[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82871":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":37,"readmeContent":38,"aiSummary":39,"trendingCount":16,"starSnapshotCount":16,"syncStatus":14,"lastSyncTime":40,"discoverSource":41},82871,"harness-terminal","robzilla1738\u002Fharness-terminal","robzilla1738","The native macOS terminal that keeps your sessions running and tells you when a coding agent needs you. GPU-rendered, scriptable, agent-aware.","https:\u002F\u002Fharnesscli.dev",null,"Swift",282,20,2,3,0,1,52,160,9,3.97,"MIT License",false,"main",true,[27,28,29,30,31,32,33,34,35,36],"ai-agents","coding-agents","developer-tools","gpu","macos","metal","sparkle","swift","terminal","terminal-emulator","2026-06-12 02:04:28","# Harness\n\n[![CI](https:\u002F\u002Fgithub.com\u002Frobzilla1738\u002Fharness-terminal\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Frobzilla1738\u002Fharness-terminal\u002Factions\u002Fworkflows\u002Fci.yml)\n\nThe native macOS terminal that keeps your sessions running and tells you the moment a coding agent needs you.\n\nEvery pane renders on Harness's own GPU engine. Your splits and sessions live in a background daemon, so they survive quitting the app — and their scrollback survives a daemon restart. You can drive or attach to them from the command line, including a headless or remote daemon over SSH. And Harness watches the agents you run inside it (Claude Code, Codex, Cursor, and more), so an approval prompt never sits unseen behind another tab.\n\nOne self-contained app. The terminal engine, daemon, and CLI are all first-party Swift; the only external dependency is Sparkle (the macOS auto-update framework, GUI-only).\n\n## Download\n\n**[Download Harness for macOS →](https:\u002F\u002Fgithub.com\u002Frobzilla1738\u002Fharness-terminal\u002Freleases\u002Flatest\u002Fdownload\u002FHarness.dmg)**\n\nOpen the DMG, drag `Harness.app` to Applications, and launch it normally. The release is signed, notarized, and built for Apple silicon Macs running macOS 15 or later.\n\nSHA-256: `fcfd70bded44d8c8c3d2c43144c7101b4ac960b46c4e6342234e5010b90ccb17`\n\nPrefer to build it yourself? Jump to [Build from source](#build-from-source).\n\n## Why Harness\n\n- **It's a real terminal first.** GPU rendering, accurate sRGB color by default, opt-in converted Display-P3 vivid color, ligatures, inline images (Sixel \u002F Kitty \u002F iTerm2), and 490 built-in themes with a muted Harness default. Block and box-drawing glyphs are drawn procedurally, so borders tile without seams at any font.\n- **Your work outlives the window.** Sessions, tabs, and splits are owned by a daemon. Quit and reopen and everything is exactly where you left it, scrollback included — history is persisted to disk and restored even if the daemon restarts. Attach the same session from a second window or another machine.\n- **It's scriptable, locally or remotely.** `harness-cli` drives the whole thing — open tabs, send keys, capture a pane, resize, swap, zoom — so your tooling can build the layout it needs. Point any command at a headless or remote daemon with `--host \u003Cname>`; the daemon and CLI run on Linux too, so a remote box can host your sessions.\n- **It watches your agents.** Harness detects Claude Code, Codex, Cursor, and others by their process tree, shows which session is running what, and pings you when an agent stops or asks for approval. `Cmd+Shift+U` jumps you to the one that's waiting and skips the ones still thinking.\n\n## How it feels\n\nHarness ranges from a plain, get-out-of-your-way terminal to a full session manager. Pick the level in **Settings → Terminal → Experience**:\n\n- **Plain Terminal** — fast and quiet. No command prefix, no status bar. Sessions close when you quit, like any terminal.\n- **Persistent Terminal** — the same clean look, but sessions survive quitting and you can attach to them from the CLI.\n- **Full Terminal** — everything: command prefix, status line, copy mode, paste buffers, panes, and the full `harness-cli` command set.\n- **Agent Workspace** — persistent project workspaces with agent detection and notifications turned up front.\n\nNew installs start in Plain. Moving over from another setup? See [docs\u002FMIGRATION.md](docs\u002FMIGRATION.md) — Harness can import an existing terminal config (colors, font, padding) on first run.\n\n## Features\n\n- GPU-accelerated rendering by Harness's own terminal engine — accurate sRGB output by default, opt-in converted Display-P3 vivid color, a themed translucent canvas, and program output left untouched unless you opt into theme recoloring\n- Sidebar sessions, per-session tabs, and horizontal \u002F vertical splits\n- Session layout persists across quits (daemon-owned, attach from the CLI or over SSH)\n- Persistent scrollback: a pane's history is written to disk per surface and restored when the daemon restarts\n- Remote & headless daemon: run `HarnessDaemon` on a headless or remote box (Linux included) and drive it with `harness-cli --host \u003Cname>` over an SSH tunnel — register hosts with `harness-cli remote add`\n- `harness-cli` for automation and agent hooks\n- Color\u002Ftheme diagnostics from the CLI: `harness-cli color-check` and `harness-cli theme-preview --theme \u003Cname>` print deterministic SGR pages for eyeballing fidelity in Harness itself\n- Command set: `send-keys`, `capture-pane`, `kill-pane`, `resize-pane`, `zoom-pane`, `swap-pane`, `rename-tab`, `attach`, and more\n- Command prefix keymap (default `Ctrl-A`) with a live cheatsheet (prefix `?`)\n- Agent detection for Claude Code, Codex, Cursor, Pi, Hermes, OpenClaw, OpenCode, Aider, Gemini, and Goose — each with a brand color and a sidebar chip\n- Agent alerts as desktop banners, a sidebar bell, and pane rings; `Cmd+Shift+U` jumps to whoever is waiting\n- One-line hook install: `harness-cli install-hooks \u003Cagent>`\n- Command palette (`Cmd+K`) and a native macOS Settings window (`Cmd+,`)\n- 490 built-in color themes with a muted Harness default, plus `.harnesstheme` export \u002F import for sharing\n- Shell integration (OSC 133): prompt marks for jump-to-prompt and a command success \u002F failure gutter — bash \u002F zsh \u002F fish snippets in [docs\u002Fshell-integration\u002F](docs\u002Fshell-integration\u002FREADME.md)\n- Inline images that stay put across reflow and scroll into history\n- Drag file-backed folders or images into a pane to insert shell-quoted paths\n- Set Harness as the default terminal for SSH\u002FTelnet\u002Fman-page links and `.command` \u002F `.tool` files from Settings > Terminal\n- Automatic, signed background updates (Sparkle + EdDSA)\n\n## harness-cli\n\nHarness launches its daemon automatically; the CLI talks to it.\n\n```bash\nharness-cli list-surfaces\nharness-cli new-session --workspace Default --cwd ~\u002FCode\u002Fmyproject\nharness-cli new-tab --workspace Default --cwd ~\u002FCode\u002Fmyproject\nharness-cli send-keys --surface \"$HARNESS_SURFACE\" --keys \"ls -la Enter\"\nharness-cli notify --surface \"$HARNESS_SURFACE\" --title Agent --body \"Needs approval\"\nharness-cli color-check\nharness-cli theme-preview --theme \"Harness Default\"\n```\n\nInstall it onto your `PATH`:\n\n```bash\n# From the app bundle:\n\u002FApplications\u002FHarness.app\u002FContents\u002FMacOS\u002Fharness-cli install\n\n# Or from a source build:\n.build\u002Frelease\u002Fharness-cli install\n\n# Then add the printed path to your shell profile:\nexport PATH=\"$HOME\u002FLibrary\u002FApplication Support\u002FHarness\u002Fbin:$PATH\"\n```\n\nThe first-run setup in `Harness.app` performs the same local installation for new\nusers: it copies `harness-cli` and `HarnessDaemon`, registers the LaunchAgent,\nadds PATH blocks for zsh\u002Fbash\u002Ffish with backups, installs fish completions, asks\nfor notification permission, and offers detected agent hooks.\n\n## Remote & headless daemons\n\n`HarnessDaemon` can run on a headless box (no GUI) or a remote machine — including\nLinux — and you can drive it from any `harness-cli` command with a global\n`--host \u003Cname>` flag. The transport is an SSH tunnel that forwards the remote\ndaemon's control socket, so it reuses your existing SSH trust with no new\ncredentials.\n\n```bash\n# On the remote box: run the daemon and note its socket path (harness-cli doctor prints it).\n# On your machine: register the remote, then target it with --host on any command.\nharness-cli remote add --name devbox --ssh me@devbox --socket \"\u002Fhome\u002Fme\u002F.config\u002Fharness\u002Fharness.sock\"\nharness-cli remote list\nharness-cli ping --host devbox\nharness-cli new-session --host devbox --cwd ~\u002FCode\nharness-cli send-keys --host devbox --surface \u003Cid> --keys \"ls -la Enter\"\nharness-cli capture-pane --host devbox --surface \u003Cid>\nharness-cli remote remove --name devbox\n```\n\nPass extra SSH options (port, identity file, jump host) with `--ssh-arg`, e.g.\n`--ssh-arg -p --ssh-arg 2222 --ssh-arg -i --ssh-arg ~\u002F.ssh\u002Fdevbox`.\n\n## Agent hooks\n\n`HARNESS_SURFACE` is set in every Harness pane, so an agent can ping the exact tab it's running in:\n\n```bash\nharness-cli install-hooks claude-code\nharness-cli notify --surface \"$HARNESS_SURFACE\" --body \"Approval required\"\n```\n\nPer-agent setup lives in [docs\u002Fagent-hooks\u002FREADME.md](docs\u002Fagent-hooks\u002FREADME.md). Agents without a hook mechanism still notify you through Harness's built-in activity detection once they're running.\n\n## Keyboard shortcuts\n\n| Action | Shortcut |\n|--------|----------|\n| New tab | `Cmd+T` |\n| New workspace | `Cmd+Shift+N` |\n| Close tab | `Cmd+W` |\n| Split horizontal \u002F vertical | `Cmd+D` \u002F `Cmd+Shift+D` |\n| Switch to tab 1–9 | `Cmd+1` … `Cmd+9` |\n| Previous \u002F next tab | `Cmd+Shift+[` \u002F `Cmd+Shift+]` |\n| Jump to waiting agent | `Cmd+Shift+U` |\n| Command palette | `Cmd+K` |\n| Settings | `Cmd+,` |\n| Toggle sidebar | `Cmd+\\` |\n\nThe command prefix (default `Ctrl-A`) adds the full pane \u002F session keymap on top — press prefix then `?` for the cheatsheet.\n\n## Build from source\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Frobzilla1738\u002Fharness-terminal.git harness\ncd harness\nmake release\nopen Harness.app\n```\n\nValidate a source checkout before shipping changes:\n\n```bash\nswift build\nswift test                              # fast, deterministic suite\nHARNESS_LIVE_DAEMON_TESTS=1 swift test  # adds the real socket \u002F PTY \u002F security tests\nmake bench\n```\n\nCI runs all three on every push: the deterministic suite, the live daemon tests, and a release build. The live tests spin up a real daemon over a Unix socket and a real PTY, so run them locally before changing the daemon, IPC, or PTY code.\n\n`make bench` runs opt-in release benchmarks and prints machine-readable JSON timing lines. Treat those as a structural baseline, not a pass\u002Ffail gate — GPU and timing numbers vary by machine.\n\nRenderer tests use structural offscreen readbacks by default. Set `HARNESS_WRITE_RENDER_SNAPSHOTS=1` when running `swift test --filter MetalRendererTests` to write PNGs under `\u002Ftmp\u002FHarnessRenderSnapshots` for human debugging only.\n\n### Develop in Xcode\n\n`Harness.xcodeproj` is generated from `project.yml` with XcodeGen. The app target builds and bundles `HarnessDaemon` and `harness-cli` into `Harness.app\u002FContents\u002FMacOS\u002F`, so an Xcode run uses the same helper layout as the release app.\n\n```bash\nxcodegen generate\nopen Harness.xcodeproj\nxcodebuild -project Harness.xcodeproj -scheme Harness -configuration Debug \\\n  -destination 'platform=macOS,arch=arm64' build test\n```\n\n## Requirements\n\n- Apple silicon Mac running macOS 15.0 or later for the downloadable DMG\n- Xcode 16+ \u002F Swift 6.0 (to build from source)\n- For a headless\u002Fremote daemon: any machine with Swift 6.0 (macOS or Linux) — build the daemon + CLI with `swift build -c release` (the GUI app, renderer, and Sparkle are macOS-only and are dropped from the Linux build)\n\n## Documentation\n\n- [Experience modes](docs\u002FMODES.md) — Plain \u002F Persistent \u002F Full \u002F Agent\n- [Sessions & panes guide](docs\u002FMULTIPLEXER_GUIDE.md) — prefix, panes, sessions, copy mode, attach from anywhere\n- [tmux-style capabilities PDF](docs\u002FHARNESS_TMUX_CAPABILITIES.pdf) — printable setup, shortcuts, commands, attach, copy mode, and troubleshooting\n- [Release runbook](docs\u002FRELEASE.md) — signed\u002Fnotarized DMG, GitHub Actions release workflow, and Sparkle appcast publishing\n- [Migration](docs\u002FMIGRATION.md) — bringing your config and habits across\n- [Keybindings](docs\u002FKEYBINDINGS.md) · [Commands](docs\u002FCOMMANDS.md) · [Shell integration](docs\u002Fshell-integration\u002FREADME.md) · [Agent hooks](docs\u002Fagent-hooks\u002FREADME.md)\n- [Changelog](CHANGELOG.md) — release history\n- [Third-party notices](docs\u002FTHIRD-PARTY-NOTICES.md)\n\n## License\n\nMIT\n","Harness 是一款专为 macOS 设计的原生终端应用，旨在保持会话持续运行并在编码代理需要时及时通知用户。其核心功能包括基于 GPU 的渲染技术、后台守护进程支持下的持久会话管理以及对多种 AI 编码代理的支持。Harness 通过自研的 GPU 引擎渲染每个窗格，并且会话和分割视图在后台守护进程中运行，即使关闭应用程序也能保留状态。此外，该工具还具备强大的脚本能力，支持本地或远程操作，同时能够监控如 Claude Code、Codex 等 AI 编码助手的状态。适用于需要高效管理和监控开发环境的专业开发者，特别是在涉及复杂多任务处理及频繁使用 AI 辅助编程工具的场景中。","2026-06-11 04:09:29","CREATED_QUERY"]