# Changelog All notable changes to Caprock. Format: [Keep a Changelog](https://keepachangelog.com/). Versions map to the roadmap phases in `.ai/09-execution-plan.md`: **v0.1.0** = Observe, **v0.2.0** = Control, **v0.3.0** = Orchestrate. **v0.4.x**/**v0.5.0** are post-Orchestrate polish (plan-limit windows, orchestrator-lifecycle fixes, Homebrew formula, first-run UX). ## [Unreleased] Changes waiting for the next release are one file each in `changes/unreleased/`, assembled into a version section here by `scripts/changelog.py` when a release is cut; `scripts/changelog.py preview` prints that section now. The format is in `changes/README.md`. ## [0.175.0] - 2026-11-07 ### Added - **machines:** a prompt on another of your computers can be approved or denied from the app's notification, as one on this computer can (macOS and Linux); the answer goes to that computer through the link, and a prompt answered there first takes the notification away. - **machines:** the Cost screen has **This Mac / All computers**: with another computer linked, *All computers* shows each computer's spend, priced with its own table, and the total of those that answered. A computer that did not answer is named as not counted, never as $0. - **machines:** a linked computer's access is now bound to that computer's own key, with nothing to do: a copy of it taken off that computer works from nowhere else. - **docs:** `docs/machines.md` says what the hosted relay measured, how and when to run your own relay, and how to measure a link between two computers. - **storage:** The status strip at the bottom of the window shows how far compression has got (*Compressing · 40% · 224.6MB saved*), and once it has caught up and packing the file would free a meaningful amount, offers *Pack database · ~85 s*. A click opens the details: how long it takes and what it frees, both estimated from this database, that sessions keep running and new events wait, and **Pack now**. Every event that arrives during the pack is recorded when it ends. The pack shows a progress bar measured from what SQLite has written. `GET /v1/storage/pack` reports the job and the pack, `POST` starts one, and `GET /v1/storage`'s `compression` gains the job's progress. ### Fixed - **storage:** Compress tool output now works on a computer whose agents never stop. It waited for 30 minutes with nothing recorded, which agents running around the clock never leave, so with the setting on all night it compressed nothing. Its steps — and the base64 compaction's, and incremental vacuum's, which give free space back to the disk — now run whenever writes pause for 5 seconds, give way to any write that arrives, and rest nine times as long as each step took, so they use at most a tenth of one core. ## [0.174.1] - 2026-11-07 ### Added - **machines:** `GET /v1/machines` says what each linked computer's channel has cost the relay (`traffic`: messages and bytes each way since the daemon started or paired it), and `bench/peer.mjs --idle N` measures a window left open — so the hosted relay's free-plan headroom is read, not guessed. ### Fixed - **ui:** the Agent panel's header shows the session's portrait again: the face you picked for it (a duck, a crown, a pumpkin…) or its own, large, where 0.174.0 drew only the agent's mark. A click on it still picks the face, and the mark is a small badge on its corner, so Claude and Codex still tell apart. The header is symmetric: the portrait is as tall as the figures beside it, so both columns start and end on the same lines; the subagents' faces sit centred beside the portrait in at most two rows (past eight, seven and a *+N*); and when the state and the permission mode wrap under a long name they stand at the left, not over the figures. The *1 working · peak 4* line now floats under the faces on hover instead of holding empty room under them. - **machines:** after the other computer's owner pressed Allow, the sidebar, Now and New agent kept saying "waiting for Allow" until Settings → Computers was opened, and the next look came a minute later. A computer that lets this one in — a socket opens, a request is answered — is now asked again by itself, one that waits for Allow is looked at again after 5 s, 10 s, 20 s…, and the same clears "removed" when that computer knows this one again. In the two-daemon smoke the laptop learned of the Allow about 3 s after it. - **machines:** a prompt said on another computer while its sessions were being read could miss the one list for up to 10 s: the read from just before it was kept as fresh. Such a read is now answered but not kept. - **machines:** after another computer's Caprock restarted, this one kept asking it for frames past its new count, got a reset on every reconnect, and lost the prompts said there while the link was down; it now resumes from where that computer stands. A computer that lets the watch in and hangs up at once is waited out (2 s doubling to 60 s) instead of re-dialled every 2 s. ## [0.174.0] - 2026-11-06 ### Added - **plugin:** Caprock is a Claude Code plugin. `claude plugin marketplace add dspv/caprock`, then `claude plugin install caprock@caprock`, adds the read-only `caprock mcp` server for every project. Its launcher finds `caprock` even when the desktop app put none on your `PATH`, and when Caprock is not installed it says so, with the install link, instead of a bare "failed". It downloads and sends nothing. - **ui:** the file tab reads more kinds of file. Markdown and HTML get *Rendered* / *Source* / *Split*, Split showing the source and the page side by side, their scrolling kept together for Markdown; the choice is remembered. An HTML page is drawn in a sandboxed frame that runs no script and loads nothing from the network, its own stylesheets and pictures read from the project. CSV and TSV files show as a table, pictures (SVG too) as themselves, and code and config files are syntax-highlighted by a part of the app loaded only when such a file is opened; a file over 256 KB stays plain. ### Changed - **ui:** the Agent panel's header puts the pictures at the left and the figures at the right. The agent's mark is a large tile (still the button that picks the session's face), and beside it the subagents' faces in a grid of four columns: the working in colour, the recently finished grey, a *+N* tile past eight. The small mark on the name row is gone in this look, so the agent is drawn once. Burn, tokens and cost stand right-aligned, under the pictures in a narrow panel. Hovering the grid shows *1 working · peak 4*, which opens the last hour's chart, and the three dots that switch looks. This *Matrix* look is the default and replaces *Crew*; a viewer who had picked the crew gets the matrix. *Faces as chips* and *Strip* stay. ### Fixed - **ui:** the Agent panel (⌘I) no longer says $0.00 for a session on a model Caprock has no price for, such as Kimi or DeepSeek after a limit moved the session there. Its cost figures read — with the model named on hover; a session with some turns priced shows the priced sum with a + (*$1.84+*) and says on hover how many turns are not in it. - **daemon:** "Return after the reset" survives a restart. A session that Caprock moved to another provider or sign-in at a usage limit still goes back once the limit resets, even when Caprock restarted in between; a return more than an hour overdue at the restart is dropped. ## [0.173.0] - 2026-11-06 ### Added - **sidebar:** on a large database with *Compress tool output* off, the sidebar's bottom block says so in one quiet line — for example *Database 2.5GB · compressing frees about 1.0GB*, both figures from your own database, the saving an estimate from a sample of your tool calls. It shows only when the estimate is at least 300 MB. A click opens the switch in Settings → Storage, lit, and turns nothing on; × hides it for 30 days. Folded, it is a database icon with a dot. It goes as soon as compression is on. - **storage:** *Compress tool output*, under Status → Storage, stores tool calls and their results older than a day zstd-compressed, a few hundred rows at a time while Caprock is idle — never at start and never while anything is being recorded. Prompts and replies stay as they are, so search is unchanged. Off until you turn it on; the panel says how much smaller your own database would be (an estimate from 2,000 of your tool calls), and once it runs, how much it is. On a copy of a 2.5 GB database it saved 818 MiB of tool output, and the file went to 1.5 GB after the one VACUUM that follows, which runs only when the disk has room for it. Turned off, the same job restores the rows. An older Caprock refuses to open the database after this upgrade (with a one-line message, changing nothing). Proposed and measured by [@SergeAx](https://github.com/SergeAx) in #672. - **ios:** scanning the computer's pairing code with the iPhone's own Camera app now opens Caprock for iPhone and pairs it, instead of opening Safari and asking you to scan again inside the app. Only the pairing link opens the app; every other `m.caprock.dev` address still opens in Safari, and without the app the link opens the phone's page as before. The link is read on the phone; nothing new is sent anywhere. Needs the next App Store build of the app. - **phone:** m.caprock.dev in Safari on an iPhone shows Apple's banner, *Caprock · Open in the App Store*, so someone who scanned the pairing code with the camera learns that Caprock for iPhone exists. Only the phone's page carries it; other browsers, the app itself and a home-screen copy never show it. - **ui:** Settings → Use on your phone offers Caprock for iPhone in a clear row, *iPhone? Caprock for iPhone adds notifications, voice and photos.* **Get it on the App Store** shows a QR the iPhone's camera opens the App Store with; before, a small grey link opened the listing on the computer, where it installs nothing on the phone. ### Changed - **cockpit:** the Context meter says what a compaction is doing. While one runs — started from Caprock, typed in the terminal or Claude Code's own — stripes move over the bar and the line reads *Compacting · 0:16 · usually ~1 min*, the time since it began and this machine's median (no "usually" until five compactions were timed; Claude Code reports no progress, so there is no percent). The moment it ends the meter shows the size it left, *2% full · was 332k*, the old fill shrinking away once. The empty track is tinted where the bar turns amber (60%) and red (85%), and the quarter marks read the same over the fill and the track. - **ui:** Settings on a computer is large and easy to read, the way the phone's is: section titles 19px, every option's name 15.5px with its explanation under it, every on/off a switch, fields and buttons at least 34–36px tall, and a step up for all the small print in every section. Nothing moved and no setting changed; the phone layout is as it was. - **ui:** the Agent panel's subagents take far less room. By default the subagent chips under the figures are now the subagents' faces — in colour and pulsing while one works, grey once it finished — with *1 working · peak 4* beside them, which opens the last hour's chart under the row; there is no framed block. A *Strip* look draws one line instead: the working faces big, the finished small and grey, and the hour as a small sparkline that shows the peak on hover and opens the full chart on a click. The *Crew* look stays, with less padding and a shorter chart. The *Chart of faces* and *Numbers* looks are gone; a viewer who had picked one gets the new default. With no subagents in the session, nothing is drawn. ### Fixed - **ios:** dictation in the iPhone app waits up to two seconds for the final words after you stop it, instead of dropping the recogniser at once (the speech plugin 8.4.6, on Capacitor 8.6.0). - **cockpit:** the Context meter drops to the size a compaction left as soon as `/compact` finishes, instead of showing the size before it until the model answers again. - **ui:** attaching on a phone offers two clear choices. The Attach button (the phone's New chat and Save, a chat, and a session's chat on the Full dashboard) opens a menu with **Photos**, the photo library or the camera, and **Files**, which opens the Files browser straight away; before, one picker left both to iOS's own sheet. With a mouse it opens the file dialog as before. A HEIC photo is now always sent as JPEG, so one picked from Files is no longer refused. The iOS app names why it opens the photo library, from its next App Store build. ## [0.172.0] - 2026-11-06 ### Added - **ui:** Settings → *Use on your phone* has one line under **Connect a phone**, *iPhone: get Caprock on the App Store*, linking to Caprock for iPhone, now on the App Store; it opens in the default browser and sends nothing. *How it works* names the app as a way to keep Caprock on an iPhone, and the iOS README, `docs/app.md` and `.ai/` no longer call the app ready for review. - **telegram:** a Morning summary — one Telegram message each morning from your bot: how many of the new mail conversations Caprock Mail's sorting marked important, with the sender and subject of the newest five; the sessions that finished overnight per project, with those that stopped at a usage limit or exited with an error; and the sessions and tasks waiting for you. Buttons open mail, Home and History on your phone when it can reach this computer. Off until turned on in Settings → Telegram, at 08:00 unless you pick another time; a computer asleep then sends it on waking, until noon, and never twice in a day. Settings says what it sends, and *Send a test summary now* shows it at once. Free (ADR-092). - **chats:** on a phone, New chat asks who works — Claude on your subscription, another Claude sign-in, DeepSeek or Kimi on your key (only while it is set), Codex — and where: a chat of its own, a recent folder or any other folder under home. The chat then works in that folder, opens as a chat and is listed in Chats, with a line saying what it sees and that only its model's provider gets what it reads. On a desktop New chat still starts at once, and *In a folder…* opens the same steps. Folders can be labelled Work or Personal from the Where step; the tags show on the Chats list, which filters by them (ADR-091). ### Changed - **ui:** the app's sidebar is calmer and says what is open and in which phase. New agent sits in its own band at the top, with Chat, Project and a ⋯ menu (New shell, Search, History, Share your week) in one row under it; the keys are the ones they always had. A new **Open** section lists exactly your open tabs in tab order, each with its project, its ⌘ key and a coloured phase: working, needs you, idle, done or failed. Projects are folded to one line with a short summary ("1 needs you", "2 running", "3 idle") and unfold to their sessions as before. Recently closed folds to one line. The Today card became one thin line above Dashboard — spend, running, what waits and the fuller plan window — with a × to hide it; Settings or the ⋯ menu brings it back. The Projects | Tabs switch left the heading, since Open lists the tabs; Settings → Appearance keeps the choice of what sits under Open. ## [0.171.0] - 2026-11-03 ### Added - **agents:** when a Claude Code session Caprock started hits its plan's usage limit, it can be continued elsewhere: on DeepSeek or Kimi as the same conversation, on another Claude Code sign-in as the same conversation (its transcript copied there, never moved), or on Codex with a summary of the work. `POST /v1/sessions/{id}/continue-on`; sessions carry `limit_hit` with the reset time; Settings can move a session automatically and bring it back after the reset (ADR-090). - **terminal:** at the limit, one quiet line under the session's terminal says which window and when it reopens ("5-hour limit · back at 18:40"), with a small chip for each place it can go on — another Claude sign-in, DeepSeek or Kimi when their keys are set, Codex — and Wait. A click moves it; the tab follows the new session, and a note says where it went, with Undo. - **settings:** *When a limit is reached*: Ask me, Continue automatically on an ordered list of targets, or Wait for the reset, and Back on Claude after the reset. - **subscriptions:** Claude Code on Kimi, on your own Kimi platform key, kept in the keychain like the DeepSeek key, with Moonshot's published settings for Claude Code; its key field sits under DeepSeek's. ### Changed - **plan:** Claude's plans carry Anthropic's new names: Max 5× is now **Max** ($100) and Max 20× is now **Ultra** ($200), as renamed at the end of October 2026 (claude.com/pricing, read 2026-11-03). The plan picker offers Pro, Max and Ultra, and a plan Caprock's picker stored under an old name reads back under the new one, so the header chip that said *Max 20× · $200.00/mo* now says *Ultra · $200.00/mo*. A plan name you typed yourself is left as you wrote it. A verified Ultra account has no five-hour limit, so the Plan limits card shows its week alone, and a five-hour reading left from before the move is no longer shown as a stale window forever. ### Fixed - **session:** a session on a model with no published price (Claude Code on Kimi, `kimi-k3`) no longer reads "Cost $0.00". The Cost tile, the session header and the Now card show "—" and "price unknown", or the priced sum with "+ N unpriced turns" when only some turns could be priced, and the cumulative cost panel counts priced turns only. The session API carries `stats.unpriced_turns`. ## [0.170.1] - 2026-11-02 ### Fixed - **app:** the macOS `.dmg` opens on its branded window again (in fact for the first time from a release): the background picture, the app and the Applications folder side by side, the 660×400 window. Tauri's bundler lays that window out with a Finder script it skips on CI, so every `.dmg` release.yml built since 0.97.0 opened as a plain white folder. The image is now made with dmgbuild, which writes the window's settings directly, and the release and CI checks fail without them. ## [0.170.0] - 2026-11-02 ### Changed - **ui:** the all-time strip on Now is a row of tiles like Cost's Totals — a label over each figure, one even row — instead of a running line that wrapped *sessions a day* onto a second line; on a phone the Quick chat and New session buttons go under it. - **ui:** the Agent panel's empty subagent frame says *no subagents · 1h* on one line instead of wrapping *no subagents in the last hour*. - **app:** the macOS installer window is graphite with Caprock's characters round the arrow — *Your agents are waiting*, *Drag Caprock onto Applications* — instead of the plain paper ground. ## [0.169.0] - 2026-10-31 ### Added - **ui:** At a glance has the share button the other figure panels have: picture without the Charts/Numbers switch or fold toggles, and Copy as text with the Numbers view's tables. So do All time on Home, Last 30 days and Compactions on Cost, Hermes Agent on Cost, Compactions on Week, and Lifetime, Daily cost, Top projects (names hidden by default) and Model mix on Lifetime. ### Changed - **ui:** the Agent panel's session chip says *uptime 8d* instead of *started 8d ago*, so it stays on the model and context line; the start time is in its tooltip. - **ui:** the subagent frame in the Agent panel is drawn with the Caprock characters instead of a thin step line. By default the last hour is a chart of faces: twelve five-minute columns, each a stack of faces as tall as the most subagents at once, with the peak and the time it was reached (*peak 5 at 09:42*); past six at once one face stands for several. Two more looks sit behind three small dots in the frame's corner: *Crew*, one face per working subagent with the finished faded, and *Numbers*, the crowd large with *N working now*. The faces follow the one picked for Claude in Settings, and the choice of look is remembered. - **app:** the "Caprock vX is available" card on Now updates in place in the desktop app — **Update to vX — Restart**, a progress bar while it downloads, then the restart — the same one click as the status strip, instead of a Download link to the release page. A browser and installs that cannot update themselves still get the command or the release page. ### Fixed - **ui:** a share button can no longer leave the sheet stuck on "Drawing…" with every button off. A press on a card whose figures are still being counted waits at most six seconds, saying *Counting this month…*, then sends the card as shown (its corner still names the reading); the picture embeds only the fonts the page already loaded, from the browser's cache, instead of fetching eight font files from a daemon busy counting the month; and drawing has a 30-second limit, after which the buttons come back with *Could not draw the card — try again.* Panel pictures get the same limit. ## [0.168.0] - 2026-10-31 ### Added - **compact:** every compaction is now a stat: what it cost and what it has saved since, both estimated from the pricing table and marked ≈. The Agent panel's Context shows the latest one on one line (*32h ago · 442k → 19k · cost ≈ $0.09*) with a small curve of the saving since and *saved ≈* at its end; the ⓘ beside *~15% stays* says what /compact does and how each figure is estimated. Cost and Week gain a Compactions panel: the count, cost, saved and net for the period. Every compaction already recorded is filled in once on the first start, its summary's length read back from the transcript. New `GET /v1/stats/compactions`; `GET /v1/sessions/{id}/compaction` gains `estimate` (migration 0077). ### Fixed - **pricing:** Claude Sonnet 5.5 cache reads are priced at $0.10 per million tokens from 7 October 2026, as Anthropic charges (0.05x the input price); the table had kept $0.20. Turns from that day are repriced once, openly, and the session and daily totals move by the difference. GPT-6.1 Terra gets its own row, so its Codex turns are priced instead of counted as unpriced. Table version 2026-10-31.1. ## [0.167.0] - 2026-10-30 ### Added - **ui:** the Agent panel header shows the session's reasoning effort beside its model, *Opus 5.5 · high*, as Claude Code's own hooks report it. The daemon now keeps the newest known level per session (low, medium, high, xhigh, max; migration 0076) and returns it as `effort`; a session whose hooks never named one shows the model alone. ### Fixed - **ui:** a shared panel's picture is the title and the content alone: fold chevrons, More/Less and Hide toggles, Settings links, a row's ways in, tooltips and hover-only buttons are left out. With Hide project names on, names no longer slip through in part: a folder's last segment, a GitHub slug's owner and repository and a name in another letter case are hidden too, and an activity line such as "editing caprock/internal/api/x.go" reads "editing path 1", its file names and branches replaced. ## [0.166.0] - 2026-10-29 ### Added - **ui:** Files: → expands a folder in place, its contents right below it one level in, as Finder's list view does; → again steps onto its first file, ← folds it or steps back to the folder holding the row. A triangle on each folder row does the same with the mouse; Enter still goes into the folder. Nested rows show git marks, size and date, are tinted in compare mode, stay under *What the agent changed*, and can be marked, viewed, edited, copied, moved and sent to the Trash. ### Changed - **ui:** the top of the Agent panel (⌘I) takes about half the height it did and cuts nothing. One row carries the agent's own mark (a click on it still picks the session's face), the session's name once, the project only when it differs, the branch, the state and the permission mode. Burn rate stays big with tokens and spend on one line under it, beside a new chart of how many subagents worked each minute of the last hour, with how many work now, their types and the hour's peak; with none, the chart says so. The model, the context fill and the start are small chips under them. - **api:** `GET /v1/sessions/{id}/subagents?hour=1` adds the last hour's subagent count a minute (`hour: {start, step_ms, counts, peak}`). - **ui:** a folded **Plan limits** panel is no longer an empty row. Its header keeps one thin bar per window the panel shows — Claude's 5 hours and week, and Codex's when it reports them — each with its short name, the percentage and the reset time, coloured as the gauges are (amber from 60%, red above 85%, grey when the reading is stale). As the row narrows the reset times go first, then the names; the bars and percentages stay, on one line. ## [0.165.1] - 2026-10-29 ### Fixed - **app:** the window no longer flips to "the daemon stopped" and back to the dashboard on a brief hiccup. A running daemon is kept through 5 s of failed checks (20 s when it is only slow), and a slow `/v1/status` no longer counts at all; a real stop (its `runtime.json` gone, or its process exited) is still seen at once. When the app does count the daemon as gone, `app.log` says why. ## [0.165.0] - 2026-10-28 ### Added - **ui:** Files, a two-panel file manager in the spirit of Norton Commander that knows about your agents (⇧⌘X, Ctrl+Shift+X on Windows and Linux; ⌘K → Open Files; Files in a project's menu). Your checkout on the left, an agent's worktree on the right: Compare tints what differs and what is on one side only, What changed filters to that worktree's changes, View shows the file or its diff with + and − counts. Copy, move or rename, new folder and delete (F5–F8, or ⌥5–⌥8 on a Mac), each confirmed by name; delete only ever moves to the Trash. Reaches only the project's folder and its worktrees, and is read-only from a phone or another computer. A Norton look paints it blue with cyan frames and the F-key bar. - **ui:** every figures panel can be shared — Live pulse, Repos, CI/CD, Plan limits, Most expensive, Releases, Plan value and the Cost panels get a share icon in their header: Copy image, Save PNG, Copy as text (Markdown) and Post to X, Threads or LinkedIn through the share card's own sheet. *Hide project names*, on by default and remembered, turns projects, sessions, branches, folders, pull request titles and logins into "project 1", "session 1"… in the picture and the text alike. Drawn on your machine; only the X, Threads and LinkedIn buttons upload the picture, to caprock.dev, as for the share card. ### Changed - **ci:** the Windows Go leg, the slowest job in a CI run, is split into three jobs that run side by side (lint and smoke, the slowest package's tests, the rest of the tests), and a pull request that touches only the changelog, its fragments or `.ai/` docs — a release pull request — skips the build and test jobs while the docs checks still run. - **ui:** the agent cockpit's header names the agent in a small muted label and puts the session's configuration where the big name was: the model and how full its context is (*Opus 5.5 · 62% ctx*). Under it, the subagents working now are counted by type (*3 subagents · 2 Explore, 1 general-purpose*), and a type opens the first of its kind in the Subagents section. A figure the daemon does not report is left out. - **ui:** the tab in front is framed in the accent on every side, the Dashboard tab in front a step heavier, and behind it keeps an accent outline, so it is the one tab the eye finds. The Pipeline and Mail tabs are quiet beside it now, drawn like a session tab until brought forward. The Pipeline tab closes from behind too (its × on hover), and with ⌘W (Ctrl+Shift+W) while it is in front; it stays closed until ⌘P opens it again. ### Fixed - **ios:** the iPhone app's upload to App Store Connect is no longer refused over export compliance. The build no longer claims an approved compliance code it does not have; App Store Connect asks the encryption questions on the build instead. - **ui:** the Repos panel's last column (Release) no longer runs past the panel's right edge in a mid-width window: a letter-spaced heading wider than its column no longer widens the column, and the table drops to its narrower layout a little earlier. ## [0.164.1] - 2026-10-28 ### Changed - **ui:** the app window uses less memory with terminal tabs left in the background. A tab out of sight for five minutes now gives its terminal's GPU context back, and every closed or replaced terminal gives its context back at once instead of when the page next cleans up. Measured in the app with eight terminal tabs, a long chat and the Dashboard open, after 25 minutes: the window's graphics memory went from 125 to 80 MB and the whole app from 478 to 432 MB. Coming back to a tab looks as it did: the terminal is drawn in the frame it appears in. ## [0.164.0] - 2026-10-28 ### Added - **ios:** Caprock for iPhone, version 1.0, ready for the App Store, in `ios-app/`: the phone remote in a Capacitor shell, bundled rather than loaded from `m.caprock.dev`. Pair by scanning the computer's code with the app's own camera, or paste the link; dictate in any language the iPhone recognises on its own, with nothing sent anywhere and a line when a language is not on the device; lock the app behind Face ID; the pairing kept in the Keychain; **Try it without a Mac** on bundled sample data that connects to nothing; the app's own Settings (paired computer, voice language, Face ID, unpair). Nothing in the app is for sale. A manual workflow (`ios-release.yml`) archives, signs and uploads a build to App Store Connect; the listing texts are in `ios-app/store/`. No push notifications in 1.0; they follow in 1.1 (ADR-083). - **machines:** start an agent on another computer from this one. New agent gains a Machine field when you have linked a computer: pick it, and the folders, agents and models are read from that computer, the agent runs there, and its tab opens here. A computer that cannot take a start is listed with why (offline, waiting for Allow, removed there), and a refusal is said in words, a folder missing there included. - **machines:** one list across your computers. Sessions on the other computers that need you sort first in the sidebar, Now shows them under *On other computers*, and the app tells you when one needs you, naming the computer. A computer that goes away is shown as offline with when it last answered, not with the sessions it had. The daemon reads each computer once for every window (`GET /v1/machines/sessions`) and listens to it for prompts only while a window is open. - **machines:** a guide for trying it on two computers, `docs/machines.md`, and an end-to-end test with two real daemons and a local relay in the smoke suite. ## [0.163.1] - 2026-10-28 ### Fixed - **app:** a daemon that answers slowly on a loaded computer no longer flips the window to "The Caprock daemon stopped". A daemon that takes the connection and answers late is kept for 20 seconds; no connection at all, or silence past that, shows it as stopped. ## [0.163.0] - 2026-10-27 ### Added - **browser:** *Open on my phone* in phone mode. A local dev server's page (Vite, Next, webpack on localhost) opens on a real phone on the same Wi-Fi: a QR code, scanned with the phone's camera. Caprock shares that one server through a proxy on this computer's Wi-Fi address and a random port, behind a link only the QR carries; live reload works. Sharing stops on *Stop sharing*, after 30 minutes unused, after 8 hours, or when Caprock quits (ADR-087). ### Changed - **ui:** folded, the CI section says "#220 merged" (or "closed") for a pull request that is done, instead of a tally of its old checks. ### Fixed - **queue:** a message waiting in a session's queue is no longer lost when the session ends. When the process ends, the waiting messages are kept for 7 days, shown under the conversation as *Not sent: the session ended*, each with **Send to a new session** (the same agent in the same folder, continuing the conversation when it can; the message then goes in through that session's queue), **Copy** and **Delete**, and **Send all** for several, in order, one per turn. A `/clear` no longer empties the queue: it moves to the new session and carries on delivering there. Migration 0075 (ADR-053, amendment of 2026-10-27). - **ui:** a pull request with failed checks no longer says "ready to merge". GitHub calls it clean when no check is required, and Caprock repeated that beside the red checks; it now says "mergeable, checks failed", or "checks running" while they run. - **ui:** the window holds much less memory over a long day. The Live pulse kept every tool's whole answer (command output, files read in full, an edit's original file) for up to 4,000 events a track; it now keeps what the bars read. An open chat following a busy agent no longer grows for as long as it stays open: past 240 messages it keeps the newest 120 and pages the rest back in when scrolled to. A session's timeline left open keeps 1,000 live events instead of 5,000. The agent cockpit keeps a result's outcome, not its output, and clipped text no longer keeps the full original alive. ## [0.162.0] - 2026-10-27 ### Added - **share:** X, Threads and LinkedIn now put the card you chose in the post itself. Pressing one uploads that exact picture — the picture alone — to caprock.dev and opens the post with its link, whose preview is the card, so there is nothing to paste. The buttons' tooltips and the box after posting say so, and the box can take the picture down again (Remove the shared picture); Settings → Privacy lists every shared picture with Remove. The social site may keep the preview it already fetched. Share…, Copy image, Save image and My Telegram never upload. If the upload fails, the sheet falls back to the clipboard and the ⌘V steps, and says why in one line (ADR-086). - **phone:** Share your week on the phone home draws the Week card and opens the phone's own share menu with the picture attached — on an iPhone, pick Threads or X. Nothing is uploaded on the phone. ### Fixed - **store:** an upgrade that found no disk for the safety copy of the database used to say so only in the log. It is now recorded, and `/v1/status` (`upgrade_copy_skipped`), `caprock status`, Now and Status say that no copy was made, how much disk was free and needed, and that older Caprock versions cannot open the upgraded database. - **ui:** while older history moves in after the 0073 upgrade, History, Memory's search and session pages say so in one quiet line, "Older history is still loading — N% moved", gone once the move ends. ## [0.161.0] - 2026-10-27 ### Added - **cockpit:** **Compact context**, free. In the Context section, one click types Claude Code's own `/compact` into a session Caprock started — at once at its prompt, otherwise when its turn ends — and the session carries on in place with a summary; `/clear` is never typed. The collapsed Context line shows a small icon from 60% full; both are hidden under 100k tokens. Before the press it says what usually stays and where that comes from: your own compactions once five are measured, until then one machine's measurement (70 automatic compactions, 2026-09-29 to 2026-10-25, a median 15% kept). After it, the measured before and after, *Compacted: 41.4k → 10.1k tokens* — at once where Claude Code writes the size after on its compaction boundary, else with the next reply. A session another terminal holds is never typed into: it shows the command to type there and Continue here. Compaction boundaries are now read from transcripts, including the ones already on disk, once, in the background (`GET /v1/sessions/{id}/compaction`, `POST /v1/agents/{id}/compact`). ### Changed - **store:** an event names its session by an integer key instead of repeating the session's 36-character id in its row and in most indexes. A 1 GB database came out 128 MiB smaller after a VACUUM (measured 2026-10-19). The upgrade no longer rewrites the events table before the dashboard answers: the first start takes seconds, and the older events move into the new table in the background, newest first, 1 min 52 s for 603,141 of them on a 1.2 GB database (measured 2026-10-23). Until they are in, the Now screen and `caprock status` say so, older history is incomplete, the other agents' importers wait, and removing a session asks to try again later. A query on `caprock.db` joins `sessions` for a session's id (`docs/schema.md`). No earlier release opens the upgraded database, so the upgrade first keeps a copy of it as `caprock.pre-0073.db` in the data directory for 30 days: to go back, stop Caprock, put the copy in place of `caprock.db`, remove `caprock.db-wal` and `caprock.db-shm`, and install the older release. `caprock up` and the desktop app wait for the copy and say the database is upgrading. ## [0.160.0] - 2026-10-26 ### Changed - **ui:** the share sheet writes the post from your figures — "My agents shipped 48 PRs this week.", the other counts and which agents did the work — in place of one line with no number; the dollars stay on the card. After X, Threads or LinkedIn opens, a box lists the steps: the card is on your clipboard, the post is open, and pressing ⌘V in the post adds the card. ## [0.159.1] - 2026-10-25 ### Fixed - **share:** X, Threads and LinkedIn get the card you chose, dark or paper: the post no longer carries a caprock.dev link, which made them show the site's dark preview instead, and a large line says to press ⌘V (Ctrl+V) in the post to add the card from the clipboard. ## [0.159.0] - 2026-10-25 ### Added - **cost:** every cost at API list price now also says what the work was of your subscription, on a muted line under it: plan dollars and the share of the weekly limit (*$50 at API · ≈$1.65 of plan · ≈2.3% of a week*). On the Cost screen, the session card, a session's page, the Pipeline's rows, its Releases and both Most expensive lists. Each sign-in is priced by its own plan over the last 30 days and calibrated on its own last full week; hover for how, and why use outside Caprock makes the figures run a little high. Nothing is shown on a metered plan, with no plan stated, or before a weekly window has been seen. - **share:** share from wherever you work: a small share icon on the sidebar's Today card, File → Share Your Figures… in the macOS app, and the share toast now shows over session tabs too. - **share:** your week, every week: when a week closes (Sunday 18:00, or the first time you open Caprock in the two days after) and it merged at least one PR, one quiet toast offers the card in its own figures ("Your week is done. 33× your plan this week · 48 PRs merged") and opens the sheet on this week. Once per week, whichever way you answer. - **share:** Threads joins X and LinkedIn as a place to post the card. ### Changed - **resources:** one **Free up memory** button, in Caprock resources and in the memory popover alike, replaces *Clean up* and *End N idle agents*. It opens a list in two groups — leftovers and idle agents — each line with its own checkbox and size, the total following the ticks, and says first what happens: conversations are kept, and anything an idle agent started in the background stops with it. - **resources:** it is stricter about what is safe. A test copy of Caprock is offered only once the agent that started it is gone; one whose agent still runs is kept, with the reason on its row. An idle agent is offered only after 15 minutes idle, with nothing but its own helpers running under it, and never the tab in front; the rest it leaves running are listed with why, and the daemon checks each again at the click. - **share:** the share card tells the truth. Pull requests come from GitHub's record where Caprock holds one (the lists the Pipeline reads), not only from the `gh pr merge` commands agents ran — a batch or script merge counts now. Sessions started at `/` or in your home folder (scheduled scripts) are left out of every figure, and the card says "hand-run sessions". The cost per merged PR is the Pipeline's own per-PR figure, averaged, so the two never disagree. - **share:** the card's pull request count is GitHub's whole period. When the lists Caprock kept do not reach back to the period's start, the missing older pull requests are read from GitHub once, in the background, and kept; the next card counts them (it read 48 merged where GitHub said 59 before). - **share:** one card, two formats. Landscape and portrait lead with the same two big figures — your plan's multiple (or the dollars) and merged PRs — instead of a Figures card and a Story card that said different things. - **share:** a calmer sheet: Share…, Copy and Save in one row; My Telegram, X, Threads and LinkedIn in another; the post text behind *Edit post text*; one line on what leaves the machine. *Send to someone in Telegram* is gone — Copy image does that. ### Fixed - **ui:** a row's ⋯ menu on Chats, Now and the home is no longer cut off by the list's rounded box on a wide window: it is drawn above everything, under the ⋯, and opens upwards when the window has no room below (#816). - **terminal:** a tab whose agent **Free up memory** ended shows its conversation with Continue here at once, instead of *Can't connect · next try in 10 s* over a process Caprock itself ended. - **resources:** Caprock resources no longer offers to stop Caprock Mail. The separate Mail app was taken for a Caprock command left behind because its process name starts with `caprock`; an app in its own bundle is never listed now, only the `caprock` binary itself. - **store:** a pull request a script opened or merged now gets the agent cost of the session that ran the script. Before, only a `gh pr` command the session typed itself counted, so on the PRs & CI board three releases made by a release script showed "–". Now GitHub's own opening and merge times are matched to the one session in the repository that had a Bash call running at that moment. With no such session, or more than one, the pull request stays unattributed. Nothing is stored, and every session is still charged once. - **share:** the week card's footer keeps *caprock.dev · What's yours?* on one line in the 1200 × 630 picture; its note reads *PRs: GitHub + agents*. - **share:** a pull request merged after `cd ~/dev/` from another repository's session is no longer counted twice on the share card. ## [0.158.0] - 2026-10-24 ### Added - **brain:** Second Brain no longer reads every session. A session a scheduled job starts can say so (`POST /v1/agents {"automation": true}`) and is never read or handed memories; Settings → Second Brain → *Never read these folders* skips every session in a folder (recorded as skipped, with the folder) and keeps those projects out of the graph, search and what a new session is handed unless you open that project. Nothing already kept is deleted. The instructions also tell the model to skip what is true only of one run (what the agent did or saved this time, a dropped connection) and keep what still holds for the product or the codebase. - **ui:** the Lifetime screen says, under its daily chart, that Claude Code deletes conversations older than its `cleanupPeriodDays` (30 days unless set), so the history before Caprock's first day was gone before Caprock saw it, and offers **Keep them from now on**: it writes `cleanupPeriodDays: 36500` into `~/.claude/settings.json`, that key only and every other byte of the file kept, backed up first, and refuses a file that is not valid JSON. Shown only while the period is unset or 90 days or fewer; nothing leaves the machine (`GET`/`POST /v1/claude/retention`). ### Changed - **docs:** the README opens the way caprock.dev now does: every coding agent you run, wherever it runs, who is waiting on you, who is stuck and how close the limit is, then each pull request to release with what it cost. Its first sections follow the site's order: pull requests, sessions waiting on you, terminals, cost and limits. ### Fixed - **brain:** the sidebar card's line at the daily limit reads *Limit reached · 1546* instead of being cut mid-word on a 14-inch screen. - **brain:** Second Brain no longer reads sessions started at the disk root or in the home folder itself, where launchd and cron run scheduled `claude -p` jobs. They are recorded as skipped with the reason, drop out of the sessions waiting at once and stop using the daily token limit; folders under the home are read as before, and nothing already kept is deleted. Settings → Second Brain says so under *Never read these folders*. - **agents:** a session whose program exits a moment after it starts now says why. Its tab shows *Claude Code exited at once (code 1)* with the last lines it printed, the program that ran, and **Try again** and **Close**, instead of *Connecting to the session… Can't connect · next try in 5 s* over a process that was already gone. The same lines, the command and the binary's version go to service.log at WARN, and `GET /v1/agents/{id}/exit` serves them (kept in the new `session_exits` table). - **agents:** *Continue here* on a Claude Code session that moved to another folder with `cd` starts in the folder its conversation began in. Started in the moved-to folder, `claude --resume` printed "No conversation found" and exited at once. - **pipeline:** a pull request closed without a merge is no longer drawn in flight as *PR open*: a session's record of it made the row even though GitHub listed it closed. A row whose only title is its number now reads *#796*, not *#796 #796*. - **pipeline:** one cost per pull request. The in-flight row, the list's *Agent cost* and the *Agents · 14 days* figure now read the same recorded spend (the in-flight row used to add up the whole sessions on it), and a pull request closed without a merge in the window counts toward the 14 days: what agents spent on it was spent. - **pipeline:** with no pull request merged in 14 days, *Speed* says *–* and why instead of *0.0/day*; with no agent cost recorded on any pull request, *Agents* says *–* and why instead of $0.00. ## [0.157.0] - 2026-10-24 ### Added - **brain:** Second Brain no longer reads every session. A session a scheduled job starts can say so (`POST /v1/agents {"automation": true}`) and is never read or handed memories; Settings → Second Brain → *Never read these folders* skips every session in a folder (recorded as skipped, with the folder) and keeps those projects out of the graph, search and what a new session is handed unless you open that project. Nothing already kept is deleted. The instructions also tell the model to skip what is true only of one run (what the agent did or saved this time, a dropped connection) and keep what still holds for the product or the codebase. - **ui:** the Lifetime screen says, under its daily chart, that Claude Code deletes conversations older than its `cleanupPeriodDays` (30 days unless set), so the history before Caprock's first day was gone before Caprock saw it, and offers **Keep them from now on**: it writes `cleanupPeriodDays: 36500` into `~/.claude/settings.json`, that key only and every other byte of the file kept, backed up first, and refuses a file that is not valid JSON. Shown only while the period is unset or 90 days or fewer; nothing leaves the machine (`GET`/`POST /v1/claude/retention`). ### Fixed - **agents:** a session whose program exits a moment after it starts now says why. Its tab shows *Claude Code exited at once (code 1)* with the last lines it printed, the program that ran, and **Try again** and **Close**, instead of *Connecting to the session… Can't connect · next try in 5 s* over a process that was already gone. The same lines, the command and the binary's version go to service.log at WARN, and `GET /v1/agents/{id}/exit` serves them (kept in the new `session_exits` table). - **agents:** *Continue here* on a Claude Code session that moved to another folder with `cd` starts in the folder its conversation began in. Started in the moved-to folder, `claude --resume` printed "No conversation found" and exited at once. ## [0.156.0] - 2026-10-24 ### Changed - **app:** the status strip holds service things only: the session in front's model, context, next-call price and cost, and today's spend, left it — the session's cockpit and the sidebar's Today strip carry them. What the session's processes use (CPU and memory) stays. ### Fixed - **app:** on a narrower screen the status strip's *Update to vX — Restart* button and *Downloading vX* wrapped onto two lines; they stay on one, and a paid plan reads *Premium* there, with the plan and its end date in its tooltip. ## [0.155.0] - 2026-10-23 ### Added - **ui:** the phone attaches any file Caprock keeps, not only photos: a Markdown note, a PDF, a spreadsheet or a source file, from Choose File on an iPhone, in a session's chat, the Home field and the Save sheet. A document shows as a chip with its name and goes into the session by its path, as a file dropped on the desktop does; one Caprock does not keep, or one over 10 MB, is refused with the reason in a line under the field. - **ui:** the phone Home's *Full dashboard* is a row like the others, with what is there under it (*New session, all projects and sessions, settings*), instead of a faint line. ## [0.154.2] - 2026-10-23 ### Fixed - **app:** a Page tab opened on an address nobody answers no longer flashes a white rectangle before *Nothing answers at …*: a new page stays hidden until it has something to show. - **app:** shrinking the window with a phone preview open no longer draws the page past the window's bottom edge while the tab catches up. - **app:** a phone page drawn smaller than its true size reads the device's size exactly: an iPhone 16 reads 393×681, where it had read 392 wide side by side and up to three pixels short in height when scaled. ## [0.154.1] - 2026-10-23 ### Fixed - **release:** a stray `ui/node_modules` link committed in 0.154.0 stopped that release from building; it is removed, and `.gitignore` now ignores `node_modules` whether it is a folder or a link. 0.154.0 was tagged but never published, so this release carries everything listed for it. ## [0.154.0] - 2026-10-23 ### Changed - **ui/brain:** Second Brain's *Last 14 days* now looks like the Dashboard: a row of big figures (tokens over the 14 days, the API-price cost, today against the daily limit, reads), the tokens per day in the Dashboard's chart style with its ruler, still stacked by project with the limit line and the over-limit mark, and a clear top five projects with each one's share and a bar in its chart colour. The rest fold into one *and N more* line that opens the full table of every project. ### Fixed - **pipeline:** with no predicted version, the release plan said *Next release Next release · 1 merged*; the line under the heading no longer repeats it. - **brain:** a long memory title in the graph panel's *Newest* list is cut with an ellipsis instead of running past the panel's edge. - **ui:** the cockpit's CI block, folded, no longer shows an old copy of a pull request's checks as running. Its one line was drawn from what was kept when the block was last unfolded and never read again, so it could say "#801 · 4 running · 11h" of a pull request merged hours before, next to the time of a different answer. The session's pull requests are now read folded too, the line waits for that read and the time beside it is that read's; a kept copy not read again yet no longer has a growing elapsed time. - **telegram:** a module that answers a button press at once keeps its edit. The press is written to the module's store before its `✓