| name | court-record-transcriber |
| description | Development skill for CaseMark's Court Recording Transcriber - an AI-powered
application for transcribing court recordings with speaker identification,
synchronized playback, search, and legal document exports. Built with Next.js 16,
PostgreSQL, Drizzle ORM, wavesurfer.js, and Case.dev APIs. Use this skill when:
(1) Working on or extending the court-record-transcriber codebase, (2) Integrating
with Case.dev transcription APIs, (3) Working with audio playback/waveforms,
(4) Building transcript export features, or (5) Adding speaker identification logic.
|
Court Recording Transcriber Development Guide
An AI-powered application for transcribing court recordings with speaker identification, synchronized playback, search functionality, and professional legal document exports.
Live site: https://court-record-transcriber.casedev.app
Architecture
src/
โโโ app/
โ โโโ api/recordings/ # API routes for recordings
โ โ โโโ route.ts # List, create recordings
โ โ โโโ [id]/
โ โ โโโ route.ts # Get, update, delete
โ โ โโโ transcribe/ # Start transcription
โ โ โโโ export/ # Export endpoints
โ โโโ upload/ # Upload page
โ โโโ recording/[id]/ # Transcript viewer page
โโโ components/
โ โโโ ui/ # shadcn/ui components
โ โโโ AudioPlayer.tsx # Waveform + playback
โ โโโ TranscriptView.tsx # Transcript display
โ โโโ SpeakerEditor.tsx # Label speakers
โ โโโ ExportDialog.tsx # Export options
โโโ lib/
โโโ db/
โ โโโ index.ts # Database connection
โ โโโ schema.ts # Drizzle schema
โโโ casedev/ # Case.dev API client
โโโ legal-vocabulary.ts # Word boosting config
Core Workflow
Upload Audio โ Transcribe โ Identify Speakers โ Review/Edit โ Export
โ โ โ โ โ
MP3/WAV Case.dev API Auto-detect Sync playback PDF/Word/
M4A/etc with legal Judge, Atty, click-to-seek Plain text
vocabulary Witness, etc
Tech Stack
| Layer | Technology |
|---|
| Frontend | Next.js 16, React 19, Tailwind CSS |
| Backend | Next.js API Routes |
| Database | PostgreSQL + Drizzle ORM |
| Audio | wavesurfer.js |
| Transcription | Case.dev Speech-to-Text API |
| Export | React PDF, docx library |
Key Features
| Feature | Description |
|---|
| Audio Upload | Drag-drop MP3, WAV, M4A, FLAC, OGG |
| AI Transcription | Case.dev API with legal vocabulary boosting |
| Speaker ID | Auto-detect speakers, customizable labels |
| Synced Playback | Click transcript line to jump to timestamp |
| Search | Find words/phrases with highlighting |
| Export | PDF, Word (.docx), plain text with legal formatting |
Database Operations
PostgreSQL with Drizzle ORM. See references/database-schema.md.
Commands
npm run db:push
npm run db:generate
npm run db:studio
Core Tables
- recordings: id, filename, duration, status, audioUrl
- transcripts: id, recordingId, content (JSON), speakerMap
- utterances: id, transcriptId, speaker, text, startTime, endTime
Case.dev Integration
See references/casedev-transcription-api.md for API patterns.
Transcription Flow
const { audioId } = await uploadAudio(file);
const { jobId } = await startTranscription(audioId, {
vocabulary: legalVocabulary,
speakerDiarization: true,
});
const transcript = await pollTranscriptionStatus(jobId);
await saveTranscript(recordingId, transcript);
Audio Playback
See references/audio-playback.md for wavesurfer.js patterns.
Key Features
- Waveform visualization
- Click-to-seek from transcript
- Playback speed control
- Keyboard shortcuts (space, arrows)
Development
Setup
npm install
cp .env.example .env.local
npm run db:push
npm run dev
Environment
CASEDEV_API_KEY=sk_case_... # Case.dev API key
DATABASE_URL=postgresql://... # PostgreSQL connection
NEXT_PUBLIC_APP_URL=http://localhost:3000
Common Tasks
Adding a New Export Format
- Create export function in
lib/export/
- Add endpoint in
app/api/recordings/[id]/export/
- Add option to
ExportDialog.tsx
Customizing Speaker Labels
const speakerLabels = ['Judge', 'Plaintiff Attorney', 'Defense Attorney',
'Witness', 'Clerk', 'Unknown'];
Adding Legal Vocabulary
export const legalVocabulary = [
'objection', 'sustained', 'overruled', 'plaintiff', 'defendant',
'voir dire', 'habeas corpus', 'pro bono', 'amicus curiae',
];
Export Formats
| Format | Use Case |
|---|
| PDF | Official court filing, archive |
| Word (.docx) | Editing, annotations |
| Plain Text | Processing, search indexing |
| SRT | Subtitles for video recordings |
Troubleshooting
| Issue | Solution |
|---|
| Transcription stuck | Check Case.dev API status, verify audio format |
| Audio won't play | Verify audio URL accessible, check CORS |
| Speaker labels wrong | Use SpeakerEditor to reassign |
| Export fails | Check transcript exists, verify format support |
| Waveform not showing | Ensure wavesurfer.js loaded, check audio src |