Whisper-Pipeline · WebGUI — Design-Brief¶
Status: Brief für UI-Mockup-Erstellung. Tech-Architektur ist separat festgelegt (FastAPI + Jinja2 + HTMX, server-rendered HTML, kein SPA).
Ziel des Briefs: HTML-Mockups + CSS, die später als Templates in eine FastAPI/Jinja2-Anwendung übernommen werden. Lieferung als statische .html-Dateien (eine pro Screen) plus eine zentrale style.css. Keine React/Vue/Svelte-Komponenten, kein Build-Step.
1 · Projekt-Kontext¶
Whisper-Pipeline ist ein lokales Tool, das einen Podcast-Audio-File (.m4a / .mp3 / .wav) in vier Phasen zu einem fertigen YouTube-Video verarbeitet:
- Transkription — WhisperX (lokal) erzeugt Word-Level-Timecodes, Speaker-Labels, .srt, .txt
- Metadaten — lokales LLM (MLX) generiert YouTube-Titel, Beschreibung, Tags, Kapitel
- Render — Remotion (Node.js) erzeugt eine MP4 mit Visualizer (Dialogue oder Monologue)
- Upload — YouTube Data API v3, Video landet als Private im Kanal
Alles läuft lokal. Die WebGUI ist das primäre Interface, das die heutige Textual-TUI ablöst.
2 · Nutzer:in und Nutzungs-Kontext¶
- Single-User, eine Person produziert ihre eigenen Podcasts
- Localhost im Browser am Mac (kein Remote, keine Auth)
- Sessions dauern Minuten bis ~30 Min (Transkription + Render brauchen ihre Zeit)
- Persona: technisch versiert (kennt CLI), legt Wert auf Übersicht und Vertrauen ("habe ich noch Kontrolle über den Upload?"), nicht auf Klick-Effizienz
3 · Tech-Constraints fürs Mockup¶
- Server-rendered HTML. Jinja2-Templates später; jetzt einfach
.html-Dateien. - HTMX-tauglich. Interaktive Updates werden via
hx-get,hx-post,hx-swap-Attribute auf bestehende Elemente nachgerüstet. Das Mockup darf zeigen, wie Bereiche ausgetauscht werden (z.B. „Status-Banner ändert sich"), muss aber kein JS-Logik enthalten. - SSE für Live-Log. Stdout-Zeilen einer laufenden Pipeline streamen ins Log-Panel. Im Mockup: einfach ein Bereich mit Codeblock-Look, der so aussieht, als würden Zeilen nachfließen.
- Vendored Assets. Keine CDN-Links, kein Tailwind-CDN. Falls Tailwind: Build-Step okay, aber Vorzug für vanilla CSS mit Custom Properties (
--color-…). - Kein Komponenten-System. Wiederholte Bauteile sind Klassen-basiert (
.run-card,.phase-indicator, …), nicht Web-Components.
4 · Screens¶
4.1 — index.html (Start / Konfiguration)¶
Das ist der Landing-Screen. User landet hier, gibt Audio-Pfad ein, wählt Optionen, startet die Pipeline.
Inhaltsbereiche:
- Header — Titel "Whisper-Pipeline", evtl. Subtitle "Transkription · Meta · Render · Upload"
- Audio-Auswahl — Pfad-Input (Drag-and-Drop-Zone wäre nice-to-have), Anzeige des erkannten Stems
- Resume-Banner (bedingt — nur wenn
output/<stem>/run-state.jsonexistiert) — zeigt den Status eines früheren Runs als Glyph-Reihe (✓ Transkription · ⟳ Metadaten · ✗ Render · · Upload), mit Hint "Skip-Boxen sind voreingestellt" - Konfiguration — Formular:
- Visualizer (Select: Dialogue / Monologue)
- Sprache (Auto / de / en)
- Modell (large-v3-turbo, large-v3, large-v2, medium, small, base, tiny)
- Sprecher-Erkennung (Auto / 2 / 3 / 4 / 5 / Aus)
- Episode (Text)
- Kanal/Serienname (Text)
- Skip-Phasen (4 Checkboxen)
- Run-Trigger — primärer Button "▶ Pipeline starten" (Ctrl+R-Hint)
- Sekundär-Link — "Vergangene Runs ansehen" →
/runs
4.2 — run_detail.html (laufender oder fertiger Run)¶
Wo der User die meiste Zeit verbringt. Während Pipeline läuft: Live-Updates. Nach Fertigstellung: Übersicht + Upload-Button.
Inhaltsbereiche:
- Run-Header — Stem, Audio-Pfad, Start-Zeitpunkt, Gesamtdauer (live tickend)
- Phase-Indikator-Strip — 4 Phasen horizontal: Transkription · Metadaten · Render · Upload. Jede mit Status (pending · running · done · aborted · skipped) und je nach Status anderer Optik (z.B. running = animierte Border / Puls; done = grün; aborted = rot)
- Progress-Bar — eine Gesamtleiste, ergänzt durch die Phase-Indikatoren oben
- Live-Log-Panel — Monospaced Codeblock, scrollt mit, neue Zeilen unten dran. Soll wie ein Terminal aussehen, aber lesbar (genug Padding, gut gewähltes Mono-Font)
- Transkript-Preview (erscheint nach Phase 1) — ein paar Zeilen mit Speaker-Doppelpunkt-Format ("Alice: …", "Bob: …") als Lesbarkeits-Check
- MP4-Preview (erscheint nach Phase 3) —
<video controls>mit dem fertig gerenderten Clip - YouTube-Metadaten-Card (erscheint nach Phase 2) — Card mit Titel, Beschreibung-Preview (ggf. truncated), Tags als Chips, Kapitel-Liste (Timestamp + Label). Read-only im V1.
- Upload-Trigger (erscheint nach Phase 3 wenn nicht skipped) — großer Button "↑ Auf YouTube hochladen" mit Privacy-Wahl daneben (Private / Unlisted). User muss aktiv klicken.
- Upload-Done-Card (nach Phase 4) — YouTube-URL, "Im Browser öffnen"-Link
4.3 — runs.html (Run-Historie / Output-Browser)¶
Liste aller verarbeiteten Audios. Klick auf Run-Card → run_detail.html.
Inhaltsbereiche:
- Header — "Vergangene Runs", "Neuer Run starten"-Link zurück zu
/ - Filter-/Sortier-Bar (nice-to-have) — z.B. nach Datum, Status (alle / fertig / abgebrochen / unfertig)
- Run-Card-Liste — pro Run eine Card:
- Stem als Titel
- Datum/Zeit
- Phase-Indikator-Strip (kompakte Variante)
- MP4-Thumbnail falls vorhanden (am besten ein Standbild aus dem MP4; im Mockup Placeholder)
- YouTube-URL falls hochgeladen
- Hover-State erkennbar
5 · Komponenten (Mockup-Kernstücke)¶
5.1 — Phase-Indikator-Strip¶
Vier Phasen nebeneinander, je ein Glyph + Label + Status-Farbe. Verwendungen:
- Voll-Variante in run_detail.html: groß, mit Animation für running, Zeit-Info pro Phase
- Kompakt-Variante in runs.html (Run-Card): klein, nur Glyph + Farbe
Status-Mapping:
- pending — ○ (grau, leicht ausgegraut)
- running — ⟳ (Akzentfarbe, pulsierend/rotierend)
- done — ✓ (Erfolgsfarbe)
- aborted — ✗ (Fehlerfarbe)
- skipped — · (gedämpft, kleiner)
5.2 — Live-Log-Panel¶
Monospaced, dunkler Hintergrund, leicht erhöhter Kontrast. Format jeder Zeile: optionales Timestamp-Prefix, dann Text. Soll bei langer Output-Länge sauber scrollen — auto-scroll-to-bottom, mit "User-scrolled-up → pause auto-scroll"-Verhalten (kann später im JS gelöst werden; im Mockup einfach Mono-Block).
Hervorhebung optional: SUCCESS-Marker als grüner Strich am Zeilenanfang, WARN/ERROR als gelbe/rote.
5.3 — Run-Card¶
In runs.html. Eine ganze Karte, klickbar als Link. Inhalte siehe 4.3.
5.4 — Resume-Banner¶
In index.html über dem Formular. Drei Varianten:
- Aborted/Unterbrochen — gelb-warm, "Letzter Run: [Phase] abgebrochen. Skip-Boxen für fertige Phasen vorab angehakt."
- Komplett — grün-positiv, "Letzter Run komplett. Für Neu-Render: Skip-Render entfernen."
- In-Progress (extern beendet) — neutral, "Vorhandener Run gefunden."
5.5 — Form-Felder¶
Standard-Inputs (Text, Select, Checkbox). Aber bitte konsistent gestylet, nicht Browser-Default. Selects sollten zu Selects auf dem System passen (keine schweren Custom-Dropdowns).
6 · Stil-Richtung (offen — bitte Vorschläge)¶
Vorgaben:
- Dark Mode bevorzugt (User arbeitet abends an Podcasts), aber Light Mode sollte mit-funktionieren (CSS Custom Properties + prefers-color-scheme)
- Kontrast hoch genug für längere Lesezeit
- Akzentfarbe sollte zu „Audio/Signal" passen — denkbar: warmes Violett (#a878ff war in der TUI), tief-Cyan, warmes Orange. Genau die richtige Wahl ist Designentscheidung
- Typografie — gute UI-Sans (Inter, IBM Plex Sans, ähnlich) für Text, gute Mono (IBM Plex Mono, JetBrains Mono, oder System-Mono) für Log und Code
Inspirationen: - Linear, Vercel-Dashboard, Cursor's UI — clean, dunkel, hochwertig - TUI-Charakter erhalten: an Stellen wie Live-Log und Phase-Indikatoren soll der „Terminal-Spirit" durchscheinen - KEINE Bling-Animationen, KEINE überladenen Gradient-Hintergründe
7 · Interaktive Zustände (im Mockup zumindest skizziert)¶
- Audio-Input leer vs. valider Pfad (validation-feedback)
- Pipeline läuft (Run-Button disabled, Phase-Indikator running)
- Pipeline fertig (Upload-Button erscheint)
- Pipeline abgebrochen (Fehler-Bereich mit letzten 10 Log-Zeilen)
- Resume-Banner in den drei Varianten oben
- Empty State in
runs.htmlfalls noch keine Runs existieren
8 · Output-Erwartung¶
Liefere bitte:
- Drei
.html-Dateien —index.html,run_detail.html,runs.html— als statische Mockups (mit<head>, eingebundenem CSS, gerne mit Dummy-Daten) - Eine
style.css(oder ggf. zwei:tokens.css+style.css), die alle drei Mockups bedient - Für
run_detail.html: bitte alle interaktiven Zustände sichtbar machen — entweder durch Inline-Variants im selben File oder durch drei separate Versionen (z.B.run_detail--running.html,run_detail--done.html,run_detail--aborted.html) - Eine kurze README, die die Design-Tokens (Farben, Typo-Größen) beschreibt, damit die Werte in der späteren Theme-Anpassung wiedergefunden werden können
Aspekt-Hinweis: Mockups sollen für Desktop-Browser-Fenster (≥ 1200px breit) ausgelegt sein. Mobile/Tablet ist später; im V1 nicht im Scope.
9 · Was NICHT im Scope ist (Phase 2)¶
Diese Features kommen erst in einer späteren Spec — nicht jetzt mit-designen:
- Transkript-Editor (in-place Korrektur, Re-Render-Trigger)
- Job-Queue / Multi-Audio-Verarbeitung
- Auth, Multi-User, Remote-Zugriff
- Tag-/Kategorien-Verwaltung
Wenn etwas im Brief unklar ist, frag bitte zurück — lieber eine Nachfrage als eine Vermutung.