feat(calls): in-call transcript open/copy/download (LC-411) #427

Merged
longjacksonle merged 1 commit from feat/lc-411-transcript-export into main 2026-06-21 02:26:12 +02:00

Implements LC-411 (the last LC-402 sub-issue): in-call transcript open / copy / download, available to every participant.

What

A small actions footer at the bottom of the live transcript drawer, shown only while a session is active:

  • Open -> the saved transcript page (/transcripts/{id}) in a new tab.
  • Copy -> copies the visible captions (speaker: text per line) to the clipboard, with a brief "Copied" confirmation.
  • .txt / .vtt -> download via /transcripts/{id}/export?format=....

transcribe.js points the links at the live transcript id and reveals the footer whenever a session is active (driven from showBanner, which already runs at every start/stop with transcriptId set/cleared) and hides it on end. Every participant knows the id (the TranscriptStarted event carries it), and the server access-gates /transcripts/{id} + the export to call participants. So the affordance is available to all participants, not just the initiator - which strengthens transparency: everyone can see and retrieve exactly what is being recorded, reinforcing the existing "This call is being transcribed" pill + auto-opened drawer.

A blocking consent-acknowledgement modal was considered and deliberately left out: it would interrupt every callee on every transcription start, and the persistent pill + drawer + now-shared export already make the recording obvious and inspectable.

Scope

Frontend only: layout.html (footer), main.css (footer/action styles), transcribe.js (set/hide links + copy), locales/{en,es}/misc.ftl (open/copy/copied). No Rust, route, or schema change - reuses the existing transcript show + export routes (both already participant-gated and valid mid-call).

Tests

just check, just test, just test-saas all pass. transcribe.js syntax-checked; just build-css regenerated.


This closes the LC-402 voice-call redesign epic (all sub-issues LC-403..LC-412 done).

Implements LC-411 (the last LC-402 sub-issue): in-call transcript open / copy / download, available to every participant. ## What A small actions footer at the bottom of the live transcript drawer, shown only while a session is active: - **Open** -> the saved transcript page (`/transcripts/{id}`) in a new tab. - **Copy** -> copies the visible captions (`speaker: text` per line) to the clipboard, with a brief "Copied" confirmation. - **.txt / .vtt** -> download via `/transcripts/{id}/export?format=...`. ## How / why it also covers consent `transcribe.js` points the links at the live transcript id and reveals the footer whenever a session is active (driven from `showBanner`, which already runs at every start/stop with `transcriptId` set/cleared) and hides it on end. Every participant knows the id (the `TranscriptStarted` event carries it), and the server access-gates `/transcripts/{id}` + the export to call participants. So the affordance is available to all participants, not just the initiator - which strengthens transparency: everyone can see and retrieve exactly what is being recorded, reinforcing the existing "This call is being transcribed" pill + auto-opened drawer. A blocking consent-acknowledgement modal was considered and deliberately left out: it would interrupt every callee on every transcription start, and the persistent pill + drawer + now-shared export already make the recording obvious and inspectable. ## Scope Frontend only: `layout.html` (footer), `main.css` (footer/action styles), `transcribe.js` (set/hide links + copy), `locales/{en,es}/misc.ftl` (open/copy/copied). No Rust, route, or schema change - reuses the existing transcript show + export routes (both already participant-gated and valid mid-call). ## Tests `just check`, `just test`, `just test-saas` all pass. `transcribe.js` syntax-checked; `just build-css` regenerated. --- This closes the LC-402 voice-call redesign epic (all sub-issues LC-403..LC-412 done).
feat(calls): in-call transcript open/copy/download from the drawer (LC-411)
All checks were successful
check-secrets / Kingfisher (push) Successful in 4s
check-secrets / Nosey parker (push) Successful in 5s
check-secrets / TruffleHog (push) Successful in 8s
check-secrets / TruffleHog (pull_request) Successful in 4s
check-secrets / Nosey parker (pull_request) Successful in 4s
check-secrets / Kingfisher (pull_request) Successful in 6s
Check / clippy + fmt + tests (pull_request) Successful in 2m52s
Create release / Create release from merged PR (pull_request) Has been skipped
1d7be5c271
Adds an actions footer to the live transcript drawer so every participant - not just the initiator - can act on the recording mid-call:

- Open: opens the saved transcript page (/transcripts/{id}) in a new tab.
- Copy: copies the visible captions (speaker: text per line) to the clipboard, with a brief "Copied" confirmation.
- .txt / .vtt: download the transcript via /transcripts/{id}/export.

transcribe.js points the links at the live transcript id and reveals the footer whenever a session is active (driven from showBanner, which already runs at every start/stop with transcriptId set/cleared), and hides it when the session ends. The id is known to all participants (the TranscriptStarted event carries it), and the server access-gates /transcripts/{id} and the export to call participants, so the affordance also strengthens transparency: everyone can see and retrieve exactly what is being recorded, reinforcing the existing "being transcribed" pill.

Frontend only: layout.html (footer), main.css (footer/action styles), transcribe.js (set/hide links + copy), en/es misc.ftl (open/copy/copied). No Rust/route/schema change - reuses the existing transcript show + export routes. just check, just test, just test-saas all pass; transcribe.js syntax-checked.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
longjacksonle deleted branch feat/lc-411-transcript-export 2026-06-21 02:26:12 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/lets-chat!427
No description provided.