You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Tracking issue for items deferred from the transcription v1 slice. Each checkbox can be promoted to a standalone issue when prioritized.
What v1 ships
Cloud-only speech-to-text via OpenAI-compatible HTTP API (Groq, OpenAI, custom endpoints). Trigger surfaces: perima transcribe <file> CLI subcommand + sidebar Transcribe button on the file-detail panel. Storage: per-segment with timestamps and FTS5 (unicode61 remove_diacritics 2 tokenizer for multilingual). Concurrency: single worker, bounded queue (depth 32). API keys via OS keychain (keyring 3.x). ffmpeg via Tauri sidecar (desktop, Linux only) or which::which("ffmpeg") PATH discovery (CLI).
Local transcription adapter (priority/high — the very-very-very next slice). whisper-rs 0.16+ → whisper.cpp (GGML format) behind a local-stt Cargo feature. Owns V013 schema (transcription_job table + pending_batch_id column on transcript_segment), chunk-based audio extraction (AudioPipeline::extract_pcm_16k_mono), GPU feature-flag matrix (metal / cuda / vulkan / coreml), first-run model-download modal with confirmation, model selection UX (large-v3-turbo Q5_0 default), Windows whisper.cpp toolchain documentation, CI cache for whisper-rs-sys build artifacts.
Audio file extractor — already filed as Audio file support: no AudioExtractor registered; audio files scan but yield no metadata #175. Precondition for audio-only files (mp3, m4a, wav, flac, ogg, opus) being transcribable through the desktop UI (the sidebar Transcribe button reads MediaMetadata.mime_type). The CLI already supports audio-file transcription today (it dispatches by file path + mime-guess).
Transcript viewer in file-detail sidebar (read-only). v1 stores transcripts and surfaces job-state UX (start / cancel / queue) but does NOT render the transcript text. Reading happens via CLI (perima transcribe ... --output text) or raw SQL in v1. The viewer slice adds a <TranscriptViewer /> component (segments listed with timestamps; click-to-copy timestamp; collapsed/expanded modes), reading via a useTranscriptsByFileUuid(fileUuid) query (latest by completed_at DESC).
Keyboard shortcut infrastructure. Horizontal UX. needs-brainstorm. Conventions to lock (single key vs chord; conflicts with Tauri global shortcuts; conflicts with browser/textarea defaults). Adds hotkey → Transcribe path.
Word-level timestamps. Feature flag word_timestamps (default off), sibling transcript_word table when enabled (~5–10× row count). OpenAI/Groq's verbose_json with timestamp_granularities = ["word"] returns word-level timing; whisper-rs supports word-level via set_token_timestamps(true).
CLI distribution (cargo-dist setup + bundled ffmpeg in release tarballs). Removes the "user must have ffmpeg on PATH" friction. priority/medium.
key_ref indirection for headless-Linux env:GROQ_API_KEY fallback. File when first user reports keyring unavailability (keyring 3.x falls back to keyutils, but some headless setups have neither). priority/low.
Re-transcription policy UI — explicit "re-transcribe with X" user action + multi-row diff/compare picker UX (sidebar shows "transcript 1 of 3 · switch") + delete-transcript Tauri command + delete-transcript CLI subcommand. Schema already supports multiple transcript rows per (file_uuid, backend); v1 surfaces only the latest. priority/low.
Unified search across search_index + transcript_search (or a separate "search transcripts" surface). needs-brainstorm. v1 ships transcripts queryable only via direct SQL or CLI output; the desktop SearchBar continues to hit search_index only.
Multi-worker transcription queue (parallel jobs with bounded concurrency cap). v1 = single worker; revisit when users demand throughput. priority/low.
OpenAI gpt-4o-transcribe-diarize model support. Requires diarized_json response_format (rejects verbose_json); separate response shape. Out of v1 scope; revisit when speaker diarization is in scope.
Streaming partial results (SSE-based progress for gpt-4o-transcribe). v1 uses heartbeat-driven progress only; SSE is a UX-polish item.
macOS + Windows ffmpeg-sidecar bundling. v1 ships Linux-only sidecar packaging. macOS + Windows users build from source until this slice lands.
unic-langid-based BCP-47 validation for --language flag. Replace v1's regex-and-allowlist if it gets brittle. priority/low.
Workspace wildcard_enum_match_arm clippy lint enablement. Currently in restriction group, not enabled. Slice-of-its-own to enable workspace-wide and audit existing wildcard arms.
When promoted to a standalone issue, an item should reference this umbrella.
Umbrella: ASR / transcription v2 follow-ups
Tracking issue for items deferred from the transcription v1 slice. Each checkbox can be promoted to a standalone issue when prioritized.
What v1 ships
Cloud-only speech-to-text via OpenAI-compatible HTTP API (Groq, OpenAI, custom endpoints). Trigger surfaces:
perima transcribe <file>CLI subcommand + sidebar Transcribe button on the file-detail panel. Storage: per-segment with timestamps and FTS5 (unicode61 remove_diacritics 2tokenizer for multilingual). Concurrency: single worker, bounded queue (depth 32). API keys via OS keychain (keyring 3.x). ffmpeg via Tauri sidecar (desktop, Linux only) orwhich::which("ffmpeg")PATH discovery (CLI).Spec:
docs/superpowers/specs/2026-05-02-transcription-v1-design.mdPlan:
docs/superpowers/plans/2026-05-02-transcription-v1.mdRoadmap
whisper-rs 0.16+→whisper.cpp(GGML format) behind alocal-sttCargo feature. Owns V013 schema (transcription_jobtable +pending_batch_idcolumn ontranscript_segment), chunk-based audio extraction (AudioPipeline::extract_pcm_16k_mono), GPU feature-flag matrix (metal/cuda/vulkan/coreml), first-run model-download modal with confirmation, model selection UX (large-v3-turboQ5_0 default), Windows whisper.cpp toolchain documentation, CI cache forwhisper-rs-sysbuild artifacts.mp3,m4a,wav,flac,ogg,opus) being transcribable through the desktop UI (the sidebar Transcribe button readsMediaMetadata.mime_type). The CLI already supports audio-file transcription today (it dispatches by file path + mime-guess).perima transcribe ... --output text) or raw SQL in v1. The viewer slice adds a<TranscriptViewer />component (segments listed with timestamps; click-to-copy timestamp; collapsed/expanded modes), reading via auseTranscriptsByFileUuid(fileUuid)query (latest bycompleted_atDESC).needs-brainstorm. Adds right-click → Transcribe path.needs-brainstorm. Conventions to lock (single key vs chord; conflicts with Tauri global shortcuts; conflicts with browser/textarea defaults). Adds hotkey → Transcribe path.word_timestamps(default off), siblingtranscript_wordtable when enabled (~5–10× row count). OpenAI/Groq'sverbose_jsonwithtimestamp_granularities = ["word"]returns word-level timing;whisper-rssupports word-level viaset_token_timestamps(true).cargo-distsetup + bundled ffmpeg in release tarballs). Removes the "user must have ffmpeg on PATH" friction. priority/medium.key_refindirection for headless-Linuxenv:GROQ_API_KEYfallback. File when first user reports keyring unavailability (keyring 3.xfalls back tokeyutils, but some headless setups have neither). priority/low.transcriptrows per(file_uuid, backend); v1 surfaces only the latest. priority/low.search_index+transcript_search(or a separate "search transcripts" surface).needs-brainstorm. v1 ships transcripts queryable only via direct SQL or CLI output; the desktop SearchBar continues to hitsearch_indexonly.gpt-4o-transcribe-diarizemodel support. Requiresdiarized_jsonresponse_format (rejectsverbose_json); separate response shape. Out of v1 scope; revisit when speaker diarization is in scope.gpt-4o-transcribe). v1 uses heartbeat-driven progress only; SSE is a UX-polish item.unic-langid-based BCP-47 validation for--languageflag. Replace v1's regex-and-allowlist if it gets brittle. priority/low.wildcard_enum_match_armclippy lint enablement. Currently in restriction group, not enabled. Slice-of-its-own to enable workspace-wide and audit existing wildcard arms.When promoted to a standalone issue, an item should reference this umbrella.