Settings (desktop)
Every field with its consequence, the one switch that sends your captures off the machine, the update check that goes out at every start, and the six global shortcuts.
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 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. It lives in two places in the Uploads section (apps/desktop/src/settings.html:1094-1191), and this page quotes both because a support answer that merges them misstates the precondition.
The hint on the switch itself (:1108): "Off by default. Nothing is sent until you switch it on and either sign in or add an API key under Self-hosting." (apps/desktop/src/settings.html)
The "What this switch sends" body (:1113-1120): "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."
⚠ CORRECTED 2026-09-20, AND BOTH HALVES WERE WRONG. The pointer read
settings.html:166-172, which is a@mediablock about nav column widths. And the quote was introduced as "verbatim" while ending "Off by default, and nothing is uploaded until both fields below are filled in." - a sentence the product stopped saying when the address fields moved into theSelf-hostingdetails (:1156-1188) on 2026-08-31, so the old text told a reader to do something the app no longer asks for.
Settings has a checkbox for it, off by default, and nothing leaves your machine until you turn it on and either sign in or add an API key in the self-hosting settings.
The server address under Self-hosting is not needed for Sharing. Its hint: "Empty means SnapBuddy's own server, which is what almost everyone wants." (apps/desktop/src/settings.html)
The server address: the badge, and the sign-out when it changes
When the server address under Self-hosting is anything other than SnapBuddy's own server, the
board's title bar shows a badge after the SnapBuddy name, and the recording pill shows the same
badge after its timer: "Staging" for SnapBuddy's staging server, a test copy that is not the real
SnapBuddy, and "Self-hosted" for any other address. With the field empty, or holding
https://app.snapbuddy.ai, there is no badge. The badge comes from the address alone; the app does
not ask the server (apps/desktop/src-tauri/src/auth.rs, server_kind; joined-to-code: its table
test and the board and pill badge harness checks).
A Save that changes the server address signs you out, and clears a pasted API key unless you
changed the key in that same Save, because neither was issued by the new server. An empty field and
https://app.snapbuddy.ai are the same server, so moving between those two signs nobody out
(apps/desktop/src-tauri/src/main.rs, set_settings, and apps/desktop/src-tauri/src/auth.rs,
origin_changed; joined-to-code: their Rust tests). When the Save goes through, Settings says what
it removed (joined-to-code: the Settings Save harness check):
- Signed out and the key cleared: "Saved. The server changed, so you were signed out and the API key was cleared. Either sign in again or add an API key for the new server." (apps/desktop/src/settings.html)
- Signed out only: "Saved. The server changed, so you were signed out. Sign in again for the new server." (apps/desktop/src/settings.html)
- The key cleared only: "Saved. The server changed, so the API key was cleared. Either sign in or add an API key for the new server." (apps/desktop/src/settings.html)
- Neither: "Saved."
The update check: the request that goes out at every start
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).
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
"The desktop app sends your captures, and anything about them, only through the Sharing switch in Settings, which is off until you switch it on. Apart from that, it goes online only to sign you in and keep you signed in, once you press Sign in, and to check GitHub for updates, which tells GitHub your IP address but not your version; an update is downloaded only if you say yes. The privacy notice sets out what leaves, and when: https://snapbuddy.ai/privacy"