All notable user-visible changes to this project are documented in this file.
- Surfaces: a published card is now an ordered list of parts, not a single
HTML blob. A
diffpart renders a unified/git patch as a syntax-highlighted split/unified code review (via @pierre/diffs) directly in the viewer; anhtmlpart is the sandboxed markup snippets always were. Combine them — e.g. a diagram html part above its diff — in one versioned, commentable card. - Generic publishing across all tiers:
publish_surface/update_surface(MCP),POST /api/surfaces, andsideshow diff <patch>/sideshow publish --diff. Diff parts are rendered from patch data by the viewer, so agents send a patch, never markup, and the sandbox is untouched.
sideshow-term watchnow starts a local server in the background when needed, and baresideshow-termopens the watcher. Terminal servers default to port 4243, with--portfor choosing another local port. The watcher supports mouse input for clicking sidebar snippets and wheel-scrolling content. Agents can runsideshow-term clearto remove stale visualizations from the current session, orsideshow-term clear --allto clear the whole surface.sideshow-term serveremains for explicit server-only use.- Snippets are now "surfaces" throughout the API:
/api/surfaces,surface-*SSE events, and comments keyed bysurfaceId. The old snippet endpoints and thepublish_snippet/update_snippettools remain as back-compat aliases, so existing agent configs keep working. Stored boards migrate in place on load.
sideshow-termcan now be packaged and installed standalone: its server runtime dependencies are declared, it reuses thesideshowpackage's server core, and published installs run built JavaScript instead of TypeScript fromnode_modules.
- Cmd+Option+Up/Down switches between sessions in the viewer without reaching for the sidebar — Down moves to the next session in the list, Up the previous, wrapping at the ends.
- The viewer notices new releases: a dismissable banner in the sidebar names
the latest version with a copyable upgrade command (npm install locally,
redeploy for workers), and the release notes render as a card at the top of
the stream. Dismissing either hides both until the next release. The check
lives server-side at
/api/version(npm registry + GitHub release notes), is cached for six hours, and fails silently — offline costs nothing but the absence of the notice. - The CLI now runs on Windows: session detection walks the process tree with a
single PowerShell call instead of
ps, andsideshow serve --openlaunches the browser viacmd /c start. macOS and Linux are unchanged.
- A session thread at the bottom of each session in the viewer: a composer for messaging the agent without picking a snippet.
- Feedback now reaches agents without polling: publish/update/reply responses
carry a
userFeedbackarray with any comments the user left since the agent's last call (delivered once; a consumedwaitalso counts as seen). - The design guide, setup block, and Claude Code skill teach the background
watch pattern: arm
sideshow waitas a background process after publishing and react when it exits, instead of blocking or polling. - Agents can name their session at creation:
sessionTitleon the publish body and both MCPpublish_snippettools,--session-titleonsideshow publish. Applied only when the publish creates the session — it never overwrites a title, including renames made in the viewer. - A snippet kit baked into every snippet doc, so agents publish compact
markup instead of hand-written inline CSS: bare
button/input/select/textareapre-styled to match the viewer, SVG utility classes (t/ts/thtext presets,box,arr,leader,node,c-*color ramps with dark-mode-aware text), and a shared#arrowmarker injected into every doc. The design guide documents it as a compact reference table.
- New snippets no longer steal the scroll position: the viewer only follows them when already at the bottom of the stream, and shows a "new snippet ↓" pill otherwise.
- Activity the user isn't looking at — another session, or any session while the tab is hidden — badges the tab title with an unread count.
- The Claude Code skill now documents the repo-local CLI fallback and a checkpoint-drain feedback pattern for harnesses that cannot surface background watcher output.
- Feedback was re-delivered when channels were mixed: a fresh
sideshow waitprocess (or restarted stdio MCP server) started from seq 0 and replayed comments the agent had already received via piggyback or another channel.author=usersession reads with no explicitafternow resume from the server-side agent cursor, and the CLI and stdio MCP keep no cursor of their own — delivery is exactly-once across CLI, MCP, and piggyback. Pass--after <seq>(CLI) orafterSeq(MCP at/mcp) to deliberately re-read. - A comment that failed to send was silently lost (input cleared, no error). The viewer now echoes comments immediately (pending until confirmed) and on failure restores the text to the input with an error toast.
- After an SSE reconnect the viewer refetches the selected session, so snippets and comments that arrived during the gap can no longer be silently missing from a live-looking board.
- The viewer layout no longer breaks at phone widths: below 700px the sidebar collapses into a drawer behind a slim top bar (hamburger toggle, unread dot), the stream takes the full width, and hover-only actions (card open/delete, session delete) stay visible on narrow or touch screens.
- Comments not attached to a snippet (e.g.
sideshow commentwithout--snippet) were stored and delivered to agents but never shown in the viewer; they now render in the session thread. - The viewer is now usable by keyboard and assistive tech: session rows are focusable and activate with Enter/Space (focus survives live re-renders), hover-only actions (session delete, card open/delete) are reachable and shown on focus, the editable session title is labeled and Escape cancels an edit, snippet iframes carry the snippet title, and toasts are announced via a polite live region.
--help/-hon CLI subcommands (sideshow publish --help, …) printed a raw parseArgs stack trace; it now prints the usage text and exits 0. An unknown option or missing option value likewise fails with a one-line error and asideshow helphint instead of a stack trace.- Following the README quick start from a git clone failed:
npx sideshow serveexited withviewer build missingbecause nothing built the viewer.npm installin the repo now builds it (the published npm package was unaffected —prepackalready ships a built viewer).
sideshow demoseeds two example sessions (a sequence diagram with a comment thread, an interactive explainer, a metrics card) so the viewer can be explored without an agent.
First release.
- Initial release: live preview surface (Hono server + single-file viewer) with sessions, versioned snippets, and comment threads.
- Zero-dependency
sideshowCLI:serve,publish,update,wait,comment,list,sessions,guide,setup. Sessions resolve automatically per agent conversation. - Stdio MCP server with
publish_snippet,update_snippet,wait_for_feedback,reply_to_user,list_snippets,get_design_guide. - Long-poll feedback endpoint (
GET /api/comments?wait=N) so terminal agents can block on user comments without extra infrastructure. - Agent design contract served at
/guide; paste-able AGENTS.md integration block at/setup. - Sandboxed snippet rendering (
sandbox="allow-scripts", CSP CDN allowlist) with light/dark theme CSS variables and asendPrompt/openLinkbridge. - Cloudflare Workers deployment (
npm run deploy): the whole app runs in a Durable Object with SQLite storage; local and cloud are the same product behindSIDESHOW_URL+SIDESHOW_TOKEN. - Built-in MCP over streamable HTTP at
/mcpon every server (local and deployed) — agents can connect without any local process. - Token auth for deployed instances: bearer header for APIs,
/?key=<token>cookie flow for the viewer;/guideand/setupstay public. - Claude Code skill at
skills/sideshow/teaching agents the publish → feedback → iterate workflow.