Skip to content

What's New

  • Anything still running is pinned above the composer, not just sub-agents. A background Bash, a Monitor or a workflow could run for minutes behind a card scrolled far up the transcript, and the only hint was a static running chip — which meant “no completion notification was found in the transcript”, not “we checked”. A killed task kept that chip forever. The bar now names each running thing, what it is doing right now, how long it has been going and how many steps it has taken, and it clears when the work actually ends. It renders nothing when nothing is running.

    Two limits are worth knowing. The signal is per-process, so after a server restart the bar is empty until something new starts — which is right rather than a gap, because Paddock stops the fleet without waiting for jobs and those tasks really are dead, unlike the old chip that went on claiming a killed one was alive. And it is driveMode: session only: the CLI runtime reads the transcript file, and these are stream-only control messages that never reach it.

  • A chat that is still working no longer reports itself idle. This is the fix proper. Background work outlives the turn that launched it, so the moment the reply landed the sidebar’s streaming dot, Home’s in-flight badge, the running-only filter and the fleet strip were all told the session had stopped while minutes of work carried on. They now read the truth. The composer is deliberately not locked while only background work runs — an hour-long Monitor should not make the chat unusable — so “this chat is busy” and “a model turn is in flight” are now two different questions with two different answers.

    Still open: sending into a chat that has live background work is not solved yet (#806). The composer is unlocked, but a message sent while a background task is still running can sit waiting on the runtime’s collision guard for up to five minutes before the new turn starts, and Stop still means end the session, which kills the work you were watching rather than interrupting the turn.

  • Fixed from 0.68: an imported directory appears in the sidebar straight away. Discover’s success screen said “they are in the sidebar now” while the sidebar still said “No projects yet” until you reloaded the browser. The list refreshes the moment the run finishes, and the results screen — including the rows that failed and have something to say about it — now stays up until you leave it rather than being unmounted by its own refresh. (Shipped to npm as 0.68.1, which has no git tag or release page of its own.)

  • A new instance opens on Discover instead of an empty project list. It reads your Claude Code history, works out which directories on this machine you have actually been using claude in, and offers them as projects — with conversation counts, last-used dates and git remotes, so you can tell them apart. Tick the ones you want, press Import N projects, and each becomes a project pointing at that directory with its conversations brought across as resumable chats. It stays in the sidebar afterwards; it is not only a first-run screen.
Discover offers the directories you have actually been using Claude Code in. Importing links the directory and copies its conversations across — your own history is never moved or deleted.

The heuristic is most of the feature. A naive scan of a real developer machine surfaces around 166 transcript folders, roughly 150 of them throwaway temp-dir sessions, plus /, ~/Downloads and /tmp. Discover drops those, along with system paths, Paddock’s own directories, your home directory itself, and anything already a project. Two rules are soft — no git repository, and outside your home — and appear as toggles below the list, but only when relaxing one would actually reveal something. A line above them says how many went each way, so “why 5 and not 12?” has an answer on screen rather than looking like a bug.

Rows expand lazily, fetching a directory’s sessions only when you open one, and their tickboxes go three-state so you can take some conversations and not others. A directory whose transcripts record a different spelling of its path — a symlinked home, /var against /private/var — is warned about before you import, that being how an import otherwise comes back mysteriously empty. Rows fail independently and each says why: a project that was created but whose chats did not come across is called out in amber rather than green, because it leaves a real empty project behind.

  • --here is removed, and nothing replaces it — because nothing needs to. It opened the directory you were standing in as the workspace. Discover covers the job it was built for, from one instance with as many linked directories as you like, which is also the only shape that can run as a background service (#796): a launchd agent hosts one instance, so three directories opened with --here were three instances of which it could run at most one.

    There is nothing to migrate — the flag is now rejected like any other unknown option, and a run that used to resume a directory now starts the ordinary ~/.paddock instance. If you did open a directory with it, its state is the .paddock/ and .chats/ folders inside it: add the directory through Discover to bring its conversations across, then delete those two folders and the two lines --here added to your .gitignore.

  • Where you run paddock from no longer affects anything. --data-dir (or PADDOCK_DATA_DIR) is the only thing that picks which instance you get. The startup line that used to name a workspace now names the data directory.

  • Importing a directory writes nothing into it. No .paddock/, no .chats/, no .gitignore edit, no CLAUDE.md — the project record and its transcripts both live in the data dir, and the project simply points at the path. Under the default claude.transcripts: own, your ~/.claude transcripts are copied with their timestamps preserved, never moved or deleted, so your terminal claude is unaffected. Under claude.transcripts: host nothing is copied at all — the project reads your ~/.claude folder directly, and adopting only registers the sessions that are already there. Working in chats sets out the difference.

  • Paddock can keep itself running. paddock service install registers the instance as a per-user launchd agent on macOS or a systemd --user unit on Linux, so it starts when you log in rather than when you remember — with uninstall and status alongside it. Nothing else needs installing: the unit runs the Node binary you already have, by absolute path, and restarts on a crash but not on a clean exit. Keeping Paddock running on your laptop covers it.

0.67 — A design system, four themes, and the fleet readout

Section titled “0.67 — A design system, four themes, and the fleet readout”

The UI had no design document and no token layer. Colour was addressed by palette step in 1017 places, with 722 hand-written dark: pairs, and a single ramp tuned against a dark canvas had been reused unchanged against a light one — which is why light mode failed WCAG AA at its most-used tokens. 0.67 replaces the whole colour layer, then builds three more themes on top of it.

  • Light mode now passes AA. Help text and field labels went 3.75:1 → 6.71:1, muted text and placeholders 2.81:1 → 4.90:1, and the primary button’s white label 4.17:1 → 5.53:1. Light and dark ramps are derived separately in OKLCH now rather than one being reused for both, and the mid-steps lose the high-chroma tan cast that made light mode read muddy.

    Contrast is enforced rather than asserted: a test parses the real stylesheet and fails the build if any text-on-surface pair drops below 4.5:1 (3:1 for control boundaries) in either mode, or if a colour falls outside the sRGB gamut. Along the way dialogs started trapping and restoring focus, menus gained arrow-key navigation, prefers-reduced-motion is honoured throughout, and chat messages no longer animate in — a 250ms fade-with-translate on something that happens a hundred times a day.

  • Four themes, in Config → Appearance, applied instantly. Foundation is the neutral base — warm ground, terracotta accent. Parchment is a 90s RPG menu: wine chrome, brass fittings, corner brackets, an old-style serif. Terminal is green phosphor and ANSI in the dark, greenbar and ribbon ink in the light. Sci-Fi is a deep-space ground and luminous cyan. Both light and dark are designed for each theme, not inverted from one another, and every theme is contrast-guarded in both modes by the same build-time check — which now also fails both ways, on a theme registered with no stylesheet and on a stylesheet no one registered.

    It is a per-browser choice: no save, no restart, nothing an operator sets for everyone, and it survives a reload without a flash.

The same screen — a project’s Settings tab — in each of the four, all in dark mode:

Foundation: a warm near-black ground with a plain sans-serif, terracotta on the new-chat button and the Save changes button, and the project header sitting flush on the page ground. Unread chats carry terracotta dots and each project shows an unread badge in the sidebar

Parchment: the project header becomes a wine-red band, Save changes is a brass pill, the settings card is drawn with corner brackets, and every label is an old-style serif in small caps — the section heading "Identity & Metadata" carrying an italic ampersand. Unread chats are marked in amber against the brown ground

Terminal: green phosphor on near-black, with the sidebar, labels and field text all in the same green, and the settings card outlined in a thin phosphor rule. Unread dots and the sidebar's project badges glow the same green

Sci-Fi: a deep blue-black ground with luminous cyan on the new-chat button, the Save changes button and the active tab underline, and the project's tag chips set in letter-spaced uppercase. Unread dots and sidebar badges pick up the same cyan

  • Pick any colour for the accent and it stays readable. The picker takes a colour and nothing else. The theme supplies its own saturation and its own target contrast, and the lightness is solved to clear that floor — so the colour you pick is re-solved against whichever theme and mode you are in, rather than used at whatever lightness it happened to arrive with. Flip to dark and it is solved again. There is a spectrum strip, ten named hues, and a Theme’s own button to put it back.

    Optionally the same colour tints the page ground — None, A little, More — which is the fast way to tell two Paddock instances apart at a glance. No colour theory is exposed anywhere in the UI.

    PADDOCK_BRAND_ACCENT still composes: with no colour picked, the solver reads the hue your brand colour produced and re-solves it against the active theme, so it is now a hue seed rather than a literal colour. A colour you pick yourself overrides it.

The Appearance section of the Config screen: four theme cards each previewing their own chrome, a full-spectrum strip to drag along, ten named hues from Ember to Rose with a "Theme's own" reset, a None / A little / More control for tinting the background, and a live preview row showing buttons, a link, an accent chip and the status hues the theme keeps for itself

Change the accent and the whole UI follows — and a theme changes ground, type and chrome together. Applies immediately, per browser, with no save step.

Also fixed here: in dark mode the primary button’s fill lightened on hover, taking its white label from 5.53:1 to 4.17:1 — below AA, on hover, on the most-clicked control in the app. Hover raises contrast in both modes now.

  • A live strip above every screen says what the herd is doing. How many turns are in flight fleet-wide, how many chats are holding a reply you have not read, and a channel per running turn carrying its project, a live elapsed clock and a segmented context gauge. Longest-running first, up to three channels depending on the width of your window and an honest +N for the rest — the counts themselves stay exact. Clicking a channel opens that chat.

    Two of those did not exist anywhere in the UI before. A turn that had been going forty minutes and one that started eight seconds ago looked identical, and context pressure was visible only inside the chat it belonged to — by which point you had already opened it. An idle fleet costs nothing: no timers, no requests. While something is running it refreshes the chat names and context fills every thirty seconds, and the only thing that animates is the clocks, because a persistent readout is on screen 100% of the time and anything decorative in it is decorative forever.

    (Since 0.69 the strip also counts chats that are only running background work, which have no turn to time — those channels show —:— where the clock would be.)

  • Home’s empty states are invitations, and the Config screen is readable. A quiet workspace used to render five near-identical rounded boxes down one viewport, four of them dead ends, with the first two saying the same thing twice. The two attention feeds now collapse into a single “All caught up” panel when both are empty — one state, not two — and it is the only thing on the screen carrying a primary action. It is deliberately not shown while the feed is loading or after it errored, because claiming all is caught up before the answer arrives is a lie the reader acts on. The remaining empty states say who fills them in and when: OVERVIEW.md and CHANGELOG.md are written by the post-turn sweeper, not by hand.

    On Config, one measure replaces four unrelated left edges, fields became rows instead of a ragged two-column grid, everything routes through the same card and control primitives as the other settings screen, and the dirty marker no longer shoves an edited field out of its own track. The section rail used to vanish below 1024px, handing you back the 5,500px scroll its whole flat shape was justified by; it runs horizontally under the filter at those widths now. The twenty amber env chips are quiet, because being set from the environment is a fact about a field rather than a warning about it. The restart banner stays loud. It earned it.

  • A file staged while a turn was running no longer rides the next message. Attachments were consumed by sending and never by queueing, so a file staged mid-turn sat in the tray and went out silently with whatever you sent next. Attachments now travel with the queued message, every window sees them, and Stop hands them back.
  • Reloading mid-turn no longer eats the reply. A remount fetched the transcript and applied it wholesale, throwing away every frame that arrived while the fetch was in flight — losing the assistant’s entire reply and leaving a sub-agent card spinning on “running” until another reload.
  • The sidebar unread badge can always be cleared. It counted deleted chats, so it could read 3 with one chat left and no way to reach zero. Deleting a chat now takes its bookkeeping with it, and an instance already stuck heals itself on the next load.
  • A new project with an old project’s name starts empty. Re-creating “Foo” used to inherit the deleted Foo’s run history and a phantom unread badge.
  • Archiving a chat silences it everywhere. It used to count toward the sidebar badge while being excluded from Home’s Unread feed.
  • Three ways a queued message could be silently lost are fixed. The queue — the chip holding what you type while a turn runs — deduped on a timestamp from your browser, so one fast clock destroyed every later queued message on that chat. It also drained from only one of the eight places a turn can end, so anything queued behind a /compact, a trigger or a background sub-agent sat stranded until a later message flushed it.
  • A second tab merges instead of overwriting. The queue is one shared slot per chat. Previously a second window replaced the first one’s message, and that client then watched someone else’s text appear as though they had typed it.
  • Stop returns your queued message to the composer rather than sending it.

0.66.0 — Config screen, and a new default port

Section titled “0.66.0 — Config screen, and a new default port”
  • The instance Config screen is now navigable. Forty-seven settings that rendered as one 5,508-pixel column get a section rail with counts and scroll-spy, a live filter, and a Modified only lens. It follows VS Code’s settings screen rather than tabs, and that is the argument: tabs partition, which is exactly what defeats a search. The filter matches labels, keys, help text and environment variable names. Env-overridden settings carry a chip, explained once in a legend rather than beside twenty fields.

The redesigned instance Config screen: a section rail with per-group counts down the left, a live filter and Modified-only toggle across the top, an env-override legend, and a dirty dot marking the one group holding an unsaved edit

One document, filtered and jumped. Searching by environment-variable name is the case tabs would have made impossible.
  • Breaking: the default port moves from 4000 to 7233. Setting PORT, port: or --port changes nothing. If you rely on the default, update your reverse proxy, docker run -p, Kubernetes targetPort and SSH tunnels — or pin PORT=4000.
  • Both on-disk formats declare a schemaVersion. An older build used to drop keys it didn’t recognise and write the file back without them. A config file from the future now refuses to start; a project file is skipped loudly. Nothing on disk changes — the current shape is version 1.
  • Deleting or reverting a chat stops the turn first. claude writes the transcript itself, so unlinking it mid-turn didn’t delete the chat — the live process wrote itself back, stripped of history. Promote lost it from both projects.
  • The UI says “adopt” rather than “import” — where the transcripts are your own ~/.claude, the sessions offered are already there and the action only registers them. Your originals are never moved or deleted.
  • A running sub-agent keeps its place in the bar. Backgrounded sub-agents pair within milliseconds, so one was stamped with a final duration that kept climbing.
  • On driveMode: batch only, deleting the chat you just finished no longer misfiles your next message into a new session.
  • An agent can convert its own notebook project to a repo-backed one. Without an MCP verb it had to stop and ask, or create a second project and abandon the first — losing every chat in it. promote_project clones, re-points the working directory and re-registers against the existing chat store. A failed clone rolls back.

0.64 — Linked directories, managed and unmanaged

Section titled “0.64 — Linked directories, managed and unmanaged”
  • path: links a directory that already exists, used in place. No copy, no clone: your checkout keeps its history, branches and remotes. Paddock writes nothing into it, and deleting the project never touches it.
  • Two axes replace one flag. Managed means Paddock curates the project’s own files; unmanaged means you version-control the content yourself. Whether a git repo sits behind it is a separate question. repoBacked is removed from the API response.
  • The Changes tab reports on the code, not the notes — it had been reading the metadata directory.

0.63 — Host plugins and MCP server fidelity

Section titled “0.63 — Host plugins and MCP server fidelity”
  • A plugin installed in Claude Code now works here. Sharing instructions brings its commands, agents and skills; sharing MCP servers brings its servers too, each allow-listed automatically — without that they connect and have every call denied with no prompt.
  • headers and type on an inherited MCP server are carried through rather than stripped, which matters because a stored OAuth token is keyed on a hash including both.
  • On driveMode: batch, a credential declared in mcpServers: is readable in process arguments by any local user while a turn runs. Paddock can’t fix this from its side, so it warns at startup. The default session mode is unaffected.

0.62 — Granular host Claude inheritance options

Section titled “0.62 — Granular host Claude inheritance options”

Paddock sits next to Claude Code state you already have: transcripts, a login, an MCP server or two, a curated CLAUDE.md. Until this release it reached all of that through one lever — which Claude home it pointed at — so moving it for one reason changed four others. That is how a single week produced data loss, an invisible macOS login, and a delete that destroyed real terminal history.

  • Five independent keys, each answering whose X does this instance use?

    claude:
    transcripts: own # own | host — default own
    credentials: host # own | host — default host
    instructions: own # own | host — default own
    hooks: own # own | host — default own
    mcpServers: own # own | host — default own

    own is Paddock’s, isolated inside the data dir; host is this machine’s Claude Code. Omit the block for full isolation apart from your login. What Paddock touches on your machine states the guarantee in one place.

  • ⚠️ If you keep a curated ~/.claude/CLAUDE.md, read this one. instructions defaults to own, so your user-level CLAUDE.md, agents/, commands/ and plugins/ are not loaded; every release before 0.62 bridged them in unconditionally. Set instructions: host to keep the old behaviour. Each project’s own CLAUDE.md is loaded in every mode and is unaffected. The change bites on the CLI paths — the sweeper, triggers and driveMode: batch — where those files did still apply. (0.64 raised the startup notice to a warning, so you are now told.)

  • Host settings.json hooks no longer run inside Paddock turns. Every hook you had ever configured used to run here with no way to turn it off. hooks: host restores them; the rest of that file still applies either way.

  • Your own MCP servers can reach Paddock two ways. claude.mcpServers: host attaches what is already in your ~/.claude.json. A sibling mcpServers: block declares servers to Paddock itself — the answer for a container with nothing to borrow — where env:VAR_NAME references keep tokens out of a git-tracked file.

  • Deleting a shared chat releases it instead of destroying it. Under transcripts: host a Paddock chat and a claude --resume in the same directory are the same file, so delete no longer means rm — the transcript is your history, not Paddock’s copy.

  • CLAUDE_HOME and --isolated-claude-home are removed, replaced by the block above. CLAUDE_CONFIG_DIR still works as “put Paddock’s home here”, but a value resolving to your ~/.claude is now a startup refusal rather than a silent re-coupling. No migration needed.

Section titled “0.61.1 — CLI login, and symlinks into your Claude home”
  • Paddock no longer plants anything in a Claude home it doesn’t own. It used to redirect a directory’s transcripts by replacing ~/.claude/projects/<encoded-dir> with a symlink to the workspace’s .chats/. It skipped directories you already had history in, but not empty ones — which was exactly what --here (removed in 0.68) was usually pointed at. From then on every claude session in that directory was written into Paddock’s store, so deleting .chats/ took real history with it. One person lost 30 transcripts this way.

  • On a Mac, your existing Claude Code login works again. Claude Code files its Keychain entry under a name derived from whether CLAUDE_CONFIG_DIR is set, so once Paddock pointed at its own Claude home a perfectly good login went invisible and every turn failed with Not logged in. A Keychain entry can’t be bridged the way a .credentials.json can, so with no token in your environment the CLI now runs against your own ~/.claude. (0.62 removed --isolated-claude-home; claude.credentials and claude.transcripts decide this now.)

  • A first run with no credentials prints a message, not a crash. It used to emit several screens of stack trace containing the whole sweeper system prompt, four times, with the useful line forty lines down.

  • Transcripts move out of ~/.claude into Paddock’s data directory. They were the last state living outside it, reached by planting symlinks into your Claude home — and the code doing that would, on every agent registration, copy your transcripts out and delete the originals, inside a bare catch. Paddock now keeps its own home under the data dir and only ever reads ~/.claude.

  • Four turn-level fixes. Appending to a queued message no longer discards the addition; Stop works on a /compact, where slash-command turns had never registered a cancellable id; marking the chat you are reading as unread survives its own turn landing; and the sidebar stops flashing to skeletons twice per turn.

  • Paddock is MIT licensed, and the packaging now says so. There was no licence file and no license field, while the publish script defaulted it to MIT — so every release told npm one thing while the source granted another.

0.59.1–0.60 — npx install, --here, and confirmed adoption

Section titled “0.59.1–0.60 — npx install, --here, and confirmed adoption”
  • npx @edspencer/paddock starts an instance in one command — server, web UI and Claude Code runtime, no Docker and no clone. It starts quiet, says where it put your data, and warns up front rather than failing on the first turn.

  • --here opens the directory you are standing in as the workspace, rather than creating a project somewhere else. It creates .paddock/ for state and .chats/ for transcripts and adds both to your .gitignore; later runs resume with no flag. The model is git init, with .paddock/ as .git.

  • Adoption asks before it takes anything. The old button imported everything on one click and could not be undone. It now opens a dialog listing candidate sessions grouped by source directory — the source path being the detail that makes “these are from a scratch copy, not my checkout” visible before you commit — and a successful adoption offers Undo.

  • It stops offering chats that were never yours. Paddock’s own curation runs were being offered as terminal history, and a same-named directory anywhere on disk counted as your checkout; a repo-backed project now requires the git remotes to match.

  • Published with provenance — releases go to npm from CI through OIDC trusted publishing, with a signed attestation tying each version to the commit.

  • The CLI got quiet and explains its failures. A first run printed about thirty lines of boot logging, scrolling the URL you wanted off the top; it now prints nine, with --verbose to opt back in. --open launches the browser once the server is listening, a port clash is a sentence rather than a stack trace, and --help says where your data lives.

  • Paddock tells the agent what it is rendering into. It injected no system prompt of its own, so Claude ran on its stock preset — written for a terminal. Nothing said that replies render as Markdown in a browser, that a bare #123 is dead text, or that a tool exists to put an image on screen. An audit of the hundred most recent chats on the dogfooding instance found 4,440 bare #123 references against 155 markdown links, and 194 images read with none ever shown to the user.
  • Two rules, and you can replace or silence them. Show, don’t describe, and make clickable things clickable. Set environmentPrompt: to your own text to replace it, or to an empty string to append nothing.
  • npx @edspencer/paddock — no Docker, no clone. The package is synthesised from built output rather than being a workspace package, so no future publish can fire an internal package at the registry. Source maps are stripped, taking it from about 22 MB to 2 MB.
  • The claude CLI was never a prerequisite for chats, whatever CONTRIBUTING.md said — they run through the SDK, which resolves its own bundled binary. Only the sweeper, triggers and driveMode: batch shell out.
  • PADDOCK_SCRATCH_DIR is gone, and an instance still setting it boots and ignores it. Paddock reads config by name rather than validating a schema, so a removed key is never looked at — and a typo’d key is equally silent.
  • Bring the terminal claude history you already have into a project. When a workspace has adoptable sessions, a button appears above its chat list; one click and they arrive, carrying an Adopted badge and their original timestamps, so a conversation from three weeks ago sorts where it belongs rather than collapsing to “today”. Your ~/.claude history is copied, never moved. The count is live rather than a dismissable prompt, and there is a headless equivalent for when the transcripts and the server don’t share a filesystem.
Seven terminal sessions adopted into a project in one click. The dates are the original ones — imported chats sort by when the conversation really happened, not when you imported it.

An imported chat open in Paddock. Every row in the chat list carries a small terminal icon marking it as imported, and the message box below reads "Message Claude…"

  • Detection is forgiving about where your checkout lives. A repo-backed project matches any transcript folder whose recorded working directory has the same checkout name, so history from a clone at a different path still comes over. The working directory is read out of the transcript rather than decoded from the folder name, because that encoding is lossy — /a/b-c, /a-b/c and /a/b/c all collapse to one folder. Empty and slash-command-only transcripts are held back as noise and reported separately, so a lower count always has an explanation.

0.54 — The “keeper” rename, and Home’s attention feeds

Section titled “0.54 — The “keeper” rename, and Home’s attention feeds”
  • The UI says Claude. Paddock is a thin layer over Claude Code, and the “keeper” persona invented a second actor that does not exist — you were messaging Claude the whole time. The composer says Message Claude…, Settings has a Claude section, and where a sentence didn’t need an actor the word is simply gone.

  • Breaking: the keeper names are gone from config, env and the API, with no aliases. If you set either of these, rename them:

    beforeafter
    PADDOCK_KEEPER_DRIVE_MODEPADDOCK_DRIVE_MODE
    PADDOCK_KEEPER_NATIVE_PROMPTPADDOCK_NATIVE_PROMPT

    In paddock.yaml, keeperDriveModedriveMode. An instance still setting the old key falls back to the built-in default quietly, so check yours. On GET /api/models, keeperDefaultdefaultModel.

  • Home leads with what needs you: running chats, then unread. It used to open on a list of recent chats — the same list the sidebar already shows — so the front door duplicated the furniture and buried the signal. The root’s Home is fleet-wide; a project’s is scoped to itself. Running state is read from the live session hub rather than guessed from timestamps, which is also what fixed the in-flight badge: watching the running set is now itself a reason to hold a socket open.

The root workspace's Home, leading with a Running section and then an Unread section listing 88 chats from across every project, each tagged with the project it belongs to and how long ago it replied

  • OVERVIEW.md renders on Home beside CHANGELOG.md, both collapsible. The old Overview card is gone, and the New Project button moved to the sidebar’s Projects header.
  • Foreground sub-agents stopped duplicating themselves into the transcript, and a live bar above the composer now shows each running sub-agent’s latest step — tapping one scrolls its card into view. Liveness comes from the sub-agent’s own transcript, so a parent finishing its turn no longer makes a working sub-agent look idle.
  • A chat can no longer be bound to the curator’s transcript. For a notebook project the sweeper shared a working directory with Claude, and since a sweep is scheduled after every turn the two raced for the same session directory — so curation text could stream back as the reply, and the chat could disappear from the project’s list entirely.
  • The sidebar’s Home link carries the same unread badge as every project row. 0.52 reduced the sidebar to a single Home link, and that link stayed mute — the root is a workspace with chats of its own, yet it was the one row that could never tell you something had come back. It now shows an accent pill counting unread replies, a spinner and count for turns in flight, and nothing at all when quiet, using the same component and accessible labels as a project row. In 0.53 the in-flight half only appeared once you had opened a chat, because nothing held the socket open until then; 0.54 fixed that.
  • Home also costs one request less. The project list used to be followed by a second full fetch of the root workspace, from which everything but a few metadata fields was thrown away.

Everything from 0.52 back to 0.29 lives on What’s New — earlier releases: subtree actions and the one-front-door sidebar, the root becoming a workspace, scratch being retired, driving Paddock from outside over MCP, per-message fork and revert, attachments, streaming, unified triggers, and the rest.


Maintaining this page: add a short, user-facing entry here whenever you cut a release (see RELEASING.md). When this page gets unwieldy, move the oldest entries to the archive page verbatim — the archive is append-only and its entries are never rewritten.