A terminal designed to bea browser for agent sessions

Close it. Reopen it. All sessions are still there.

macOS 15+ · Apple Silicon · Free · iOS beta on TestFlight

Sessions

12 issues · 11 sessions finished today
MA-4836Claudepush-website

Build pixel-perfect macOS Dock quit-and-reopen hero sequence

Extend the website hero with a markup-based, pixel-matched macOS Dock that auto-reveals as the synthetic cursor travels downward. Use crisp native-style icons for Finder, Push, Xcode, Chrome, Photos, System Settings, Spotify, FaceTime, Slack, and Calendar; reproduce the Push Dock context menu, animate Quit closing only the mock app shell, then relaunch Push with every terminal tab and session restored.

18 turns · 2m · redesign/nd · bypass

MA-4822Claudepush-macos

Review issue update

Shipping release v1.10.197 with all of today’s session-identity and delivery fixes; the build pipeline is running now. Once I confirm the DMG and appcast published, you run Check for Updates in prod Push to get it.

595 turns · 5h 27m · master · bypass

MA-4831Claudepush-website

push-docs-site-plan

Building the public Push docs site: the full 18-page manual plus disclosure pages is done, verified, and open as PR #2 on push-website. Next: your review and merge, especially the rewritten privacy policy wording.

185 turns · 2h 46m · redesign/nd · bypass

folders

Your tabs group themselves.

Every tab belongs to the folder it runs in — the chips come from your own directories. One chip, one project, and each folder remembers the tab you left active. The cursor is clicking real controls; click anywhere to take over.

grid mode

Every running session on screen at once.

A browser gives you a tab overview. Push gives you a live grid — flip the display mode, pick a session, and land in the tab where it runs. These panes replay real production sessions.

Three ways work begins

Capture. Track. Spin off. There is no fourth.

New work relates to your current session in one of three ways: it is the session, it came from the session, or it has nothing to do with it. Three doors in. No fourth.

is this what I’m already doing here? → yes TRACK └ no — will whoever picks it up need this context? → yes SPIN OFF → no CAPTURE
capture

Unrelated? Capture it.

A thought from anywhere. Speak it on your phone or type it in a tab. It becomes an issue. It doesn’t link to this session — that link would just be noise.

▶ "rotate the api keys"
→ captured · unlinked

track

Doing it right now? Track it.

One command turns this session into a tracked issue. They become the same thing: the tab is the issue, and the work shows up on your phone.

$ push track "ship the login fix"
→ MA-4506 · tab bound · Run live

spin off

A side quest? Spin it off.

It gets its own issue and its own tab, with a link back to this session — so whoever opens it later knows where it came from. This session keeps running.

$ push spin-off "rate limiting"
→ MA-4513 · context carried

Built like a browser

Held to browser standard.

Browsers never lose your tabs. Terminals always did. Push fixes that — then goes further, because these tabs run agents.

$ ⌘Q # tuesday, 6:40 pm 12 sessions closed. nothing lost. $ open -a Push # wednesday, 9:12 am ✳ 3 folders · 12 tabs restored ✳ claude --resume 8f3e1c2a … running right where you left it.
the browser doesPush doesregister
Close it, reopen — the tabs come back.Quit, reopen — the sessions resume. The conversation, not just the window.like a browser, deeper
A tab shows a favicon and a title.A tab shows its agent, its issue, its status, and the context it has left.tabs that report
Tab groups you curate by hand.Folder chips from the working directory — grouping you never configure. Each folder remembers its last-active tab.automatic
⌘T · ⌘W · ⌘⇧T · ⌘1–9.The same muscle memory, unchanged — ⌘⇧T reopens a closed session where it was.zero relearning
History you revisit.Full transcripts you can resume.history, upgraded
Tab overview.Grid mode — every running session on screen at once.unlike a browser
Tabs are sealed boxes.Tabs talk to each other — one tab can read, prompt, and drive another.unlike any browser
A tab can’t need you.A tab can need you — and it finds you on your phone.waiting on you
Four agents, one terminal

