Settings (desktop)
Every field with its consequence, the one switch that sends anything off the machine, the one request with no switch, and the six global shortcuts.
Em dashes in quoted shipped strings are shown as plain hyphens; the originals use em dashes.
The page is the single authority
The page sends the whole settings struct on Save, so what it shows is what the app does (contract-pinned). Two save buttons: Save (everything above it) and Save shortcuts.
Sharing: the switch that sends recordings off the machine
The shipped copy leads with the consequence, verbatim (apps/desktop/src/settings.html:166-172, em dash shown as hyphen): "This sends the recording off your computer. With it on, each finished recording is registered with the address below, and then the video file itself is sent to whatever upload address that server hands back - which may be a third-party video host rather than the server you typed. The share link is copied to your clipboard. Anyone with that link can watch the recording - treat one like a password. Off by default, and nothing is uploaded until both fields below are filled in."
Nothing uploads until both the server address and the API key are filled in.
The update check: the one network request with no switch
Shortly after every start, and whenever you press Check for updates, the app asks GitHub for the
latest version. The request discloses your IP address, not your version: the updater endpoint is
a static file with no {{current_version}} placeholder, so the same URL is fetched whatever you
run, and the comparison happens locally (apps/desktop/src/settings.html:235-244;
apps/desktop/src-tauri/tauri.conf.json). scripts/check-promises.mjs joins this copy to the
updater config in both directions, so neither the disclosure nor the denial can drift
(joined-to-code).
The privacy notice address
The privacy address is selectable text plus a Copy link button, because the app cannot launch a
browser: there is no opener plugin and WebView2 drops target=_blank. The URL literal is joined to
LEGAL.website by scripts/check-promises.mjs, which also requires both board.html and
settings.html to carry the link (joined-to-code).
Honesty strings that are not TODOs
- "Background blur and replacement are not built yet." (apps/desktop/src/settings.html:152)
These are shipped admissions, not placeholders; do not reword them into promises.
Retired 2026-08-25: "Frame rate is fixed at 30 fps for now, so there is no control for it." It left this list because it stopped being true, which is the only reason an admission ever should. win.rs clamped the capture to 30 whatever the picker said; the clamp is gone (capture_fps), and the pre-record picker's 30/60 choice is real. The tooltip points at the picker instead. Note what retiring it cost: four other files pinned the sentence, one of them a passing test, so telling the truth was a five-file commit. That is the argument for citing an admission by CONSTRUCT where one exists.
Capture, recording and theme fields
After-capture mode (open editor, save straight to folder, copy to clipboard), the capture delay (board buttons only; see capturing.md), recording defaults for the pre-record picker, and theme plus accent (see theming.md). The pill, webcam bubble and region overlay stay dark by ruling.
Shortcuts
Six global actions: capture screen, capture region, capture window, start/stop recording,
pause/resume, copy last card. Each action has a fallback chain; for capture screen the order is
Ctrl+Shift+S, then Ctrl+Shift+9, Alt+Shift+S, Ctrl+Alt+S, Ctrl+Shift+F12
(fallbacks(), apps/desktop/src-tauri/src/main.rs:230-240). A modifier is required, because a
bare key would be stolen from every app.
If another app owns a combination, SnapBuddy binds a fallback and tells you: the settings page shows "{asked} is already taken by another app - using {effective}" (apps/desktop/src/settings.html:457, em dash shown as hyphen).
The record toggle stops an active recording from anywhere. Copy last copies the newest live card's image, or its prompt bundle when it has no image.
The sentence a support agent can paste
"Two things ever leave the machine: recordings that Sharing uploads once both fields are filled, and the update check, which tells GitHub your IP address but not your version. Everything else is local."