A workspace for Claude Code and Codex sessions, on the Mac you leave on.
Treacle is a visual layer over the coding-agent sessions on your Mac. Every worktree and every session on one screen, a lamp that says who is working and who is waiting, and the questions as cards you answer in place. tmux and git worktrees underneath, so nothing is hidden from you. A Chrome app at the desk, the same app on your phone, so nothing is tied to a device.
Treacle is a visual layer over the coding-agent sessions on your Mac. Every worktree and every session on one screen, a lamp that says who is working and who is waiting, and the questions as cards you answer with a tap. tmux and git worktrees underneath, so nothing is hidden from you. The same app you use at the desk, on the phone in your pocket.
$ curl -fsSL https://treacle.dev/install | sh
macOS on Apple silicon. Needs tmux and an agent you already run. Self-hosted, one binary, no account. Then treacle setup on the Mac that stays on.
See everything. One worktree per ticket, one agent per worktree, and you are cycling through six tmux windows to find the one that stopped. Treacle puts them on one screen: a lamp per session, a subject line per worktree, the ticket and the PR, how much context and quota is left. The sessions waiting on you go to the top, with the question and its options as buttons.
Keep control. Every card has a box for answering in your own words. The mode chip cycles plan and auto. Send becomes stop while the agent works. Deleting a worktree with uncommitted changes makes you type CLOSE. And the raw tmux pane is one clicktap away, because it is the same pane: quit treacle and your shells are exactly where you left them.
Any device. Install it as a Chrome app and it lives in the Dock with a badge that counts the inbox. Open the same address on your phone and it is the same app, with push notifications for when you are away from the desk. Served over your tailnet from your own Mac. No cloud in the middle.
Any device. Add it to the home screen and the icon counts the inbox; a push finds you when a session needs you. Back at the desk it is a Chrome app in the Dock, the same app at the same address. Served over your tailnet from your own Mac. No cloud in the middle.
The same session, twice. On the left, what tmux shows. On the right, what treacle shows: tool calls as one-line rows, edits as real diffs, the agent's reply as rendered markdown, and the question as a card you can answer. Both are live. Type in either and the other follows.
Claude Code's hooks tell treacle the instant a session is waiting on you, so the lamp flips to needs-you before you would have noticed in the terminal. The question lands in the inbox with its options as buttons, and as a push notification with the same buttons if the app is closed.
Start a session with TREACLE_REMOTE_PERMISSIONS=1 and gated shell commands arrive as an Allow or Deny card with the full command shown. Ignore it and the terminal prompt takes over after two minutes, as it always did. Nothing is ever auto-approved.
An agent can also ask on purpose. Over MCP it can put up a choice, or a whole proposal with Approve and Reject, and block until you answer. Dismiss the card and it is told it was dismissed, not answered.
bun test packages/web
Split the folders table. Move quiet-folder state into its own table so a collapse never rewrites a repo row.
Two migrations, both reversible. No data moves.
Name a branch the Linear way and the session links its ticket, with the ticket's title and status once you add an API key. The PR comes from gh and shows its checks and review state. A plan the agent publishes pins under the header and ticks off in place as it works.
The strip at the bottom is the part you usually have to squint at: the model, the account, how many files changed and by how much, how full the context is, and how much of the five-hour and seven-day usage windows is gone. It turns amber past 80%.
Cursor-true tmux mirroring over control mode, in the same window. Select, Paste and Copy for the things a browser is bad at, and a key bar for esc, tab, the control keys and the arrows for when there is no keyboard. Interactive commands open here on their own. It is the same pane you would attach to from a shell, so nothing treacle shows you is a summary of something you can't see.
Cursor-true tmux mirroring over control mode. A key bar for esc, tab, the control keys and the arrows, because a phone keyboard has none of them. Select, Paste and Copy for the rest. Interactive commands open here on their own. On an iPad with a keyboard it is a place you can work from, not just check on.
The status line at the bottom is Claude Code's own. The key bar underneath is treacle's, and matters most on a tablet.
A session is a conversation. A task is a thing that has to be finished. The board holds the second kind, and it will not take a wish: every task needs a definition of done and, ideally, a command that proves it. Flip between sessions and board with one button in the header.
ClickTap start on a ready task and treacle creates a worktree from the base ref, writes the brief to .treacle/task.md, launches the agent you chose and sends the opening message. Watch it in the session feed or go and do something else.
The agent reports back over MCP: a note, a link, or done. Done runs the task's check command in the worktree and moves the task to review, where it waits for you with the evidence and a diff against base. Accept, or send it back with a reason.
Tasks can wait on other tasks, be blocked with a reason, and be given grants: things the agent may see. The board says what is running now, what is next up, what is proposed, what is blocked, and what got done today.
Open a task and you get what it is for, what would count as finished, the check that proves it, and every attempt with what it produced. The changes tray shows the files against base with a diff you can unfold.
Drafting one takes a title, a done-when, an intent, a check command, an agent and a base ref. The hint under done-when says it plainly: the board is not for wishes.
Every registered repo lists its worktrees as cards with a colour, the branch, the ticket and PR pills, and a one-line subject a small model writes about what is going on in there. Tabs are tmux sessions, busiest first, each with a lamp. Merged work shows purple at a glance.
Add a worktree with a branch name and a base. Add a tab with Terminal, Claude or Codex, and pick the account if you have more than one. Codex sessions get a feed and question cards of their own.
Deleting refuses while anything is running or uncommitted in there, says which, and makes you type CLOSE to override it. Folders with nothing going on for a day fold away behind one row.
It is one web app on your own Mac. Chrome installs it as a desktop app with its own window and a Dock badge. Your phone adds it to the home screen. Your iPad gets the terminal with a key bar. They all reach the same server over your tailnet, and none of them holds any state, so you can pick up on one exactly where you left off on another.
On the phone, the whole app. The inbox and its buttons, every session's feed, the board, worktrees, the terminal. The compose box types straight into the pane, so iOS dictation just works, and a mic button sends audio to whisper.cpp on the host.
A push finds you, and only when it should. Web Push from your own host, only while the app is closed, only for a session flipping to needs-you, a decision opening, or an agent calling notify. It carries the question and its options. Tapping it opens that session. While the app is open it chimes instead.
Talk to it. Tap the mic, speak, tap again, and the words land in the compose box for a glance before you send. Audio goes to the host over the tailnet and whisper.cpp transcribes it there. One command installs the model.
At the desk, a Chrome app. Its own window next to your editor, no address bar, the same inbox and feed and board. Wider, so the worktree cards carry their actions and the terminal view has room.
In the Dock, with a badge. The icon counts the inbox the same way the phone's does, and Chrome delivers the same push notifications when the window is closed.
One click to install. The icon at the end of Chrome's address bar. No download, nothing to update by hand: the app updates itself whenever the server does.
Setup is a walkthrough, not a checklist. It ticks off what it can do itself, asks about the two things that edit Claude Code's config, and does not call the host reachable until a device of yours has actually loaded the app. Re-run it after every update; it only changes what changed.
One file. It is the server, the CLI, the MCP server and the hooks. The installer puts it in ~/.treacle/bin, links it into /usr/local/bin when it can, and otherwise adds it to your shell's PATH once.
treacle setupSix things happen on their own: an access token, a tmux config, the web app, and a launchd service that keeps the server up across reboots. Then it asks which repos to manage and whether to wire up Claude Code. The last step is the only one that can fail, and when it does, setup walks you through fixing it.
The remote-access walkthrough has one screen per state. Not installed, not signed in, HTTPS certificates off in your tailnet, no other device on the tailnet yet. Each offers to do the fix, opens the right page, and checks again. If the Mac you are sitting at is the host, you can skip this and open it on localhost; come back to it when you want other devices in.
Setup ends with the URL, the token, and a QR code that carries the token in the URL fragment, so the token never reaches an access log and there is nothing to type on a phone. Then it waits, for up to two minutes, until a device of yours has loaded the app, and names the device that did.
In Chrome, the install icon at the end of the address bar puts Treacle in the Dock with its own window and a badge that counts the inbox. On the phone, Share then Add to Home Screen does the same. ClickTap the bell in the header once to allow notifications. The app updates itself whenever the server does.
Chrome on the Mac: one click, its own window, a Dock icon.
Safari on the phone: Share, then Add to Home Screen.
Bell on. The first session to stop shows up here.
TREACLE_REMOTE_PERMISSIONS=1 claudePer session. Gated Bash calls become Allow or Deny cards in treacle, with the command shown in full.
treacle voice installDownloads the whisper.cpp base model, about 148MB, into ~/.treacle/models. Needs ffmpeg and whisper-cpp from Homebrew.
treacle updateChecks treacle.dev for a newer build and installs it, hash and signature verified. The previous binary stays for treacle update --rollback.
treacle doctorSays where every step stands, including whether the tailnet has HTTPS and whether any device has reached the host.
~/.treacle/config.jsonAdd linearWorkspace and a personal linearApiKey and ticket pills show the ticket's title and status.
Treacle is a single Bun binary that owns a tmux server and the git worktrees under the folders you register. Agents run in tmux panes it created. The app talks to it over WebSockets and REST with a bearer token, on localhost or inside your tailnet. There is no desktop app to install and no server of ours.
One binary, one directory. The server, CLI, MCP server and hooks are the same executable. State lives in ~/.treacle.
Survives the things that happen. Restart the server and the tmux sessions are still there; the app reconnects and the timeline replays from SQLite.
Honest lamps. With hooks, a lamp flips to needs-you the moment Claude waits. Without them, the pane heuristics still give you working and idle.
Subject lines by a small model. Each active worktree carries one line about what is going on, written from the newest session, refreshed at most every half hour.
Files in. The + in the compose bar uploads a photo or file to the host and types its path into the prompt. You press Enter.
Previews out. An agent can proxy a dev server on the host into the session feed as a capability URL that lives for about six hours.
No. Most days it is a Chrome app in the Dock next to your editor. The phone is the same app at the same address, which matters when a session needs you and you are not at the desk. Nothing about it needs a phone.
No, it sits on top of it. Every tab is a tmux session on a server treacle runs, and the raw pane is one clicktap away in the app or one attach away in a shell. Anything the app cannot express, you do in the pane, and the feed catches up.
No. The server runs on your Mac, your devices reach it over localhost or your tailnet, and treacle.dev serves this page and the download. Push notifications travel through the browser vendor's push service, encrypted end to end as Web Push requires; the payload is opaque to anyone but your device.
treacle update asks treacle.dev for a newer build and installs it. The download is checked against its published hash and its signature before it replaces anything, and the previous binary is kept, so treacle update --rollback puts it back. The app shows a one-line banner when a newer build exists; on the phone, updating is one tap. "updates": "ask" | "auto" | "off" in ~/.treacle/config.json decides what happens. ask, the default, tells you and waits. auto installs it and restarts the server, but only when no agent is mid-turn. The check is a GET for a public file on treacle.dev that carries no token or identifier, and off turns it off entirely.
Only to reach it from another device. On the host itself it works on localhost with no network setup at all. For the phone and the laptop, Tailscale is the network: free for personal use, installed by setup with Homebrew if you like, and the reason no ports get opened.
Claude Code gets the most: status hooks, permission cards, the MCP tools and the transcript-backed feed. Codex sessions have a feed and their questions become cards. Anything else runs in a plain Terminal tab with the raw tmux mirror.
Every card has an "answer in your own words" box, and the compose bar types into the pane. A multi-part question opens in the session and is answered part by part. Interactive commands open the terminal instead.
After two minutes, or if no treacle client is connected, the normal terminal prompt takes over. Nothing is auto-approved. Dismissing a question tells the agent it was dismissed, not answered.
Not yet. Treacle runs on macOS on Apple silicon today. The client side is any browser that can install a web app.
Nothing. Treacle is free to use, personal or commercial, on machines you own or administer. The source is not open and the binary may not be rehosted. Point people here instead.
Your code never leaves your machines, because there is nothing for it to leave to.
Treacle has no backend, no accounts, no telemetry. treacle.dev serves this page and the download. That is everything it can see.
$ curl -fsSL https://treacle.dev/install | sh