Skip to content

Svelte Web UI rewrite + Command Center redesign - #33

Open
sim186 wants to merge 6 commits into
mainfrom
feat/svelte-web-ui
Open

sim186 wants to merge 6 commits into
mainfrom
feat/svelte-web-ui

Conversation

@sim186

@sim186 sim186 commented Oct 21, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replaces the hand-written frontend/index.html + ES modules with a Svelte 5 + TypeScript + Vite app in web/, built into frontend/ (generated, gitignored). See docs/adr/0001-big-bang-web-ui-rewrite.md.
  • Bundler-managed deps (WaveSurfer, marked, Inter, IBM Plex Mono) replace CDN/vendored copies (docs/adr/0003).
  • Command Center redesign: NavRail + TopBar replace TabBar, AI panel and job queue docked into the layout (fixes the overlay overlap), settings consolidated into a SettingsModal, live-streaming transcript while a job runs, dark theme.
  • release.yml and the PyPI wheel job now run npm ci && npm run build --prefix web before packaging; package.py refuses to run without a built frontend/.

Breaking for contributors: Node.js 22+ is now required to build the Web UI (docs/adr/0002). Backend and TUI stay pure Python.

Test plan

  • npm run build --prefix web
  • npm test --prefix web (12/12) and npm run check (0 errors)
  • pytest -q: 551 passed, 1 env-dependent failure (test_runtime_pack.py::test_a_missing_stack_with_no_manifest_says_so fails when pyannote is installed locally; unrelated to this branch). Run stopped at that failure with -x, so CI covers the remainder.
  • Local python package.py (macOS): build succeeds; packaged app with AMICOSCRIPT_UI=none serves the new bundle and /api/models, /api/settings respond.
  • Windows/Linux packaged builds (release workflow dry run)
  • Click-through of the native pywebview window

Known, not from this branch

/api/version returns "" in the PyInstaller bundle: get_version() looks for VERSION at parents[3], but the bundle places it in _internal/. Same on main.

🤖 Generated with Claude Code

Ticket 01 of the Svelte migration (.scratch/svelte-web-ui-migration/). Adds
web/ (Svelte 5 + TypeScript + Vite + Tailwind v4), building into frontend/,
which is now generated output instead of committed source. WaveSurfer,
marked, and Inter become bundled npm deps, replacing frontend/vendor/'s
manual pinning. RevalidatingStaticFiles is replaced with a narrower
no-cache-on-index.html-only static mount, since Vite's build empties
frontend/ on every run and a heuristically-cached index.html could otherwise
outlive the hashed assets it references. CI (tests.yml, release.yml) and
both Dockerfiles now build the Web UI via Node before packaging; package.py
refuses to run without a prior asset build. tests/test_frontend_assets.py
and two watcher-latency assertions are adapted off the deleted
frontend/js/* source, with their guarantees either ported forward
(web/src/lib/time.test.ts) or flagged for re-coverage in the tickets that
rebuild those features.

Landing on a dedicated branch rather than main: the big-bang rewrite
(ADR-0001) means frontend/ has no full UI again until tickets 02 and 03
also land.
Ticket 02 of the Svelte migration (.scratch/svelte-web-ui-migration/). Adds
the login gate, tab bar, hamburger drawer, and full Transcribe tab (drop
zone, URL import, batch queue) as Svelte components, plus every
Transcribe-sidebar setting: model/language, diarization, Cloud Power, LLM
provider setup and model browser, benchmark, security (password) and backup
panels, and meeting auto-capture with its onboarding/update banners. Also
ports the floating recording-chip and job-queue widgets, the release
update banner, the command palette (fuzzy-ranked commands + live recording
search) with its keyboard shortcuts, and client console logging.

State lives in per-domain `*.svelte.ts` rune modules under web/src/lib/
(auth, session, jobs, watcher, llm, ...) rather than one shared object, so
each area's reactive state and its module-level helpers stay next to each
other. The Transcript and Library tabs are left as placeholders — ticket 03
builds those out — but the job/watcher state they'll need (recordingId,
transcriptEnabled) is already threaded through.

Fixes a few bugs surfaced by /code-review along the way: batch-item upload
percentage missing its ×100, the changelog modal popping up after its own
"open GitHub in a new tab" fallback, a dropped save-settings-back-to-server
call on restore, and an SSE reconnect counter that was shared across
unrelated jobs instead of tracked per job.
Transcript tab: synced waveform playback, speaker legend and
reassignment, in-transcript search, bulk speaker-assign/translate,
live SSE segment streaming, AI hub (summary/actions/custom analyses),
export (JSON/SRT/VTT/TXT/MD/CSV), and folder/tag editing from the
sidebar.

Library tab: recording cards with folder/tag filter sidebar, FTS5
full-text search, bulk move/tag/export/delete, and folder/tag
create/rename/delete.
Ticket specs and scratch notes under .scratch/ are local working
notes, not project source — untrack and gitignore them.
Replace TabBar with NavRail + TopBar, dock the AI Assistant panel and
job queue into the layout (fixes the overlay overlap), consolidate the
sidebar settings accordions into a SettingsModal, stream transcript
segments live while a job runs, and apply a dark theme with IBM Plex
Mono for technical text.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant