v1.19Latest
The reasons behind the map, a name on every number, and a buffer that survives the dark
- NewUsage keeps one account roster for every vendor, and every number on screen names the login it was read from. There were two credential stores before — a roster of Claude session keys behind the Claude pane, one pasted credential per vendor behind the Usage pane — and neither could see the other, so the app could disagree with itself: "Working as Secondary" on one screen and a percentage read from an entirely different login on the other, both rows labelled "Claude" and neither saying whose window it was. Logins now live in one place for all six vendors, the engine is keyed by vendor *and* account, and a login another tool on this Mac already holds appears as its own detected row rather than quietly standing in for yours. A named account may only spend its own credentials: when its cookie expires it stays visibly unread instead of falling through to whatever else is lying around and reporting a stranger's percentage under your name. Nothing is re-authenticated on the upgrade — each account points at the Keychain item that already held its credential, because copying full-access tokens is a step that can half-fail and the failure leaves you signed out with no way back. Alerts stop being Claude's alone too: "warn me before this window runs out" was never vendor-specific, only the code was, and the other five could run to 100% in silence.
- New/canvas now carries the reasons, not just the commits. It mapped what was built and said nothing about why any of it took the shape it did, while the decision record filled up for weeks in tables that only /trust's tally ever reached. Every feature chip now shows the decisions confirmed or standing while its commits landed, and clicking one opens the argument: the feature at the centre, its decisions hung around it, and a single drawer underneath holding the feature's commits until a decision is clicked and then holding that decision's whole case. Decisions are numbered by when they were settled, and the numbers carry onto the facts each one takes as given — 567 of 616 fact mentions in this repo resolve to the decision that settled them, so a fact stops being a loose string and becomes something to click: who settled it, what has leaned on it since, and whether it was quietly set to something else later. Commits are tagged with the finished task they produced only through a real confirmation and never a matching timestamp; inferring it from the clock put a screen-capture task onto a commit about MCP protocol negotiation because both happened the same afternoon. The canvas also opens in a window of its own, the way /config does, and stays open when the menu-bar popover closes.
- New/feedback is a way for words to come back the other way. Four kinds — broken, missing, friction, praise — an optional area, a message box, and an optional reply address that is never required, because asking for an address before accepting a complaint is how you stop hearing complaints. Send writes to a local outbox first and posts second, so a message written offline survives quitting and sends itself later; the pane says "Sent" or "Kept" depending on which actually happened, never on whether the words were saved. It carries the same identity block the heartbeat already sends, so a message lands on that Mac's row in the console rather than in an anonymous pile, and the pane names exactly what travels with it, Machine ID included. Deliberately not gated by the command-usage privacy switch: that switch covers passive counting, and this is text typed under a Send button.
- NewTrace can offer that pane rather than waiting to be found — once, quietly, and on conditions. It is a one-line strip in the project list, never a dialog, and it appears only after ten days installed, five separate days of use in the last month, and a moment of looking back that armed it: a finished recap, or a week's artifact sitting there ready to send. Never mid-flow. One "not now" buys sixty days and a second ends it permanently; writing a message ends it too, because someone who has spoken has been asked. All of that is the interruption budget rather than politeness — a panel people learn to wave away is a gate that has stopped gating, and the confirm that guards every agent write shares that surface. Whether they have used Trace enough to have a view is read from local activity rather than command counts, since counting stops the moment someone turns command sharing off, and that would silently never ask exactly the people most suspicious of us. Every message records whether it came from the strip or from someone typing the command, so whether the offer earns its cost is readable instead of arguable.
- ImprovedUpdates install themselves by default. Checking was never the part that failed — installed copies do notice a release and then sit on the prompt, and an update that needs a decision is an update most people don't take, which leaves fixes shipped weeks ago running nowhere. A found update is now downloaded and put in place for the next launch. It is the same tickbox Sparkle's own update settings have always had, so unticking it sticks: your answer lives in your defaults and outranks the default baked into the build.
- ImprovedTrace reads the message someone forwarded, not just the words typed around it. A forwarded Slack message — or a pasted permalink to one — leaves the visible text holding only the covering note and delivers the message itself as an attachment, which no read path here looked at. So "Add this task to Rockstar LMS" over a forwarded "Fix the loop problem in the slackConnector file" reached the classifier as five words containing no task at all: the instruction was legible and its subject did not exist. Forwards are folded in now wherever a message is read — DMs, pinned messages, reactions, the mention scan — and the quoted half is carried structurally as well, so "this task" resolves to the words that were forwarded instead of filing a task called "this task", which is worse than failing because it looks fine in the confirmation. Link previews are not folded in: a page nobody read is not something anybody typed.
- ImprovedThe account an agent wrote about a commit is now found for the commits that actually have one. A task filed from a commit landed in Done with an empty "How it was built" while the account sat in the session transcript the whole time — a commit was recognised only by a command containing both `git commit` and the opening of the subject, which holds for a one-line `git commit -m` and fails for every commit whose reasoning was written to a file first and committed with `-F`, or fed in by heredoc. Exactly backwards from what the record is for: it caught the throwaway commits and missed the considered ones. The transcript is walked in order now, so a file written earlier can be matched against the path handed to `-F` later, and `git -C <dir> commit` is recognised as the commit it plainly is. It stays as causal as the half it extends — the same session has to have written that file, with that subject in it. There is a probe behind DEBUG that prints the per-commit hit table, because a claim about accuracy is worth nothing if the next change to the matcher can't re-measure it.
- FixedThe capture buffer no longer dies when the screen goes dark. It had exactly one recovery hook, system wake, and a display sleeping on idle or a lock posts neither of the events that fires — both tear the stream down the same way a sleep does, so the buffer died, landed in a failed state with the feature still switched on, and stayed dead until the next relaunch, taking auto-recorded meetings with it. That the wrong event was being watched is measurable rather than argued: a power log from an ordinary working day here shows the display off for 65 minutes and again for 88, against a single real sleep all day. All three mechanisms are watched now, and recovery is a bounded ladder at one, three and eight seconds rather than a poll, so a genuinely denied Screen Recording permission is never retried forever; underneath it sits a net that tries once a minute when a call is running with nothing to record it into. Stop Sharing from the menu bar is the one stop that must never heal itself — every recovery path refuses it, since a button silently undone is a suggestion — so it gets a way back instead: a gold strip at the top of the project list, and a notification for the case where nobody opens the popover for an hour. And /config no longer reports "Failed to find any displays or windows to capture" for a screen that is merely asleep. That was the truth about the stream and a lie about the feature.
- FixedQuitting Trace no longer leaves a capture stream running inside macOS. The stop was issued, but stopping a stream is a round trip to the system daemon and a quit gives it no chance to make it — the process exits first and the request is never sent. The daemon does not reap what it is left holding: measured on this machine, an instance terminated at 19:30 and the system was still pulling frames for it, and logging an error for every one, three and a half hours later — 105,862 of them, still going when it was found. None of that is visible from inside Trace and all of it is worn by the whole Mac: the menu bar keeps saying your screen is being observed, and every DRM player — Netflix, Apple TV, Prime — refuses to render to a display it believes is being recorded. From the outside the symptom is that Trace is quit, its capture toggle is off, and the Mac will not play video. Shutdown now blocks on that stop, with a two-second backstop so a wedged daemon can never hang the quit. A force quit still leaks, because nothing runs at all on a kill, and the fix for that is a reaper on the next launch rather than anything at exit.
- FixedA Bluetooth headset can no longer switch your screen recording off. Enabling the buffer failed with "could not write to the buffer (Cannot Encode Media) — is the disk full?" on a disk with 118 GB free: that sentence was a hardcoded guess rather than a diagnosis, and it sent the search in the wrong direction for the length of an afternoon. The real error is one specific complaint about output settings, and the only settings shaped at runtime are the audio ones — reproducible with a pair of AirPods Max as the default input, which drop to a mono headset profile the moment the microphone opens. So the fix is aimed at the cost rather than the trigger: an audio track that will not encode now retires the audio for the rest of the run and lets the next frame open a clean video-only segment, and only a failure that persists with nothing but video attached is treated as a real buffer failure. Video is the feature here and audio is the garnish; the old behaviour had that backwards. Both audio inputs also declare their format up front, so an impossible pairing fails when the buffer is started — the one moment anyone can still do something about it — rather than killing a writer some frames into a live segment. And errors carry their domain, code and failure reason now, so the next one is read off the banner instead of reconstructed from a localized string.
- FixedTalking to a voice assistant is no longer recorded as a meeting. Detection watches which process holds the microphone, and a browser holding it counted as a call outright — that is what catches Google Meet, which is not an app. ChatGPT voice mode and Claude voice are the same shape at the audio layer: one browser process, input and output held together, for minutes. With auto-record on, that put four assistant conversations into the unfiled drawer inside half an hour, one of them in a window ChatGPT had titled "Discuss Trace Future". Nothing in the audio stack separates them and neither does the name, so a browser now counts as a call only when one of its window titles names a call tool — meeting tools put the product in the title, because that is what a room is called. Apps in the meeting list still count outright, and a browser whose titles can't be read, which is what a missing Screen Recording permission looks like, counts as it always did. The cost is a browser call on a tool that isn't listed, which now goes unrecorded where it used to be caught by accident; that case is logged with its bundle id rather than swallowed, so a tool worth adding can be found by name.
- FixedSwitching the agent bridge on fails out loud when the install didn't take. Every MCP writer under it is best-effort by design — one agent's config being unwritable is no reason to leave the others unregistered — but that error was swallowed rather than carried, so a switch reading "on" with no `trace` entry in any config was a reachable state, and it is exactly the state that produces a beta user with no hooks, no tools and nothing anywhere saying why. The install now writes and then goes back and reads, because the failure worth catching is a file that accepts the write and loses it afterwards, which is what Claude Code does with its config while it is running. The error names the agent and the file and splits by cause, since quitting the agent does not help a refused write and a permission change does not help an entry that vanished after a write that worked. A failed install rolls itself back rather than leaving a hook with no server behind — the combination that prints nothing and explains nothing. Four ways a write could silently not stick are closed underneath it: a config command that stopped to ask a question a GUI app has no terminal to answer and then waited forever, a settings file that was present but unparseable being read as absent and written back holding only Trace's own keys, one optional agent's failure aborting the whole install on machines that do not have it, and a blocked beta build where the config lands but the server never starts. And a linked folder with an empty board now greets an agent with one line instead of nothing at all, because a hook that installed perfectly and a hook that never installed produced identical evidence: an empty terminal.
- FixedTask cards stop freezing a relative time into the line that says where they came from. A task filed from a Slack reaction yesterday said "you · 8 sec ago" and would still have said it next month — the line was never rendered from a timestamp, it was a sentence written once with the relative time already resolved into it and printed verbatim for the life of the task. It was true for eight seconds. Tasks from commits said "a commit, just now", which anything under an hour old was born saying; recordings said "a recording, 21h ago" from a pass that can run days after the capture. All three now carry only the durable half — who, "a commit", "a recording" — and nothing is lost that the card didn't already have, since the Slack message, the commit and the capture are each one click away with a real date on them. Existing rows are rewritten in place: 58 tasks and 155 proposals here, with the Linear and GitHub lines deliberately untouched, because "NAV-225 · Backlog" is state rather than a clock and is re-synced rather than frozen.
- FixedThe beta download is no longer flagged as unsafe. The disk image was notarized but not signed, and those are different things: notarization staples a ticket to the image and Gatekeeper reads it — but Chrome never mounts the image. Its download check reads the image's own signature to attribute the file to a Developer ID, finds nothing to read on an unsigned container, falls back to URL reputation that a beta link on a new domain does not have, and tells every tester the download is unsafe. The image is signed now, and the check that would have caught it is fatal rather than advisory: swallowing its exit code is how an unsigned build shipped to testers while every other line in the release reported success.
v1.18
Meetings record themselves, and a question is answered rather than filed
- NewTrace records a call on its own. When the detector says one started, the whole thing is recorded end to end — no /capture-screen, no decision asked for at the moment there is least attention to spare, and no rolling buffer that has already thrown the call away by the time anyone remembers. It stays off until you switch it on in /config → Capture, and it deliberately doesn't arrive free with the buffer: this is the one setting under which Trace commits other people's voices to disk without being asked at the time, which is a different promise. The recorder is the buffer you already have with pruning held back — no second stream, no second encoder, no extra permission.
- NewRecording never waits for an answer. It starts on detection and is retried on every poll for as long as the call runs, so a buffer that was down when the call began, or auto-record switched on mid-call, starts recording from that moment rather than dead-ending until the next meeting. Accepting the "start the buffer?" nudge during a call now records that call too — the detector speaks once per meeting, so the one you had just said yes about used to be the single meeting that never got recorded.
- NewWhich project a recording belongs to is asked in a panel, not a banner. A time-sensitive notification appears briefly and then retires into Notification Center without a sound, so on two back-to-back calls the question was never seen at all; a panel can't retire itself, and stopping you for the two seconds an answer costs is the whole trade. Answering closes it and hands the keyboard back to the call. The question is itself optional — leave it off and recordings simply collect unfiled.
- NewUnfiled meetings have a drawer of their own in /config → Capture: a gallery of thumbnails with the time each call started, filed into a project in one click. They live in their own table rather than as project-less journal entries or a hidden system project, so nothing leaks into the project list, the recaps or /recall. Video ages out on a retention you set, and the expiry takes the video and nothing else — a transcript is ten kilobytes against a few hundred megabytes an hour, so there is no reason for the cheap half to share the expensive half's deadline. Filing a recording keeps its video too.
- NewA question typed into a project's input bar is answered instead of filed. Bare text there has always meant "file this" and raised the task-or-log picker, but a lot of what gets typed is a question about work already done — "how did we fix the cursor issue in the context panel", "when did we talk to Prasoon". Those now run /recall against that project's record. A word list catches the shapes a word list is good at, and the local model reads the rest — Gemma when it's running, Apple's on-device model otherwise — and has to agree across two reads before it can call something a question the word list didn't flag, since that is the direction that costs something. The line is read during the pauses while you're still typing, so Return usually finds the answer already waiting; a line submitted faster says "Reading that…". The picker is untouched and never comes up for a question.
- ImprovedThe capture dot in the project list header says what it is actually doing — holding the buffer, or recording the meeting you're in — and, underneath, how many unfiled meetings are waiting and when the next video expires. One dot rather than a second indicator beside it: both mean your screen is being recorded, and two signals for one fact is one more than anybody learns to read. It's also the drawer's only surface outside /config, because an expiry nobody can see is one that eventually takes something by surprise.
- ImprovedTrace's MCP server no longer claims a protocol revision it can't serve. It echoed back whatever a client offered, which is correct exactly as long as every revision a client can offer is one the server implements — and 2026-07-28 ended that: it removes the initialize handshake, the session header Trace keys every per-agent decision off, and the server→client request the headless confirm path is built on. A client asking for it now gets back the newest revision both sides genuinely speak, here where it can still choose something else, rather than finding out on the first request that took the claim at its word. The npm bridge answers the same way.
- FixedThe capture buffer never survived sleep. macOS tears the stream down when the display sleeps, and nothing in the app ever started it again — so the feature sat switched on and not recording until a relaunch or a trip through /config, and an unplugged display left it in the same state. Trace now watches sleep and wake: the buffer is stopped on our terms on the way down, so /config doesn't report a failure you can do nothing about, and retried at two seconds and again at five on the way back, which recovers the deaths that had nothing to do with sleep as well. History is deliberately not carried across — the ten minutes before the lid closed are not the ten minutes before it opened.
- FixedThe meeting detector's clocks no longer survive a sleep they shouldn't. Its timer kept running, so nothing ever reported an error, but the marks it judges a call by were wall-clock stamps from before the machine went down — the first tick after a wake would weigh a call that ended last night against a clock saying the microphone had been held for nine hours.
- FixedA recording is cut where the microphone was released rather than ninety seconds later. Where the clip stops and when the call is declared over are now separate questions: the declaration waits twenty seconds so AirPods reconnecting or a device switch doesn't split one meeting into two recordings, but that safety margin used to be paid for in content — a minute and a half of whatever you opened after the meeting, welded onto the end of the meeting.
- Fixed/recall no longer fails outright on a project with a lot of long matches. Every field was truncated on its own but nothing bounded their sum, so a run of completed tasks each carrying a long account of what was built cleared Apple's hard 4,096-token context wall and the call came back as an error instead of an answer. Matches are now admitted in ranked order until the budget is spent, dropping the weakest rather than cutting short what's kept.
v1.17
A second model, a second chat app, a second ticket source
- NewTrace can run a local Gemma instead of Apple's on-device model. It first looks for whichever Gemma you already run — Trace Engine, Ollama or LM Studio, in that order on loopback — and talks to that copy, so the feature costs nothing if the weights are already on your disk. If you run nothing, the new Models pane in /config downloads and starts one for you: a progress bar with byte counts and an ETA, resumable and cancellable, and no terminal at any point.
- NewThe Trace Engine, a vendored fork of an Apache-2.0 local runtime, streams a Gemma 4 26B-A4B off the SSD in roughly 2 GB of RAM — which is what lets a bigger-model tier exist on an 8 GB Mac at all. It runs as a child process, so a model that wedges or leaks takes down a subprocess and not the app your work lives in, and it exits with Trace rather than surviving as an ownerless 2 GB.
- NewTelegram, alongside Slack. A bot token from @BotFather and one hello to the bot — no OAuth, no app to register, no redirect. From a DM you can list tasks, add or complete one, ask what happened, or start an agent, with replies and remote-agent evidence coming back the same way.
- NewGitHub as a second ticket source. Issues assigned to you, pull requests waiting on your review, and your own open PRs mirror into a bound project as real tasks, one repository per project, with a searchable repo picker and a lock on private rows. Authorization is the device flow, so nothing has to open a loopback listener. Nothing is ever written back — GitHub's nearest equivalent to a Linear status push is closing the issue, which claims the work is finished for everyone.
- NewWhich GitHub queues mirror in is a per-project switch, because which queue counts as your work differs between a repo you maintain and one you contribute to. Turning all three off pauses a repo without losing the binding, and deliberately stops reconciling too, so pausing never sweeps what is already on your board.
- NewHindi/English code-switched speech no longer comes back as confident nonsense. Apple's on-device recognizer ships no Indic locale, so a capture that garbles now gets a second pass through Sarvam, storing both a Hinglish transcript and its English translation — with a "Redo via Sarvam" for the transcript that reads as fluent English and is still wrong. Clean English captures never leave the device, and the switch is off until you add a key.
- New/config is a real resizable window with a sidebar instead of one flat column three viewport heights long. Nine named sections — General, Capture, Agents, Integrations, Usage, Claude, Commands, Data & Privacy, About — with controls grouped into cards, dependent controls simply not drawn while the thing they modify is off, and every switch's long-form reasoning behind a "Why this exists" disclosure rather than printed under every row. Being a window rather than a popover also means a trip to the browser to authorize Slack or Linear no longer dismisses the setup you were half-way through.
- NewA text size you can set: a slider from 80% to 160% in General, printing the resulting body point size beside the percentage. Above 100% the panel grows with the type, clamped to the screen, since bigger text in a fixed frame doesn't make the board easier to read, it just makes it hold less. macOS has no Dynamic Type for an app to follow, so this is Trace's own font layer.
- NewTrace notices when a call starts and offers to switch the capture buffer on from a notification, answered on the banner — the buffer is most valuable during a meeting and most likely to be off then too, and every second spent finding the toggle is a second that can never be captured. Detection reads CoreAudio's per-process view rather than window titles, which are redacted without Screen Recording, precisely the case this was written for.
- NewA project's Docker containers now show their published ports. One daemon holds the socket for every container on the machine, so a match against a project's working directory could only ever fail — Trace now asks the runtime instead, matching on the folder Compose recorded or the deepest bind mount. Killing such a port stops that container by name rather than signalling the daemon and taking down every container you have running.
- NewSearch inside the Journal. /recall is answered in the journal itself instead of sending you elsewhere, and there's a filter field under the header where every word typed has to appear somewhere on the row — text, a capture's title, overview, points or transcript, or the date in any of several written forms, so "aug postgres" narrows to the August capture that mentioned Postgres. A bare "yesterday" or "last week" is read as a date window rather than as words.
- NewCaptures can be retitled from their right-click menu. A capture's title is whatever the model made of the transcript, and when it read wrong there was no fix — the generic Edit item expired after 24 hours and the title was then permanent. Renaming also stops a later insights pass from taking the title back.
- NewA remote agent session can be launched from the middle of a session you're already in, and its link sent to whichever DM app you choose.
- NewAn agent question that asked to be seen and is still unanswered 25 seconds later sends a time-sensitive notification, which crosses Spaces the way a menu-bar popover cannot. The trigger is the end state, not the event — at the keyboard you settle the question inside the grace period and no banner is ever posted.
- NewThe quieter agent failure is now caught too: an agent that asks nothing and simply stops, mid-prompt or between two tasks of a batch, while the board goes on showing the work in progress with its timer running.
- NewA finished task now records what was actually built, not just what was asked for. The "here's what exists and here's the one thing worth knowing" an agent writes at the end used to go to terminal scrollback and nowhere else; it's now kept on the card as a folded footnote, editable in the confirmation, and ranked as its own facet by /recall. Completions also carry an identity, so an agent calling again corrects the pending confirmation instead of putting a second one beside it.
- NewAgents can read that history back. The new trace_recall tool ranks a project's completion accounts, logs and decisions against a question asked in a sentence and returns what was written at the time — so a fresh session can find out how something was built, not just what is open. It returns the raw records rather than a summary, since the consumer is itself a language model and the file names and exact rejection reasons are the reason it asked.
- New"Start work on the login redesign in Trace" now launches a remote session on that project directly. Previously the only way in was to list a project's tasks, read an id off the board and say "start work on 2321" — the task existed only to be the thing a DM could point at. Where nothing on the board matches, the message itself is the brief; if it named no project, Trace asks which.
- NewA hammer reaction in Slack files the message straight onto the board as a pending task, skipping triage — a pin says "this matters, I'll sort it later", but a hammer has already decided. The permalink, channel tag and who-and-when line come with it.
- NewThe Slack channel a proposal came from is now its own column on proposals, tasks and journal entries, drawn as a tag everywhere the record shows up. It used to be a phrase in the middle of an attribution sentence that died with the strip — accept a Slack message as a log and the channel was gone outright.
- NewInstant Replay retention goes up to 3 hours, from 30 minutes, and the /config slider now estimates disk use so a large retention-and-quality combination is flagged before you set it rather than when the writer runs out of room.
- NewClicking an attached image under the input bar opens the full-size preview — the same zoomable sheet the journal uses — so an attachment looks the same before you send it as after. At 28pt you cannot tell one screenshot from another, and the only way to check used to be sending it.
- NewThe weekly report is sent as a PDF rather than as its markdown source, paginated with real link annotations on commitment URLs, Letter or A4 by region, and drawn in fixed colours so a report generated in dark mode isn't printed dark. The markdown is still what goes on the clipboard.
- NewHold the space bar in any input bar to dictate. A tap is still a space; a press past 400ms starts listening, and the words land in the bar as editable text with the caret in them — so every command, picker and completion works on spoken input, and nothing commits until Return. It reads through Apple's on-device engine, so there is no key to supply and nothing leaves the Mac. This replaces ⌃D, which uploaded to Whisper and ran whatever came back as a command, where one mis-hearing filed a task. Needs macOS 26.
- NewA voice note sent to Trace in Slack or Telegram is transcribed and acted on like a typed message. Trace echoes what it heard before doing anything, so a mis-hearing is visible while the reply is still arriving rather than after a task with the wrong title is on the board.
- NewAsk about the projects themselves over DM, not just the work inside them. "List my active projects" answers with each one's open count, "what's archived" answers without, and "archive Rockstar LMS" or "turn Aurora active" moves one across that line.
- NewRight-click a done card and "Show details" opens the record behind it — what was built, where it came from, when it closed — led by two to four glanceable points, since the honest account is routinely four paragraphs and the original stays one click away.
- NewRight-click an in-progress task to jump to the terminal pane the agent is working in. Trace links the two three ways — the connection a tool call arrived on, the task ids it wrote into the brief, or the tty — and the menu item appears only once that pane is confirmed still open.
- New/show-all now raises an All/Active/Archived filter above the project list, with a count on each segment and a Clear that closes the archive again, instead of mixing archived rows in with no way out but retyping /show-active.
- NewYour data can leave the Mac that wrote it. Export an archive you can carry, keep a dated backup in iCloud Drive, and restore either one — a restore asks where each project lives on this machine, since the stored paths are absolute, and merges loose files rather than replacing them so it never deletes captures the incoming database doesn't reference. The store now carries a version number and refuses to open one written by a newer build.
- NewA per-project switch for whether agents are told to consult the record before reading the code. On by default, and per project because the record is: a young project with three completions has nothing worth the call.
- Improved/find is now /recall — it asks your record a question and writes a grounded answer, where "find" promised the filter the journal's own field already does. /find keeps working as a hidden alias.
- ImprovedToday's activity and the temporary-priorities list are now /today and /priorities rather than two glyphs to recognise in the project list header. A gear takes their place, opening the same window /config does.
- ImprovedWork that reaches Done without the agent filing an account — everything completed from Slack, and every commit that was never a task — now recovers what the agent actually wrote from its session, so /recall can answer "how was this built?" about it. Nothing is generated: where no account was written, none is stored, and the record names which of the three writers produced it.
- ImprovedThe switch that decides whether a commit can confirm a completion now has a row in /config → Agents. It shipped on by default with no way to turn it off.
- ImprovedThe onboarding tour no longer drops a dimmed backdrop over the "How urgent?" picker it never mentioned, and it now follows your first /log into the journal instead of ending on the one question it left unanswered.
- ImprovedThe DM classifiers now run on Gemma, with Apple's model kept as the net. Measured on twelve real Slack and Telegram messages, Apple got 8 of 12 and Gemma 11 — and the misses were not cosmetic: "the cursor bug is fixed" and "scrap the font-size task" both came back as requests to create a task, and "what happened in the last capture?" came back as a request to send a video.
- ImprovedThe capture transcript and insights sheet has two tabs instead of one long scroll. On a capture whose summarization failed there was nothing to stack above the transcript, so the panel opened straight onto transcript text and the insights half was not on screen at all. The empty state now says which of three things happened and offers a Generate insights button.
- ImprovedThe config window uses the system's own Liquid Glass, the same material as the menu-bar popover, running the full width as one continuous sheet — so it refracts what's behind it and follows the appearance you picked, instead of approximating glass with a translucent fill that looks similar in a screenshot and then never changes.
- ImprovedProvider logos in the usage and config panels are now the official marks.
- FixedThe catch-up banner no longer claims you've been away for days over a project that's been busy. It read the stamp that only your own logs and completions move — deliberately, so the heatmap stays a record of your judgment and not your agent's throughput — so it sat directly above "11 proposed, nothing written yet" and said eleven days. Staleness now counts from the newest of anything that happened there, including your commits in a linked repo.
- Fixed/new with a name you already have said "The operation couldn't be completed. (Trace.DBError error 4.)". It now names the project holding it, and points at /show-all when the name is held by an archived one. "trace" beside "Trace" also stopped being two rows nothing downstream could tell apart.
- FixedLong or Hinglish captures produced no insights and said nothing about it. Every prompt embedded the whole transcript against a 4,096-token window, and each failure was swallowed by a guard that read as "no" — so a gate that threw was indistinguishable from a gate that declined, and the capture was stamped as mined and never revisited. Transcripts are now budgeted in tokens counted by script rather than in characters, and the checks read Sarvam's English rendering.
- FixedTrace no longer stops answering DMs while you're away. Reading Claude Code's OAuth token meant reading another app's keychain item, which macOS answers with a modal that blocks the calling thread until someone dismisses it — and "Always Allow" doesn't hold, because the grant lives in an ACL that gets rewritten on every token refresh. One dialog on an unattended Mac took down both Slack poll loops and outbound DMs with them.
- FixedThe "Context or constraints" box in the agent confirm panel threw the caret to the end after every character typed anywhere but the end — put the cursor three lines up, type one letter, and the next landed at the bottom.
- FixedReveal in Finder and Copy File in the weekly report's share menu did nothing at all, silently: AppKit tells the delegate a service was chosen before running its handler, and by then the presenter the handler depended on was already gone.
- FixedThe text-size slider no longer rebuilds itself while you're dragging it.
- FixedThe config window and the menu-bar popover stop fighting over the foreground, and the empty band above every pane title is closed.
- FixedA capture's right-click menu says "Edit Title…" rather than "Rename…", matching what the pencil on the row does.
- FixedA remote agent's evidence goes only to the DM app that asked for the work, instead of being broadcast to every configured one.
v1.16
Re-testing Telemetry
- ImprovedThe download button and panel are much more improved in UI/UX. The info-message shown about telemetry appears right where what's on plate text option appears.
v1.15
Licensing, and knowing which features earn their keep
- NewTrace checks in once a day to confirm its licence and report its version. The reply is what keeps your access working, so a beta round can now be extended without shipping a whole new build.
- NewAnonymous slash command usage — which commands you use and how often, and never what you typed after them. On by default, with a single switch in /config that turns it off, stopping the counting as well as the sending.
- NewA Machine ID in /config, derived from this Mac, so support can find your install without you sending any personal detail.
- ImprovedThe privacy page now lists every field the daily check-in sends, in full rather than in summary.
v1.11.0
Capturing Actions Happened in past
- NewNow Users can capture actions happened on their screen in last 30/60/90 seconds with /capture-screen 30|60|90 given their preferences. It captures actions prior the command was sent, and stores that in the journal as a log.
v1.10.0
Cinematic onboarding tour
- NewA self-driving first-run experience: a director script drives the real UI through a staged takeover, seeded with demo projects that carry backdated history and a fabricated git repository so every screen has plausible data.
- NewAccessibility-gated event synthesis powering the tour — right-click menus, keystrokes, and Unicode typing — with longer interludes for the Cursor agent prompt and a real repository page.
- NewApplication picker for shortcut targets, so editor and terminal launches respect which apps are actually installed.
- NewCommand history cycling in the input bar via the arrow keys, plus placeholder hint text.
- NewInput bar and entry pinning in the Journal view.
- NewTRACE_STORE_DIR debug override for isolated development stores, guarded against migrating a legacy store into a dev location.
- ImprovedOnboarding moved from a ghost-cursor takeover to a progressive, step-by-step flow after the ghost model proved fragile to pacing and window geometry.
- ImprovedProject focus view gained a card-shuffle transition between task states.
- RemovedThe /council entry point and its access path from the app.
- RemovedThe legacy slideshow onboarding — views, window controller, and roughly 50 MB of bundled video assets.
- FixedHeatmap day step in the onboarding flow now advances reliably.
- FixedKill-port menu no longer renders as a clipped sliver inside project rows.
- FixedLong journal logs containing blank lines render in full instead of being truncated.
- FixedBack button hit area expanded to a usable size.
v1.9.0
TraceServer & AI Council
- NewTraceServer — a localhost HTTP surface on 127.0.0.1:8787 (NWListener, bearer-token auth) exposing /health, POST /command routed through the existing command pipeline, and GET /projects/:id/context for journal and task grounding.
- New/council — a Next.js AI council of seven personas across six gated stages, grounded in live journal and task data. Includes cross-persona relay with unread badges, automatic stage-insight capture and manual save-back into the project journal, side threads, and an artifact gallery.
- NewCouncil agent harness with a mode-aware tool registry (artifacts including Mermaid, relays, stage insights), attachable skills, and web search.
- NewCouncil chat input with file and skill attachments, push-to-talk voice transcription with a live waveform, and an elapsed-time activity indicator.
- NewCouncil rendering for Markdown, Mermaid, and HTML artifact previews, zoomable inline diagrams, and a browse trail.
- NewNotification system with twelve triggers derived from existing app data and tiered delivery levels, including Claude usage alerts keyed to remaining quota.
- New/config for power-user opt-ins and for setting how many actions earn a project its daily checkmark.
- NewIn-app /claude-usage popup.
- ImprovedThe recap pipeline was extracted into a dedicated generator so the overlay and headless callers share a single map-reduce path.
- FixedDeleting a log now clears that day's checkmark instead of leaving it lit.
- FixedThe council launcher treats a hung listener on port 3789 as foreign rather than spawning over it.
v1.8.0
On-device AI
- NewOn-device AI over Foundation Models, with swift-ai-sdk vendored into the project — no network calls and no API keys.
- New/recap for on-device work summaries, scoped to the calling view: the project list recaps everything, the focus view recaps only the project in focus.
- NewProject catch-up banner for stale projects, and a cross-project briefing shown on return after a break.
- New/find — on-device semantic search across the work log, available from both the project and Priorities views.
- New/canvas — an AI pipeline that traces features out of git history into a draggable, pinch-zoomable feature map, presented from the project focus view.
- NewStructured-output and enum-pick primitives in the AI layer, plus history-derived cache invalidation keyed on the repository HEAD.
- ImprovedShortcuts now support multiple directories and repositories per project; the GitHub shortcut lists every repository across a project's directories.
- FixedRepaired guided-generation streaming in the vendored swift-ai-sdk.
v1.7.0
- New/create-section to group pending tasks under named dividers, with those dividers carried through to the completed-tasks table.
- NewTask completions broadcast to local listeners.
- FixedAttaching images from folder-based sources.
- FixedDuplicate prompt when submitting non-command input in the focus view.
v1.6.0
- NewClickable links in tasks and logs, styled to match body text with an underline and a per-link hover fade.
- NewCompletion tick beside a project's name once meaningful progress is recorded that day.
- NewWrapping and unwrapping in the Priorities view.
- ImprovedAccess gating: free use is limited to two projects; a full unlock requires contacting the maintainers.
- ImprovedOnboarding is now mandatory — the app is unreachable until it completes.
- ImprovedOnboarding steps reordered.
- ImprovedThe docs/ folder is no longer tracked in version control.
- FixedRestored SwiftUI text rendering for task rows that had gone invisible.
v1.5.0
- NewLive dev-server port detection per project, surfaced in a dedicated row beneath the project focus header.
- New/claude-usage to open Claude usage settings.
- New/show-tags and /hide-tags to toggle tag display on project rows.
- NewGit commits shown alongside logs in the Journal view.
- NewFirst-run onboarding flow.
- NewImage attachments in journal logs.
- NewDelete action for pending tasks.
- ImprovedThe cursor now becomes a pointer over tappable elements across the project list and focus views.
- FixedView state is preserved when the app is summoned via the global hotkey.
v1.4.0
- NewHeader statistics on the project heatmap view.
- NewAutomatic new tag on projects for their first ten days, removed automatically thereafter.
- New/delete-project to remove abandoned projects from the database, cascading their rows.
- NewTemporary Priorities list for day-scoped work outside any project, with its completions surfacing in the "today" feed.
- NewInline slash-command suggestions in the input bar.
v1.3.0
- NewGlobal hotkey to summon the app from anywhere.
- NewVoice input support.
v1.2.0
- NewOpen a project directly in Cursor from the task screen, and in cmux from the project focus view.
- New/rename, /add-tag, /remove-tag, and /filter commands.
- NewCombined and per-project heatmaps reachable from the project list.
- NewTimer views with accompanying animations.
- NewGitHub repository link button.
- NewRight-click menu with a quit action.
- RemovedThe /archive and /bring-back commands, superseded by tagging and filtering.
- FixedCrash when the timer's finish outline animation completed, caused by overlay windows tearing down mid-stroke.
- FixedHeatmap view positioning, task text editing, and text overflow in task cards.
- Fixedcmux launch button target resolution.
v1.1.0
Initial release
- NewInitial release of Trace, a menubar-only macOS 14 application for tracking projects, tasks, and work history.
- NewSQLite storage layer built on a database actor with schema migrations, over a four-table schema.
- NewDomain models for projects, tasks, journal entries, and activity, each with an observable repository store.
- NewSlash-command system — command enum, parser, and router — driving all interaction from a single input field.
- NewProject list view and a per-project kanban focus view.
- NewSecondary views: help overlay, today feed, contribution heatmap, and journal.
- NewReusable components: command input with #project autocomplete, task cards, project rows, and an undo toast.
- NewFloating heatmap tooltip with click-to-expand day activity.
- NewRelative time formatting, task rot staging, and data export utilities.
- New/show-all and /show-active as explicit commands rather than a single toggle.
- NewProduct specification, architecture notes, feature list, build milestones, and README.