Recording (desktop)
Screen recording, the consent warnings that must never move, the pill, crash recovery, and what the interaction track does and does not collect.
Em dashes in quoted shipped strings are shown as plain hyphens; the originals use em dashes.
The pre-record picker
Choose what to record (Screen, Window, Region), pick a source from the list, set two independent audio toggles (microphone and system audio), optionally turn on the webcam bubble, then a 3-2-1 countdown. Defaults come from Settings; the source kind and the microphone device are remembered per machine (apps/desktop/src/recorder.html, recorder.js).
Consent: the shipped warnings, verbatim
The system audio toggle's label carries a warn-note: "System audio - also records others on a call" (apps/desktop/src/recorder.html:112; the hyphen is a plain hyphen in the source).
The control's title, in full: "Captures everything this machine plays. On a call that includes everyone else's voice, and their meeting app will NOT show a recording indicator. In many countries and US states, recording someone without telling them is a criminal offence - tell them first." (apps/desktop/src/recorder.html:112, em dash shown as hyphen).
The meeting app shows no indicator because capture happens at the WASAPI layer, below anything the meeting app can observe. This warning lives on the control itself and must never move; it is listed in the do-not-delete contract and is never demoted into a tooltip or an info bubble.
The webcam bubble
The bubble opens the moment you toggle it, so you can position it before recording starts. It captures nothing until recording starts. Preview mirroring is optional and preview-only; the recorded track is never mirrored (apps/desktop/src/webcam.js).
The pill
While recording: a pulsing dot (amber and still while paused; still under reduced motion), a timer, a webcam toggle, pause/resume, Stop (keeps the take), and Discard (destroys it, no recycle bin). Discard requires a hold of roughly 600 ms with a pointer, or two presses within three seconds with the keyboard. Space pauses only while the pill has focus. Escape does nothing, on purpose: a stray Escape must not end a take (apps/desktop/src/pill.js).
Honest states
- A take rescued after a crash appears as a card with a warn "Recovered" badge and a 0:00 duration badge, because nothing at recovery time knew the length. The file plays fine. The badge's title says so: "Rescued after the app was interrupted. The file is playable; its length was not recorded, so the badge above reads 0:00." (apps/desktop/src/board.js:435; joined-to-code: recover harness checks).
- A recording delivered to the board while its card is in the trash comes back restored, with a toast saying so (joined-to-code: trash harness check).
The interaction track
A recording writes a sidecar .events.jsonl with mouse positions, clicks and window-focus changes. Deliberately no keystrokes: not the characters, not the key codes, and no window titles (apps/desktop/src-tauri/src/record/events.rs; joined-to-code: events.rs test). That track writes the "Steps to reproduce" section of the card's .md, capped at 25 steps with an honest closing line "...and N more interactions, not listed." (apps/desktop/src/doc.js:418; joined-to-code: bp1 checks).
Upload
Nothing uploads unless Sharing is on in Settings with both fields filled, or you press Upload to cloud on a card. The link is copied to the clipboard and stored on the card (joined-to-code: b4 checks). See settings.md for what the Sharing switch discloses.
The sentence a support agent can paste
"A Recovered badge with 0:00 means the app rescued the file after a crash; the recording is intact, the app just never learned its length."