Components

Editor and transcript components

Everything inside an open recording: the tape-deck transport, the waveform and its selection, non-destructive edit tools, the transcription consent flow, transcript review and removal.

Rendered from the shipped source with synthetic demo data. Not captured from a running app. Native microphone capture has not passed host qualification; this page shows interface states only and does not imply working hardware capture.

Playback and transport

What the person sees the moment they open a recording: who and what it is, the tape-deck controls that play it, and the strip that says where the file lives. All of it plays the edited recipe, never the source file.

H
Editor heading and actions
Tells you which recording is open and gives the two things you do with a whole recording: put words on it or export it. Met on every open of a recording from the library.
apps/desktop/src/App.tsx · Editor
Ready

Open day planning call

Oct 12Stereo · 48.0 kHzDemoMeetings
Back link, title, the "..." details button, kind/notes button, date, channel and sample-rate line, tags. Transcribe and Export audio both enabled.
Transcribing

Open day planning call

Oct 12Stereo · 48.0 kHzDemoMeetings
A transcription job is running: the Transcribe button is disabled, shows a spinner and reads "Transcribing…". Export stays enabled.
Saving an edit

Open day planning call

Oct 12Stereo · 48.0 kHzDemoMeetings
While a trim, remove, split, undo or redo is being written both buttons are disabled.
T
Transport bar
The tape-deck row: rewind, play or pause, fast-forward, eject, time readout, speed, plus the save indicator and undo/redo. Used every time you listen or edit.
apps/desktop/src/App.tsx · Editor (.transport)
Ready, paused
00:00.0/ 00:24.0
Saved locally
Play icon, 00:00.0 / 00:24.0, speed 1×, "Saved locally". Undo and Redo are disabled because nothing was edited.
Playing
00:07.5/ 00:24.0
Saved locally
The play button swaps to Pause. Speed 1.5× changes listening only, never the saved audio.
Saving an edit
00:00.0/ 00:24.0
Saving edit
Spinner and "Saving edit". Undo and Redo are disabled. Play, rewind, fast-forward, eject and speed are NOT disabled; the code gates only Undo and Redo in this row (the edit tools are gated separately, see Edit toolbar).
Undo available
00:00.0/ 00:20.0
Saved locally
After one edit the Undo arrow is live and the total reads 00:20.0.
Redo available
00:00.0/ 00:24.0
Saved locally
After undoing the edit, the Redo arrow is live. Because an edit still wrote a new recipe revision, the library keeps its Edited badge (see Findings).
C
Playback cassette strip
A little cassette that turns while audio plays, a quiet nod to the tape deck. Seen above the transport whenever the Cassette animation preference is on (it is on by default).
apps/desktop/src/App.tsx · Editor; apps/desktop/src/cassette.tsx · CassetteTape
Ready to play
Ready to play
Playing
Playing
The reels rotate (class tape-running). The system reduced-motion setting takes priority in the stylesheet.
Animation off

Nothing is rendered. With Settings > Cassette transport > Animate cassette reels switched off the whole strip, including the words Ready to play, is removed from the page (preferences.animation && …).

Intentionally empty.
P
Saved-location strip and assurances
Shows where Cassette keeps the managed copy and repeats the promise that edits never touch the source audio. Read when you wonder whether trimming is destructive.
apps/desktop/src/App.tsx · Editor
Managed path and assurances
C:\Users\Demo\Music\Cassette\open-day-planning-call.wav
Your original is always preserved.Edits change the recipe, never the source audio.Playback speed affects listening only.
Long managed path
C:\Users\Demo\Music\Cassette\Imported\2026\October\open-day-planning-call-with-the-whole-committee-original-take-three-before-cleanup.wav
Your original is always preserved.Edits change the recipe, never the source audio.Playback speed affects listening only.
Long paths are not truncated by the code; layout handled by the stylesheet only.

Waveform and selection

The picture of the sound and the way you point at part of it: click to seek, drag to select, edit the numbers by hand. After edits the waveform shows the edited timeline with a marker at every cut.

W
Waveform
Draws the edited timeline as 350 bars with a playhead, a drag-to-select band and a dashed marker where one segment ends and the next begins. The main control for finding and marking audio.
apps/desktop/src/App.tsx · Waveform
Idle
00:0000:0400:0800:1200:1600:2000:24
Playhead at 00:00, ticks 00:00 to 00:24 in six equal steps.
Playing
00:0000:0400:0800:1200:1600:2000:24
Playhead follows the audio at 12.3 s.
With selection
00:0000:0400:0800:1200:1600:2000:24
Selected bars darken, a tinted band with two edge handles spans 2.0 s to 10.0 s.
Split only
00:0000:0400:0800:1200:1600:2000:24
Split at 12 s leaves two adjoining segments: a marker appears but the length stays 00:24.
After remove (two segments)
00:0000:0300:0600:1000:1300:1600:20
Removing 9.0 to 13.0 s leaves [0-9] and [13-24]: 20 s long, one marker at 9 s, ticks rescale to 00:20.
Remove then split (three segments)
00:0000:0300:0600:1000:1300:1600:20
A further split at 6 s adds a second marker. The playhead sits at 6 s of the 20 s edited length.
S
Selection readout
The strip under the waveform: a hint and Select all when nothing is chosen, otherwise exact start and end fields you can type into. Used for precise edits.
apps/desktop/src/App.tsx · Editor (.selection-info)
Nothing selected
Click to seek. Drag across the waveform to select audio.
Hint text and a Select all shortcut.
Range selected
Selection 00:08.0
From 2.00, To 10.00, length 00:08.0, Clear selection. End cannot exceed the edited length; start must stay under the end.
Select all
Selection 00:24.0
Select all fills the whole edited length. Delete selection then triggers the keep-a-segment guard (see Editing tools).

Editing tools

Non-destructive edits: trim, split and delete change a recipe of segments, and undo or redo walks that history. This group also shows the notices the editor raises when an action is refused or fails.

E
Edit toolbar
Trim to selection, Split at the playhead, Delete selection, and Loop. Each button enables only when it has something to act on.
apps/desktop/src/App.tsx · Editor (.editor-controls)
Playhead at start, no selection
Trim, Delete and Loop disabled. Split disabled because the playhead is at 0 (needs more than 0.01 s from either end).
Playhead mid, no selection
Only Split is available.
Selection made
Trim, Split, Delete and Loop all enabled.
Loop on
Loop button is highlighted; playback repeats the selection.
Saving
Trim, Split and Delete disabled. Loop is not disabled while saving (the code only checks for a selection).
Playhead at the end
Split disabled within 0.01 s of the end.
U
Trim 2 to 10 s, then undo
Walks the arithmetic the project docs quote: a 2 to 10 second trim leaves 8 seconds and undo restores the full 24. Shown so the numbers can be checked against the real code.
apps/desktop/src/timeline.ts · trim; apps/desktop/src/App.tsx · Editor.apply
Before: 24.0 s with 2 to 10 s selected
00:02.0/ 00:24.0
Saved locally
00:0000:0400:0800:1200:1600:2000:24
Selection 00:08.0
Selection length is 8.0 s.
After Trim to selection: 8.0 s
00:00.0/ 00:08.0
Saved locally
00:0000:0100:0200:0400:0500:0600:08
Click to seek. Drag across the waveform to select audio.
trim(segments, 2, 10) = one segment [2-10], so the edited length is 00:08.0. The selection clears and the playhead resets to 0. Undo is enabled.
After Undo: 24.0 s
00:00.0/ 00:24.0
Saved locally
00:0000:0400:0800:1200:1600:2000:24
Click to seek. Drag across the waveform to select audio.
Undo re-saves the previous recipe, so the length is back to 00:24.0 and Redo is enabled. The saved recipe revision is now 2, not 0.
N
Editor notices (toast)
One-line messages at the bottom of the window that tell you why something did not happen or that a background job finished. The editor raises these through its onNotice callback.
apps/desktop/src/App.tsx · Editor, App (.toast)
Keep a segment
Keep at least a short audio segment.
Shown when an edit would leave nothing: Select all then Delete selection. Not reachable by Trim.
Playback blocked
Playback could not start: play() failed because the user didn’t interact with the document first.
Wording comes from the browser or system error text.
Audio would not load
Audio could not be loaded. Reopen the recording or check the audio output device.
Raised by the audio element error handler.
Transcript ready
Transcript ready, with speaker labels.
After a transcription job completes with a result. Opens the transcript panel automatically.
Transcription ended
Transcription ended.
Fallback when a job stops without a transcript and without an error message.
Job failure from the provider
Provider returned HTTP 401. Check your key, credits, supported audio length, and provider limits.
The job status error text is shown verbatim.

