Ocean Code
Editors and your terminal
Ocean Code runs inside Xcode and Zed over the Agent Client Protocol with the same engine and sessions as the pager, and in the terminal it draws only what changed, follows your display's refresh rate and shows images inline where the terminal can.
The same engine runs in three places: the terminal (Ocean pager), an editor that speaks the Agent Client Protocol, and headless. Sessions, credentials, permissions, agents and the ledger are shared; a session started in Xcode shows on the board beside the terminal ones.
Xcode and Zed
oceancode acp runs the engine as an Agent Client Protocol agent on stdin and stdout. The editor starts the binary itself as a subprocess; there is no URL, no port and no API key to enter. The editor's own tools arrive as an MCP server when the session starts, so in Xcode the agent can build, test, run previews and read diagnostics.
- Find the binary's absolute path:
which oceancode. - Xcode › Settings › Intelligence, under Agents click Add an Agent…: Name
Ocean Code, Executable the path from step 1, Argumentsacp, Interpreter blank. - In the Intelligence sidebar, New Conversation → Ocean Code. Allow it the first time.
Xcode starts agents with the system folders only on PATH (/usr/bin:/bin:/usr/sbin:/sbin), so a sign-in kept in a shell variable is not seen, and the Claude subscription route cannot find the claude binary it probes. Sign in once from a terminal (oceancode auth) so the stored credential is used, and add one Environment Variable row in the sheet, PATH, with your terminal's PATH.
Add an external agent to ~/.config/zed/settings.json, with an explicit PATH for the same reason:
{
"agent_servers": {
"Ocean Code": {
"type": "custom",
"command": "/Users/you/.local/bin/oceancode",
"args": ["acp"],
"env": { "PATH": "/Users/you/.local/bin:/opt/homebrew/bin:/usr/bin:/bin" }
}
}
}Ocean Code then appears in Zed's Agent Panel. For a grid of pagers instead, a Zed task that runs oceancode in a center-pane terminal, bound to a key, tiles as many sessions as you like, each with its own ⇄N OC chip and #code tab title. Set terminal.option_as_meta so the pager's Option+Tab reaches it.
An Xcode conversation's session store lives under ~/Library/Developer/Xcode/CodingAssistant/, so a pager opened in the project does not list it; oceancode resume <code> from anywhere does. Flags and the wire are in the ACP reference.
The terminal
Ocean pager runs in your terminal, and your terminal draws it.
- Only what changed. Each frame sends the cells that changed, wrapped in a synchronized update so the terminal shows the whole frame at once; an unchanged frame sends nothing.
- Your display's pace. While text streams or you scroll, the pager follows the display's refresh rate (8–16 ms a frame); when nothing moves, it stops redrawing and the process parks.
OC_PAGER_FPS=1shows the frame rate. - Keys first. Keystrokes and the mouse are handled before incoming text, so a slow terminal makes a stream arrive in bigger jumps but never blocks typing.
- Search built in. Release builds carry ripgrep;
grepandglobwalk in parallel, and thesearch 12 · 0.3schip on the status bar counts them. Attft 0.8s · api 1.9schip shows the time to the first token and the provider's round trip. - It takes the terminal back. A command that makes itself the terminal's foreground, an interactive shell started by a tool, used to freeze the window; the pager now reclaims it within a quarter of a second.
What the terminal you choose adds:
| Capability | Terminals |
|---|---|
| Pasted screenshots shown inline in the transcript | Kitty, Ghostty, WezTerm (others show a placeholder; the model receives the image either way) |
| Clickable paths and links | iTerm2, Ghostty, Kitty, WezTerm, Alacritty, VS Code's terminal, Zed |
The session's code and title in the tab (#2oca Fix login) | iTerm2, WezTerm (as the ocean_session user variable) |
| Notifications when a turn ends or a session waits | iTerm2, WezTerm, Kitty, Ghostty and others, each over its own protocol; otherwise the bell |
| True colour themes (Ocean Night, Ocean Day) | Every terminal but Terminal.app, which gets the 16-colour fold |
Themes, notification options, every key and slash command: Ocean pager reference. Environment variables: Ocean pager.
Headless
oceancode run "…" runs one job and exits with a typed code, answering a sub-agent's permission ask or question itself; oceancode serve exposes sessions, prompts, status and the management commands over HTTP on port 4096 for your own tooling. Both are in the headless reference and the HTTP API.
Ocean.app
Ocean.app is the native Mac window of the Ocean family, drawn with wgpu on Metal: Dashboard, Code, Find, Activity and Environments read Ocean Git, and its Chat answers questions about the code read-only over Ocean Git. The coding agent itself works in the terminal and in your editor.