A personal macOS mission-control for Claude Code sessions across many projects.
Agents run on their own; only the sessions that need you surface — in one keyboard-driven
panel you summon with a global hotkey. Answer a permission prompt or type a reply, and it goes
straight into the session. Sessions live in tmux, so they survive pass restarts and you can
tmux attach from any terminal.
Status: MVP (M0–M4) complete and verified end-to-end. Multi-agent adapters for Codex/pi are stubbed (the architecture is in place) but land in M5.
- Global hotkey (default ⌥Space) summons the panel over any app, any Space, without disruptively stealing your editor's focus. Resizable (drag edges; size is remembered) and toggleable between floating (always-on-top) and a normal window you keep beside your editor (⌘⇧F).
- Chat home — a feed of every session with its last response, and one input pinned at
the bottom. Type to reply to the selected session (injected safely; refuses a bare shell),
@to jump to a project/session,y/nto answer a pending permission, ⏎/⌘⏎ to open its terminal. - Interactive terminal — opening a session embeds a real terminal attached to its tmux
session: type straight into Claude (keys, arrows, permission answers), full color and sizing.
⌘[steps back to the home;⌘⏎opens it in Ghostty. - Agentic embedded browser — the page beside a session is both human-visible and controllable
through
passcli. An agent canopen, take a compact interactivesnapshot, then use stable@eNreferences toclick,fill,type,select,press, andscroll;screenshotandreadclose the visual verification loop. Commands act on the same persistent WKWebView the user sees, without exposing arbitrary JavaScript execution. - Hooks-driven attention — Claude permission prompts / questions / completions arrive via Claude Code hooks; the selected session surfaces at the top with what it needs and how long it's waited (worktree badge, branch, agent glyph).
- tmux-backed sessions — created by pass or adopted from existing
pass-*sessions; each is attachable from any terminal. Worktrees group under their main repo but show a⧉badge. - Projects — register a single repo, a parent folder (scanned for repos), or several at once (menu / Settings); live sessions' projects are remembered automatically.
- Executable feature documents — keep software feature contracts in
<project>/.pass/features/*.json, launch their local development server, follow a human test guide, ask a local agent to implement or verify the contract, and send failed human-review feedback back for rework. Agent summaries, changed files, checks, review history, and lifecycle status stay in JSON so they can be committed or synced later. - Notifications for permission / input / finished, with the menu-bar badge as a reliable always-on fallback.
- Settings (⌘,): rebind the hotkey, launch-at-login, floating toggle, project list, install hooks, notification status, and build/review extensions with an AI agent.
- Extensions (v1) — add your own features as manifest+script extensions in
~/.pass/extensions:>commandsin the quick command (⌘P) and event rules (attention/session → script/notify/sendText/openURL), with per-capability permissions and an enable-after-review flow. Ships with an agent-usage example (>usage— Claude Code token usage by day/model/project). Web UI windows (apiVersion 2) render extension-owned HTML/CSS/JS in a separate macOS window with a constrained snapshot/event/action JSON bridge; the bundled event-monitor example opens with>events. AI Extension Builder turns a natural-language goal into a disabled Claude work session, then shows every generated file and permission for feedback or explicit fingerprint approval. Enabled extensions also appear in the Pass panel's top launcher and the macOS menu-bar menu. Design & schema:docs/EXTENSIONS.md. - Attached device pane — Vysor-style video for Android and iOS devices inside the running
session's terminal workspace. Android supports basic pointer control over USB/Wi-Fi and
emulators; install its runtime once with
brew install scrcpy ffmpeg. iPhone and iPad use macOS's native trusted-USB capture path with no extra runtime: connect and unlock the device, accept Trust This Computer, and allow Pass camera access when macOS asks. iOS mirroring is view-only because iOS doesn't expose a general-purpose remote touch API. The divider is draggable and an open browser tab remains available when the device pane closes. Pass never captures a Mac window, so Screen Recording permission is not required. Use the device button in a session header or menu bar → Attach device pane…. - Mobile remote developer preview — an outbound-only macOS gateway, Cloudflare Worker/Durable Object relay, and Expo client can list/create sessions, send messages, and answer decisions. The current shared-token pairing is explicitly development-only; device-key pairing and voice are still follow-up work.
Requires Xcode 26+, xcodegen (brew install xcodegen), tmux, and a free Apple Development
signing identity. See BUILD.md for details and the hard-won platform findings.
make run # build + launch (stdout in terminal)
make open # build + launch the .app bundle (Finder-style)
make test # run unit tests
make logs # stream the app's OSLogThe first launch opens a three-step setup assistant:
- Runtime check — detects
tmux(required) and Git (recommended). If Homebrew is available, Pass can installtmuxin place and re-detect it without an app restart; otherwise it opens the Homebrew installation guide. - Agent check — detects Claude Code, Codex, and pi independently. Only one is needed; missing optional agents link to their official installation guides.
- Integrations — installs Claude hooks by merging them into
~/.claude/settings.json(backed up first; never touches other hooks) and links the bundledpasscli.
The assistant can be reopened any time from the menu bar. If notifications are blocked, enable
Pass in System Settings. Summon with the shortcut selected in Settings (⌘⌘ or ⌥Space), @ to
jump, or use New session… from the menu bar.
The implementation and its security boundary are documented in
docs/mobile-remote-architecture.md. Relay setup lives in
relay/README.md, and Expo setup lives in
mobile/README.md. No relay is deployed automatically.
deck/ contains a controller-first SteamOS remote client. Agents run on an
internet-connected Pass host while the Deck connects through the existing relay protocol for
session discovery/creation, terminal input, messages, and structured permission answers. See
deck/README.md for setup and Deck controls.
Claude Code (in tmux) ──hooks(HTTP)──► HookServer (127.0.0.1:49817)
│ normalize (ClaudeAdapter)
▼
TmuxClient ◄── reconcile ── SessionStore ──► EventRouter ──► Inbox + Notifications
(create/adopt/attach) (git identity, (state machine) ▲
▲ attention) │
└──────────── ReplyInjector (bracketed paste / y-n) ◄── panel (SwiftUI) ──┘
- The core is agent-agnostic: agent knowledge lives only in adapters (
ClaudeAdaptertoday;/hook/<agent>,@pass_agent, and per-agent glyphs are already wired for Codex/pi in M5). - tmux + git are the database — pass persists only a small project MRU list; everything else (cwd, branch, worktree, agent, activity) is derived live.
- Feature JSON is the contract — the app and local agents read and update the same repository
files. A generated
.pass/feature.schema.jsonsupports validation; project-relative paths keep documents portable, and local development commands run only after an explicit click.
- Open pass › Features, choose a project, and create or edit a feature.
- Add requirements, observable acceptance criteria, a development command/URL, and a short human test guide. The feature is saved as a reviewable JSON file in the project.
- Choose Implement or Verify. pass starts (or reuses) a local agent session and gives the
JSON file as its contract. The agent writes its summary, changed paths, check evidence, and
needsReview/blockedstatus back into that file. - Choose Start server, open the local URL, and follow the guide. If behavior is wrong, enter feedback under Human review and request changes; pass records it and sends it to the agent.
- Only a person can choose Mark verified.
spikes/FINDINGS.md— empirical validation of Claude hooks, tmux injection, and the GUI/PATH environment (the S0 spikes that de-risked the architecture before any Swift was written).BUILD.md— build/signing setup and platform gotchas (notification signing, non-activating panelcollectionBehavior, tmux-Fcontrol-byte escaping, accessory-app edit shortcuts).docs/BROWSER.md— implemented embedded browser design: the terminal │ WKWebView split and thepassclisnapshot/ref/action protocol that lets agents open, inspect, and operate the same page the user sees.docs/mobile-remote-architecture.md— implemented developer MVP status plus the secure pairing, hardening, and voice-management roadmap for mobile access.