Don’t pick a winner. Bet the field.

Push ships no model and no agent of its own, so it has no side. All four run first-class: naming, resume, and history work the same in every tab. There’s no shared protocol for any of that, so we built it four times. Your agents disagree about everything except where they live.

Claude Code

storage
~/.claude/projects/<cwd>/<id>.jsonl
resume
claude --resume <id>
handled
Auto-resume on relaunch · session-id markers · /clear flips · tab title from haiku

Codex

storage
Codex-internal store
resume
codex -C <cwd> resume <thread>
handled
Per-turn hooks · per-cwd thread filter · clean tab title via overlay

OpenCode

storage
OpenCode-internal store
resume
opencode <cwd>
handled
Plugin push-monitor.js · upstream prefix suppressed · title from info.title event

Hermes

storage
~/.hermes/state.db
resume
hermes --resume <id>
handled
SQLite read-only · 17-hook surface mapped · title from sessions.title row
The push CLI

The terminal agents use — not just run in.

You and your agent get the same command line. Track a session. Open the next tab. Hand work to another agent. See what’s running. You type it, or your agent types it.

$ push track "promote the push CLI" MA-4506 created · owner push-website tab bound · Run button live $ push terminal open --push work 4512 opened tab · codex · first turn typed $ push spin-off "rate limiting" MA-4513 · new tab carries this context $ push status Runs 4 running · 1 slot free Sessions 3 working · 43 idle Needs you 1 approval pending
$ push track "your first tracked session"
bundled, not installed

Already on your PATH.

It ships inside Push.app. No package to install, no daemon to run. Open a tab and the command is there.

four agents already speak it

Claude, Codex, OpenCode, Hermes — all fluent.

The /push skill ships with the app, projected into all four agents' skill homes. Type /push — $push in Codex — and the agent knows the verb set.

one CLI, two drivers

You type it. Your agent types it.

No agent-only API, no human-only dashboard hiding behind it. The same verbs, whichever of you reaches for them first.

Waiting on you

The only status that matters.

When an agent needs an answer, it stops and waits. Push makes that one state impossible to miss — in the tab, in the menu bar, and on your phone.

codex · MA-4793 · tab-strip hover-card fidelity Bash command $ swift test --filter TabStripHoverCard Do you want to proceed? ❯ 1. Yes 2. No, tell Codex what to do differently ✋ waiting on you — the same tab you can find in the window above
the tab

Its mark turns amber. You can see who needs you without reading anything.

the menu bar

Your Mac shows it — whatever app you’re in.

the issue

It’s marked in-review, so other agents stop picking it up.

your phone

The approval arrives on your iPhone. Tap yes. The agent continues.

You never set this status. You never clear it. Answer, and it’s gone.

One more thing

There’s a system behind this terminal.

Speak a todo on your phone. It becomes an issue. An agent picks it up in a tab on your Mac. The approval comes back to your pocket. Three surfaces, one loop — the terminal is just the front of it.

Beyond the terminal
What it isn’t

Made for one job. Honest about the rest.

Not a Linux server tool.

Mac-only today. No daemon-on-the-remote-box story. If your work lives behind ssh + tmux, this isn't the terminal you want.

Not a PR review queue.

The work happens inside the tab, not on a status board. If you spend most of your day accepting and rejecting agent diffs, you want a different shape of product.

Not for one throwaway shell.

Two open tabs, any terminal is fine. The persistence, the folder chips, the four-agent integration — they earn their place when you have many sessions, not one.

FAQ

Questions, answered.

What is Push?

A Mac terminal built around code agents. Many sessions in one window, naming and resume that work across Claude Code, Codex, OpenCode, and Hermes, folder chips that group by working directory, and the Mac-native rendering you expect. Quit the app and your sessions are still there tomorrow.

Why a terminal? Why not a nicer app?

