Description
claude-web-console is a Claude Code plugin that mirrors a live session into a
local web UI with rich rendering, and (as it grows) lets the user browse past
sessions and drive new ones from the browser. It is grouped as an epic because
delivery spans many independent but coordinated features — rendering, session
management, viewer UX, transport, and bidirectional control — that share one
architecture and one set of invariants.
Current baseline (already built): hooks (UserPromptSubmit / MessageDisplay /
Stop) POST to a local stdlib-Python server, which broadcasts over SSE to a
browser viewer that renders Markdown (markdown-it), math (KaTeX), and PlantUML
(local PicoWeb). Claude-only — depends on the MessageDisplay hook, which has no
Codex equivalent.
Member Workstreams
Starting clusters (member issues to be scoped under each; the list will grow):
- Rendering — renderer registry via the
fence dispatch; render additional
block types beyond Markdown / math / PlantUML.
- Session management — browse and open sessions whose transcript already
exists, including sessions from other projects, and render that stored
transcript in the viewer (not only the live stream). Open a brand-new session
from the web UI.
- Viewer UX — auto-scroll to the newest message as LLM output arrives so the
user can follow along comfortably; related reading-comfort behavior.
- Artifact & file preview — when the assistant writes or points at a local
file (draft / scratchpad artifact, e.g. under tmp/), render its content
inline in the viewer so the user reads it in the web UI instead of having to
open the file manually. Removes the "it's in a file you now have to go open"
friction.
- Transport & liveness — SSE robustness, reconnect / history replay,
retention limits.
- Bidirectional input — web UI → Claude Code control. This is the capability
that "open a new session from the web UI" depends on; previously deferred, now
in scope.
- Robustness / offline — browser libraries vendored locally under
server/static/vendor/, no CDN dependency (done).
- Packaging & config — env vars / ports, launcher, PlantUML engine bootstrap.
Coordination Notes
Shared invariants that constrain every member issue:
- Hooks are best-effort, silently no-op when the server is down, and never write
to stdout — they must not affect the conversation.
- The server is Python stdlib only with zero build step; browser libraries are
vendored under server/static/vendor/ (no CDN). .mjs / .woff2 must stay
mapped in server.py's CONTENT_TYPES, or the viewer silently fails to load.
- Stored transcripts live under
~/.claude/projects/; the session-management and
bidirectional-input workstreams are the ones that reach outside the current
live session, so they carry the most cross-cutting design decisions.
Description
claude-web-consoleis a Claude Code plugin that mirrors a live session into alocal web UI with rich rendering, and (as it grows) lets the user browse past
sessions and drive new ones from the browser. It is grouped as an epic because
delivery spans many independent but coordinated features — rendering, session
management, viewer UX, transport, and bidirectional control — that share one
architecture and one set of invariants.
Current baseline (already built): hooks (
UserPromptSubmit/MessageDisplay/Stop) POST to a local stdlib-Python server, which broadcasts over SSE to abrowser viewer that renders Markdown (markdown-it), math (KaTeX), and PlantUML
(local PicoWeb). Claude-only — depends on the
MessageDisplayhook, which has noCodex equivalent.
Member Workstreams
Starting clusters (member issues to be scoped under each; the list will grow):
fencedispatch; render additionalblock types beyond Markdown / math / PlantUML.
exists, including sessions from other projects, and render that stored
transcript in the viewer (not only the live stream). Open a brand-new session
from the web UI.
user can follow along comfortably; related reading-comfort behavior.
file (draft / scratchpad artifact, e.g. under
tmp/), render its contentinline in the viewer so the user reads it in the web UI instead of having to
open the file manually. Removes the "it's in a file you now have to go open"
friction.
retention limits.
that "open a new session from the web UI" depends on; previously deferred, now
in scope.
server/static/vendor/, no CDN dependency (done).Coordination Notes
Shared invariants that constrain every member issue:
to stdout — they must not affect the conversation.
vendored under
server/static/vendor/(no CDN)..mjs/.woff2must staymapped in
server.py'sCONTENT_TYPES, or the viewer silently fails to load.~/.claude/projects/; the session-management andbidirectional-input workstreams are the ones that reach outside the current
live session, so they carry the most cross-cutting design decisions.