# Hermes WebUI -- Forward Sprint Plan > Current state: v0.1.0 | 190 tests | Daily driver ready > This document plans the path from here to two targets: > > Target A: 1:1 feature parity with the Hermes CLI (everything you can do from the > terminal, you can do from the browser) > > Target B: 1:1 parity with Claude's reproducible features (the full Claude > browser UI experience, minus things only Anthropic can build) > > Sprints are ordered by impact. Each builds on the one before. > Past sprint history lives in CHANGELOG.md. --- ## Where we are now (v0.1.0) **CLI parity: ~80% complete.** Core agent loop, all tools visible, workspace file ops, cron/skills/memory CRUD, session management, streaming, cancel -- all solid. Gaps are configuration, subagent visibility, and runtime controls. **Claude parity: ~55% complete.** Chat, streaming, file browser, session management, tool cards, syntax highlighting, model switching -- all present. Gaps are project organization, artifacts, voice, sharing, mobile. --- ## Sprint 11 -- Streaming Smoothness + Tool Card Incremental Render **Theme:** Make heavy agentic work feel fast and fluid. **Why now:** The biggest remaining daily friction point. During a 20-step task, every tool event triggers a full renderMessages() re-render of the entire message list. On fast tasks you can see flicker. This is the last thing that makes the UI feel noticeably worse than watching the CLI. ### Track A: Bugs - Tool card DOM thrash: renderMessages() rebuilds all cards on each tool event. Switch to incremental append (append new card to existing group, no full rebuild). - Scroll position lost on re-render during streaming (messages jump). ### Track B: Features - **Incremental tool card streaming:** Instead of renderMessages() on each tool event, maintain a live card group element per turn and append/update cards in place. The assistant text row below the cards also updates incrementally (already does via assistantBody.innerHTML). - **Tool card collapse-all / expand-all:** A small toggle in the topbar or per-message to collapse all tool cards in a response. Useful when a response has 10+ tool calls. - **Smooth scroll:** Pin scroll to bottom during streaming unless user has manually scrolled up (read-back mode). Resume pinning when user scrolls back to bottom. ### Track C: Architecture - `api/routes.py`: extract the 49 if/elif route handlers from server.py's Handler class into a dedicated routes module. server.py becomes a true ~50-line shell: imports, Handler stub that delegates to routes, main(). Completes the server split started in Sprint 10. **Tests:** ~12 new. Total: ~196. **Hermes CLI parity impact:** Low (smoothness, not features) **Claude parity impact:** Low --- ## Sprint 12 -- Settings Panel + Toolset Control **Theme:** Configuration you can actually reach from the UI. **Why now:** Last remaining thing that forces a trip to the CLI or config files for basic setup. The model dropdown works but defaults aren't persisted server-side. Toolsets can't be toggled per session. ### Track A: Bugs - Model dropdown doesn't sync when a session was created with a model not in the current dropdown list (edge case from model additions). - Workspace validation on add doesn't check symlinks (shows as invalid when it's actually a valid symlink to a directory). ### Track B: Features - **Settings panel:** A gear icon in the topbar opens a slide-in settings panel. Sections: Default Model (writes HERMES_WEBUI_DEFAULT_MODEL to a settings file), Default Workspace (writes HERMES_WEBUI_DEFAULT_WORKSPACE), UI preferences (font size, message density). Persisted server-side in `~/.hermes/webui-mvp/settings.json`. - **Toolset control per session:** A "Tools" chip in the session topbar opens a popover listing all available toolsets (terminal, web, file, memory, etc.) with toggles. Selected toolsets stored on the session and passed to AIAgent. Matches the `--tools` flag behavior in the CLI. - **Rename file / Create folder:** Two small file tree ops that close the last workspace management gap. Inline rename on double-click (same pattern as session rename). Create folder via + menu next to the existing + file button. ### Track C: Architecture - Settings schema: `settings.json` with typed fields, validated on load, with sane defaults. Served via `GET /api/settings`, written via `POST /api/settings`. **Tests:** ~15 new. Total: ~211. **Hermes CLI parity impact:** High (toolset control is the last major CLI feature) **Claude parity impact:** Medium (settings exist in Claude as a panel) --- ## Sprint 13 -- Notification System + Background Visibility **Theme:** Know what Hermes is doing even when you're not watching. **Why now:** Cron jobs run silently. Background errors surface nowhere. You have no way to know a long-running task finished (or failed) while you were on another tab. This is a meaningful daily driver gap for anyone using cron heavily. ### Track A: Bugs - Cron "Run now" button shows no feedback if the job errors immediately. - Sessions with very long message histories (100+ messages) cause noticeable render lag on load (no virtual scroll yet). ### Track B: Features - **Cron completion alerts:** When a cron job finishes (success or error), push a toast notification to the UI. Use a polling endpoint (`GET /api/crons/status`) that the UI checks every 30s while the window is focused. Badge count on the Tasks tab icon when there are unread completions. - **Background agent error alerts:** When a streaming session errors out (network drop, model error, tool failure), and the user is not currently viewing that session, show a persistent banner: "Session X encountered an error." Clicking it navigates to that session. - **Virtual scroll for session list:** Session list currently renders all sessions in the DOM. Above ~100 sessions, the sidebar gets slow. Implement simple virtual scroll: render only ~20 visible rows, reuse DOM nodes on scroll. ### Track C: Architecture - SSE reconnect: if the SSE connection drops mid-stream, auto-reconnect once (with the same stream_id). Currently a network blip ends the response silently. **Tests:** ~14 new. Total: ~225. **Hermes CLI parity impact:** High (cron visibility, error surfacing) **Claude parity impact:** Medium (Claude has notification panel) --- ## Sprint 14 -- Project Organization + Session Management **Theme:** Organize work the way you think, not just chronologically. **Why now:** After 100+ sessions the sidebar is a flat chronological list. Finding sessions from 2 weeks ago, or keeping a "MyProject" workspace separate from personal work, requires the search box. This is the biggest remaining daily organizational gap vs. Claude's project folders. ### Track A: Bugs - Session search content scan (depth=5) is slow on large session histories. Add server-side caching of search index. - Date group headers ("Today / Yesterday / Earlier") use updated_at which can be misleading for sessions touched by automated title-setting. Use created_at for initial grouping, updated_at for sort order. ### Track B: Features - **Session folders / projects:** A "Projects" section above the session list. Each project is a named group. Sessions can be dragged into projects or assigned via right-click. Stored in `projects.json`. Projects collapse/expand. This is the single biggest Claude parity feature missing. - **Pin sessions:** Star icon on any session to pin it to the top of the list above date groups. Persisted on the session JSON as `pinned: true`. - **Session tags:** Inline `#tag` syntax in session titles gets extracted and shown as colored chips. Clicking a tag filters the list. No backend change needed -- parsed client-side from title text. - **Archive sessions:** A "More" overflow menu on each session (right-click or long-press) with: Archive (hides from main list, accessible via filter), Duplicate (new session with same workspace/model), Export JSON. - **Import session from JSON:** Drag a `.json` export file into the sidebar to restore it as a new session. Mirrors the existing JSON export. ### Track C: Architecture - Session index v2: extend `_index.json` to include `tags`, `pinned`, and `project_id` fields. Rebuild on session save. Enables fast client-side filtering without disk reads. **Tests:** ~16 new. Total: ~241. **Hermes CLI parity impact:** Low (CLI has no session organization) **Claude parity impact:** Very High (projects are a core Claude concept) --- ## Sprint 15 -- Artifacts + Code Execution **Theme:** See outputs, not just text. **Why now:** Claude's most distinctive feature is the artifact panel -- code runs inline, HTML renders in a sandboxed iframe, SVGs show as images. This is the largest single capability gap between what we have and what Claude feels like. It also directly enables the Hermes "code execution cell" feature (Jupyter-style in-browser execution). ### Track A: Bugs - Prism.js autoloader makes one CDN request per language encountered. On a code-heavy session this causes noticeable latency. Bundle the top 10 languages (Python, JS, bash, JSON, SQL, YAML, TypeScript, CSS, HTML, Rust) locally. - Code blocks in long responses sometimes re-highlight on every renderMessages() call. Debounce highlightCode() with requestAnimationFrame. ### Track B: Features - **Artifact panel:** When Hermes produces a code block tagged as `html`, `svg`, or `react`, a "Preview" button appears on that code block. Clicking it opens a sandboxed `