Hooks you can read first
The hooks tell each agent which pane it’s in and ask it to name the tab after its task. Before anything is installed, you see the exact change to the agent’s config. We keep a backup, and you can undo it.

Waitlist open
Run Claude Code, Codex, OpenCode and pi in as many tabs as you like. Ottermo shows you which one needs you, keeps them all running when you quit, and lets you answer from your iPhone.
✻ Claude Code
> add partial refunds to the checkout
⏺ I’ll add a migration for partial refunds,
then update the refund service.
⏺ Write(migrations/0042_partial_refunds.sql)
⎿ Wrote 18 lines
⏺ Bash(bun run migrate)
Bash command
bun run migrate
Run the refunds migration
Do you want to proceed?
❯ 1. Yes
2. Yes, and don’t ask again for bun run
3. No, and tell Claude what to do differently
~/webshop main ❯ bun test
bun test v1.3
✓ cart › totals [3.1ms]
✓ checkout › applies coupon [11.8ms]
✓ checkout › full refund [9.2ms]
✗ checkout › partial refund [4.0ms]
expected 1250, received 0
3 pass
1 fail
~/webshop main ❯
Needs you · refunds migration
Run the refunds migration?
Built-in hooks for
Other agents work too, through the bell and standard terminal notifications.
Needs you
Each tab shows its agent and one line about what it’s doing: the question Claude is asking, Codex’s summary, the command that failed. Tabs that need you move to the top of the sidebar, most urgent first, and stay there until you type into them. Glancing at one doesn’t clear it.
An agent asked a question or wants permission, 1Password is waiting for approval, or something rang the bell. You get a sound and a Dock badge.
A command failed or an agent stopped on an error.
An agent finished, and its last message becomes the note. Any command that ran for more than 10 seconds counts too.
Busy. Nothing for you to do yet.
The hooks tell each agent which pane it’s in and ask it to name the tab after its task. Before anything is installed, you see the exact change to the agent’s config. We keep a backup, and you can undo it.
1Password only says “Terminal wants to use a key.” Ottermo’s tab names the command that asked, like 1Password · git push origin main, so you know which agent it was.
Click one and you’re in that tab. The Dock menu lists everything that’s waiting, and triggers can run a command of your own on any event.
Sessions
Every shell lives in a small server that’s separate from the app. Quit Ottermo, or let it crash, and your agents carry on. Open it again and everything is where you left it, down to the scrollback. Updates swap the app in place without stopping anything.
Restarting your Mac does stop them. Your tabs, splits and folders come back as fresh shells, and old commands aren’t run again. Claude Code, Codex, pi and OpenCode pick up their conversations where they left off.
claude --resumecodex resumepi --sessionopencode --sessioniPhone and iPad
The iPhone app shows your Mac’s tabs and what each one is waiting for. When an agent asks something, the question and its answers appear on your Lock Screen. Tap one to reply, or open the full terminal when you need more.
Needs you · refunds migration
Run the refunds migration?
Done · checkout tests
Added 4 tests for partial refunds. All pass.
Error · cargo test
2 tests failed in limit.rs
Remote hosts
Connect to any Mac or Linux box, including the ones on your tailnet. The first time, Ottermo copies a single static binary to ~/.termo. No root, no package manager. Your ssh config, keys, ProxyJump and agent work as they are, and so does 1Password.
Sessions on a host keep running while your Mac sleeps or the Wi‑Fi drops. Their tabs dim, and pick up where they were when you’re back.
~/.termo/bin/termolinux x86_64 · aarch64 · macOSComing laterOttermo Team
Share one session, and your team can watch from their Mac or iPhone. You choose who can type, one person at a time. Guests see that session and nothing else: not your other tabs, your machines or your files.
It’s end-to-end encrypted. Cloudflare carries the traffic but can’t read it. Team will be a paid plan, and you’ll need an account for it.
~/api fix/limit ❯ kubectl logs deploy/api --since=10m | grep 429
12:04:11 429 POST /v1/charge limit=100 window=60s
12:04:11 429 POST /v1/charge limit=100 window=60s
12:04:12 429 POST /v1/refund limit=100 window=60s
~/api fix/limit ❯ git diff src/limit.rs
End-to-end encrypted
cat a 100 MB log. The macOS PTY’s own limit is 0.60.Measured on a MacBook Pro with an M4 Max, running macOS 26.
The details
The same terminal core as Ghostty, drawn by Ottermo’s own Metal renderer in a native AppKit window. No Electron, no web view.
A hotkey slides a terminal down over whatever you’re doing, even in full-screen apps. It keeps running while it’s hidden.
Drag a pane by its header, pick a tmux layout, snap dividers to ½, ⅓ and ⅔. Your shell gets one resize, not thirty.
14 built-in themes, and every Ghostty theme works too. Matching themes for Claude Code, Codex, pi and OpenCode switch between light and dark along with the app.
Use termo send, capture, wait and prompt --wait to hand work from one agent to another. Anything the app can do, a script can do too.
Ottermo types its path in, so the agent can read it. That works for screenshots too. Kitty inline images and ligatures are supported.
Turns itself on at password prompts, so nothing else on your Mac sees what you type there.
Ghostty’s syntax, plus tmux-style prefixes, modes and global hotkeys. You can change or turn off every binding.
No analytics, no crash reports, no account. Ottermo checks for a new version once a day. Your phone’s notifications pass through our relay, and so does its connection to your Mac when the two can’t reach each other directly, encrypted end to end. That’s all we hear from it.
We’re letting people in a few at a time. Join the waitlist, confirm your email, and we’ll write again when your invite is ready.
No. The terminal, remote hosts, the iPhone app and its notifications all work without one. You only need one for the paid parts: Ottermo Team, to share sessions with other people, and Holt cloud machines.
Two parts are paid: Ottermo Team, with a 14-day trial, and Holt, our cloud machines for you and your agents, which you pay for as you use them. Everything else in Ottermo is free.
Claude Code, Codex, OpenCode and pi have built-in hooks. With them, Ottermo shows their questions, permission prompts and summaries, and puts the answers on your phone as buttons. Installing the hooks is up to you. You see the diff first, and you can undo it.
Other agents, like Gemini, aider or goose, are recognized by name and get their status from the bell and standard terminal notifications (OSC 9, 777, 133 and 7501). You see when they need you or finish, but without answer buttons on your phone.
A Mac with macOS 14 or later, and macOS 26 for Liquid Glass. The iPhone and iPad app needs iOS 26. Remote hosts can be any Mac or Linux machine you can ssh to.
No. Ottermo is a Mac app. Linux machines work as remote hosts, and their tabs show up next to your Mac’s.
You pair it once, by scanning a code on your Mac and confirming there. After that they find each other by key: directly when they can, on the same Wi-Fi, over Tailscale or across the internet, and through our relay when they can’t. The connection is encrypted end to end either way, so the relay only sees that two devices are talking and how much. There’s no Remote Login or VPN to set up.
Partly. It uses libghostty-vt, the terminal core inside Ghostty, with its own renderer and interface on top. Ghostty theme files and keybind syntax work as they are. Ottermo is made by Nordbeam, not by the Ghostty project.
You can, but you may not need to. Sessions already outlive the app, splits and layouts are built in, prefix keys work like tmux’s, and termo attach opens any pane from another terminal, over plain ssh too.

We’re letting people in a few at a time. Leave your email, confirm it, and we’ll write again when it’s your turn.