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.
None of the shipped strings quoted here contains an em dash, so nothing is substituted; they are verbatim. In a quote, a name in braces, such as {name}, or a capital N stands for a part the app fills in as it runs. Three dots at the start or end of a quote stand for words left out, unless the article says the app prints them.
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).
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).
When the server address in Settings is not SnapBuddy's own server, the pill also shows the server badge after the timer (see settings.md; 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 its duration reads 0:00." (apps/desktop/src/board.js,
takeBadges; 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 (docSections in apps/desktop/src/doc.js),
capped at 25 steps with an honest closing line whose three dots are the app's own:
"...and N more interactions, not listed."
(reproLines in apps/desktop/src/doc.js; joined-to-code: bp1 checks).
Upload
Nothing uploads unless Sharing is on in Settings and you either sign in or add an API key in the
self-hosting settings, and Upload to cloud on a card needs the same. (This said "with both fields
filled" until 2026-09-20. The server address and API key moved into Self-hosting on 2026-08-31;
settings.md carries the correction and the shipped copy it is checked against.) 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."