github.com/marcus/sidecar
v1.4.0
#1623 most downloaded on Go modules
marcus/sidecar
What this package is like to depend on
Last release today
22 Aug 2026
Release timing varies
gaps range from 8 days to 2 months
Nearly every release is documented
notes for 135 of 150 stable releases
Nothing withdrawn
no release was ever pulled
7 months old
158 releases · first in 2025
158 releases in the last 12 months
see the full history below
Release timeline
158 releases · Dec 2025 to Aug 2026Releases
latest 60 of 158-
v1.4.022 Aug 2026Release notes
Open source →Changelog
- b657a3c Merge pull request #263 from youdie006/fix/search-focus-gg
- 5af121c Merge pull request #303 from marcus/scroll
- cb16507 Merge pull request #304 from marcus/fix/files-tree-scroll-fits
- 6059004 Merge pull request #305 from marcus/cross-project-td-links
- 7bdfc86 Merge remote-tracking branch 'origin/main'
- fdc5dfc Merge remote-tracking branch 'origin/main' into scroll
- 614729a build: pin td v0.63.0 and tasks v1.13.0
- 226eca9 build: upgrade Go directive to 1.27.0
- e0954e8 feat(configui): a Feature Flags page covering the whole registry
- 3531e44 feat(configui): every feature flag says what it does
- f876180 feat(terminal): span-capped background rendering with bounded/never modes
- 76f32df feat(tty): advertise truecolor to sidecar-managed tmux panes
- b8d9bce feat: content deck routes scrollbar gestures to hosted views (td-0d5d69)
- c02beac feat: cross-project td issue links resolve on local miss
- 3ad2867 feat: doc/issue viewer scrollbars draggable at view seam (td-b31ec5)
- a72d3a6 feat: file browser scrollbars draggable (tree/search/preview) (td-d889dc)
- 06ffcff feat: git/conversations/notes scrollbars draggable (td-550ce1)
- c653c29 feat: interactive scrollbar on project workspace sidebar (sessions parity) (td-85b9f6)
- ad14891 feat: interactive scrollbars on terminal panes (un-cut Phase 3)
- 6cedb54 feat: kanban lane scrollbars draggable (per-lane regions) (td-76f757)
- 330647c feat: modal viewport + switcher scrollbars draggable (td-a6317f)
- 32a07fb feat: palette + notification centre scrollbars draggable (td-3037a9)
- 7d9cb9b feat: sessions sidebar + theme picker scrollbars draggable (td-c6f01c)
- 80e5e28 feat: shared interactive scrollbar core with geometry + inverse mapping (td-6852aa)
- f768e4b feat: wire Sessions note preview scrollbar (td-14f48e)
- 3756ad5 feat: wire kanban lane scrollbars in workspace + overview hosts (td-a7d02e)
- f46207f feat: workspace_terminal_panel ships on by default (nt-7c82c9)
- c6f28cf fix(app): relaunch into the global tab the user left on
- 67e1572 fix(build): make lint reads the module Go version with GOWORK=off
- 4e3921e fix(configui): cap how far right a settings row pushes its control
- f14644e fix(configui): keep the Feature Flags page inside the pane it renders in
- ff8be52 fix(conversations): let g/G be typed into the session search box
- a897b52 fix(testenv): strip TMUX_PANE from isolated test environments
- 960e2ce fix(tty): scope the truecolor claim instead of asserting it for every terminal
- 7232026 fix(ui): strip background SGRs without nesting escape sequences
- dc37152 fix: align modal viewport bar regions with rendered column; cancel parent bar gesture on sub-modal open (td-a6317f)
- 72303e9 fix: correct OffsetAtRow re-anchor precondition doc + collapse test case (td-6852aa)
- 05c1659 fix: files tree shows full list from top when it fits the viewport
- a07592b fix: global Sessions list misses new projects and non-Git projects' shells
- ba4755e fix: lint clean under the CI-pinned golangci-lint
- f409379 fix: never resize the tmux pane hosting sidecar itself (td-9cddeb)
- 340fe28 fix: repeat pane opens stop lying; create shell opens beside the session (nt-7c82c9)
- 6c8be85 fix: wire issueview scrollbar gestures through workspace + overview hosts (td-b31ec5)
- a0af587 fix: workspace sidebar free-scroll clears on selection change only; bounded wheel-boundary test (td-85b9f6)
- 5972313 test(app): make the restored-scope assertions capable of failing
Release notes
Open source →Features
- Scrollbars you can grab, everywhere they appear. A shared interactive scrollbar core with one geometry and inverse mapping now backs the palette, notification centre, file browser (tree, search, and preview), git, conversations, notes, the doc and issue viewers, kanban lanes, the sessions sidebar, the project workspace sidebar, the theme picker, modal viewports, and the project switcher. Bars drag from anywhere on the track, hosted views receive the gesture through the content deck, and a sub-modal opening cancels the parent's in-flight drag.
- Terminal panes scroll interactively too, with the scrollbar wired through both workspace projections rather than reimplemented per surface.
- Cross-project td issue links resolve on a local miss. An issue ID that does not exist in the current project is looked up across the other configured projects instead of dead-ending.
- Carried terminal backgrounds are span-capped.
boundedrenders short runs — diff hunks, highlighted notices — and drops the background of any run longer than the cap, so an application that paints most of its output one colour degrades to plain text instead of repainting the pane.neversuppresses carried backgrounds entirely;autokeeps the previous canvas-detection behaviour. Configurable per surface asplugins.workspace.terminalBackgroundsandterminalBackgroundSpanMax. - 24-bit colour is advertised to tmux. A fresh tmux server carries no
direct-colour capability, so tmux quantized truecolour output to the 256 cube
inside sidecar panes. Sidecar now appends one
terminal-overridesentry, idempotently. The claim names sidecar's ownTERMrather than every terminal type, and is only made whenCOLORTERMsays the terminal renders direct colour —terminal-overridesis a server option that outlives sidecar and applies to every session on the server, so a blanket claim would corrupt colour in terminals sidecar never opened. Failure is never fatal: a colour hint cannot block opening a shell. - A Feature Flags page listing the whole registry. Configuration → System →
Feature Flags shows every flag Sidecar knows about with its real state.
Previously only four hand-picked flags had a control, so
tmux_interactive_input,tmux_inline_edit,files_auto_refresh,plugin_content_panes, andterminal_resource_providerswere settable only by hand-editingconfig.json. Flags that Panels & Integrations already owns are shown read-only with a jump to the control that owns them, so the flag and the plugin's own enabled key cannot drift apart. - The split workspace terminal ships on by default.
Bug Fixes
- Relaunching returns to the global tab you left on. Quitting from
Sessions, Activity, or Tasks reopened the project workspace: the last global
tab was remembered but the space itself was not, so the remembered tab only
applied the next time you pressed
K. A remembered space whose tabs are no longer available falls back rather than showing an empty surface. - Sidecar never resizes the tmux pane hosting itself. Scrolling the global Sessions list to its bottom could shrink Sidecar's own screen (td-9cddeb).
- Settings toggles stop drifting right on a wide window. Panel rows right-aligned their ON/OFF pill to the pane's full width, so widening the terminal pulled every toggle away from its label. Rows now stop at a shared cap that lines the pills up with where the widest form field ends.
- Background SGRs are stripped without nesting escape sequences.
- The global Sessions list sees new projects and non-Git projects' shells.
- The files tree shows the full list from the top when it fits the viewport.
- Repeat pane opens stop lying, and
create shellopens beside the session. - The workspace sidebar's free-scroll clears on selection change only.
g/Gcan be typed into the conversations session search box instead of jumping the list.
Build
- Go 1.27, matching td and tasks.
encoding/json/v2is the default implementation; sidecar's adapter parsing, config, and state round-trip unchanged. make lintworks in a go.work checkout again. It computedGOTOOLCHAINfrom ago list -mthat did not setGOWORK=off, so the workspace answered for tasks and td as well and the recipe expanded to three version words.- Test binaries no longer inherit the developer's
TMUX_PANE, which could silently drop a scripted pane from an inventory assertion after a tmux server restart renumbered panes.
-
v1.3.021 Aug 2026Release notes
Open source →Changelog
- acd7230 Add feature demoing instructions to AGENTS.md and create demo-environments guide
- f885ca1 Add modular isolated demo environment launcher (scripts/demo.sh)
- 28b10de Add plan for permanent note deletion and purge policy (td-90a9bd)
- 0ec2aad Add scrollbars to fileview panes in files plugin and workspace document panes
- f053c99 Always build fresh Sidecar binary from active checkout with devel version in demo launcher
- 7a0ca12 Fix file panes stuck on Loading after a split.
- cd445ba Fix refreshInterval duration string format in demo config generator
- 6c3e467 Frame the Create Workspace kind row to show keyboard focus.
- 1ca8b4e Highlight the selected kind in the Create Workspace modal.
- a0112c5 Initialize TD in all demo projects, isolate Tasks store with generic tasks, and fix stallion art alignment
- e2cc153 Merge pull request #297 from marcus/sidebar-scroller
- 7b2cb6a Merge pull request #298 from marcus/agent-shell-create
- 5d8f2b0 Merge pull request #299 from marcus/feat/terminal-splits-phase-a
- 8d5e650 Merge pull request #301 from marcus/onboarding
- 8ef07fc Merge pull request #302 from marcus/pre-launch-polish
- 974e1ec Refine TD uninstalled onboarding screen layout, copy, and syntax highlighting
- 7074244 Seed in-progress, open, and closed TD tasks across all demo projects
- 30fcad5 Session copy ring: paste-recent over ssh, undo aliases in notes
- e0b457d Support --git and --no-git in fresh preset for demo environments
- 0f090be Use symlink PATH mirroring to cleanly omit td/tasks in demo onboarding mode
- c041bab Use valid 8-character hexadecimal IDs in demo tasks store
- b959e1f build: managed dev installs track workspace siblings (td, tasks)
- 42dfefb docs(plans): add agent shell/worktree creation CLI plan
- ccd436c docs(plans): add terminal splits & windowing plan (phases A/B)
- fcf1cbd docs(plans): deprecate workspace-windowing-system in favor of terminal-splits plan
- 396ff61 docs(plans): deprecate workspace-windowing-system in favor of terminal-splits plan
- 5f12e9e docs(plans): resolve open questions in agent create CLI plan
- 53caf26 docs(plans): resolve open questions in terminal-splits plan
- c7f9075 docs(plans): resolve open questions in terminal-splits plan
- f667af0 docs(proof): real-app proof of the split terminal lifecycle
- 3bb065e feat(diagnostics): refresh info modal layout, plugin table, and close button
- 051c5da feat(modals): add scrollbar, stable height, and mouse support to switcher modals
- 0386bf6 feat(palette): refresh shortcuts modal using declarative modal library
- cd6668a feat(panes): clickable-title rename and sidebar layout badges
- 62bddf8 feat(panes): duplicable shell placement, live cap, and a Terminal split row
- 1e4b37e feat(panes): make the terminal panel a Shell leaf of the pane tree
- 050ecb0 feat: claimHosts lets providers claim built-in URL spans (td-a5dba8)
- 549f2a7 feat: clickable links in workspace Files panes (td-fb8582)
- 1d3c197 feat: first-run Workspaces empty state when nothing is missing (td-219916)
- b5fa5f5 feat: hover state on per-tab close buttons
- c68e7a7 feat: in-app install for td and tasks (td-b70b47)
- 0fa15d1 feat: open notes as workspace content panes (td-7cc3eb)
- e84b9ec feat: opencode auto-approve support in shell creation via --auto (td-cbf112)
- a8f0be5 feat: per-tab close buttons and tighter tab labels (td-5892bd)
- 14400bf feat: polish Notes lists, archive, search, formatting, and content links (td-40a7d5, td-360d0a, td-ded773, td-861c74, td-684e43, td-b57215)
- af50cbe feat: recognize symbolic git ranges as diff links (td-b8c54e)
- 2aeac63 feat: route non-git first-run into Add Project and init on main (td-4a0687, td-2d4ef5)
- a671d6c feat: sidecar create shell (td-248649)
- 5fc3f07 feat: sidecar create shell --split (td-48f25c)
- d6c30b2 feat: sidecar create worktree (td-03acac)
- 756c346 fix(palette): add scrollbar and stabilize list height on scroll boundaries
- 96e1789 fix(panes): close, refuse, and unwedge the split terminal
- d18cf64 fix(panes): make a split terminal belong to its own workspace
- f5de853 fix(panes): make the split's close end its session, and its confirm honest
- 0f91d9d fix(panes): scope the split terminal's name to its own workspace
- a34907d fix(workspace): synchronize content deck on leaf forget and fix lint
- b823430 fix: announce pane geometry to plugins on resize, not per frame (td-fcb03a)
- 3766f08 fix: archive reloads the right pane with the selected note (td-b8c54e)
- 74fadf6 fix: bind Init in the config keymap so the footer shows it (td-2d4ef5)
- 468fbb7 fix: break canvas-detection ties on row starts (td-fb5a9d)
- 9af0a28 fix: canvas detection abstains untouched default-bg rows (td-b8c54e)
- d9fb54c fix: canvas detection survives the screen model's serialization (td-fb5a9d)
- 6cf8133 fix: claimed resource URLs keep their OSC-8 hyperlink (td-a5dba8)
- 59cfbe9 fix: clicking a commit tab's own header no longer strands it loading
- bf8bfcc fix: clicking below a note's last line lands the caret at end of text
- bc4e985 fix: coalesce wheel bursts across issue viewer surfaces (td-7975fd)
- a8628e0 fix: content pane header × hit rect covers the glyph (td-b8c54e)
- 0c66980 fix: create CLI worktree context, journal, and ack matching (td-248649, td-03acac)
- a04e7ea fix: derive workspace skip-permission flags from workspaceops so opencode launches with --auto (td-cbf112)
- d84a676 fix: drop footer refresh stamp and align shortcut help (td-f6ad90, td-70f800)
- e4b47dc fix: fill Grok terminal background on large canvases (td-5d79ba)
- 5c7c5bc fix: issue panes render markdown at full pane width via compact renderer contract (td-85a2be)
- 5e7a1f8 fix: keep global Sessions honest until inventory has settled (td-219916)
- 1bb9f4a fix: make Add Project git init a keyboard and footer action (td-2d4ef5)
- dc07a93 fix: only steal Notes preview clicks for real content links (td-b57215)
- d91b403 fix: open workspacecreate for empty worktrees with padded Start Agent (td-2140b4)
- 5f37df4 fix: pace wheel bursts forwarded to pane applications (td-b8c54e)
- 6df7351 fix: pair padded viewers with compact-document markdown renderers (td-65095b)
- 9769a02 fix: plugin-switch keys stay live over a focused content pane
- c8b3eda fix: seed --run on reused terminal-split sessions (td-48f25c)
- cd6142d fix: show Sessions first-run empty state when the catalog is empty (td-219916)
- 5a36def fix: tab close hits and compositor goldens (td-5892bd)
- bf3469c fix: tick Tasks install spinner and detect GOBIN installs (td-b70b47)
- 793858f merge: split-terminal close/lifecycle fixes into agent-shell-create
- fc4c898 merge: terminal-splits Phase A into agent-shell-create (td-48f25c)
- 17c9859 refactor(panes): delete the terminal panel's second split system
Release notes
Open source →Features
- First-run onboarding that names the next step. Launching in a non-git
directory with no configured projects opens Configuration → Add Project
instead of an empty td monitor. Initialize this directory (or the Git tab)
runs
git init -b mainafter a click ori, then reloads git context without a restart. - In-app install for td and Tasks. The td uninstalled view and
Configuration → Panels offer a confirmed Install button (Homebrew, or
go installif brew is missing). Sidecar never uses sudo and does not treat a package-manager exit as success. Diagnostics for missing standalone Tasks points at Panels rather than claiming Sidecar will not install it. - Empty states that point at the next action. TD monitor empty panes
explain how to create work; embedded Sidecar adds a Workspaces hint when
there are no tasks yet. Workspaces first-run copy covers
n/+once inventory has loaded. An unattached worktree preview is padded and has a Start Agent button that opens the create-workspace form.
Bug Fixes
- Create Workspace kind toggle shows the selected type. Opening the form in Shell mode (or leaving focus on Name) no longer leaves both Shell and Worktree looking unselected; the current kind stays highlighted.
- Note activity in the td monitor says "created note" / "updated note" instead of treating notes as issues. (Requires a td build that includes the matching monitor change.)
- Create Workspace kind row shows when it has keyboard focus. The chosen
kind stays filled;
[ ]around the row uses the same Primary colour as a focused input so Tab on the toggle is visible without stealing the selection.
Workspaces and panes
- The terminal panel is a Shell leaf of the pane tree. The panel's second, parallel split system is gone; shells, files, notes, issues, and resources are all leaves of one tree with one compositor, one border rule, and one divider renderer. Shell placement is duplicable, respects a live cap, and the sidebar shows layout badges. Pane titles are clickable to rename.
- Split terminals belong to their own workspace. A split's close ends its
session and its confirmation says what will actually happen; a wedged split can
be closed, a reused session honours
--run, and split names are scoped to the owning workspace. sidecar createCLI.sidecar create shell,sidecar create shell --split <dir>, andsidecar create worktreelet an agent open shells, splits, and worktrees in the running app, with worktree context, journalling, and ack matching.- Notes open as workspace content panes. Notes lists, archive, search, formatting, and content links were polished together; the archive reloads the right pane with the selected note, and clicking below a note's last line lands the caret at the end of the text.
- Per-tab close buttons with a hover state and tighter tab labels.
- Clickable links in Files panes, symbolic git ranges recognized as diff
links, and
claimHostsso resource providers can claim built-in URL spans while keeping their OSC-8 hyperlinks. - Scrollbars in Files fileview panes, workspace document panes, and the switcher/palette modals, which also gained stable height and mouse support.
- opencode auto-approve support in shell creation via
--auto, derived from workspaceops rather than hardcoded per launcher. - Session copy ring — paste-recent over ssh, plus undo aliases in notes.
- Refreshed diagnostics info modal layout, plugin table, and close button.
Bug Fixes — panes, rendering, and input
- Pane geometry is announced to plugins on resize, not every frame (td-fcb03a), and wheel bursts are coalesced and paced across issue viewer surfaces and forwarded pane applications.
- Canvas detection survives the screen model's serialization, abstains on untouched default-background rows, and breaks ties on row starts (td-fb5a9d, td-b8c54e); Grok terminal backgrounds fill on large canvases.
- Issue and document panes render markdown at full pane width via the compact renderer contract, and padded viewers are paired with compact-document renderers (td-85a2be, td-65095b).
- Clicking a commit tab's own header no longer strands it loading, file panes no longer stick on Loading after a split, and plugin-switch keys stay live over a focused content pane.
- Notes preview clicks are only stolen for real content links (td-b57215), and the content pane header × hit rect covers the glyph.
- Footer drops the refresh stamp and aligns shortcut help (td-f6ad90, td-70f800).
Build and tooling
- Managed dev installs track workspace siblings (td, tasks) through
go.work, andmake install-statusreports the sibling revisions compiled in. scripts/demo.sh— modular, fully ephemeral demo environments (multi-project, single-project, and fresh onboarding presets) that build a fresh binary from the working tree and clean up on exit.
Dependencies
- td v0.61.0 → v0.62.0 (monitor empty states, note activity verbs, embedded next-step, and the issue-modal CPU fixes).
-
v1.2.220 Aug 2026Release notes
Open source →Bug Fixes
- Create Workspace modal retains keyboard focus across fields. Tabbing or clicking away from the Name field no longer snaps focus back to Name on intermediate view renders. Initial focus resolution now handles declarative modals before and after first paint without overwriting active field selection.
- Retain workspace shell focus when switching plugins.
-
v1.2.120 Aug 2026Release notes
Open source →Changelog
- ccc6f69 Merge pull request #296 from marcus/worktree-modals
- c0c9fb8 feat: global create uses shared form with auto-approve and base branch (td-88f018)
- c1b56a3 feat: project plugin uses shared create form (td-c7e2d4)
- 6c0fbba feat: shared Create Workspace form (td-8a319a)
- 1c16e9f fix: bump text-selection contrast another 20%
- c91f227 fix: fail managed install when PATH sidecar is not the activated build
- 48d079c fix: lift text-selection highlight off the canvas (td-489be4)
- f5d2b68 fix: make local lint match GitHub and drop unused create-form leftovers
- 5cde5b0 fix: point PATH sidecar at the build install-worktree just activated
- 8e526fe styles: curate vibrant tinted selections and support chromatic contrast in normalizer
Release notes
Open source →Bug Fixes
- Text selection is easier to find against the canvas. The highlight sat at 1.2–1.5:1 on every theme — a selected-row fill, not a span — so a drag in Notes, Files, or a document pane disappeared into the shell background. Selection now lifts to at least 2.65:1 against the canvas and stays on the same ink pole, so body text, headings, and syntax colours are not inverted or washed out. Curated tinted selections bring vibrant, theme-matched highlights while supporting chromatic contrast in normalizer calculations.
-
v1.2.020 Aug 2026Release notes
Open source →Changelog
- fefb6ea Add plan for a single Create Workspace modal.
- 17c394b Merge branch 'main' into notification-center
- 65ea416 Merge branch 'notification-center'
- 92ff714 Merge origin/main Notes polish into content links (td-653150)
- 2d73800 Merge origin/main into content-links-for-all (td-928fee)
- 76e135b Merge pull request #292 from marcus/edit-files
- faa304f Merge pull request #293 from marcus/markdown-with-themes
- 920e105 Merge pull request #294 from marcus/notes-polish
- 08f9cc6 Merge pull request #295 from marcus/content-links-for-all
- 506fdf7 Move completed plans
- fed3008 docs(notify): Phase 1.5 — toasts never take focus, no focus context
- 7c693d3 docs(notify): add Phase 1.5 (two-tier notifications, centre polish) and toast audit
- 6936523 docs(notify): queue bottom-status sweep and ship sequence after polish round 2
- 48a024d docs(notify): queue polish round 2 (toast redesign, centre x/double-click, row-bg fix, global tab parity)
- a4b93ee docs(notify): record the Phase 5 proof run and mark the phase done
- f911b3e docs(notify): record the Phases 2-3 headless proof run
- d09f31d docs(notify): record the polish round 2 proof run
- fe04ecd docs(notify): tab cycles focus through the open centre; Phase 3 queueing spec
- a58746d docs(notify): target-activation plan; rework Phase 5 to build on it
- 40ef246 feat(docview): in-file search core with wrap-aware matching
- 549f4d4 feat(markdown): derive Glamour styles from the active Sidecar palette
- 98d94f1 feat(markdown): make every shared consumer cache theme-aware
- 5cc7e6f feat(notify): --target calls to action and cross-project landing
- 5c3020c feat(notify): app-level notification centre right panel
- 73871d8 feat(notify): centre polish, quieter countdown, click-to-dismiss toasts
- 9377954 feat(notify): double-click and a per-group clear in the centre
- 0bb9570 feat(notify): every surface's tab ring reaches the open centre
- 4c6962b feat(notify): mouse-scroll the notification centre
- a7bcbe9 feat(notify): notification core, store, app wiring, and sidecar notify CLI
- bd29ffa feat(notify): numbered calls to action in the notification centre
- 4c8fe78 feat(notify): post notifications on settled agent lane transitions
- 6c8254d feat(notify): session and task calls to action
- e5fdf9e feat(notify): stack toasts, collapse by source, and reveal them a row at a time
- 1fe1497 feat(notify): status flash tier, config-backed expiries, shared source symbol
- de8b2a2 feat(notify): tab makes the open notification centre a focus stop
- f654045 feat(notify): toast overlay, header indicator, and retire the footer toast
- 5de58b9 feat(panes): in-file search on both pane surfaces, and ctrl+p/f in the browser
- ff72524 feat(panes): inline edit in doc panes on both workspace surfaces
- cb54515 feat: add Git content link capability (td-459d3a)
- fa6b8b1 feat: add app content decks and Files links (td-22f35f)
- 37f3122 feat: add internal note links
- 93a9308 feat: add shared content link core (td-e287bc)
- 833ef70 feat: add shared passive content deck (td-4120e1)
- 45d8e78 feat: enable plugin content panes by default (td-307076)
- 5bfabc7 feat: graduate Notes setup journey (td-cdc3ba)
- 30d7e98 feat: honor Notes editor preferences and shortcuts (td-982583)
- 7ba76e5 feat: integrate embedded content deck focus (td-de82cc)
- d3cebe4 feat: make Notes mouse editing native (td-43b82d)
- 6dbed6e feat: make Notes mutations optimistic (td-889d49)
- 84a7b3a feat: polish Notes layout and save chrome (td-8c2abd)
- 632097c fix(activation): a path qualifier names a checkout, not the project
- 0593d5f fix(docview): keep row styling and overlapped matches through highlights
- ee76739 fix(markdown): preserve style-file path case and cache override resolution
- fee42d4 fix(notify): close review findings and proof-run defects in Phase 1
- 42d9a01 fix(notify): close review findings in the stacking, reveal and tab work
- 2822e48 fix(notify): hold the selection background across styled row spans
- 5230bea fix(notify): keep git failure alerts to a headline, drop dead status state
- c048557 fix(notify): lease the git-write refusal and record Phase 1.5 as built
- 499eee1 fix(notify): one focused pane app-wide when the centre takes the keyboard
- 431f3a3 fix(notify): only read what was seen, and keep the centre keyboard-reachable
- ea95d68 fix(notify): put the toast's close region on the cell the × is drawn in
- 42b908d fix(notify): put the toast's controls in its title row
- ec8d16a fix(notify): retire the last bottom-status echoes in notes and gitstatus
- feeba19 fix(notify): retract a block where it stood, and land both arrival paths on one frame
- 35e459a fix(notify): scope the call-to-action memo to its checkout and keep URLs whole
- 0240872 fix(notify): solid toast background behind the title, countdown burns toward the close button
- efa74e7 fix(notify): stack real arrivals, drive the column from the reveal machine, and deliver in-project posts
- 90a188b fix(notify): wrap toast titles and bodies instead of ellipsizing; rule only above content
- 7501de1 fix(overview): hand ctrl+c back while a doc-pane search owns the keyboard
- 97a8c4f fix(panes): release pane editors on teardown, and route the pointer by pane
- 275d055 fix: bound explicit OSC link destinations (td-e287bc)
- e60e079 fix: close app content deck review gaps (td-22f35f)
- ea5c789 fix: filter rendered links before decoration (td-928fee)
- c9be831 fix: flatten app content deck primary panes (td-79dd54)
- 6e43111 fix: isolate Git full-file staging identity (td-459d3a)
- 7ade6a9 fix: keep shell diff continuation on project root (td-4c5b13)
- dddf64b fix: keep unsafe internal link labels inert
- 8811762 fix: match notes edit padding to markdown view (td-35fb1b)
- dedb9f4 fix: persist app deck palette navigation (td-22f35f)
- 160fd72 fix: preserve Workspace deck host contracts (td-4c5b13)
- 9021d6c fix: preserve absolute content paths (td-233c7e)
- d859a1d fix: preserve inactive app deck watcher lifecycle (td-22f35f)
- 8cea26e fix: preserve zero-value content surface safety (td-928fee)
- a50cadb fix: rebind direct passive diff opens (td-4120e1)
- fc0a082 fix: rebind passive deck tabs on context changes (td-4120e1)
- 86ebbff fix: reload passive tab across surface contexts (td-4120e1)
- 232dd76 fix: remove migrated pane helpers (td-416158)
- a939eb4 fix: render loose Notes outlines as lists (td-42cd0f)
- 7766f06 fix: retain app passive pane focus and commands (td-a91834)
- 8ca365f fix: scope raw diff results to passive tab identity (td-4120e1)
- bd1ff1e refactor(activation): both surfaces jump through one service
- e28ba10 refactor(activation): one pending-target slot, cross-project jumps land
- 907f122 refactor(activation): one state-free jump service, file kind first
- 3449e4e refactor(inlineedit): use the shared confirm/native helpers in both hosts
- 6bb0d44 refactor(notify): re-tier every audited toast call site
- bd1eb72 refactor: extract shared inline-edit lifecycle into internal/inlineedit
- bde731a refactor: share Workspace content deck operations (td-4c5b13)
- 7470cff refactor: share docview's ANSI highlight walker with filebrowser
- 5c54845 test(activation): prove the dispatch, not the declaration
- 97b927a test(markdown): audit every theme's Markdown inputs and document the mapping
Release notes
Open source →The footer toast is gone. Notifications stack in the corner, live in a centre you can open from any surface, and take numbered jumps to the thing they name. Clicking a file, a commit, a td id, or a note link opens a pane beside the plugin you were already looking at, instead of yanking you away. Markdown follows the active Sidecar theme. Notes is no longer a beta.
Features
- One Create Workspace form on both surfaces. Project Workspaces and
global Sessions share the same Shell | Worktree modal, with auto-approve
and base branch on global as well as project. Instant-create shortcuts are
unchanged: project
ctrl+n, Shells[+], andautoCreateShellstill skip the form. - A notification system instead of a one-line footer echo. Toasts are
bordered blocks in the top-right of the content region: they stack, collapse
by source, reveal a row at a time, and dismiss on click or
d. The centre is an app-level right panel (N/alt+n) with per-source sections, unread dots, wheel scrolling, and a header indicator next to the gear. Settled agent lane transitions post here; so does anything that used to flash the footer. A quieter status-flash tier exists for things that should not take a toast slot. Expiry, stacking, and per-source behaviour live on the existing config screen. sidecar notifyfor agents.post,list, anddismisswrite the same log the UI reads. A post appears as a toast in the running instance and stays in the centre until dismissed; with no instance running it is stored and shown at the next start.--target kind:value[:line][@project]attaches numbered calls to action (issue, task, commit, file, session, url), including a jump into another checkout.- Content links and passive panes on Files, Git, Notes, td, and Tasks. A
file path,
path:line, td id, commit hash, orsidecar://…link underlines only when it can be activated in the current project. Clicking it keeps the active plugin on screen and opens the same Document, Issue, Diff, or Resource pane Workspaces already uses: first pane to the right, another kind stacked in that column, the same kind as a tab. Plugin content panes are on by default. Tab walks the plugin, then the panes, in visual order;q/eschides the focused pane andxcloses a tab. - Tab walks into the embedded td and Tasks panels. Those two surfaces now name their own focus stops, so the app's tab ring can enter the monitor's current-work / list / activity panels and Tasks' list and detail regions instead of treating the whole plugin as one opaque box.
- In-file search and inline edit in document panes, on both the project
workspace and the global Sessions browser.
/searches the focused file (incremental,n/N, wrap-aware highlights); the same tmux-PTY editor the Files plugin uses now edits a doc pane in place.ctrl+p/ctrl+freach the file finder from the browser as well. - Markdown follows the active Sidecar theme. Headings, links, inline code,
rules, and fenced blocks are derived from the current palette rather than
Glamour's generic
darkpreset. Fenced code uses the same Chroma style as file previews. Switching a theme restyles Markdown that is already on screen without discarding scroll, selection, tabs, or search. - Notes is a stable project surface. A project that has not run
td initgets a setup path rather than a dead screen. Create and delete are optimistic, mouse editing is native (multi-click, click-after-EOL, pane-local$EDITORforwarding), and the built-in editor honors Mac/Emacs keys plus a persisted Built-in /$EDITORpreference. Layout, filter, and save chrome are tighter; informal numbered outlines render as lists; edit padding matches the markdown view.
Bug Fixes
make install-worktree/make install-localmakesidecaron PATH run the build they just activated. Homebrew is still the managed link; copies that win PATH (typically~/go/binfrom unmanagedmake install) are pointed at the same artifact somake install-worktree && sidecaris one build.make install-statusstill reports resolution without mutating it.- Unsafe internal link labels stay inert, and only rectangles that are actually rendered as links are decorated — so a label that looks like a path or a td id inside chrome, search, or an editor is not clickable.
- Absolute content paths survive a project switch, so a pane opened by full path does not resolve against the wrong checkout.
- Git full-file staging keeps its identity when a content pane is open beside the Git plugin, instead of staging the wrong file because the pane and the list had drifted apart.
- A path qualifier on a jump names a checkout, not a project, so
cross-project notification targets and
sidecar openland in the worktree they named. - Git failure alerts are a headline, not a dump, and the last bottom-status echoes in Notes and git-status are gone — those events are notifications.
Internal
make lintis the GitHub lint job: full codebase,GOOS=linux,GOWORK=off, golangci-lint v2.12.2. The old--new-from-merge-basegate missed unused leftovers whose function bodies were not edited.internal/contentlinkowns link recognition andsidecar://routing;internal/passivedeckowns the app-level content deck both plugin hosts and the workspace surfaces bind to. There is still one compositor and one pane frame.- Document search lives in
internal/docview. Inline edit for Files, Notes, and doc panes sharesinternal/inlineedit. - Cross-surface jumps (notification centre, content links,
sidecar open) go through one state-free activation service, with a single pending-target slot so a project switch and a landing cannot race.
Dependencies
- td v0.60.0 → v0.61.0. The embedded monitor exposes its three root panels as focus stops the host tab ring can enter.
- tasks v1.11.0 → v1.12.0. Same contract for Tasks' list and detail regions.
-
v1.1.119 Aug 2026Release notes
Open source →Changelog
- b3ba2b5 release: take tasks v1.11.0, and gate releases on sibling pins
Release notes
Open source →Dependencies
tasksmoved to v1.11.0, two releases on from the v1.9.0 v1.1.0 shipped against. It brings three-part delegation (mode and note) through the data model, the CLI, the HTTP surface, and a delegate modal; a user-configurable delegation vocabulary; approving and completing a proposal in one step; and expanded relative date input.
Fixes
- A release can no longer ship against a stale sibling module. v1.1.0 was
cut with
taskspinned two minors behind and nothing noticed, becausego.workresolvestdandtasksto the local checkouts — so the pins ingo.modare the one thing a local build never exercises. The release preflight now reads those requirements withGOWORK=off, compares eachgithub.com/marcus/*module against its newest published tag, and refuses to tag when any of them is behind.make sync-depsis the fix it points at: it pins every sibling to its latest release and tidies, so the correction is one command rather than a per-modulego getthe operator has to remember.
-
v1.1.019 Aug 2026Release notes
Open source →Changelog
- d5552f5 Merge pull request #291 from marcus/worktree-text-selection-phase1
- 1cad001 Merge remote-tracking branch 'origin/main'
- ff2b39c build: let any harness make a worktree Go-buildable with make worktree-init
- b7a0fbd build: run worktree-init automatically for Sidecar-created worktrees
- eea47f1 feat: copy to both clipboards, and make copy-on-select a choice
- 7968608 feat: make the text in a document pane selectable on both surfaces
- ed910e5 fix: act on independent review of the document-pane selection
- df6faa3 fix: act on independent review of the live-refresh work
- c93f5c2 fix: copy what the user sees, highlight what they selected
- ed5ba2f fix: drop three dead diff-host wrappers that broke the lint gate
- e69cc0a fix: keep a globally created shell live after the next poll
- 89432fc fix: make every copy reach both clipboards, and one control own copy-on-select
- 8230ce3 fix: make sidecar-modern text selection easier to see
- 1dd68a8 fix: make the global Diff pane accept file clicks and host shortcuts (td-efbaa9)
- 86dc806 fix: never owe a re-read to a view that can never perform one
- b4624e7 fix: re-add live watches the kernel dropped under us
- ab78d7e refactor: give every content pane one shared live-refresh binding
- 85fa789 refactor: give the selection engine a home outside the terminal
- f74b9b3 styles: add custom sidecar-modern Chroma syntax theme with red keywords and teal types
Release notes
Open source →Text you can see is now text you can select and copy — on every surface, into every clipboard — and the machinery behind panes gained two shared seams so project and global workspaces stay one model rather than two lookalikes.
Features
- Text in a document pane is selectable on both surfaces. A file pane could
be read but not copied from. It is one
docview.Modelin two places — the project workspace and the global Workspaces browser — so the selection binds to the viewer once and both surfaces inherit it, the way live refresh already does. Rows are wrapped and tab-expanded at layout time, in the column space they are actually drawn in, so the columns a selection names are the columns on screen and the selection engine never sees wrapping. The line-number gutter is kept beside the text rather than inside it, so it can never be selected or copied. - Copies reach both clipboards, and copy-on-select is a choice. Every copy
used to end in a local clipboard utility, which does not exist over SSH or
inside the tmux control-mode sessions the workspace surfaces run on — so
copying put the text nowhere and reported success anyway.
internal/clipis now the single path text takes: the system clipboard natively, and the terminal's own over OSC 52. Copy-on-select is a setting rather than an assumption, and one control owns it. - A
sidecar-modernChroma syntax theme, with red keywords and teal types, plus easier-to-see text selection in that theme.
Bug Fixes
- The global Diff pane accepts file clicks and host shortcuts (td-efbaa9).
The Sessions Diff leaf registered file-row hits but never dispatched them,
and always claimed leftover keys, so
@never reached the project switcher. Click and wheel rules moved onto the sharedworkspacediff.View, and host globals now pass through when a content leaf is focused. - A shell created from the global browser stays live. Creating one wrote the session and manifest, then the next live-only poll treated it as unclaimed and painted the preview "session ended" while tmux was still running (td-ecb0b8). Unclaimed sessions now fall through to path ownership, and an in-flight status pass cannot drop a project re-inventoried mid-cycle.
- Live watches the kernel drops are re-added, and a view that can never perform a re-read is no longer owed one.
Internal
internal/livepanesowns the live-refresh watcher lifecycle that had been written out once per pane kind per surface — six near-identical copies, and six chances for a new pane kind to silently never refresh. Adding a kind is now oneBindingentry per surface.- The selection engine lives outside the terminal package, so surfaces that are not a PTY can use it.
make worktree-initlets any harness make a git worktree Go-buildable, and Sidecar-created worktrees run it automatically.
Dependencies
- td v0.59.0 → v0.60.0. The embedded monitor's list, board, and swimlane panes now share one row layout, so keys and columns line up and selecting a row no longer shifts it.
-
v1.0.318 Aug 2026Release notes
Open source →Changelog
- 80fab32 Completed plan
- 0258bab Merge branch 'fix/td-4d99ae-tmux-test-isolation'
- 1f88b29 Merge branch 'main' into notes-overhaul
- 35b00d2 Merge branch 'main' into terminal-parsers
- 7046224 Merge branch 'main' into terminal-parsers
- 4982959 Merge branch 'notes-overhaul'
- ebf7c86 Merge branch 'notes-overhaul'
- 62080c4 Merge branch 'resource-workspace-binding' into terminal-parsers
- d648665 Merge branch 'worktree-agent-a5e2ec78a3e88a090' into terminal-parsers
- a3cb54f Merge main into td-theme
- 7e7dbd7 Merge origin/main into notes-overhaul
- bfebfbe Merge pull request #288 from marcus/terminal-parsers
- 327b573 Merge pull request #289 from marcus/notes-overhaul
- 097a3d8 Merge pull request #290 from marcus/td-theme
- 0b15949 Merge terminal-parsers into worktree branch
- f8d3583 Revert accidental removal of docs/plans/active/sidecar-configuration-seam-map.md
- 1080b95 app: describe providers after the first ready frame, behind a feature flag
- 9acc599 app: hand both surfaces the live matchers and a provider-backed resolver
- 019a560 build: take td v0.59.0
- 381646e cli: add sidecar terminal-links list/check
- 61722cd config: add the terminalResources section and prove the save round-trip
- 140a916 deps: upgrade embedded tasks to v1.9.0
- f95bb15 feat: deliver Sidecar themes to embedded td monitor (td-8d698b)
- 5cd9719 feat: notes glamour view with source map and m toggle (td-caca7d)
- 055d9f7 feat: notes one layout contract for view and edit (td-48eb72)
- 356957c feat: notes source selection and content undo/redo (td-178efc)
- a35a0ae fix(styles): fill full surface background in modal and panel gradient borders
- aef68f1 fix(styles): keep td panel renderer background transparent to match host panels
- 09d7881 fix: address lint gate on td-theme (errcheck, staticcheck)
- c5b491f fix: address review findings on the cross-instance workspace refresh
- c6dca92 fix: address review of the tmux test-isolation fix (td-4d99ae)
- 25871db fix: avoid a dead-store lint flag in ShellCreatedMsg handling
- 31f2296 fix: bump td to 1ef0847 (TRUNCATE journal mode, no WAL corruption)
- d65ccb1 fix: click a diff pane in global Workspaces without losing the keyboard
- 5eb54cb fix: close notes save ownership races (td-4baaa6)
- f23169c fix: close remaining dirty-note drop paths (td-244d0b)
- 1d2cda7 fix: don't scan nested checkouts in the worktree-removal guard
- 2f04c13 fix: drop the dead existingShell lookup left by 5cd0040
- 5194911 fix: finish leftover review items on embedded td theme delivery (td-16f319)
- 5de68ee fix: give resource providers a working directory that exists
- 066a657 fix: give the coalescing watcher test a quiet window the burst fits in
- 2d59bfd fix: keep notes wheel scroll after paint (td-caca7d)
- 9c2f31f fix: land view-mode wrapped clicks on the clicked word (td-28409a)
- 0c21e36 fix: make notes saves nonblocking and durable (td-4baaa6)
- e312ddd fix: notes correctness — paste, titles, stale async, temps (td-d07d31)
- de23e09 fix: notes store shells out to td CLI instead of opening issues.db (td-adbf16)
- cbc597c fix: order inline note persistence (td-4baaa6)
- 9358f0a fix: persist dirty notes across leave and overlapping saves (td-244d0b)
- 5811351 fix: pin td to the theme-contract revision and drop the local replace
- d320bab fix: polish Notes Phase 1 review findings (td-bd90f9)
- f67be1b fix: preserve note retry intent order (td-4baaa6)
- c90697b fix: preserve wrapped notes click position (td-2f6d46)
- c7ec56a fix: retire obsolete note exports (td-4baaa6)
- 6ab01ed fix: satisfy notes phase 3 lint gate (td-4baaa6)
- cc90748 fix: seed textarea viewport so enter-edit keeps screen row (td-e98c91)
- 55321ff fix: show shells another Sidecar instance created without a manual refresh
- 5cd0040 fix: stop labeling non-Cursor shells as Cursor
- 8124979 fix: stop tests spawning tmux against the developer's real server (td-4d99ae)
- b891c07 fix: stop the coalescing watcher test racing the latency cap
- 5adebc4 fix: tdmonitor tests use an isolated td database, never the real repo db
- 6816bae overview: bind the Resource leaf to the global Workspaces browser
- d5a844f paneframe: stop dropping a leaf kind's floor, and close two resourceview gaps
- 29cd5ab resource panes: one command vocabulary and one wheel answer for both surfaces
- e35a27f resource panes: route provider open requests
- c46a6aa resource: add the typed provider document, bounds, and safe-markdown gate
- 040a7a4 resource: drop the stderr byte bound the frozen contract removed
- 9eb42f2 resourceprovider: conform the host to the frozen v1 contract
- 730cd00 resourceprovider: run providers as processes, behind one narrow interface
- 00452db resourceview: one shared pane seam so the two surfaces cannot drift
- c381720 resourceview: own provider request refusals
- bc31742 resourceview: the host-independent resource card and its tabs
- eb9436c terminallink: recognize external resource keys, built-ins first
- eb47614 uirequest: carry a provider resource through sidecar open
- 9e53d26 workspace: bind the Resource leaf to the project surface
- c97929c workspace: finish the shared content pane lifecycle
- e069db0 workspace: share content pane lifecycle
- 170e58a workspace: test that a ready provider actually underlines the key
Release notes
Open source →Mostly internal groundwork — the embedded td monitor, the global Workspaces browser, and the Notes editor — plus the fixes that fell out of it.
Features
- The embedded td monitor wears Sidecar's theme (td-8d698b). The td tab used to render in td's own colors regardless of the active Sidecar theme. It now takes the host theme across every surface — lists, kanban and swimlanes, modals, forms, markdown, and the select filters — and follows a theme change live, without losing selection, scroll position, or filter text. Requires td v0.59.0.
Bug Fixes
- Shells another Sidecar created now appear on their own. The global
Workspaces poll is deliberately live-only: it refreshes tmux evidence for
workspaces it already knows about and reads no durable state. A second Sidecar
on the same host — a session over SSH or mosh — writes into the same state
tree, so its shells simply did not show up until something forced a full
cycle. Same host means same filesystem, so each configured project's
shells.jsonis now watched rather than polled, and a signal re-fingerprints the manifests by content so only projects that actually changed are re-read. - Clicking a diff pane in global Workspaces no longer hands the keyboard
back. The click-away rule enumerated which leaf kinds count as a click
inside the preview, and that list named only the doc and issue leaves. A
press on a diff or resource leaf moved the focus ring onto it and was then
treated as a click away: the diff drew idle, the list drew focused, and
j/kmoved 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. - Shells are no longer mislabeled as Cursor. Identification followed
activity phrases rather than identity, and Codex's npm launcher is
node, so prompts like "ctrl+c to stop" stole those panes.defaultAgentType=cursorcompounded 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. - Terminal resource providers work on a fresh install. A provider child was spawned with the Sidecar config directory as its cwd — a directory that is read but never created, so before config had been saved once it did not exist. A process whose cwd is missing does not fail diagnosably; it fails to spawn at all, so every terminal resource provider was silently dead. It now falls back to the system temp directory, which is equally neutral and always present.
- A wrapped click in Notes' view mode lands on the word clicked. Glamour's wrap breakpoints are not the textarea's, so adding the visual column to the wrap-segment start could put the caret on a different token. Paragraphs and headings now snap to the clicked word; fences stay at the top of the block and raw view is unchanged (td-28409a).
Notes plugin
- The built-in editor now has real selection and undo. Shift-arrows (and
alt+swhen the terminal swallows shift) extend a source-coordinate selection that survives wrap and resize.alt+aselects all,alt+ccopies the selection or the whole note,alt+xcuts, and typing, paste, or backspace replace the range as one undo unit.ctrl+zundoes andctrl+y/ctrl+shift+zredo; short typing bursts coalesce. Barevandustill type. The tmux editor keeps vim's own undo. - Saving no longer freezes Notes. Autosave, leaving edit, navigation, and editor handoffs keep the UI responsive while td is busy. Slow and failed saves stay visible and retryable, content saves use one td command without a full-list reload, and shutdown checkpoints unsaved text before flushing it.
-
v1.0.217 Aug 2026Release notes
Open source →Changelog
- d6c86c1 fix(update): show why an update failed, not just that it did
Release notes
Open source →Bug Fixes
-
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 installshowed the command and nothing else, with evenexit status 1cut 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 installenvironment 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.
-
v1.0.117 Aug 2026Release notes
Open source →Changelog
- 147454f feat(cli,ui): auto-apply shell rename live and update agent instruction copy
- 0ee8c80 perf: stop an idle Sidecar from burning ~25% CPU on git subprocesses
- ecf590f release: dispatch and wait for Go CI instead of failing on a pending run
- a531148 version: keep only the cgo warning suppression we actually need
- 3615984 version: make the automated go install match the working manual one
Release notes
Open source →A performance and install-reliability patch on top of 1.0, plus a smoother shell-rename flow.
Performance
- An idle Sidecar no longer burns a quarter of a core. The git watcher was
driving itself: the
git statusa 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 listno longer runs inline on the render goroutine every tick, and td's monitor honorsplugins.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.
Bug Fixes
- The in-app updater's
go installnow matches the manual one. It inherited Sidecar's environment, so from a checkout with an activego.workit picked up localreplacedirectives, and it carried whateverCGO_CFLAGSthe machine had — either of which could fail the cgo build. It now runs withGOWORK=offand appends the warning suppressions to the user's ownCGO_CFLAGS, and the manual command shown on screen reflects the same environment. - Renaming a shell applies live rather than waiting for a restart, and the agent instruction copy describing it was updated to match.
-
v1.0.017 Aug 2026Release notes
Open source →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.
Features
- Configuration, in the app. A full Configuration surface with its own chrome, navigation, and search: Sidecar Setup, Diagnostics, Appearance, Projects, Workspaces, Agents, Terminal, Panels & Integrations, Advanced, and About. Readiness checks sit behind Setup and Diagnostics, each with a focused repair. Controls are real dropdowns rather than values that cycle, the theme picker previews live, and startup recovery routes a broken install to the page that fixes it.
- Themes unified. Sidecar Modern is the default, alongside 20 curated palettes. The theme system is one registry the app, the picker, and the website all read.
- Global Workspaces reaches parity with the project view. Create project
shells and worktrees from the global browser, delete and merge from it, reveal
from it, and get the same launch lifecycle, shell-liveness handling, and
refusal rules. Both sidebars share one header (
[sort] [+]), one age formatter, and a sort — by activity, recency, or name — that is remembered per project and reachable from the keyboard withv. - One pane frame under both surfaces.
internal/panelayoutandinternal/paneframeown 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. - Panes hold content, not modes. Diff, Task, issue, and file leaves open
beside the live terminal instead of replacing it, each with its own tab strip:
click a tab,
{/}to cycle,xto close. Project tabs persist per terminal surface; global tabs stay in memory for the selected row. sidecar openworks 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 --agentsdocuments the whole surface for agents.- Live panes refresh themselves.
internal/livewatchkeeps issue, document, and diff panes current without a keypress. - The file finder and project search moved into shared packages and are now available inside workspace file panes, sized to the widths a real pane gives them.
- Diff viewing grew up: an extracted
workspacediffviewer with its own keys and paging, commit-as-root tabs, section line totals, and a total commit count in Git. - Conversations gained a Grok adapter for sessions and resume.
- Notes runs on td's public
pkg/notesAPI rather than its own database handling. - A new homepage. The marketing site is rebuilt around the app it is selling, with Sidecar's real chrome re-created as browser components and all 21 themes live from the same data the binary uses.
Changed
- Create New Worktree is a stable form: type a natural name, press Enter. Base branch, task, and agent are one-line Combo fields that overlay instead of stretching the modal. Git uses a slug of the display name, kept separate from the display name you typed.
- The header's hierarchy was redesigned, and cycling now works across the whole header.
- Inertial wheel scrolling has exact boundary answers on every surface and every modal kind, instead of forwarding past the edge.
Bug Fixes
- Worktree tmux sessions key on path identity, so renaming a worktree no longer strands its session.
- Workspace terminal ownership is synchronized, closing a race that let a stale pane paint over a live one.
- Shell liveness is hardened against resurrection and wedged tmux.
- Clicked git specs resolve so a click and the CLI land on the same tab.
- Stale full-file paint is cleared on scope and file change; Diff tabs repaint through the host adapter.
- Files keeps its preview modes when closing tabs for a path, and closes the right ones.
- Worktree removal has one path, with force as an explicit caller intent, and probe deadlines are deterministic.
Removed
- Prompt templates and the prompt picker. Task-linked agent launch still injects task context automatically.
- The worktree Output / Diff / Task tab row. Diff and Task are header action
chips that insert a leaf;
d, the chip, andsidecar open --diffare the paths into Diff. - Link Task from the Create Worktree modal.
Dependencies
github.com/marcus/tdv0.58.0 (publicpkg/notesAPI)github.com/marcus/tasksv1.8.3
-
v0.99.114 Aug 2026Release notes
Open source →Features
- Worktree 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 live terminal.
,/.no longer cycle worktree views; they cycle Diff target tabs only while a Diff leaf is focused.d, the Diff chip, andsidecar open --diffare the paths into Diff. --disable-feature=workspace_doc_panesnow means no Diff: there is no pane tree, sod/ the Diff chip /sidecar open --difftoast or no-op ("Document panes are disabled; Diff needs the workspace pane tree").- File preview tabs are now clickable in both project and global Workspaces, with global previews retaining multiple open files instead of replacing the current one.
- Issue panes in project and global Workspaces keep one tab per open td id
instead of replacing the current issue. Click a drawn tab to select it;
{/}cycle;xcloses the active tab. Project tabs persist per terminal surface (qhides, lastxforgets). Global tabs stay in memory for the selected row and are not written to disk.
Bug Fixes
- Project workspace tab clicks now select the intended file without being stolen by the terminal preview or pane divider.
- Global and project Workspaces once again share pane placement and resizing behavior, including stacked file and issue panes, draggable nested dividers, and per-workspace restoration of pane layouts and scroll positions.
- Worktree 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 live terminal.
-
v0.99.014 Aug 2026Release notes
Open source →Features
- 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 rectangle model. Clicking a file or issue opens it in that tree, repeated documents collect into tabs, focused panes can be closed or zoomed, and the full in-workspace layout survives restart (external files remain session-only). Small windows degrade to one focused pane without corrupting the saved tree.
- Issues are useful inside the workspace, not only in a modal. Issue panes share the existing fetch and rendering core, show the full issue card, scroll under mouse or keyboard control, and retarget in place when another td id is clicked.
- Editing stays in Sidecar while each surface keeps the right editor. Notes regain their lightweight editor, workspace documents can edit notes in their pane, and the file browser keeps its tmux-backed inline editor. Full tmux attach and the experimental terminal split are now explicit opt-ins instead of escape hatches that unexpectedly replace the Sidecar experience.
Bug Fixes
- Terminal scrolling now follows one rule everywhere. Watched and live panes share scrollback keys, wheel routing, history access, gesture pinning, flick cadence, and shifted-key handling across project and global workspace surfaces. The reader's viewport is preserved when interaction ends.
- Pane geometry now reaches the tmux window even when a control-mode transport owns it, so opening a document or dragging a divider resizes and redraws the terminal immediately instead of waiting for a later click.
- Notes editing no longer leaks its command into other palettes, file-browser inline editing keeps its own input ownership, and preview/tab cleanup removes stale panes without leaving the selection on missing content.
Dependencies
- Tasks embedding updated to v1.8.2, adding bounded store-lock waits and verifiable public-install provenance.
-
v0.98.013 Aug 2026Release notes
Open source →Features
- 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 hosted Tasks — reached without switching projects first. One shared workspace catalog feeds it, so every project's worktrees and shells appear in a single list that filters, sorts, and groups. Sorts carry section headers (Project / Recent), rows show kind, project, name, and age on one line, idle worktrees hide by default behind a sort/filter fly-out, chosen rows pin to the top, and the last global tab survives a restart. The header breadcrumb names the global Overview so the current space is never ambiguous.
- Global workspaces are live, not just listed. Selecting one previews its terminal read-only; entering hands it the keyboard, so an agent running in another project can be watched and driven from one place. Each row carries Output, Diff, and Task tabs, shells can be renamed in place, and Diff jumps to the target project's Git plugin with that project's checkout selected.
- Document panes ship enabled. Markdown mentioned by an agent opens beside
the terminal in a real pane tree, with panes that persist and resize across
restarts,
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. - Child shells nest under their parent worktree in the project sidebar, so a worktree and the shells opened inside it read as one group.
Bug Fixes
- Terminal windowing is now one rule instead of several. Placement,
freezing, wheel notches, and selection geometry moved onto a single shared
bottom-relative window model in
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. - Backslash hides the sidebar without dropping into the watched preview,
qtypes normally in the global Rename Shell modal, Enter closes the View fly-out after applying a sort, and the Task tab'smno longer fires while a hidden doc pane holds focus. - Workspace diffs load the first commit without moving the cursor, compare short against full hashes correctly when skipping commits, and no longer gate the global preview on capture freshness.
Dependencies
- td updated to v0.57.0: reopening an issue now supersedes the stale approval, the review buckets that were classified but never drawn are painted, and the monitor's kanban stops crushing card width with empty columns.
- Tasks embedding updated to v1.8.0, bringing the redesigned Projects view, urgency bands, and the shared row vocabulary.
-
v0.97.011 Aug 2026Release notes
Open source →Features
- Conversations is opt-in via the
conversations_pluginfeature 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, orsidecar --enable-feature=conversations_plugin. With the flag on,plugins.conversations.enabled: falseremains a hard off-switch. Tab shortcut numbers for plugins after Conversations shift left when it is off. - The embedded Tasks tab is framed like every other plugin. Sidecar draws the shared gradient panel around Tasks and renders the embedded model at the panel's interior size, shifting mouse coordinates past the frame so clicks, drags, and wheel events land where Tasks expects them. Unavailable and loading states stay unframed.
sidecar shell namereports 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.- Codex status detection is more accurate.
Performance
- Git diff rendering cost no longer scales with file size. Line truncation scanned a line rune-by-rune from the end and re-measured the whole candidate at each step, so a single 10KB minified JSON line took 577ms to truncate and a 100KB line took about a minute — repeated for every visible line, every frame. Truncation now scans forward against a width budget (577ms → 1.4µs for a 10KB line; 2.5µs at 100KB, output unchanged across widths, CJK, emoji, and combining marks), truncation happens before syntax highlighting so chroma no longer tokenizes discarded bytes, max line number and side-by-side content width are memoized on the parsed diff, and side-by-side pair grouping is cached per hunk with above-viewport hunks skipped.
Dependencies
- Tasks embedding updated to v1.7.0, adding ordered labelled task links and the multi-link picker.
- Conversations is opt-in via the
-
v0.96.011 Aug 2026Release notes
Open source →Features
-
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 throughSIDECAR_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
ufrom 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 thetasks_pluginfeature is effectively enabled (config or CLI override, exactly as plugin assembly resolves it) and the standalonetaskscommand 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 installedwith the supportedbrew install marcus/tap/taskscommand, and updating Sidecar refreshes only its embedded Tasks tab. A confirmation updates; it does not install a new product.
Fixes
- Terminal selections preserve application-painted background colours. The overlay now composites selection styling without leaving harness-rendered backgrounds in the wrong state.
- Each product now uses its own install provenance. Sidecar previously reused its own detected install method to update td, which could run the wrong command on a mixed installation. Provenance is now resolved per product by checking whether the executable you actually run belongs to the formula (
brew --cellar) or to your active Go bin directory — so a Homebrew Sidecar alongside ago installed td, or an active local Tasks development selector, is handled correctly. An unrecognised install is reported with a manual command rather than overwritten. - A failure no longer erases earlier successes. Targets run sequentially and each one's outcome is retained, so completion distinguishes
updated,already current,needs a manual update, andfailed, with a per-target manual command for anything that failed. Retry runs only the failed products. - Restart is only claimed when Sidecar itself changed. A td- or Tasks-only update no longer asks you to quit Sidecar.
- Verification compares exact versions, asking each binary in its own dialect. Every binary a release ships must report the released version afterward — for Tasks that means
tasks,tasks-tui, andtasks-apitogether, so a partially updated suite is a failure rather than a silent success. Success is never inferred from exit status or Homebrew wording alone. - The progress modal no longer offers a cancel it cannot honour. It now shows which product is being changed and what already settled, and says
Update in progress; the running package manager was never cancellable.
Dependencies
- Updated the embedded Tasks TUI from v1.5.0 to v1.6.0.
-
-
v0.95.010 Aug 2026Release notes
Open source →Features
-
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.jsonldirectly. 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,
KeyRouterandFooterStatusProvider; 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 indocs/adr/0001-contextual-plugin-keys-take-precedence.md. -
Tab order is data, not statement order. Plugin registration moved out of
main.gointointernal/plugins/assembly, whosePlanis 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.
Bug Fixes
- The footer no longer advertises keys that do something else. Only bindings Sidecar will actually honour are registered, so a plugin key the host reserves or refuses cannot appear in the footer or merged help labelled as if it worked.
- Registering a plugin binding twice is a no-op. Binding tables grew on every project switch, since plugins re-register on model adoption while the keymap lives for the process.
- A transient toast is no longer hidden by a persistent plugin status. A plugin reporting a long-lived condition previously masked every toast for that tab, including update-and-restart notices.
Dependencies
- Adds
github.com/marcus/tasks v1.5.0, the embeddable Tasks TUI. - Raises the
godirective to 1.26.0 to match that module. github.com/marcus/tdstays at v0.56.0 (already latest).
-
-
v0.94.210 Aug 2026Release notes
Open source →Features
- Copy terminal selections with
cmd+c. On terminals that deliver the macOS shortcut to Sidecar,cmd+cnow copies selected text in both read and interactive modes;alt+cremains 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.
Bug Fixes
- Terminal selection behaves like a native terminal. A drag that begins on a passive terminal now selects immediately without activating, reframing, or jumping to the top of scrollback; a motionless click still activates on release. Double-click-and-drag extends by words, triple-click-and-drag extends by lines, shift-click extends to padding and chrome, and dragging beyond an edge continues through scrollback with bounded auto-scroll. Selection remains local even when the program inside the pane enables mouse tracking, while motionless clicks still reach that program.
- Selection highlighting remains visible over application-painted backgrounds. Multi-line selections no longer disappear on rows whose own ANSI styling sets or resets the background, including pinned-panel layouts, and the original row background is restored after the selected span.
- Copy terminal selections with
-
v0.94.110 Aug 2026Release notes
Open source →Bug Fixes
- 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 hidden tmux pane:
esc,q, andKclose the board (qcloses 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. Theoverviewcontext bindings are registered so?lists them, and the footer shows the board's own hints. - Option/Alt keys reach the pane as real terminal input. Bubble Tea decodes a terminal's ESC prefix into ModAlt, so alt-modified keys arrived as a bare character and common bindings did nothing; the prefix is restored, making Option+Left/Right word motion (alt+b / alt+f) and Option+Backspace word deletion behave as they do in any terminal. Ctrl is preserved as the meta-control byte, and alt+shift+f stays
Finstead of collapsing to the base rune. - The terminal scrollbar column is reserved unconditionally, so crossing the scrollback threshold no longer changes the width tmux wraps at — a frame published mid-resize rendered the pane one column too wide, clipping its final column and reflowing it as a blank wrapped line. (td-0818ef)
- The commit-for-merge modal no longer dead-ends on a clean tree. When an agent had just committed in the workspace, the lagging status snapshot let you press Commit against a clean index and hit git's "nothing to commit" as an unrecoverable modal error; the merge/PR workflow now proceeds with a toast explaining that nothing needed recording.
- Quiet live shells read as
◎ liverather than● running, so a plain shell with a process but no agent activity no longer looks like busy work.
Features
- Agent chips match across surfaces. The workspaces list and kanban reuse the Overview's themed agent presentation — icon, colour, raised fill — and Overview shell cards drop the redundant
tmuxprefix in favour of the session name. - The marketing front page was updated to cover recent features.
- 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 hidden tmux pane:
-
v0.94.1-0.20260810045052-9b76b9b2ebe210 Aug 2026 pre-releaseNothing published for this version
-
v0.94.010 Aug 2026Release notes
Open source →Features
- 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 — click the logo or press
Kto 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) - Terminals across the app share one model-first component. Workspace panes, shell panes, and the files-plugin inline editor all run on the same terminal model instead of three divergent capture paths: absolute scrollback history is preserved, terminal generation is invalidated on resize, a blank pane falls back to a rendered snapshot rather than flickering empty during reseed, and pane input routing is consistent everywhere. The inline editor inherits all of it, and rejects stale async save results instead of applying them over newer edits. (td-b49d63, td-14a1df, td-d5df75, td-76f993, td-d267fe)
- Workspace creation, merge, and PR lifecycles are recoverable and safe to interrupt. A creation that fails partway preserves its partial state and can be resumed rather than leaving an orphaned worktree; merge preflight, post-create discovery, and other long git operations are cancelled cleanly when you move on, instead of landing their results on a workspace you have already left. Cleanup refuses unsafe targets, merge recovery is bound to the identity it started with, pull revalidates its target first, fork base topology resolves correctly, and containment refusals say plainly why they refused. (td-24d130, td-75360a, td-9ce7db, td-c90334, td-9ce314)
- Diff status is authoritative. The changed-file counts and diff strategy shown on a workspace card come from a captured strategy rather than being recomputed against whatever the tree looks like at render time, so branch commits show correctly and a phantom diff entry no longer appears.
- Agent activity states animate, and each provider gets its own spinner set, so a working agent reads as working at a glance instead of as a frozen frame.
- Grok detection, plus a round of general agent-detection accuracy fixes.
Bug Fixes
- Theme contrast is enforced on every surface text is drawn on, so no theme can produce unreadable text on a coloured background; search match highlights are guaranteed a legible foreground.
- Passive terminal follow is preserved on the live grid — the Overview grid no longer steals follow from a terminal you are watching.
- The workspace terminal cursor is placed from a carried pane split, and the preview header collapses to a single row.
- Panel shortcut input is routed to the right panel; model-owned panel capture is guarded. (td-14a1df)
- Visible terminals are kept current rather than going stale behind the active pane.
Developer
- Releases fail closed on red Go CI instead of relying on a manual checklist item.
- A byte-fed screen-model adapter, tmux fidelity harness, and shadow-comparison canary were built and evaluated against the tmux-owned path; the gate outcome is recorded as HOLD, and tmux retains ownership of bracketed paste at the input seam. (td-b7aa77, td-d7a24f)
- Isolated terminal proof harness hardened: bare control-client socket identity is verified, and the proof driver refuses to run against a shared server. (td-d7a24f)
- A Codex adapter, plus harness-change detection per terminal/workspace.
- 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 — click the logo or press
-
v0.93.008 Aug 2026Release notes
Open source →Features
- Agent activity detection is semantic, not just pattern-matched, and it now drives the kanban board. Working/idle/blocked/done for Claude, Codex, Gemini, Grok, and Antigravity is classified by a real per-provider rules engine (
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) - Five more agents get the same live activity detection: Pi, GitHub Copilot CLI, Cursor Agent, OpenCode, and Amp. Each ships its own rule set (compatibility-tested against Herdr provider manifests) for working/blocked/idle, including recognizing that a help/history/settings overlay or an interrupted turn should retain the agent's last real state rather than reporting idle. Fallback idle — no rule matched a known-live process — no longer downgrades to a "done" completion badge for these five, only for the original four. Terminal-control snapshots (tmux control-mode) now carry pane title and current-command metadata end-to-end, so these probes get the identity they need without falling back to slower polling; the "fallback idle can never announce completion" rule stays scoped to expanded agents, and a plugin-wide fallback idle default is scoped to only the panes actually expanded on screen so a collapsed row can't borrow another row's read. (td-30281f, td-31ab2b, td-52abdf, td-a5670d, td-8625a6)
make install-local/make install-worktree/make use-homebrewmanage a Homebrew-linked development binary safely.scripts/dev-install.shbuilds and swaps the linkedsidecarbinary in place, refuses to runinstall-localfrom a branch or a linked worktree (useinstall-worktreewhen that's deliberate) so an incidental checkout can't silently become "the" dev binary, andmake install-status/make test-dev-installreport and prove the switching logic against an isolated fake Homebrew prefix.make installremains the old unmanagedgo installpath. Mirrors the switching tool td just shipped. (td-d2466a)
Bug Fixes
-
Git status parsing is hardened for large trees and copy/rename cases.
git diff --numstatis 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 batchedwcpass) 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 withgit rev-parse --git-pathso linked worktrees (whose HEAD/index live outside the common.gitdirectory) 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
.gitignorescaffolding 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 calledexec.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.jsondown to its own sessions. A live instance watching that file then dropped six shells from the Workspaces sidebar whose tmux sessions were still running, andrdid 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), andrre-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-sessionsis 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)
Developer
-confignow also relocatesstate.jsonanddebug.log. They live next toconfig.json, sosidecar -config ~/somewhere/sidecar.jsonreads and writes its persisted UI state and debug log from~/somewhere/rather than~/.config/sidecar/. This is what makes-configa real isolation lever for proof runs. If you pass-configin normal use and want your existing preferences, movestate.jsonnext to the config file you point at. (td-8d18de)go testis isolated from the real state tree by default. Any test binary is treated as asserting isolation, so a package that forgets to redirectXDG_STATE_HOMEnow gets a refusal instead of quietly creating directories in~/.local/state/sidecar/projects. A test that deliberately exercises the ordinary unisolated path setsSIDECAR_ALLOW_REAL_STATE=1(withHOMEpointed at a temp dir). (td-8d18de)- Proof runs are isolated on both axes, and fail closed if they are not. "Never restart the default tmux server" turned out to be necessary but not sufficient: the run that caused the bug above held a private tmux socket and still resolved the developer's real
~/.local/state/sidecar. Sidecar now refuses to read or write anything under the real state or config tree whenSIDECAR_ISOLATED_STATE=1is 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.shnow isolatesTMUX_TMPDIR,XDG_STATE_HOME,XDG_CACHE_HOMEand-configunder one run root, adds apathssubcommand, and tears the inner server down by explicit socket path;scripts/tmux-screenshot.shrefuses to run un-isolated, andtmux-drive.sh startrefuses to take over a run root another driver is already using (setSIDECAR_DRIVE_RUN_DIRper agent, orSIDECAR_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.mdandPRIVACY.mdnow document both isolation axes (including thatXDG_CONFIG_HOMEmoves nothing). (td-8d18de)
Dependencies
- Updated td to v0.56.0. Review stamps cleared by superseded-approval handling now sync between machines instead of being stranded on the clearing client. The monitor displays timestamps and due/defer dates in local time with civil-day math, so a DST transition can no longer mislabel tomorrow as today. Sidecar needed no change for this.
- Agent activity detection is semantic, not just pattern-matched, and it now drives the kanban board. Working/idle/blocked/done for Claude, Codex, Gemini, Grok, and Antigravity is classified by a real per-provider rules engine (
-
v0.92.006 Aug 2026Release notes
Open source →Features
- Grok is a first-class workspace agent. Create and start workspaces with Grok (
grok, skip-permissions via--always-approve) alongside Claude, Codex, and the rest. Configure which agents appear and in what order withplugins.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. - Embedded terminals render at their true pane size. Tmux panes are sized and mapped through hit testing so the program inside lays out for the visible area rather than a mismatched rectangle; letterbox padding no longer steals editor clicks.
- Focus-gated ownership lease for shared tmux geometry. When several sidecar instances (or a sidecar and an attached client) share a session, geometry ownership follows where the user is — focus and attach hold ticks with bounded refresh, dead leases are reclaimed, and an attach no longer claims permanent authority. Held sessions read input back out of tmux so a background holder does not starve the active client.
Bug Fixes
- Global shortcuts show up in the command palette. Hard-coded app bindings (
i,W,#,r,ctrl+c) are registered in the keymap so discovery matches what the app actually handles. - Open Issue Enter uses the sole search result when the cursor has not been moved, instead of submitting a partial typed query.
- The agent config picker list is pinned for the modal lifetime so a config reload cannot reshuffle options under the cursor mid-choice.
- Modals take keyboard focus from a live terminal so typing goes to the dialog rather than the session underneath.
- Terminal view and cursor stay on one pane-row anchor; geometry decisions use user presence rather than focus alone; failed marker reads are treated as absence of evidence rather than proof of a hold.
Developer
- Streamlined releases.
RELEASE_VERSION=vX.Y.Z make releasefail-closed-preflights (clean tree, livemain, changelog entry, noreplace, tag absence), pushes an annotated tag, waits for CI, and verifies or resumes the Homebrew formula. CI runs verify → GoReleaser → template-renderedFormula/sidecar.rbwith downgrade/idempotency/race guards. Seedocs/releasing.md.
- Grok is a first-class workspace agent. Create and start workspaces with Grok (
-
v0.91.002 Aug 2026Release notes
Open source →Features
- 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
enter/i/Epress, 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, matchingenter; 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. - Drag a row in the files tree to move the file or folder. Press on a row and move two cells in any direction to pick it up; drop it on a directory row to move it there, or on a file row to move it alongside that file, the way Finder and VS Code behave. Resting over a collapsed folder for a moment springs it open so one gesture can reach a nested destination, dragging to the top or bottom of the pane scrolls the tree, and
esccancels 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 keyboardmdialog, which previously reachedos.Renameand reported a rawinvalid 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.
Bug Fixes
- Clicks in the files plugin land on the row you are looking at while an input bar is open. The tree's clickable rows were registered one row too high per open bar, and the move dialog's path-suggestion dropdown was not counted at all — so with three suggestions showing, every row was off by five. The same stale measurement shifted click and drag-selection in the preview pane by a line, and put the suggestion list's own click targets a row above the suggestions they named. Keyboard tree scrolling used a third, different measurement, which could leave the cursor on a row that was never drawn.
- Mouse scrolling and clicks work in the td plugin again. td's monitor computes its panel bounds only when it receives a window-size message, and since the monitor model is now built asynchronously it is adopted after the app has already broadcast that size — so the new model never saw one. Panel bounds stayed empty, every hit test missed, and the wheel and clicks silently did nothing until the terminal was resized.
- The files tree scrollbar stays in its own column. It jumped left to hug the longest filename whenever no full-width highlighted row was on screen — during a drag, and any time the cursor was scrolled out of view.
- Manual search inputs accept spaces.
Dependencies
- Updated td to v0.55.0. Log rows written as side effects — the progress note
td unstartrecords 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 toopenreleases the implementer claim on every surface, including the API, which had never received the earlier reopen and unblock fixes.ERROR:andWarning:diagnostics moved from stdout to stderr so--jsonoutput 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.
- 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
-
v0.90.031 Jul 2026Release notes
Open source →Features
- The file browser now tracks filesystem changes as they happen. Sidecar watches the project root and expanded directories, coalesces bursts of creates, deletes, renames, and writes, and refreshes the tree without waiting for the tab to lose and regain focus. Changes also invalidate background file previews, quick-open results, and path-completion data so every file-browser surface stays aligned with the disk. The watcher is bounded to avoid excessive file descriptors on macOS and is enabled by default behind the
files_auto_refreshfeature flag.
Performance
- Tree rebuilds, quick-open scans, and path-completion scans now run outside the UI update path while the previous results remain visible. Navigating to a known file descends only through the directories in that path instead of loading the entire project tree.
Bug Fixes
- Async tree refreshes preserve directories expanded and files selected while a scan is running, reject stale results, and continue listening while the inline editor, search, or a modal is open. Recreated directories are re-watched, project switches stop the old watcher, and cache scans can no longer clear one another's dirty state.
Dependencies
- Updated td to v0.54.0, adding review attribution and sync support along with monitor input, CLI error reporting, and terminal-output sanitization fixes.
- The file browser now tracks filesystem changes as they happen. Sidecar watches the project root and expanded directories, coalesces bursts of creates, deletes, renames, and writes, and refreshes the tree without waiting for the tab to lose and regain focus. Changes also invalidate background file previews, quick-open results, and path-completion data so every file-browser surface stays aligned with the disk. The watcher is bounded to avoid excessive file descriptors on macOS and is enabled by default behind the
-
v0.89.1-0.20260730151228-ab0f51ca6de430 Jul 2026 pre-releaseNothing published for this version
-
v0.89.030 Jul 2026Release notes
Open source →Features
- 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 [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 newui.terminalTitletemplate ({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.
- 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 —
-
v0.88.228 Jul 2026Release notes
Open source →Bug Fixes
- Scrolling an embedded terminal scrolls the program running in it. When the program has enabled mouse tracking — Claude Code, vim with
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, andalt+wheel still scrolls it for programs that do.
- Scrolling an embedded terminal scrolls the program running in it. When the program has enabled mouse tracking — Claude Code, vim with
-
v0.88.127 Jul 2026Release notes
Open source →Bug Fixes
Eenters 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 (typingwhoamiafter it opened the issue picker).enterwas and remains the primary binding.
Dependencies
- Updated td to v0.53.0, which fixes several issue-query bugs.
-
v0.88.027 Jul 2026Release notes
Open source →Features
- Embedded terminals are driven by tmux control mode. Sidecar keeps a control connection to the visible terminal and re-renders when tmux says the screen changed, instead of capturing it on a timer. The polling path is retained and resumes automatically whenever control mode cannot start or its client dies.
- Embedded terminals use the host terminal's own cursor rather than a drawn block, so shape, blink, and hidden-cursor states match what the program running inside actually asked for.
- Scroll back through the full tmux scrollback. Older ranges are fetched on demand as you scroll past what is loaded; the hint line reports how many older lines remain and how far back you are from the live edge.
- Search terminal scrollback. Press
/(orctrl+shift+fwhile interactive) to search,n/Nto step through matches,escto clear. Search covers the complete tmux history, not only the ranges you happen to have scrolled through. - Select terminal output with the mouse. Drag to select, hold alt for a rectangular selection, double-click for a word, triple-click for a line,
ctrl+afor everything. Setplugins.workspace.copyOnSelectto copy as soon as a drag ends. - URLs in terminal output are underlined and clickable. Hyperlink escape sequences present in the output itself are stripped and re-synthesized only for URLs that pass a safety check, so untrusted output cannot make a link point somewhere other than the text it displays.
ctrl+ncreates a shell session directly from the workspaces tab, skipping the type-selector modal. It usesplugins.workspace.defaultAgentTypewhen one is configured and creates a plain shell otherwise; it never passes an agent's skip-permissions flag, so usen→ Shell when you want that. The hint appears in the workspaces footer next to New.- New
plugins.workspace.autoCreateShellsetting (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.
Bug Fixes
- Typing fast in an embedded terminal no longer transposes characters. Every keypress returned its own command, and those run concurrently — so two keys typed in quick succession raced into tmux and could arrive out of order (
whoamilanding aswhoaim). 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. - The terminal cursor is drawn on the line you are typing on. The rendered buffer is scrollback followed by the pane's rows, but the cursor's row was mapped straight onto a display row as if the buffer's tail were the pane — so the cursor floated above the live line by however much scrollback the capture carried. On a fresh shell that was one row; after quitting a full-screen program like vim it was many, which is the "cursor stays at the top of the terminal while I type further down" report.
- The terminal scrollbar sits at the right edge of the pane. It was aligned to the longest rendered line instead, so on a mostly-empty terminal it appeared right after the shell prompt and crept rightwards as you typed. Full-width lines could also push the joined block past the pane and wrap it, shifting every row down by one.
- Interactive mode shows a cursor when entered from the sidebar. The native cursor and cell-motion mouse reporting were gated on the preview pane being active, and entering interactive mode left the sidebar active — so the session ran with no visible cursor at all. The previous pane is restored on exit.
- Editors opened in a workspace shell get the full pane. Shell sessions were created without a size, so tmux used its 80x24 default and anything started before the follow-up resize laid itself out for 24 rows.
- The inline file editor gets the height it is displayed in. Both the file browser's and the notes' inline editors created their tmux session at the whole plugin rect while rendering into a viewport four to five rows shorter, pushing vim's status and command lines out of view.
- Terminal selection highlights and search matches stay on their lines once older scrollback has been loaded. The renderer could be handed a base of 0 for a buffer that actually started further down tmux's history, offsetting every highlight by the amount of loaded scrollback.
- The plugin active at startup is now marked focused.
SetFocusedonly 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. - Footer hints with equal priority no longer sort nondeterministically; they now follow the order the plugin declares them in.
Developer
- Added
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.mdcovers it, including how to see the native cursor (whichcapture-panecannot) and the tmux coordinate spaces the terminal code works in.AGENTS.mdis now the single entry point for agent instructions.
Interface
- Removed the ASCII tree from the main worktree preview. The pane now leads with the text and carries hints for both
n(new workspace) andctrl+n(new shell).
-
v0.87.125 Jul 2026Release notes
Open source →Bug Fixes
- Claude Code and Cursor sessions no longer go missing when the project sits under a symlinked path. Both adapters locate sessions by deriving a directory name from the project path — Claude Code by substituting characters, Cursor by hashing the string — and neither resolved symlinks first. Sidecar passes the main worktree path reported by
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. - The Claude Code adapter now honors
CLAUDE_CONFIG_DIR. Claude Code uses it to relocate its config directory; sidecar only looked in~/.config/claude/projectsand~/.claude/projects, so a relocated install appeared to have no sessions.
- Claude Code and Cursor sessions no longer go missing when the project sits under a symlinked path. Both adapters locate sessions by deriving a directory name from the project path — Claude Code by substituting characters, Cursor by hashing the string — and neither resolved symlinks first. Sidecar passes the main worktree path reported by
-
v0.87.024 Jul 2026Release notes
Open source →Performance
- 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 machines running an endpoint security agent (CrowdStrike and similar), where every file open and process spawn carries a fixed tax and the old startup path did a great many of both.
- Conversation adapter detection no longer runs before the first frame. It used to probe all twelve adapters serially inside plugin init, and probing Codex alone walks every rollout file in
~/.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. - The Codex, Pi, and Amp adapters probe session files newest-first and stop at the first match, so opening a recently used project reads a handful of files instead of the whole history.
- The td tab builds its embedded monitor (which opens the task database) asynchronously instead of during init.
- Terminal graphics-protocol detection no longer queries the terminal at startup. The queries cost ~0.5s in escape-sequence round-trips and two tmux subprocess spawns, and nothing consumed the result — image previews always render with Halfblocks. The protocol is now read from environment variables.
- Dropped redundant
git rev-parse --git-dirprechecks beforegit worktree listandgit remote get-url, halving the subprocess spawns on those paths.
- Conversation adapter detection no longer runs before the first frame. It used to probe all twelve adapters serially inside plugin init, and probing Codex alone walks every rollout file in
Features
- Added
SIDECAR_STARTUP_TRACEfor diagnosing slow launches. Set it tostderrto print a phase-by-phase startup timeline (or1to write it to the debug log), andSIDECAR_STARTUP_TRACE_DELAYto dump the trace later so asynchronous startup work is included.
Bug Fixes
- Fixed a potential crash from concurrent access to the OpenCode adapter's project index, which was reachable whenever session loading and file watching ran at the same time.
- A panicking conversation adapter now disables just that adapter instead of taking down the application.
Dependencies
- bump td to v0.51.2 — local session state store, worktree identity on sessions, session keying by context ID for sub-agent independence,
--jsonoutput across the CLI mutation commands, project slugs and invitations, plus fixes for sync conflict false-positives, handoff autosync stalls, and SQLite timestamp serialization.
- 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 machines running an endpoint security agent (CrowdStrike and similar), where every file open and process spawn carries a fixed tax and the old startup path did a great many of both.
-
v0.86.017 Jun 2026Release notes
Open source →Features
- 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 project-path encoding.
Bug Fixes
- Preserve custom Pi Agent-compatible adapter identity on returned sessions, so OMP sessions are labeled as OMP instead of Pi Agent in conversation lists and targeted refreshes.
- Resolve symlinks when matching Pi Agent project session directories, fixing macOS paths such as
/tmpresolving to/private/tmp.
Dependencies
- bump td to v0.47.2 — normalizes issue IDs before FK-constrained writes.
- Add an Oh My Pi (OMP) conversation adapter for sessions stored under
-
v0.85.117 Jun 2026Release notes
Open source →Bug Fixes
- 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 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.
Dependencies
- bump td to v0.47.1 — fixes the capital-letter shortcut regression in the monitor keymap (
KeyToStringnow usesKey.String(), mirroring sidecar's own keymap fix).
- td monitor: capital-letter keyboard shortcuts now work again. After the v0.85.0 Charmbracelet v2 upgrade,
-
v0.85.009 Jun 2026Release notes
Open source →Dependencies
- Charmbracelet v2 migration: upgraded to the
charm.landv2 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 declarativetea.View; lipgloss colors moved toimage/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. - bump td to v0.45.0 — itself rebuilt on the Charmbracelet v2 stack, so sidecar's embedded td monitor sub-model now shares the same v2
tea.*/lipgloss.*types. The local developmentreplacedirective was removed.
- Charmbracelet v2 migration: upgraded to the
-
v0.84.018 Apr 2026Release notes
Open source →Dependencies
- bump td to v0.44.0 — SQLite configuration stabilization:
foreign_keys=ONenforced on CLIissues.dbwith migration 30 orphan cleanup + schemaON DELETE CASCADEon child relations; centralized SQLite opener (OpenSQLite) with uniform pragmas; PASSIVE WAL checkpoints onClose; removed redundant manual cascade emulation ininternal/sync/events.go; newtd doctor fkorphan audit (gated byTD_FEATURE_SYNC_CLI=1); newTD_MONITOR_DBPOOL_DEBUGenv var for monitor connection-leak tracing;td importtolerates forward-referencing deps via per-transaction FK toggle
- bump td to v0.44.0 — SQLite configuration stabilization:
-
v0.83.1-0.20260324051208-71f7918bf16524 Mar 2026 pre-releaseNothing published for this version
-
v0.83.024 Mar 2026Release notes
Open source →Features
- feat: full-file diff view with minimap (#232)
- feat: two-pane diff tab with drag-to-resize (#232)
- feat: git sidebar line stats (#232)
- feat: split terminal panel with Ctrl+T toggle (#232)
-
v0.82.024 Mar 2026Release notes
Open source →Dependencies
- bump td to v0.43.0 — 24 bug fixes: atomic lossless import, UpdateIssue missing fields, timezone-aware defer/due filtering, RemoveDependencyLogged wrong depID, DeleteBoardLogged atomicity, RateLimiter goroutine leak, CORS missing methods, snapshot stat error, DB connection leaks, form scroll over-run, modal click detection, in-progress panel header count, RFC3339Nano sync parsing, sess nil guard, escapeJSON completeness, stdin pipe size guard, trusted proxy XFF spoofing, CreateUser admin TOCTOU race, backfill false positive, autosync tx leak, singleflight snapshot dedup
-
v0.81.024 Mar 2026Nothing published for this version
-
v0.80.021 Mar 2026Release notes
Open source →Dependencies
- 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-transactional migration, snapshot race, StatusFilter/board editor data races, stale syncState, CLI reject validation, HelpFilter UTF-8, preview count, copyFile durability
-
v0.79.021 Mar 2026Release notes
Open source →Dependencies
- chore: bump td to v0.42.1 — fixes lossless import round-trip for all issue fields and associated data (#64)
-
v0.78.010 Mar 2026Release notes
Open source →Features
- Agent-powered PR description generation in merge workflow (#167)
- Configurable default agent type and
.sidecar-agent-startoverride per worktree (#198) - OpenCode adapter backward-compatible conversation updates (#199)
Bug Fixes
- Prevent tmux server exit when all sessions are killed
- Fix centralized agent file tests to use correct storage path
Dependencies
- Bump td to v0.42.0
-
v0.77.001 Mar 2026Release notes
Open source →Features
- Add GitHub Copilot CLI adapter for conversations plugin
Bug Fixes
- Restore mobile sidebar nav visibility (#220)
- Resolve worktree path from ProjectRoot, not WorkDir (#174) (#218)
- Fix task title truncation in td view (#215) (#217)
Documentation
- Worktree setup hooks (#219)
Developer
- Add pre-commit hooks for gofmt/vet/build (#216)
-
v0.76.028 Feb 2026Release notes
Open source →Features
- Add Amp agent support for workspaces (#195)
- Make PR URL clickable and add yank shortcut in merge modal (#164)
Bug Fixes
- Resolve CI lint and test failures (#214)
- Remove stale sessionIndex references in opencode adapter tests (#212)
- Add all sidecar state files to .gitignore on init and startup (#211)
Dependencies
- Updated td to v0.39.0
-
v0.75.027 Feb 2026Release notes
Open source →Features
- Open In modal to open projects in IDEs (#200)
- Centralized project data storage under
~/.local/state/sidecarwith migration (#197) - Detect
.todosfile vs directory conflict in onboarding (#206) - Agent restart uses chosen agent rather than defaulting to Claude (#192)
Bug Fixes
- Use standard diagnostic status strings for fsnotify watcher (#158)
- Hierarchical branch crash, git hangs, and adapter timeouts (#136)
- Git init bug in test, remove dead kiro code (#148)
- Opencode sandbox path matching for bare-repo worktrees (#204)
-
v0.74.119 Feb 2026Release notes
Open source →Bug Fixes
- Fix git locking errors in background operations by using
--no-optional-locks(PR #186 by @borisvu) - Fix tmux agent reconnection type handling (PR #150 by @jacola)
Added
- MIT LICENSE file (Issue #182)
Dependencies
- Updated td to v0.38.0 — approval workflow fix
- Fix git locking errors in background operations by using
-
v0.74.1-0.20260216224728-70c43431fc8416 Feb 2026 pre-releaseNothing published for this version
-
v0.74.016 Feb 2026Nothing published for this version
-
v0.73.116 Feb 2026Release notes
Open source →Bug Fixes
- Shift+Enter and semicolon key fix for Ghostty terminal (PR #171 by @boozedog)
-
v0.73.015 Feb 2026Release notes
Open source →Features
- Kanban board view — press V in board context for overlay, f to toggle fullscreen
- 7 status columns: Review, Rework, WIP, Ready, P.Review, Blocked, Closed
- Per-column independent scrolling with scroll indicators
- Form autofill/autocomplete for Parent Epic and Dependencies fields
- InProgress and PendingReview now have distinct categories (previously lumped into Ready)
Dependencies
- Updated td to v0.37.0
-
v0.72.1-0.20260214192917-094edc40ae8014 Feb 2026 pre-releaseNothing published for this version
-
v0.72.014 Feb 2026Release notes
Open source →Dependencies
- Updated td to v0.35.0 — adds GTD-style deferral (td defer, td due, temporal list filters, monitor modal defer/due display)
-
v0.71.110 Feb 2026Release notes
Open source →Bug Fixes
- Prevent refreshSessions from overwriting concurrent session list updates
- Improve update error modal UX with actionable info
- Detect brew upgrade false-positive "already installed" response
- Add
brew updatebeforebrew upgradein self-update flow
-
v0.71.010 Feb 2026Release notes
Open source →Features
- Pi Adapter: View Pi AI agent sessions (OpenClaw) in the conversations plugin, with session classification (interactive, cron, system), source channel detection, and CWD-based project matching
Documentation
- Add Pi to supported agents on website homepage, conversations plugin docs, and intro page
Dependencies
- Update td to v0.33.0
-
v0.70.009 Feb 2026Release notes
Open source →Features
- Amp Code Adapter: View Amp Code IDE threads in the conversations plugin, with token usage, tool calls, and project matching
- Kiro CLI Adapter: View Kiro CLI conversations from SQLite storage, with message parsing and project detection
-
v0.69.109 Feb 2026Release notes
Open source →Bug Fixes
- Fix file search (
/) hanging on large projects by reusing Ctrl+P file cache with fuzzy matching (#107)
Dependencies
- Update td to v0.32.0
- Fix file search (
-
v0.69.1-0.20260209043624-66764311b72a09 Feb 2026 pre-releaseNothing published for this version
-
v0.69.009 Feb 2026Release notes
Open source →Features
- Homebrew Formula: Install via
brew install marcus/tap/sidecar— builds from source for native Apple Silicon performance
Improvements
- Better PR fetching in git plugin
- Homebrew Formula: Install via
-
v0.68.008 Feb 2026Release notes
Open source →Features
- Add ProjectRoot to plugin.Context for worktree-aware shared state
- Convert 17 docs/guides into .claude/skills for AI agent discovery
- Focus files pane when clicking markdown links
Bug Fixes
- Fix splitFirst OOB panic by using strings.SplitN
- Resolve td root via git-common-dir for external worktrees
Improvements
- Resolve all 360 golangci-lint issues across codebase
- Make lint-all CI-blocking
Dependencies
- Update td to v0.31.0