Transcription and analysis

Turning a recording into text is always a choice: pick a provider, supply a key, and give explicit consent to send the edited audio. Everything here is desktop-only; the browser preview shows the form but cannot send anything.

A
Transcribe dialog
The consent gate for cloud transcription: choose OpenAI, Deepgram or AssemblyAI, provide or reuse an API key, and tick that you agree to send the entire edited recording. Opened from Transcribe or Choose a provider.
apps/desktop/src/App.tsx · AnalysisModal
Fresh, nothing chosen

Transcription and speaker labels in one pass.

OpenAI preselected, no key, consent unticked: the primary button is disabled.
Another provider

Fast transcription with speaker diarization.

Choosing a provider clears the typed key, the consent tick and any error, and updates the description and consent wording. "Remember key" is not reset.
Saved key, no consent yet

Transcription and speaker labels in one pass.

The credential store has an OpenAI key, so the field says "Using your saved key". The button stays disabled until consent is ticked.
Saved key and consent

Transcription and speaker labels in one pass.

Ready: button enabled with no key typed.
New key, remember, consent

Speech recognition with speaker-separated utterances.

A typed key (masked) plus consent enables the button; Remember stores the key in the system credential store. The key shown is a placeholder.
Starting

Transcription and speaker labels in one pass.

Everything is disabled, the close X disappears (closeable is false), the button spins. Visible only until start_analysis returns.
Provider error

Transcription and speaker labels in one pass.

The dialog stays open with a red alert and the form usable again.
Upload limit error

Transcription and speaker labels in one pass.

Wording from the platform crate; the check happens when the job runs, so it may appear later as a toast instead.
Browser preview

Transcription and speaker labels in one pass.

Cloud transcription is available in the desktop app. API keys stay out of this browser preview.
Key field, both checkboxes and the primary button are disabled and a notice says cloud transcription is desktop only. Not the shipped product.
J
Transcription progress banner
Appears under the editor while a job runs and offers Cancel. The stage line follows the platform job as it moves along.
apps/desktop/src/App.tsx · Editor (.analysis-progress); crates/cassette-platform/src/transcription.rs
Starting
Starting transcription

Sending the edited recording to your chosen provider.

Before the first status poll returns.
Preparing edited audio
Preparing edited audio

Sending the edited recording to your chosen provider.

Sending audio
Sending audio to selected provider

Sending the edited recording to your chosen provider.

The banner sentence below the stage always says it is sending the audio, even in the preparing stage.
Transcribing
Transcribing and identifying speakers

Sending the edited recording to your chosen provider.

X
Transcript and speakers panel
The panel at the bottom of the editor that says whether a transcript exists and opens it. Where you go to read, review and jump around the words.
apps/desktop/src/App.tsx · Editor (.transcript-section)
No transcript

Transcript & speakers

Words, when you want them.

Turn a recording into text with speaker labels. You choose when and where.

Invitation copy and a Choose a provider button that opens the Transcribe dialog.
Job running
Transcribing and identifying speakers

Sending the edited recording to your chosen provider.

Transcript & speakers

Words, when you want them.

Turn a recording into text with speaker labels. You choose when and where.

The banner appears above and the panel button is disabled.
Transcript ready, collapsed

Transcript & speakers

openai

Your transcript is ready.

Open the transcript to review speaker labels and jump to moments.

Provider tag and Show transcript appear. A transcript pinned to an older recipe also reads "ready" here; staleness is only reported once it is opened.
Two transcripts, current one chosen

Transcript & speakers

deepgram

Your transcript is ready.

Open the transcript to review speaker labels and jump to moments.

