Your Macs.Your agents.One window.

Hesper runs Claude Code and Codex on your laptop, the Mac mini under the desk and the Studio in the office. Every agent is a live terminal tile on one wall. The ones that need you are one key away.

Free and MIT licensed. macOS 14 or newer, Apple Silicon and Intel, signed and notarized. Nothing leaves your machines.

$ brew install --cask derzierau/hesper/hesper
View source on GitHub
apimini
migrationslaptop
docsstudio
wall-perfstudio
review-uxmini
shelllaptop

One queue, one key.

⌘J jumps to the next agent that needs you: approvals first, then questions, then errors. Allow, always-allow or deny right on the tile. Tiles never move to get your attention; the one that needs you lights up.

  • Approval
  • Question
  • Error
  • That is the order ⌘J uses.
0 need you⌘J
users tablestudio
$ claude "add a users table"
read migrations/
write migrations/0042_users.sql

Try it: press to jump to it, then to allow.

  • One wall, one queue.

    Every agent is a live terminal tile. ⌘J jumps to the next one that needs you: approvals first, then questions, then errors. ⏎ A N answer it right on the tile.

  • Every Mac is compute.

    Start an agent on any Mac from any Mac. Move or fork a running agent, with its uncommitted changes and its conversation. One ⌘Z moves it back.

  • Yours, end to end.

    Native AppKit on libghostty, no web view. MIT. A single Mac needs no relay. Several Macs talk through a relay you host, encrypted so the relay cannot read or forge anything.

Move work to where there is room.

Hand off a running agent. Continue on another Mac checkpoints the worktree (staged, unstaged and untracked), sends only the changes, sealed, and resumes the same Claude or Codex conversation there. One ⌘Z moves it back. Fork keeps the original and starts a twin. If the other Mac lacks the folder, Hesper brings it along.

laptop

apilaptop
reading internal/api/routes.go
running go test ./internal/api/

sealed

  • staged, unstaged, untracked
  • same branch
  • the conversation

never your branches or index

mini

apimini
reading internal/api/routes.go
running go test ./internal/api/

Try it: press to continue on the mini, to move it back.

Undo
one ⌘Z
Fork
keeps the original, starts a twin
Resumable transfers
up to 5 GB by default

Every layer trimmed for latency.

A native AppKit app on libghostty, a small Go daemon per Mac, and a budget for every hop.

MeasurementConditionResult
Keystroke to framelocal agent, p502.7 ms
Wall frame rate16 live agents120 fps, 0 dropped
Remote keystroke echosame LAN / via relay0.4 ms / 45 ms
Daemon CPU30 idle agents, 2 s window0.15 ms
State change on another Macto your wall, p5022 ms
Measured on Apple Silicon, p50 unless noted. Method and raw numbers are in the terminal streaming doc.

Your work, from any Mac.

History ⌘Y

One history across all your Macs. Search every Claude and Codex session you ever ran. Resume it where it ran, continue it on another Mac, fork it, or hand it from Claude to Codex.

Review ⌘R

Review what came back. Finished work from every Mac in one inbox, as a native diff in reading order. See the commands the agent ran and which turn wrote each line. Accept, reject or send it back with notes.

New in 0.2.0.

Everything the app does, hesperctl does too.

The CLI drives Hesper from a shell. The same commands are MCP tools for Claude Code and Codex, and an agent skill teaches them to fan work out to more agents.

# start an agent on another Mac, in its own worktree$ hesperctl new --machine mini --worktree "add rate limits to /login"mini/a7f3k2  api  starting# block until it needs you$ hesperctl wait a7f3k2 --until needs-youa7f3k2  needs-you  Allow edit to 0042_users.sql?# the same commands as MCP tools$ ./install.sh --mcpregistered hesper with claude and codex
CLI
hesperctl reference prints the whole CLI
MCP
hesperctl mcp serves it over stdio
Skill
skills/hesper teaches Claude Code and Codex to delegate and wait

The relay cannot type, answer, start, stop or move anything.

Every request is signed by a key in your Mac’s Secure Enclave and checked by the receiving Mac. Terminal traffic is encrypted between your Macs with pinned keys. Macs on the same network skip the relay.

What the relay sees

  • who talks to whom, when and how much
  • agent ids, states and machine stats
  • device public keys and names

What it never sees

  • names, tasks and paths
  • terminal output
  • your GitHub token after sign-in

Your Macs talk Noise_IK_25519_ChaChaPoly_BLAKE2s to each other, and controllers rekey every hour for forward secrecy. A single Mac needs no relay at all.

Read the architecture

MIT, in the open.

github.com/derzierau/hesper

Swift 6 and Go 1.25, MIT licensed.

Hesper is young and used daily by its author. Every number on this page has a measurement behind it, and every claim is in the README.

Four lines with Homebrew.

$ brew tap derzierau/hesper https://github.com/derzierau/hesper.git$ brew install --cask derzierau/hesper/hesper$ /bin/sh /Applications/Hesper.app/Contents/Resources/hesper-setup.sh$ open /Applications/Hesper.app
  • macOS 14 or newer
  • Apple Silicon or Intel
  • Claude Code or Codex, installed separately

Then run /hooks once in Codex.

A single Mac needs nothing more. Several Macs talk through a relay you host; it needs a public DNS name and a GitHub OAuth app. The deployment guide walks through it.

Prefer a zip? Signed and notarized builds for Apple Silicon and Intel are on the releases page.

Current release 0.3.0