A chat UI guesses what you want to see and hides the rest. Agent output is big, and everyone's important two lines are different — so the guessing always loses something you needed. A terminal shows everything and lets your eyes do the filtering. That's calmer, not busier. And the details a friendlier UI hides are the details you'd have learned from.

How does session resume actually work?

Every tab is pinned to a stable ID injected into the agent's environment. A bundled shell snippet plus the agent's own session-start hook keep a marker file on disk. When you relaunch the app, the marker tells Push which agent to resume and which session ID to pass — and you land back in the conversation. Crash-safe via atomic marker writes; survives Sparkle auto-update; tolerates working-directory drift.

Which code agents are supported?

Claude Code is the deepest integration today — auto-resume, /clear handling, theme-respect on appearance changes. Codex, OpenCode, and Hermes are all first-class: their session storage is read for history, their resume command shape is invoked correctly, and their tab titles are normalized. Any other shell or CLI works as a normal terminal — you just don't get the agent-specific affordances unless we've integrated it.

Is there a CLI?

Yes — push, and it ships inside the app rather than as a separate install. It’s how a session tracks itself as an issue, opens the next tab, hands its work to a different agent, reads another tab’s output, and reports back when it’s done. The /push skill is preinstalled for Claude Code, Codex, OpenCode, and Hermes, so the agent in the pane already knows the verbs — nothing to configure. You run the same commands yourself: push status for the workspace pulse, push track to turn the session you’re in into a tracked issue, push --help for the rest.

Other agent terminals also say sessions survive a restart. What's different?

Usually they mean the layout — panes, working directories, a window restored. Push means the work: the conversation resumes through each agent's own session store, the issue keeps the history, and the status is still true after a real shutdown, a reboot, or a week away. A restored directory tells you where you were; a resumed session tells you what you were doing.

So it's an issue tracker? Linear for AI agents?

No — the tracker got smaller because its user changed. Human trackers are elaborate (Triage, Backlog, In Review, Blocked…) because status was always a coordination protocol between people. An agent doesn't negotiate priority; it runs or it doesn't. So Push has three statuses — active, done, archived — and the only one that exists for you, waiting on you, sets and clears itself: the agent opens an approval, the issue computes in-review, you answer, it's gone.

Why not just use a regular terminal plus tmux?

tmux is great for surviving a flaky SSH connection on a remote Linux box. The problem here is different — you're running many agents locally and need to know which one needs you, where it left off, and how to pick it up tomorrow. That requires reading what's inside each pane (session IDs, agent transcripts, hook output), which a terminal-agnostic multiplexer is designed not to do. Push reads what's inside the pane and treats agent panes specially. Different bet, different ceiling.

Is the content of my agent sessions sent anywhere?

No. Mac-side data lives in ~/.push/. Agent transcripts stay where the agent put them — Claude's JSONL files in ~/.claude, Hermes' SQLite in ~/.hermes, and so on. Push reads them locally to render history and never uploads them. Auto-updates check a signed feed at releases.pushto.do. The agents themselves make their own API calls to whatever model you pointed them at — that's between you and them.

What about Linux and Windows?

Mac-only today. The native rendering, the libghostty palette pipeline, and the macOS-specific keyboard conventions are load-bearing for the experience we're shipping — porting them isn't a flag flip. If you need a cross-platform multi-pane terminal for agents, a modernized multiplexer is a different shape that fits Linux better.

Is it open source?

Closed-source, signed, notarized binary today. Documentation around the macOS architecture and integration playbooks is being opened up. No commitment yet on the source itself.

What does it cost?

The Mac app is free — the terminal, the agents, and the orchestration are not gated. Voice todos are unlimited. Push includes 100 minutes of recording each month; that one guardrail protects the cost of transcription, and reaching it never opens a paywall. Full pricing.

Push is made by MasslessAI. One team, one product. Built in the open, shipping weekly — every release documented, every tradeoff in public, and the inbox is open.

Open it tomorrow.
Your agent is still there.

Free. Signed and notarized. Installs in under a minute. Quits as cleanly as it opens.

macOS 15+ · Apple Silicon · Push v1.10.269