Free forever

A session is
the terminal.

Your agent's own interface, full height, exactly as it draws itself — with a writing bar underneath it. One truth on screen, and a comfortable place to answer it.

Version 0.2.2 · macOS 15+ · Apple Silicon & Intel · Signed & notarized · updates itself

boxdo-ios — Claude Code
>the receipt card wraps badly at 320px — have a look
Read(ExpenseReceiptView.swift)
Grep(minWidth)
The amount and the split summary are in one HStack with no room to fall over. I'll let it wrap under 360pt.
Edit(ExpenseReceiptView.swift)
── ios/BoxDo/Features/Apps/ExpenseReceiptView.swift
var body: some View {
- HStack(spacing: 12) {
+ ViewThatFits(in: .horizontal) {
+ HStack(spacing: 12) { amount; splits }
+ VStack(alignment: .leading) { amount; splits }
Wrapped it with ViewThatFits, so it stays on one line where there's room and stacks where there isn't. Tests still green.
>
ExpenseReceiptView.swifteditedReceiptWrapTests.swiftnewreceipt-320.pngnewCLAUDE.mdlinked
boxdo-ios
main3Fableaccept edits1m 12s
Ask, or press ⌘S to write
boxdo-ios — Claude Code
>the receipt card wraps badly at 320px — have a look
Read(ExpenseReceiptView.swift)
Grep(minWidth)
The amount and the split summary are in one HStack with no room to fall over. I'll let it wrap under 360pt.
Edit(ExpenseReceiptView.swift)
── ios/BoxDo/Features/Apps/ExpenseReceiptView.swift
var body: some View {
- HStack(spacing: 12) {
+ ViewThatFits(in: .horizontal) {
+ HStack(spacing: 12) { amount; splits }
+ VStack(alignment: .leading) { amount; splits }
Wrapped it with ViewThatFits, so it stays on one line where there's room and stacks where there isn't. Tests still green.
>
Tap to hide the bar

The Input Bar

Everything you steer with, in one strip.

Under the terminal sits the bar you write from — and around what you write, the state you keep glancing up for: the branch with the number of files you've changed, the model, how long this turn has been running, and the permission mode.

The permission chip says what your agent says — its own wording, never ours — coloured by what it means rather than how it's spelled. Click it to cycle the mode. It appears only when the mode is actually known, and dims when it's merely inferred.

⌘J is progressive: focus the bar, hide it, bring it back, with a glow on the edge saying which state you're in. The terminal stays fully usable either way — click it, arrow through its menus, or just type straight into it with the bar closed.

Editing ExpenseReceiptView.swift
boxdo-ios
main3Fableaccept edits1m 12s
also add a snapshot test at 320pt

Any agent

Never locked to one model.

Claude Code, Codex, Antigravity, Kimi, Grok, and open-source agents that talk to models on your own machine — pick per session and run them side by side. Anything missing installs itself on first start.

The catalog arrives over the air as a signed snapshot, so when an agent ships a new flag, a new model list or a new name, it reaches you without waiting for an app update. Anything that fails its signature is ignored and the app keeps the list it already trusts.

Gemini CLI is listed as API key only — individual Google sign-in was discontinued, and Google's own successor, Antigravity CLI, is in the catalog too.

New Session

Choose what powers it

Claude Code

Anthropic — the most capable coding agent

Installed

Codex

OpenAI's coding agent

Installed

Antigravity CLI

Google's agent — successor to Gemini CLI

Auto-installs on first start

Kimi Code

Moonshot AI's agent

Auto-installs on first start

Grok Build

xAI's agent

Not installed

OpenCode

Open source, any model

Installed

Copilot CLI

GitHub's agent

Not installed

Gemini CLI

API key only — individual Google sign-in discontinued

Not installed

Add your agent…

Any CLI, saved as a card

Your own CLI

If it runs in a shell, it gets a card.

Add any command as an agent and it appears in the picker beside the built-in ones, with a name and a mark of your choosing. It runs through your login shell in the session's folder, so pipelines, quotes and shell functions all work.

Add your agent

It gets a card in the picker, like the built-in ones.

Command

aider --model gpt-5

Run through your login shell, in the session's folder.

Name

Aider

Mark

Runs in the terminal, not on your phone

Your agent works here exactly like the built-in ones. What it can't do yet is appear as a chat in BoxDo on your phone.

CancelAdd

Record a support session

So we can build the chat mirror for Aider

1We make an empty folder
2You run one prompt
3You get a bundle

The prompt

Read notes.txt, then append a line saying 'reviewed' to it, then run 'wc -l notes.txt'…

Nothing is sent automatically — ever.
Every path is rewritten to /Users/dev/project.
Keys, tokens and email addresses are removed.
The sandbox folder is deleted when you finish.
Not nowStart

An agent of your own runs here, but it can't appear as a chat on your phone yet — that needs code written against a real recording. So there's a button for it: one short exercise in a throwaway folder, every path rewritten, keys and addresses stripped, and a bundle you read before you send it.

One drawing of one truth

A terminal cannot disagree with itself.

BoxDo Terminal used to draw its own chat next to the terminal your agent was already drawing. Two pictures of one conversation can quietly disagree — a line missing on one side, a different order on the other, and nothing to tell you which was right. So the terminal won. What the chat was genuinely better at, writing comfortably, moved into the bar below it.

So a session is four things: a window, your agent's own text, the files it touched, and somewhere to write back.

boxdo-ios — Claude Code
>the receipt card wraps badly at 320px — have a look
Read(ExpenseReceiptView.swift)
Grep(minWidth)
The amount and the split summary are in one HStack with no room to fall over. I'll let it wrap under 360pt.
Edit(ExpenseReceiptView.swift)
── ios/BoxDo/Features/Apps/ExpenseReceiptView.swift
var body: some View {
- HStack(spacing: 12) {
+ ViewThatFits(in: .horizontal) {
+ HStack(spacing: 12) { amount; splits }
+ VStack(alignment: .leading) { amount; splits }
Wrapped it with ViewThatFits, so it stays on one line where there's room and stacks where there isn't. Tests still green.
>
ExpenseReceiptView.swifteditedReceiptWrapTests.swiftnewreceipt-320.pngnewCLAUDE.mdlinked
boxdo-ios
main3Fableaccept edits1m 12s
Ask, or press ⌘S to write

Ten agents, one app

Claude CodeCodexAntigravity CLIKimi CodeGrok BuildOpenCodeCopilot CLIQwen CodeCrushGemini CLI

Identity

Two projects never look alike again.

Every project gets a colour and wears it. A strip above the field carries the project's name, and that colour runs through the field, the send button and the palette — so you always know which codebase you just told to delete something.

Dress it from the strip: ten Looks, painted or photographic backgrounds, a watermark, an emoji, a pattern, and a rename for the project itself. Hovering a Look tries it on the real bar before you commit to it.

Looks

Ink
Aurora
Dusk
Ember
Sea Glass
Velvet
Tape
Blueprint
Dotwork
Stencil
Only this project.Reset

Files

What it touched, where you can reach it.

Files your agent just wrote show up as chips between the terminal and the bar — created told apart from modified, and the files it only pointed at in an answer alongside them, images carrying a thumbnail.

Each one is draggable, so dropping it in Finder copies it and dropping it in a mail composer attaches it. Or Quick Look it, open it, reveal it, or hand it back to your agent as context.

Edit(ExpenseReceiptView.swift)
── ios/BoxDo/Features/Apps/ExpenseReceiptView.swift
var body: some View {
- HStack(spacing: 12) {
+ ViewThatFits(in: .horizontal) {
+ HStack(spacing: 12) { amount; splits }
+ VStack(alignment: .leading) { amount; splits }
Wrapped it with ViewThatFits, so it stays on one line where there's room and stacks where there isn't. Tests still green.
>
ExpenseReceiptView.swifteditedReceiptWrapTests.swiftnewreceipt-320.pngnew
boxdo-ios
Ask, or press ⌘S to write

The Studio · ⌘S

For the prompt that deserves more than one line.

⌘S lays a sheet of paper over the session: one column, the sentence you're writing lit, the rest stepped back, and the line holding its width at every text size.

Type @ to reach a file by name or drag one in from the tree, watch the word count, and send with ⌘↩. It's the same draft as the bar, so esc returns to it with your text intact.

Bookmark a prompt worth keeping and it comes back as a /command in any session.

boxdo-iosto Claude Code
214 wordsMediumSend⌘↩
boxdo-iosto Claude Code
ExpenseReceiptView.swiftios/BoxDo/Features/Apps/
ExpenseService.swiftios/BoxDo/Features/Apps/
ReceiptWrapTests.swiftios/BoxDoTests/
↩ to insert · esc to dismiss
214 wordsMediumSend⌘↩

Type @ and a few letters. Ranked matches over the whole project, the plain path inserted — nothing to quote or escape.

boxdo-ios — Claude Code
Find in Terminal
ViewThatFits
7/23↩ older · esc closes
>the receipt card wraps badly at 320px — have a look
Read(ExpenseReceiptView.swift)
Grep(minWidth)
The amount and the split summary are in one HStack with no room to fall over. I'll let it wrap under 360pt.
Edit(ExpenseReceiptView.swift)
── ios/BoxDo/Features/Apps/ExpenseReceiptView.swift
var body: some View {
- HStack(spacing: 12) {
+ ViewThatFits(in: .horizontal) {
+ HStack(spacing: 12) { amount; splits }
+ VStack(alignment: .leading) { amount; splits }
Wrapped it with ViewThatFits, so it stays on one line where there's room and stacks where there isn't. Tests still green.
>
boxdo-ios
Ask, or press ⌘S to write

⌘F searches the scrollback, which keeps 5,000 lines. Step through matches with the arrows, close with esc.

Reading and copying

Take the answer out without taking a screenshot.

⇧⌘C copies your agent's last response as plain text — read from the transcript, not scraped off the screen, so nothing arrives wrapped or truncated.

⌥⌘C enters copy-mode: pick a spot, extend the selection from the keyboard, copy. It drives the terminal's own selection, so it will also pick up and extend one you started with the mouse.

boxdo-ios — Claude Code
Edit(ExpenseReceiptView.swift)
── ios/BoxDo/Features/Apps/ExpenseReceiptView.swift
var body: some View {
- HStack(spacing: 12) {
+ ViewThatFits(in: .horizontal) {
+ HStack(spacing: 12) { amount; splits }
+ VStack(alignment: .leading) { amount; splits }
Wrapped it with ViewThatFits, so it stays on one line where there's room and stacks where there isn't. Tests still green.
>
ViewThatFits(in: .horizontal) {
HStack(spacing: 12) { amount; splits }
VStack(alignment: .leading) { amount; splits }
}
Copy mode↑↓←→ move · ⇧ extend · ⌘C copy · esc exit
boxdo-ios
Ask, or press ⌘S to write

Mission control

Run ten agents. Stay in control.

The session list reads like an inbox: every session shows its last exchange squeezed into one line — or You: … when your agent is the one waiting on you. ⇧⌘D opens the same picture across every project, sorted by who needs you, who's working, who's done.

boxdo-iosnow

You: the receipt card wraps badly at 320px

boxdo-web2m

Wrapped it with ViewThatFits — tests green

terminal18m

Catalog v8 signed and published

boxt-site1h

Ten themes, dark and light — copy updated

infra3h

Migration written, not applied

Needs you

boxdo-iosYou: the receipt card wraps badly at 320px

Working

boxdo-webWrapped it with ViewThatFits — tests green

Idle

terminalCatalog v8 signed and published
boxt-siteTen themes, dark and light — copy updated
infraMigration written, not applied

Privacy

Shown to you, not described to you.

Diagnostics are off until you turn them on. Two columns spell out what would be sent and what never is — and View Recent Events shows you the actual lines rather than asking you to trust the description.

Export Diagnostics writes a sanitized bundle you can read before you share it. What you and your agent wrote, terminal output, file paths and folder names are never collected at all.

One thing is on by default — which agents you have installed and how many sessions each has, never a name or a path. It has its own switch on the same pane.

Share anonymous diagnostics

Off by default. Helps us find the failures nobody reports.

What's sent

Event names and timings
Which agent CLI, and its version
Counts: turns, sessions, retries
Error names, update outcomes
Your BoxDo account id

Never sent

What you or the agent wrote
Terminal output, of any kind
File paths, folder or workspace names
Your name, email, or credentials
API keys and tokens
View Recent Events…Export Diagnostics…Show Log in Finder

Themes

Beautiful, down to the ANSI colors.

Ten themes, each in a dark and a light variant, applied to the whole app — terminal palette included. Fine-tune any of them and save the result as a theme of your own.

BoxDoCatppuccinTokyo NightNordRosé PineGruvboxEverforestKanagawaFlexokiGraphite
BoxDo
Catppuccin
Tokyo Night
Nord
Rosé Pine
Gruvbox
Everforest
Kanagawa
Flexoki
Graphite

Free forever

The app costs nothing, and it will stay that way.

Signed & notarized

Developer ID, checked by Apple. No warnings, ever.

Updates itself

Checked once a day. New versions install and relaunch on their own.

Keyboard-first

⌘K palette, rebindable shortcuts, everything reachable without the mouse.

Bring your agents home.

Download, drag to Applications, start talking.

Version 0.2.2

Building agents instead? Connect them to BoxDo via MCP →

Previous versions