With transcripts [OpenAI at recipe 0, Deepgram at recipe 1] and the recording at revision 1, the panel picks the one matching the current revision (Deepgram). If none matches, the newest is used and will be stale. There is no control to choose between them.

Transcript review

Where speaker labels and wording are checked against what the provider returned. The original is never overwritten: corrections are saved as a separate review that can be reverted. Review needs the desktop app.

R
Transcript review, editing
The correction workspace: change a speaker or the words of a segment, rename or merge speakers everywhere, save, restore the original, or export the reviewed text. Used after a transcript arrives.
apps/desktop/src/TranscriptReview.tsx · TranscriptReview; apps/desktop/src/transcript-review.ts
Loading

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0
Working locally…
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Right after opening: toolbar shows the model and recipe only, and "Working locally…" appears while the saved review is fetched. Editing controls stay disabled.
Clean, nothing changed

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0 · Review 0
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Review 0: Save review changes and Restore original are disabled (nothing to save or restore). Each row has a seek time, an editable speaker and editable text.
Correction pending

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0 · Review 1
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Segment 3 has a changed speaker and text. There is no per-row marker; the evidence is that Save is enabled, Reload reads "(discard unsaved edits)", and Export, speaker tools and Restore are disabled until the draft is saved or discarded.
Rename a speaker everywhere

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0 · Review 1
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Speaker 3 picked and Priya typed: Rename all is enabled. Merge into existing stays disabled because Priya is not an existing label.
Merge two speakers

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0 · Review 1
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Typing an existing label enables Merge into existing as well as Rename all.
Saved review

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0 · Review 2
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

After saving, Review 2: Restore original text & labels becomes available again.
Export format JSON

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0 · Review 2

JSON includes the original provider transcript as well as your review.

Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Choosing JSON adds a note that the original provider transcript is included. Choices are TXT, SRT, VTT, JSON; the save dialog is native and not shown.
L
Transcript review, locked and evidence
What you get when review cannot proceed: the audio changed since the transcript, a save collided with another change, or you are in the browser preview. The untouched provider transcript stays readable.
apps/desktop/src/TranscriptReview.tsx · TranscriptReview
Stale transcript

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

The recording was edited after this transcript (recipe 1 versus 0). All editing, seeking and export are disabled; only the original is shown and it opens by default.
Revision conflict

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0 · Review 1
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Another save moved the review on. The draft is kept; Reload saved review discards it.
Stale edit

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Error from the backend when it still receives a request for an out-of-date recipe, shown with the stale notice.
Original evidence open

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0 · Review 0
Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

The collapsible "Original provider transcript (unchanged)" lists the plain text and each segment with its seek time and speaker.
Browser preview

Transcript & speakers

openai
gpt-4o-transcribe-diarize · Recipe 0

Transcript review is available in the desktop app.

Original provider transcript (unchanged)
Okay, we're recording. Let's go through the agenda for the open day. First item is the signage. We need arrows from the car park to the hall. I can print those on Thursday, if someone sends me the layout. I'll send it tonight. What about refreshments? Two urns and the biscuit order, same as last year. Fine by me. Should we start setting up at nine?
Speaker 1

Okay, we're recording. Let's go through the agenda for the open day.

Speaker 2

First item is the signage. We need arrows from the car park to the hall.

Speaker 3

I can print those on Thursday, if someone sends me the layout.

Speaker 1

I'll send it tonight. What about refreshments?

Speaker 2

Two urns and the biscuit order, same as last year.

Speaker 3

Fine by me. Should we start setting up at nine?

Review is desktop only: no review controls, a notice, and the original open. Not the shipped product.

Removing a recording

The one destructive action in the editor, kept deliberately quiet and always behind a confirmation.

Q
Remove recording confirmation
Asks before removing Cassette’s managed copy and any transcript. Imported source files are preserved. Met after pressing Remove from library.
apps/desktop/src/App.tsx · Editor (Modal, .remove-detail)
Confirm
Open day planning call
Keep recording closes the dialog; Remove recording calls remove_asset. A failure shows the error as a toast and the dialog stays open. The same wording is used for recorded and imported items.