KQ-2054 · MEETING/RECALL
Meeting Recall
Questions asked of a recorded meeting, with its waveform and transcript docked beside the thread: every claim in an answer carries a timestamp chip, and pressing one glides the waveform's playhead to the moment on springs.glide while the transcript scrolls its own box there and a highlight sweeps across each supporting line in turn. Claims arrive on springs.snap, chips press on springs.flick, and a claim nothing supports shows a dashed No source mark. Tab moves through the chips and Enter seeks, K plays and pauses, the waveform is a slider (drag, arrows, Page keys, Home/End), and under 40rem the transcript is a sheet that rises on springs.glide.
Tuesday roadmap call
Waylight · 19:00 · 4 speakers
1 answer · press a time to jump to the moment
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/meeting-recall
Props
- title
- string
- default "Tuesday roadmap call"
- The meeting's name and the surface's accessible name.
- speakers
- RecallSpeaker[]
- default defaultRecallSpeakers
- Who spoke: { id, name }.
- segments
- RecallSegment[]
- default defaultRecallSegments
- The transcript in order: { id, speaker, start, end, text } in seconds.
- peaks
- number[]
- default seeded from segments
- Loudness samples 0–1 spread evenly over the recording.
- answers
- RecallAnswer[]
- default defaultRecallAnswers
- Questions the assistant can answer, each a list of claims with the segment ids that support them.
- defaultAsked
- number
- default 1
- How many answers are already in the thread when it mounts.
- defaultTime
- number
- default 0
- Where the playhead starts, in seconds.
- playing / defaultPlaying
- boolean
- default false
- Controlled or initial playback.
- onPlay
- (playing: boolean) => void
- default —
- Fires from the press or key that started or stopped playback, and when it reaches the end.
- onSeek
- (seconds: number, segmentIds: string[]) => void
- default —
- A chip, a transcript line or the scrubber moved the playhead.
- onAsk
- (question: string, answer: RecallAnswer | null) => void
- default —
- A question was asked; answer is null when nothing in the recording answers it.
- rate
- number
- default 1
- Playback speed.
- waveStyle
- "bars" | "mirror" | "line"
- default "bars"
- Bars from the baseline, bars mirrored about the centre, or a filled envelope.
- density
- "compact" | "regular" | "roomy"
- default "regular"
- Type and spacing in the thread and the transcript.
- accent
- string
- default "var(--accent-bright)"
- Chips, the played wave and the sweep — any CSS colour.
- status
- "ready" | "processing" | "empty" | "error"
- default "ready"
- The recording's state: still processing, no speech found, or failed to load.
- progress
- number
- default 0.64
- How far processing has got, 0 to 1, while status is processing.
- onRetry
- () => void
- default —
- Try again was pressed after the recording failed to load.
- height
- number
- default 520
- Height of the surface in px.
- disabled
- boolean
- default false
- Read only: nothing can be asked, played or seeked.
- className
- string
- default —
- Classes for the surface.
| Prop | Type | Default | Description |
|---|---|---|---|
| title | string | "Tuesday roadmap call" | The meeting's name and the surface's accessible name. |
| speakers | RecallSpeaker[] | defaultRecallSpeakers | Who spoke: { id, name }. |
| segments | RecallSegment[] | defaultRecallSegments | The transcript in order: { id, speaker, start, end, text } in seconds. |
| peaks | number[] | seeded from segments | Loudness samples 0–1 spread evenly over the recording. |
| answers | RecallAnswer[] | defaultRecallAnswers | Questions the assistant can answer, each a list of claims with the segment ids that support them. |
| defaultAsked | number | 1 | How many answers are already in the thread when it mounts. |
| defaultTime | number | 0 | Where the playhead starts, in seconds. |
| playing / defaultPlaying | boolean | false | Controlled or initial playback. |
| onPlay | (playing: boolean) => void | — | Fires from the press or key that started or stopped playback, and when it reaches the end. |
| onSeek | (seconds: number, segmentIds: string[]) => void | — | A chip, a transcript line or the scrubber moved the playhead. |
| onAsk | (question: string, answer: RecallAnswer | null) => void | — | A question was asked; answer is null when nothing in the recording answers it. |
| rate | number | 1 | Playback speed. |
| waveStyle | "bars" | "mirror" | "line" | "bars" | Bars from the baseline, bars mirrored about the centre, or a filled envelope. |
| density | "compact" | "regular" | "roomy" | "regular" | Type and spacing in the thread and the transcript. |
| accent | string | "var(--accent-bright)" | Chips, the played wave and the sweep — any CSS colour. |
| status | "ready" | "processing" | "empty" | "error" | "ready" | The recording's state: still processing, no speech found, or failed to load. |
| progress | number | 0.64 | How far processing has got, 0 to 1, while status is processing. |
| onRetry | () => void | — | Try again was pressed after the recording failed to load. |
| height | number | 520 | Height of the surface in px. |
| disabled | boolean | false | Read only: nothing can be asked, played or seeked. |
| className | string | — | Classes for the surface. |