Skip to content

frontend - #8

Merged
kavinsood merged 11 commits into
mainfrom
frontend
Jul 13, 2026
Merged

kavinsood merged 11 commits into
mainfrom
frontend

Conversation

@kavinsood

Copy link
Copy Markdown
Member

No description provided.

AaravSubberwal and others added 11 commits July 8, 2026 12:32
Stabilize audio revision keys and skip redundant peak refetches so the editor stays in sync during playback and region edits.

Co-authored-by: Cursor <cursoragent@cursor.com>
Correlation + speech-energy based resolver (pure stdlib, no numpy) that
decides mono downmix vs single-channel selection for dual-channel source
recordings, with reason codes for the decision and an escalation path for
ambiguous cases. Wired into create_analysis_audio_variants so the resolved
channel mode + reason codes are recorded in the variant recipe instead of
always hardcoding mono_average.
Add plan_concat_layout / offset_vad_for_concat / remap_concat_regions_to_sources
plus _run_multi_file_diarization to workers/dataset: concatenate multiple
source recordings, run NeMo diarization once over the concatenated audio,
then stitch and remap speaker regions back to per-source offsets. Dispatch
multi-file runs to this path while leaving the single-file path untouched.

Relax the backend's one-WAV diarization guard in dataset_runs.py so
multi-speaker, multi-file projects can start a run instead of being
rejected outright. Update the two affected tests: the route test now
exercises a still-valid ValueError for 400-surfacing coverage, and the
dataset_runs test asserts multi-file single_speaker=False now succeeds.
Retire the old Vite/React frontend (App.tsx, pages/, workspace/, pipeline/,
reference/, qc/ and their tests) and scaffold a flat, single-app Next.js 16
project in its place: no monorepo, no [locale], no auth/Supabase/tRPC/Drizzle
— just the app shell and a vendored copy of @midday/ui (src/components/ui/),
aliased via tsconfig paths as @midday/ui/*.

This commit is the app skeleton only: root layout/providers/page, Tailwind +
PostCSS + Next config, and the vendored UI kit. The setup wizard and Lab
workstation routes land in the following commits.
Add the (login-chain) route group and its steps: multi-file .wav ingest
(login), model auto-resolve with skip-ahead on hardware block (login2),
voice/speaker selection shown only when there is more than one speaker
(login3), processing/transcription progress with live language-override
confirmation (login4-5), and the final continue into the Lab (login6).

wizard-api.ts covers the full lifecycle: project create, streamed
multi-file upload, run preflight/create/start/poll, speaker listing and
selection, and resolveWhisperModel's large-v3 -> base -> error fallback.
No tuning knobs anywhere in this chain — channel/model/language are
resolver decisions, and per-project overrides live downstream in the Lab.
Add the (workstation)/lab route: real backend-wired reads (fetchClipLabView)
and writes (accept/reject/quarantine, transcript overrides, undo/redo audio
edits) with optimistic-concurrency tokens and a typed error taxonomy
(SpeechcraftApiError) for 404/409/422/400/500/503. Clip queue with search,
status/tag filters, and source-order/QC sort; inspector rail, transcript
panel, keyboard shortcuts bar, and a top-bar with the project picker,
downstream re-run dialog (re-slice or re-transcribe with overrides), and
diagnostics drawer (run log tail).

speechcraft-api.ts / speechcraft-write-api.ts are the full client for this
surface, including Dataset Health's committed QC thresholds: machineBucket
is derived from GET /qc's finalized_thresholds (falling back to backend
defaults) rather than a hardcoded gate, with a bucket filter (auto-kept /
needs-review / auto-rejected) in the clip queue's filter popover. See the
Dataset Health commit that follows for the threshold UI itself.
Format choice (LJSpeech / JSONL manifest / WAV+txt pairs), loudness
normalization and include-rejected-clips toggles, styled to match midday's
dialog conventions (constrained width, DialogHeader spacing, justified
toggle rows, Cancel/Export footer with a spinner state). Export itself is
still a local progress simulation — wiring the real backend export
preview/run endpoints is a follow-up.
Two half-width, midday-styled histogram charts (Transcript match, Speaker
check) driven by the real per-clip transcript_match/speaker_check scores
from GET /api/dataset-runs/{id}/qc. Drag a handle directly in either graph
to move that gate's minimum threshold; bars recolor kept/rejected live using
midday's own --chart-bar-fill / --chart-bar-fill-secondary tokens, and the
drag math + the handle's on-screen position share one PLOT_MARGIN constant
with the chart's own margin so they can't drift apart.

Below the charts: two boundary tables ported from the legacy qc/qcLogic.ts
AND-gate math (qc-logic.ts, unit tested) — Riskiest kept (accepted clips
closest to failing) and Best rejected (rejected clips closest to passing),
each with its own sort. Exploration is free and client-side; an explicit
'Commit thresholds' action (confirmed, since it invalidates any existing
export) calls POST /qc/finalize so the committed verdict is what Clip Lab
and Export actually consume — see the Lab workstation commit for the read
side of that wiring.
demoEnabled()/withDemo() so every wizard step and the Lab can run against
mock data with no backend, for UI review without a live FastAPI/ML stack.
The demo threading itself (mock clips, amber DEMO indicators, skipped real
API calls) already lives in the wizard and Lab commits, since those files
were committed at their current, demo-aware state — this commit adds the
one shared module all of that imports from.
- .gitignore: ignore frontend/.next, next-env.d.ts, out/, .turbo/, and
  *.tsbuildinfo; add common editor/OS noise (.idea, .vscode, *.swp, etc).
- README/INSTALL/Makefile: point setup/dev/build/check commands at the new
  bun + Next.js frontend on :3002 (make dev-frontend, bun run dev/build),
  drop the retired frontend-legacy reference.
- Remove repomix-qc.config.json (hardcoded paths into the deleted Vite
  app: vite.config.ts, tsconfig.app.json, etc — no longer valid) and
  synopsis.md (unreferenced standalone research doc).
Copilot AI review requested due to automatic review settings July 13, 2026 19:46
@kavinsood
kavinsood merged commit b162228 into main Jul 13, 2026
1 check passed
@kavinsood
kavinsood deleted the frontend branch July 13, 2026 19:46

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

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.

3 participants