v1.20Latest
The documents a project is made of, a recording you can read, and a buffer that records the screen you are on
- NewA project now has a library: the documents that describe it and the places it needs. A sixth button in the project header, opening in the same popover footprint as the journal and the heatmap, holding two kinds of thing — artifacts, the documents that describe the product (PRD, architecture, C4, ADR), and resources, the places it runs (dashboards, dev servers, staging). Both belong to the project rather than to any one of its repositories, which is the entire point: a project is several checkouts, and a document sitting in one of them is a document the next session cannot find. Artifacts and resources share one recency-ordered list rather than sitting behind two tabs, and the row grammar tells them apart. Resources arrive already populated from what Trace knew anyway — listening dev ports, the bound Slack channel, the Linear team, the GitHub repo — offered in a "found in this project" section you keep or dismiss. Git remotes are deliberately not offered, because the header's GitHub button already lists every remote across every linked folder. Links you pasted into journal logs months ago can be saved into the library from the log's right-click menu, and an empty library offers to bring in whatever is sitting in the repo's docs folder. Agents get trace_project_context, which assembles the current PRD, architecture, attached documents, repositories and services into one brief, plus trace_read_artifact and trace_write_artifact — and an agent's own documents land as drafts that are never handed on as context until a human promotes them. The artifacts directory is registered in TraceArchive: these are the only copies of documents deliberately taken out of a repository, and an archive without them would defeat the feature rather than shrink it.
- NewThe library renders what it holds instead of printing it. Architecture diagrams draw: Mermaid 11.15.0 ships inside the app and is injected into a local web view, so a diagram renders with no network access — bundled rather than pulled from a CDN because drawing your own system on your own machine should not tell anyone else that you did. The view refuses every navigation after its first load and Mermaid runs at strict security, so a diagram carrying a click directive or an injected script tag can neither run code nor open a page; a diagram that will not parse shows Mermaid's own error above its source rather than an empty pane. An HTML prototype exported from claude.ai used to file as Text and open as a page of markup — it now runs, with the same Preview/Source control Markdown and Mermaid carry and a button to hand it to Safari, recognised by extension and also by content, since a page downloaded out of a browser arrives as .txt, as .download, or with no extension at all. A workbook opens as a spreadsheet — lettered columns, numbered rows, ruled cells, measured widths, sheet tabs, read from the file rather than rebuilt from its own flattened text — and a Word file opens as a document, extracted to Markdown with numbering.xml parsed as well, because without it "1. Point it at staging / 2. Run the migration / 3. Flip the flag" renders as three interchangeable bullets and the list loses the one thing it was saying. Every format is read against two budgets: 500 rows for an agent's context window, 5,000 for a reader who scrolls. "Open with" hands a document to another application, and a text artifact is written to a scratch copy that is read back whenever the library is opened, Trace comes to the front, or an agent asks for the project context — so editing a PRD in your own editor is not a way to lose it.
- NewTyping @ in the command bar opens the library, and everything in it can be related to everything else. Bare @ lists what is there, newest first; typing filters on title, then on the kind and format words. Return opens the row — an artifact in Trace, a link in your browser — and Command-Return hands it to agents as project context, or takes it back. It sits beside the existing #project and /command completions and works from the board and the journal alike. Relations get a UI on top of the edge table the library was built with: one "Related…" menu listing everything else in the library with a tick where a link exists, so linking and unlinking are the same gesture. Links are stored as an ordered pair but read in both directions, because nobody choosing "Related" from a menu is choosing an arrow. trace_project_context and trace_read_artifact name what each document is related to, so an agent handed the requirements knows the sequence diagram exists and can ask for it. A document written by an agent also raises a notification that opens the exact document in its project library, rather than landing silently in a list nobody was watching.
- NewA recorded call reads back as something you can act on. Forty minutes of transcript is an undifferentiated wall in which the two sentences that commit someone to something look exactly like the forty minutes of context around them — nobody re-reads that, so the asks made on a call were lost the moment it ended even though they were recorded. Trace now marks them. Phrase cues for commitments, requests, obligations and deadlines, in English and Hindi, with an exclusion list for the phrases that wear an ask's clothes and mean nothing of the kind ("can you hear me" opens roughly every call ever recorded); the Hindi cues are light-verb pairs rather than bare stems, because a lone stem is half of a dozen ordinary phrases while the pair is somebody being asked for something and nothing else. Asking a model to extract the action items was the alternative and does not fit what this has to return — a span exact to the character, because the mark doubles as the seek anchor, where a model returns a paraphrase that then has to be matched back to text which never contained those words, and a near-miss points the video at the wrong minute. Underneath it, every sentence of a stored transcript now keeps the second it was said: a transcript was text and nothing else before, so nothing downstream could answer "where in the recording was this". Both transcription routes feed it, on-device and Sarvam alike, so timings arrive with the text or not at all. The danda joined the sentence terminators while this was being built — the latest recording on this Mac carries 363 of them against 19 full stops, so a boundary test that only knew about the full stop was finding a handful of enormous sentences in a forty-minute Hindi call.
- NewClicking a marked line plays the moment it was said. The asks are set in bold and pulled to the top of the sheet under the minute each was spoken, so "what was I asked for" is the first thing on the tab rather than the reward for reading it. Clicking one opens a reader: video on the left, transcript on the right, Original and Translated where both exist. Jumping full screen to that second was the obvious thing and throws away what the transcript was for — the reader lands mid-sentence in a forty-minute call and the next marked line costs a close, a reopen and a scroll — so the click seeks the player already running, and a second line moves the same window rather than restarting it. The panel carries the marked lines as a jump list on request, follows the video by marking and scrolling to the paragraph under the playhead, and collapses to pure video. Marks carry weight and colour but no underline, because these transcripts are largely Devanagari, where a rule under the text runs through the matras.
- NewThe reader can argue with what was marked. Marking by phrase is crude on purpose — every line it marks really does say those words — and the price of that certainty is the two errors it cannot help making: an ask phrased sideways ("that's on me, then") goes unmarked, and a sentence that only wears an ask's clothes gets marked. Both are obvious to the one person who sat through the call and invisible to a phrase list, and until now there was nothing that person could do about either. Right-click a line to mark it, or an already-marked one to unmark it. The correction is kept as offsets rather than as text, because the transcript is the record of what was said and is never rewritten — which is also what lets a hand-marked line find its second in the video through the same cues every found mark uses. Re-marking a line whose mark was taken off restores the finder's own rather than laying a second one over it: that is a change of mind about the line, not a new mark. The two renderings keep their marks apart, since an offset into the Hinglish transcript names nothing in particular in the English one.
- NewA voice memo can be dropped into a log and is read like a capture. Drag a recording onto the journal's input bar — out of Voice Memos, or from the Finder — and it attaches as a chip showing its name and length, alongside the images and video a log already takes; Return files it with the log. From there it goes through exactly what a screen capture goes through: transcribed on this Mac, summarised into a title and an overview, and readable afterwards rather than sitting there as a file nobody opens. A drag out of Voice Memos is a file promise whose URL is deleted the moment the completion handler returns, so audio is copied into a staging directory inside that handler and every other route in is staged the same way — one rule for discarding and one for filing, and the original is never touched, so discarding the chip deletes only the staged copy.
- NewA log or a capture can be moved to another project. Right-clicking a journal row offers "Move to project", a submenu of the other active projects, and an Undo toast in the journal offers the way straight back. Nothing is copied: images and captures live in flat stores keyed by filename and the transcript, insights, decision payload, source and title are all columns on the entry row, so the move is one UPDATE and a capture keeps its video and its words by not being touched. The activities row that credited the log moves with it, since today's list joins activities to journal entries by reference but prints the project name from the activity — leaving it behind would have shown the moved log's text under the project it had just left.
- ImprovedThe local model is gated on the Mac it is being asked to run on, and hands its memory back. The server holds about 2.1 GB from the moment it loads — a fixed expert-slot cache and a KV cache, both allocated up front and held for the life of the process — whether or not anyone has asked it anything. That is a fair price while someone is working, a poor one overnight, and on a small Mac it is never a fair price at all: 2.1 GB is a quarter of an 8 GB machine before Trace, the browser and the editor ask for theirs, and the engine can be told to hold half that only by turning off chunked prefill, which takes a 2,600-token prompt from 30 seconds to 210. So there is a floor of 12 GB of physical memory, below which the engine reports itself unavailable with a reason and the Models pane says which Mac this is and how much it has, and the memory is released when nothing is using it. Startup got cheaper too: the vendored server can now be handed a trusted receipt instead of re-hashing the weights, which was reading 1.35 GB of model weights on every single load under a comment about verifying "the small, always-touched files" — re-reading 12.6 GB on each start bought little and evicted everything else from the page cache doing it. The server also dies with its launcher rather than outliving it.
- ImprovedA finished task's account is summarised rather than re-printed. The confirmation panel's Findings was Original with bullets in front of it — the agent's account split at its full stops, same words, same order, same length — so it saved no reading and existed only as a second place the same prose lived. The reason to open it was never "there's less of it here". It now runs the account through the same prompt, parser and two-to-four point shape the task detail panel already shows for a finished task, on this Mac, on whatever local backend Trace resolves to — one prompt and one parser, so an account reads the same way in the confirmation as it does on the task afterwards, with Original still the lossless, editable reading a click away for anyone who wants the words as written.
- ImprovedFiling a task no longer means backing out to make the section first. The /task picker offered only sections that already existed, so a task headed for one that had not been made yet meant cancelling, running /create-section, and starting over. A dashed "+ New section" chip opens an inline name field in the picker itself, and submitting it creates the section and continues straight into the same priority step a picked section would. The onboarding tour also ends somewhere with something in it: it files a real link into the project library and finishes by opening it, rather than ending on an empty surface and leaving the last step to be taken on faith.
- FixedTrace records the screen you are working on, not the one you were. The buffer is one stream against one display, and which display was chosen once — when the buffer started, from whichever screen held focus at that instant — and then never revisited for the life of the stream. On a single display that is the same answer forever and the question never comes up. On two or three it is a guess made at launch, before anyone has settled anywhere, and every capture from then on holds whatever that screen happened to be showing: a recording of an idle monitor while all the work happened on another one. That is the worst failure this feature has — not an error, not an empty file, just a plausible-looking recording of the wrong thing, and nothing in Trace said which screen was being recorded either, so it could only be noticed by watching the video back. Where you are is now read from the focused window first and the pointer second, deliberately in that order, because keystrokes go to the focused window and a pointer left parked on a second screen while someone types on the first is the ordinary shape of a multi-screen desk rather than the exception. The content filter is swapped under the running stream, so every segment already recorded survives the move — a restart would discard the history, and during a call that history is the recording.
- Fixed"Stop Sharing" no longer throws away the call it just recorded. macOS files Trace's replay buffer under the same screen-share pill as the call's own share, so Stop Sharing reads as ending the share when what it kills is the recording — and someone tidying up as a call wraps presses it believing they are stopping the thing they started. Every segment of the call was on disk at that instant, finalized and stitchable, and every one of them was deleted seconds before the export that was already coming; the call reached neither the project nor the drawer, so there was nothing to find and nowhere to look. The failure path conflated "no further history will arrive" with "the history is gone", and set the first before anything else had been told, so the export refused a call whose segments were all still sitting on disk. Only actually discarding the segments makes them worthless, so that is what the export checks now — while the by-hand exports keep checking the stop, because a person who has just stopped the stream is not owed a capture from behind it.
- FixedA buffer that is running and recording nothing is now noticed. Starting a capture succeeding is not evidence that anything is being recorded: a stream started against a display that is not genuinely back yet — the ordinary state of the world for a moment after a lid opens — returns success, spawns the system daemon, and then sits there delivering no samples and posting no error, so nothing in the existing failure path ever fires. It looks perfectly healthy while holding no frames, /capture-screen answers "still warming up" forever, and anything holding an anchor into the buffer is holding an anchor into nothing. Measured once at nine minutes before it was noticed and asked about, with no upper bound on it, because nothing was watching. Alongside it: a meeting session now re-arms any dropped audio track before it anchors — a session opens no stream and asks for no tracks of its own, so it adopted whatever audio state the buffer had drifted into however many hours earlier, which is survivable for a screen capture and not survivable for a call, where the audio is the recording and the loss is found once the call is over. When audio is gone anyway, the app says so as a warning rather than a note, because the buffer runs and capture works, so every other signal in the app reads healthy while the files come out silent. And audio is encoded at a bitrate the sample rate actually allows.
- FixedWhatsApp and Telegram calls are detected. The detector's own doc comment claimed all four of its apps were covered "in their native form, which is where these calls almost always happen", and that was false for two of them: WhatsApp and Telegram were named there as covered and were in no list anywhere, so the browser path rejected them by design and the native path was never wired — a WhatsApp call was detected by nothing at all while the comment said it wasn't. Both identifiers are read off installed copies rather than guessed, and Telegram ships under two, the native macOS build and the Qt desktop one. The scar stays in the comment, because a doc comment asserting another list's contents is a claim nothing checks, and this one went unread for as long as it took someone to lose a call to it. Naming apps only ever covers the ones somebody thought of, so there is a user list underneath it now for the ones nobody did.
- Fixed/recall stops citing log entries and decisions that don't answer the question. Two independent defects produced one symptom: a correct answer with irrelevant "Decisions on record" and "From your log" entries printed beneath it, which read as the evidence for it. The relevance gate never closed — ranking trims only relative to the best hit, and scores over one project's technical prose cluster so tightly that the floor landed near 0.37 and cut nothing, so all 24 hits survived on every query measured, "what is the weather in paris" included. The agent-facing recall had carried an absolute floor since its own relevance work; the find overlay, the Slack and Telegram digests and the work briefing never did, and do now. The second defect was keyword overlap ranking by length: it asked whether a term appeared anywhere in the whole concatenated item, so the longest records won by having more text for a word to land in.
- FixedOpening the menu-bar popover over a full-screen capture no longer switches you off its Space. Nothing was closing the video — the popover hands the foreground back to whatever app was frontmost when it opened, and it already declined to do that while the Config or Canvas window was up, for the same reason: a window Trace still has on screen is Trace's turn to keep. A full-screen player simply wasn't in that list, and it is the case with the sharpest teeth, because it owns a Space, so activating the previous app doesn't drop a window behind another one — it takes you off the Space the video is on. Elsewhere in the same pass: an attached image can be copied from anywhere it is shown rather than only from the one surface that happened to have the button, the new-project row takes the cursor when it opens, and a remote Claude Code login failure is reported back to Slack instead of a bare timeout, which is the difference between knowing the login failed and watching nothing happen.
v1.19
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.