NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #1713 by repository stars
Last release today
05 Oct 2026
Release timing varies
gaps range from 8 days to 2 months
Nearly every release is documented
notes for 58 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
9 months old
184 releases · first in 2025
One column per month.
0258bab Merge branch 'fix/td-4d99ae-tmux-test-isolation'
Mostly internal groundwork — the embedded td monitor, the global Workspaces browser, and the Notes editor — plus the fixes that fell out of it.
shells.json is now watched rather than polled, and a signal re-fingerprints
the manifests by content so only projects that actually changed are re-read.j/k
moved rows. Tab-cycling never went through that path, so only the mouse was
affected. The rule now asks the drawn pane tree — a press inside any
non-terminal leaf belongs to that leaf — which cannot fall behind a leaf kind
added later, the way this regressed twice before.node, so
prompts like "ctrl+c to stop" stole those panes. defaultAgentType=cursor
compounded it: a plain zsh or a Grok session still read as Cursor. Live chips
and Overview now show what the process actually is; the launch preference
stays the restart default.alt+s when the terminal swallows shift) extend a source-coordinate
selection that survives wrap and resize. alt+a selects all, alt+c copies
the selection or the whole note, alt+x cuts, and typing, paste, or
backspace replace the range as one undo unit. ctrl+z undoes and
ctrl+y / ctrl+shift+z redo; short typing bursts coalesce. Bare v and
u still type. The tmux editor keeps vim's own undo.d6c86c1 fix(update): show why an update failed, not just that it did
A failed update now says why. The failure modal rendered only the error,
truncated to a single line, and discarded the failing command's output
entirely — so a failed go install showed the command and nothing else, with
even exit status 1 cut off. A toolchain error, a network failure, and a
checksum mismatch were indistinguishable. The modal now shows the error plus
the tail of the command's output, where the compiler or toolchain message
lives, wrapped to the modal width rather than truncated.
Note for anyone updating from v1.0.0: the go install environment fix in
v1.0.1 is run by the newer binary, so the v1.0.0 → v1.0.1 update could still
fail. Install v1.0.1 or later once by hand and automated updates work from
there on.
147454f feat(cli,ui): auto-apply shell rename live and update agent instruction copy
A performance and install-reliability patch on top of 1.0, plus a smoother shell-rename flow.
git status a refresh runs touches the index's attributes,
which kqueue reported back as a change on .git/index, scheduling the next
refresh forever. Attribute-only events are dropped now; real index writes
(which arrive as a rename) still land in the panel within a second or two. On
top of that, git worktree list no longer runs inline on the render goroutine
every tick, and td's monitor honors plugins.td-monitor.refreshInterval — a
setting that existed, was validated, and was never read — now defaulting to
10s instead of polling every 2s. Idle subprocess spawns went from 1259/min to
30/min and idle CPU from ~24% to unmeasurable.go install now matches the manual one. It inherited
Sidecar's environment, so from a checkout with an active go.work it picked up
local replace directives, and it carried whatever CGO_CFLAGS the machine
had — either of which could fail the cgo build. It now runs with GOWORK=off
and appends the warning suppressions to the user's own CGO_CFLAGS, and the
manual command shown on screen reflects the same environment.Sidecar 1.0. The surfaces that were converging over the 0.9x series — the project workspace and the global Sessions browser, the pane frame under both
Sidecar 1.0. The surfaces that were converging over the 0.9x series — the project workspace and the global Sessions browser, the pane frame under both, the CLI agents reach Sidecar through — are now one model with one set of rules, and the configuration you needed a text editor for lives in the app.
[sort] [+]), one age
formatter, and a sort — by activity, recency, or name — that is remembered per
project and reachable from the keyboard with v.internal/panelayout and
internal/paneframe own pane structure, geometry, chrome, borders, the
compositor, and hit regions; each surface binds to them in a single file. Drag
handles work on every resizable split, live panes debounce their resize until
the divider drops, and a unified focus ring follows the pointer and takes the
keyboard.{ / } to cycle, x to close. Project tabs persist per
terminal surface; global tabs stay in memory for the selected row.sidecar open works from anywhere. Outside a Sidecar shell, against the
workspace root, for multiple requests in one run, and into a Diff leaf
(--diff, or by clicking an underlined git hash or range). It reports when an
open was retargeted into an existing pane. sidecar --agents documents the
whole surface for agents.internal/livewatch keeps issue, document,
and diff panes current without a keypress.workspacediff viewer with its own keys
and paging, commit-as-root tabs, section line totals, and a total commit count
in Git.pkg/notes API rather than its own database
handling.d, the chip, and sidecar open --diff are the
paths into Diff.github.com/marcus/td v0.58.0 (public pkg/notes API)github.com/marcus/tasks v1.8.3Worktree terminals are terminals. The Output / Diff / Task tab row is gone. Diff and Task stay as header action chips that insert a leaf beside the li
, / . no longer cycle worktree views; they cycle Diff
target tabs only while a Diff leaf is focused. d, the Diff chip, and
sidecar open --diff are the paths into Diff.--disable-feature=workspace_doc_panes now means no Diff: there is no pane
tree, so d / the Diff chip / sidecar open --diff toast or no-op
("Document panes are disabled; Diff needs the workspace pane tree").{ / } cycle; x closes the active tab. Project tabs persist per
terminal surface (q hides, last x forgets). Global tabs stay in
memory for the selected row and are not written to disk.Workspace previews are now a real pane system. A terminal can sit beside nested document and td-issue panes, each placed and composed from one shared
A global scope that spans every project. Sidecar now has a second space above the per-project one, with its own tabs — Overview, Workspaces, and a hos
m (and a clickable chip) toggling rendered against raw, and any
local file an agent prints — not only markdown, not only paths inside the
worktree — openable straight from the terminal by clicking its link.internal/tty, fixing a family of drift bugs:
panels that resized to the wrong height, a pin left frozen by an empty
gesture, a notch that thawed a window mid-selection, clipped primary previews,
and term-panel or editor chrome being mistaken for a worktree pane.q
types normally in the global Rename Shell modal, Enter closes the View
fly-out after applying a sort, and the Task tab's m no longer fires while a
hidden doc pane holds focus.Conversations is opt-in via the `conversations_plugin` feature flag (default off). The multi-agent session history tab no longer ships enabled. When t
conversations_plugin feature flag (default off). The multi-agent session history tab no longer ships enabled. When the flag is off (the default), Sidecar does not register the plugin, does not construct history adapters, and does not read agent session stores — so there is no Detect/watch/load cost for users who do not need the tab. Re-enable with "features": { "flags": { "conversations_plugin": true } } in ~/.config/sidecar/config.json, or sidecar --enable-feature=conversations_plugin. With the flag on, plugins.conversations.enabled: false remains a hard off-switch. Tab shortcut numbers for plugins after Conversations shift left when it is off.sidecar shell name reports the current shell's name from the manifest,
so an agent can check whether a stale name still describes its work. Naming
guidance now asks agents to rename whenever a previous task's name no longer
fits, and Grok launches receive the same rules.The embedded Tasks tab adopts Tasks v1.6.0's refreshed visual system. Every list now shares aligned priority and metadata columns, section rules and c
The embedded Tasks tab adopts Tasks v1.6.0's refreshed visual system. Every list now shares aligned priority and metadata columns, section rules and counts; Agenda uses calendar groups; and the detail rail adds clearer state, labels, actions, links, and subtask progress.
Agents can rename their current shell through a deterministic CLI.
sidecar shell rename [--json] <name> updates the Sidecar-owned display name
without renaming the tmux session or terminal title. New shells publish their
name through SIDECAR_SHELL / SIDECAR_SHELL_NAME, and supported harnesses
are prompted to replace generated names with meaningful ones.
Overview completion means recently finished work. Sidecar persists semantic activity transitions so newly completed agents stay visible as done without classifying every old idle shell as a fresh completion.
The Git sidebar shows section line totals and the repository's total commit count. Async loads are request-ID guarded so stale history results cannot overwrite a newer repository view.
Brackets cycle top-level tabs consistently. [ and ] now move through
the assembled plugin order, with contextual plugin commands retaining
precedence where they own those keys.
The update journey now covers every product Sidecar knows about, and tells the truth about each one. Pressing u from diagnostics shows one confirmation naming every product that will change, with its current and target version and the install method Sidecar will use — Sidecar 0.95.0 → 0.96.0 · Homebrew. When the tasks_plugin feature is effectively enabled (config or CLI override, exactly as plugin assembly resolves it) and the standalone tasks command is installed, the Tasks suite joins Sidecar and td in that list. With the feature disabled, no Tasks check, process, or network request happens at all.
Sidecar never installs Tasks just because the plugin is enabled: if the standalone commands are missing, diagnostics show embedded only · standalone not installed with the supported brew install marcus/tap/tasks command, and updating Sidecar refreshes only its embedded Tasks tab. A confirmation updates; it does not install a new product.
brew --cellar) or to your active Go bin directory — so a Homebrew Sidecar alongside a go installed td, or an active local Tasks development selector, is handled correctly. An unrecognised install is reported with a manual command rather than overwritten.updated, already current, needs a manual update, and failed, with a per-target manual command for anything that failed. Retry runs only the failed products.tasks, tasks-tui, and tasks-api together, so a partially updated suite is a failure rather than a silent success. Success is never inferred from exit status or Homebrew wording alone.Update in progress; the running package manager was never cancellable.Tasks tab (Beta), off by default. Sidecar can now embed the Tasks TUI as a tab, sharing one application rather than reimplementing a second task tool.
Tasks tab (Beta), off by default. Sidecar can now embed the Tasks TUI as a tab, sharing one application rather than reimplementing a second task tool. Tasks keeps ownership of its storage, rendering, overlays, and agent queue; Sidecar owns placement, lifecycle, keys, help, and the footer. Sidecar never reads or writes tasks.jsonl directly. Requires a configured Tasks install — an unconfigured or unreadable store shows a diagnostic and a setup hint rather than an empty list that looks authoritative.
Enable it by adding the feature flag to ~/.config/sidecar/config.json:
{
"features": { "flags": { "tasks_plugin": true } }
}
The tab appears after Workspaces by default. To place it after Notes instead:
{
"plugins": { "tasks": { "position": "after-notes" } }
}
Beta: the tab is usable day to day, but per-project context following, work search across td and Tasks, and workspace/capture links are still to come.
Contextual plugin keys take precedence over global keys. Key input now resolves through a documented ladder — Sidecar modal, plugin text-input or blocking overlay, plugin contextual binding, Sidecar global, then unbound forwarding — so a plugin showing its own list decides what a key means while it is focused. Driven by two opt-in interfaces, KeyRouter and FooterStatusProvider; plugins that do not implement them behave exactly as before. ctrl+c, q, and ? are host-reserved and can never be captured by a plugin. Recorded in docs/adr/0001-contextual-plugin-keys-take-precedence.md.
Tab order is data, not statement order. Plugin registration moved out of main.go into internal/plugins/assembly, whose Plan is a pure function of config plus feature flags. Tab shortcut numbers are derived from the resulting order; nothing assumes a fixed number when preceding plugins are disabled.
The command palette carries commands that have no key. A plugin can publish an invocable command without binding a key, and it still appears in ? and the merged help. This is what lets Sidecar decline a key without making the underlying command unreachable.
github.com/marcus/tasks v1.5.0, the embeddable Tasks TUI.go directive to 1.26.0 to match that module.github.com/marcus/td stays at v0.56.0 (already latest).Copy terminal selections with `cmd+c`. On terminals that deliver the macOS shortcut to Sidecar, cmd+c now copies selected text in both read and intera
cmd+c. On terminals that deliver the macOS shortcut to Sidecar, cmd+c now copies selected text in both read and interactive modes; alt+c remains the portable and configurable alternative. Copying with no selection leaves the clipboard untouched and points to select-all. Super, Meta, and Hyper chords that tmux cannot faithfully encode are swallowed instead of typing stray characters into the pane.The Agent Overview owns the keyboard while it is open. Opening the board over a workspace left in interactive mode no longer routes your keys into the
esc, q, and K close the board (q closes it rather than quitting sidecar), global shortcuts (@, #, W, ?, !, `, ~, 1-9) keep working over an embedded shell, and unhandled keys — including bracketed paste and unparsed CSI u sequences, which previously typed straight into the covered pane and could run on newline — stop at the Overview instead of reaching a plugin you cannot see. The overview context bindings are registered so ? lists them, and the footer shows the board's own hints.F instead of collapsing to the base rune.◎ live rather than ● running, so a plain shell with a process but no agent activity no longer looks like busy work.tmux prefix in favour of the session name.Nothing published for this version
The cross-project Agent Overview is on by default. A single board shows every agent workspace across all your projects, not just the one you have open
K to reach it. Rows interleave workspace identity (project, branch, agent) with live inventory (activity state, diff size, PR status), and the board is colour-encoded by state so a glance tells you what is working, blocked, or waiting on you. Refreshes are request-ID'd and per-project trackers are isolated, so one slow project can no longer stall or corrupt another's row, stale navigation results are rejected instead of jumping you to the wrong pane, and sibling worktrees are matched to their real panes. The compact/narrow layouts keep the app header and active tab on one row. (td-1983cb, td-d2e415, td-5feb84, td-a2b217, td-2fb16f, td-a2ec37, td-897e31, td-47321d, td-20f583, td-7e8d0d, td-6b4657)Agent activity detection is semantic, not just pattern-matched, and it now drives the kanban board. Working/idle/blocked/done for Claude, Codex, Gemin
internal/agentactivity) that reads pane titles, the current foreground process, and a bounded "current bottom" window of the screen — not raw scrollback, so resolved historical UI (an old prompt scrolled past) can no longer masquerade as live state. This activity tracker is now authoritative over the legacy tmux-render heuristic for every provider it supports, and the kanban board's lanes and card health/status text are driven from the same presentation function as the list view, so the two can no longer disagree. A worktree's health (missing folder, orphaned session, error, paused) always wins over activity, and a completed run is flagged unseen ("done") only on a genuine transition from working — restart or initial idle stays quiet, and idle observed only because a positively-identified process produced no rule match ("fallback idle") never itself creates an unseen-done badge. (td-8ac0a8, td-e48244, td-eef998, td-defc9c, td-725a7e, td-495065, td-f1b868, td-6e56a6, td-4954e5, td-22b195)make install-local / make install-worktree / make use-homebrew manage a Homebrew-linked development binary safely. scripts/dev-install.sh builds and swaps the linked sidecar binary in place, refuses to run install-local from a branch or a linked worktree (use install-worktree when that's deliberate) so an incidental checkout can't silently become "the" dev binary, and make install-status / make test-dev-install report and prove the switching logic against an isolated fake Homebrew prefix. make install remains the old unmanaged go install path. Mirrors the switching tool td just shipped. (td-d2466a)Git status parsing is hardened for large trees and copy/rename cases. git diff --numstat is now parsed as NUL-delimited (-z) output instead of scanning tab-delimited lines with a regex, which broke on filenames containing tabs or newlines and matched staged/unstaged diff stats to entries by filename instead of by request; renamed-and-copied entries (C) are now distinguished from pure renames and staged/unstaged flags are read from both status columns instead of assuming a rename is always fully staged. Untracked-file line counting (a separate batched wc pass) was removed as redundant. Proven at scale against large working trees. (td-07bb70)
Git status snapshots can no longer be torn or stale by the time they render. Every status/history/diff/preview load is now a request-ID'd, immutable snapshot: a load in flight when another refresh arrives no longer overwrites in-place fields the UI is mid-render against, a stale response is dropped instead of applied, and a refresh that arrives while one is already in flight is coalesced into a single dirty flag rather than double-fetching. Errors from a failed refresh surface as a toast instead of silently leaving the old tree on screen with no indication it's out of date. (td-403712)
The git file-system watcher tracks the actual administrative files git is touching, not a hardcoded .git/ layout. Paths are resolved with git rev-parse --git-path so linked worktrees (whose HEAD/index live outside the common .git directory) are watched correctly, refs/ is walked recursively so nested ref directories are covered, and index-only churn versus HEAD/ref changes (which invalidate commit history) are classified precisely instead of both triggering a full refresh-and-reload. Stage/unstage operations are serialized through a single write executor with proper async result handling, replacing a debounce-and-batch shortcut. (td-ce6c26, td-ee1242)
Stage-all/unstage-all and other bulk git write operations run asynchronously instead of blocking the UI thread, coalescing rapid repeated calls and reporting failures without corrupting the file list. (td-ee1242)
Stale startup and dead-code debt removed from the git plugin. Sidecar's .gitignore scaffolding entries are now written only when the user explicitly initializes a new repo from Sidecar, not merely when opening an existing one; a stash-index placeholder that called exec.Command("echo") purely to satisfy an unused import was replaced with real index parsing; several unused stash helper functions were deleted. (td-c35648)
A second sidecar can no longer make your running shells disappear. The shell manifest is a file every sidecar instance on the machine shares, and startup used to prune every entry whose tmux session it could not personally see — so a sibling worktree, or a test run on its own tmux socket, would quietly rewrite shells.json down to its own sessions. A live instance watching that file then dropped six shells from the Workspaces sidebar whose tmux sessions were still running, and r did not bring them back. Persisted definitions now record which tmux server owns them, absence is only treated as death when this instance could actually have discovered the session, in-memory shells that are alive locally survive any manifest another instance writes (and are healed back into the file), and r re-runs discovery so surviving sessions come back without restarting the app or hand-editing JSON. (td-8d18de)
A shell that comes back to life is usable again. When a session that had gone missing reappeared, the sidebar row switched from offline to live but never regained its terminal, so opening it silently did nothing until the app was restarted. Reviving a shell now rebuilds its session and starts polling it. Related: a sibling worktree's shells are no longer listed in your sidebar as offline rows you could never open (they are still preserved in the shared file), a failed tmux list-sessions is no longer read as "nothing is running" — nothing is pruned when tmux cannot be reached — and shell manifest edits merge with what is on disk instead of overwriting a rename another instance just made. (td-8d18de)
-config now also relocates state.json and debug.log. They live next to config.json, so sidecar -config ~/somewhere/sidecar.json reads and writes its persisted UI state and debug log from ~/somewhere/ rather than ~/.config/sidecar/. This is what makes -config a real isolation lever for proof runs. If you pass -config in normal use and want your existing preferences, move state.json next to the config file you point at. (td-8d18de)go test is isolated from the real state tree by default. Any test binary is treated as asserting isolation, so a package that forgets to redirect XDG_STATE_HOME now gets a refusal instead of quietly creating directories in ~/.local/state/sidecar/projects. A test that deliberately exercises the ordinary unisolated path sets SIDECAR_ALLOW_REAL_STATE=1 (with HOME pointed at a temp dir). (td-8d18de)~/.local/state/sidecar. Sidecar now refuses to read or write anything under the real state or config tree when SIDECAR_ISOLATED_STATE=1 is set, exiting at startup rather than touching a byte; SIDECAR_DIAG_PATHS=1 (implied under asserted isolation) prints the resolved state, config, tmux socket and manifest paths. scripts/tmux-drive.sh now isolates TMUX_TMPDIR, XDG_STATE_HOME, XDG_CACHE_HOME and -config under one run root, adds a paths subcommand, and tears the inner server down by explicit socket path; scripts/tmux-screenshot.sh refuses to run un-isolated, and tmux-drive.sh start refuses to take over a run root another driver is already using (set SIDECAR_DRIVE_RUN_DIR per agent, or SIDECAR_DRIVE_FORCE=1). A cross-instance regression suite proves an isolated instance cannot evict a peer's live shells or write the real manifest, and the headless-testing guide, AGENTS.md and PRIVACY.md now document both isolation axes (including that XDG_CONFIG_HOME moves nothing). (td-8d18de)Grok is a first-class workspace agent. Create and start workspaces with Grok (grok, skip-permissions via --always-approve) alongside Claude, Codex, an
grok, skip-permissions via --always-approve) alongside Claude, Codex, and the rest. Configure which agents appear and in what order with plugins.workspace.agents (for example ["grok", "claude"] to hide Copilot and put Grok first); create/start pickers, defaults, and shell lists all honor the allowlist, and an unknown default falls back to the first listed agent.i, W, #, r, ctrl+c) are registered in the keymap so discovery matches what the app actually handles.RELEASE_VERSION=vX.Y.Z make release fail-closed-preflights (clean tree, live main, changelog entry, no replace, tag absence), pushes an annotated tag, waits for CI, and verifies or resumes the Homebrew formula. CI runs verify → GoReleaser → template-rendered Formula/sidecar.rb with downgrade/idempotency/race guards. See docs/releasing.md.Clicking the shell or agent output makes the terminal live. A click focused the pane but left it inert — entering interactive mode needed a separate e
enter/i/E press, so the pane looked active while typing went nowhere, and the wheel paged sidecar's own capture buffer instead of reaching the running app, which meant scrollback in TUIs like the Claude Code harness ignored it entirely. A plain click now enters interactive mode, matching enter; shift and alt clicks still fall through to read-mode drag selection, and the click is a no-op when there is no live session.esc cancels a gesture in flight. Moves that would corrupt the tree — a folder into itself or into its own subtree — and moves that would do nothing are refused with a toast saying why, and the same rules now back the keyboard m dialog, which previously reached os.Rename and reported a raw invalid argument. Drag-to-move is enabled for everyone: a press that moves less than two cells is still an ordinary click. There is no undo, so nothing moves unless the row was on screen when the button was released.td unstart records when releasing a claim, and the auto-cascade and auto-unblock notes — now sync between machines instead of being stranded forever on the machine that created them. A transition to open releases the implementer claim on every surface, including the API, which had never received the earlier reopen and unblock fixes. ERROR: and Warning: diagnostics moved from stdout to stderr so --json output is parseable. Sidecar needed no change for this and quietly benefits: the issue preview and search commands unmarshal td's stdout directly, which an error line used to corrupt, and their error extraction already fell back to stderr.The file browser now tracks filesystem changes as they happen. Sidecar watches the project root and expanded directories, coalesces bursts of creates,
files_auto_refresh feature flag.Nothing published for this version
The terminal window and tab are named after the active project. With several sidecars open at once, the tab bar now says which is which — sidecar, td
sidecar, td [charm] — instead of leaving every tab labelled by the shell, and the name follows along when you switch projects or worktrees from inside sidecar. The format is configurable through the new ui.terminalTitle template ({project}, {worktree}, {plugin}, {dir}); set it to "" to leave the title untouched, and outside a git repository it falls back to the directory name rather than clearing what your shell set. The previous title is restored on exit in terminals that support the title stack, and a title set by an editor or an attached session is taken back when you return. Under tmux this sets the pane title — see the docs for surfacing it in the status line.Scrolling an embedded terminal scrolls the program running in it. When the program has enabled mouse tracking — Claude Code, vim with mouse=a, htop —
mouse=a, htop — wheel notches now reach it as SGR mouse reports, the way any other terminal emulator delivers them. Previously every notch scrolled sidecar's own view of the captured pane instead, which was worst for full-screen programs: they draw their own scrollback inside the pane and leave tmux's history empty, so scrolling slid the viewport across the live frame and left the layout looking torn. Programs that track no mouse are unaffected and keep scrolling the captured scrollback, and alt+wheel still scrolls it for programs that do.`E` enters interactive mode again. The key was listed in the keymap and advertised by both the preview hint line and the command palette, but nothing
E enters interactive mode again. The key was listed in the keymap and advertised by both the preview hint line and the command palette, but nothing handled it — so it did nothing, and because the workspaces tab kept interpreting keys, whatever you typed next was read as workspace shortcuts (typing whoami after it opened the issue picker). enter was and remains the primary binding.Embedded terminals are driven by tmux control mode. Sidecar keeps a control connection to the visible terminal and re-renders when tmux says the scree
/ (or ctrl+shift+f while interactive) to search, n/N to step through matches, esc to clear. Search covers the complete tmux history, not only the ranges you happen to have scrolled through.ctrl+a for everything. Set plugins.workspace.copyOnSelect to copy as soon as a drag ends.ctrl+n creates a shell session directly from the workspaces tab, skipping the type-selector modal. It uses plugins.workspace.defaultAgentType when one is configured and creates a plain shell otherwise; it never passes an agent's skip-permissions flag, so use n → Shell when you want that. The hint appears in the workspaces footer next to New.plugins.workspace.autoCreateShell setting (default off). With it enabled, the first time you focus the workspaces tab in a session sidecar creates a shell for you, so a terminal is ready for quick tasks without going through the create modal. It only fires when no shell sessions exist — shells whose tmux sessions survived a restart are reattached as before — and it leaves the sidebar selection where it was rather than jumping to the new shell. Nothing is created until the tab is focused, so startup is unaffected when you open on another tab.whoami landing as whoaim). Keystrokes now go through a per-session queue that fixes their order where the key is handled, not where its command happens to be scheduled. Pastes share the queue, so pasted text can no longer interleave with surrounding keys.SetFocused only ran when switching tabs, so whichever tab sidecar opened on reported itself unfocused — which, among other things, made it poll its tmux sessions at the slower background interval until you navigated away and back.scripts/tmux-drive.sh, which runs sidecar on its own tmux socket, sends it keystrokes, and captures the screen as text and PNG — the terminal fixes above were all reproduced and verified this way, without a human at the keyboard. docs/guides/headless-testing.md covers it, including how to see the native cursor (which capture-pane cannot) and the tmux coordinate spaces the terminal code works in. AGENTS.md is now the single entry point for agent instructions.n (new workspace) and ctrl+n (new shell).Claude Code and Cursor sessions no longer go missing when the project sits under a symlinked path. Both adapters locate sessions by deriving a directo
git worktree list, which is resolved, while both tools record the working directory as the shell saw it. Where those disagree the lookup landed on a name that does not exist and the conversations tab reported no sessions at all. Both adapters now try the path as given and its resolved form, matching what the Warp, Kiro, Pi, and Pi Agent adapters already did.CLAUDE_CONFIG_DIR. Claude Code uses it to relocate its config directory; sidecar only looked in ~/.config/claude/projects and ~/.claude/projects, so a relocated install appeared to have no sessions.Startup is roughly 30x faster. Time to a usable first frame went from ~4.3s to ~0.1s on the machine this was profiled on. The gain is larger on machin
~/.codex/sessions — 3.5s against a few thousand sessions. Detection now runs asynchronously and probes adapters concurrently, so it costs the slowest adapter rather than the sum, and the tab shows its loading skeleton until results arrive.git rev-parse --git-dir prechecks before git worktree list and git remote get-url, halving the subprocess spawns on those paths.SIDECAR_STARTUP_TRACE for diagnosing slow launches. Set it to stderr to print a phase-by-phase startup timeline (or 1 to write it to the debug log), and SIDECAR_STARTUP_TRACE_DELAY to dump the trace later so asynchronous startup work is included.--json output across the CLI mutation commands, project slugs and invitations, plus fixes for sync conflict false-positives, handoff autosync stalls, and SQLite timestamp serialization.Add an Oh My Pi (OMP) conversation adapter for sessions stored under ~/.omp/agent/sessions, reusing the Pi Agent JSONL parser with OMP's current proje
~/.omp/agent/sessions, reusing the Pi Agent JSONL parser with OMP's current project-path encoding./tmp resolving to /private/tmp.td monitor: capital-letter keyboard shortcuts now work again. After the v0.85.0 Charmbracelet v2 upgrade, Y (copy task ID) and every other shift-bound
Y (copy task ID) and every other shift-bound shortcut in the embedded td monitor silently did nothing. In Bubble Tea v2 a shifted printable key arrives as the unshifted code plus a shift modifier, so td's keymap matched against "shift+y" instead of "Y". Fixed upstream in td and pulled in via the dependency bump below.KeyToString now uses Key.String(), mirroring sidecar's own keymap fix).Charmbracelet v2 migration: upgraded to the charm.land v2 stack — lipgloss v2.0.3, bubbletea v2.0.7, bubbles v2.1.0, glamour v2.0.0 (huh v2.0.3 transi
charm.land v2 stack — lipgloss v2.0.3, bubbletea v2.0.7, bubbles v2.1.0, glamour v2.0.0 (huh v2.0.3 transitively, via td). Bubble Tea v2 ships a faster renderer and a declarative tea.View; lipgloss colors moved to image/color.Color; key/mouse handling moved to the v2 message model (KeyPressMsg, MouseClickMsg/MouseWheelMsg). No intended behavior change — a mechanical migration verified against the full test suite.tea.*/lipgloss.* types. The local development replace directive was removed.bump td to v0.44.0 — SQLite configuration stabilization: foreign_keys=ON enforced on CLI issues.db with migration 30 orphan cleanup + schema ON DELETE
foreign_keys=ON enforced on CLI issues.db with migration 30 orphan cleanup + schema ON DELETE CASCADE on child relations; centralized SQLite opener (OpenSQLite) with uniform pragmas; PASSIVE WAL checkpoints on Close; removed redundant manual cascade emulation in internal/sync/events.go; new td doctor fk orphan audit (gated by TD_FEATURE_SYNC_CLI=1); new TD_MONITOR_DBPOOL_DEBUG env var for monitor connection-leak tracing; td import tolerates forward-referencing deps via per-transaction FK toggleNothing published for this version
feat: full-file diff view with minimap
bump td to v0.43.0 — 24 bug fixes: atomic lossless import, UpdateIssue missing fields, timezone-aware defer/due filtering, RemoveDependencyLogged wron
Nothing published for this version
bump td to v0.42.2 — 14 bug fixes: SSE nil-validator panic, work_session_issues sync, non-atomic undo, rows.Err() propagation, timestamp parse, non-tr
chore: bump td to v0.42.1 — fixes lossless import round-trip for all issue fields and associated data
Agent-powered PR description generation in merge workflow
.sidecar-agent-start override per worktree (#198)Add GitHub Copilot CLI adapter for conversations plugin
Add Amp agent support for workspaces
Open In modal to open projects in IDEs
~/.local/state/sidecar with migration (#197).todos file vs directory conflict in onboarding (#206)Fix git locking errors in background operations by using --no-optional-locks (PR #186 by @borisvu)
--no-optional-locks (PR #186 by @borisvu)Nothing published for this version
Nothing published for this version
Shift+Enter and semicolon key fix for Ghostty terminal (PR #171 by @boozedog)
Kanban board view — press V in board context for overlay, f to toggle fullscreen
Nothing published for this version
Updated td to v0.35.0 — adds GTD-style deferral (td defer, td due, temporal list filters, monitor modal defer/due display)
Prevent refreshSessions from overwriting concurrent session list updates
brew update before brew upgrade in self-update flowPi Adapter: View Pi AI agent sessions (OpenClaw) in the conversations plugin, with session classification (interactive, cron, system), source channel
Amp Code Adapter: View Amp Code IDE threads in the conversations plugin, with token usage, tool calls, and project matching
Fix file search (/) hanging on large projects by reusing Ctrl+P file cache with fuzzy matching
/) hanging on large projects by reusing Ctrl+P file cache with fuzzy matching (#107)Nothing published for this version
Homebrew Formula: Install via brew install marcus/tap/sidecar — builds from source for native Apple Silicon performance
brew install marcus/tap/sidecar — builds from source for native Apple Silicon performanceAdd ProjectRoot to plugin.Context for worktree-aware shared state
Merge notes plugin behind feature flag
Fix Claude Code adapter not detecting sessions in paths with dots or underscores
/home/user/github.com/project now correctly match/home/user/my_project now correctly matchFurther FD tuning with codex integration
Tiered file watching for FD reduction (reduces open file descriptors)
Character-level text selection in file browser
Stream session results per-adapter for incremental loading
Breadcrumb navigation in git diff view
[ characters leaked from mouse motion CSI sequences using time-gatingYour coding agent can read these notes before it upgrades. Set up the MCP server →