Skip to content

Cloud settings sync (optional account)

Signed-in users may sync a settings document across machines. Protect and local settings work without an account.

API (interim): private HQ services/denyout-api -> later private denyout.com web repo / api.denyout.com.

Document shape

Go types: internal/cloudsync. Desktop map: ExportSyncDocument / ApplySyncSettings in internal/desktop.

Field Sync?
schema_version yes (currently 1)
updated_at yes (last-write-wins)
settings.notify_level yes
settings.decision_timeout_sec / reask_interval_sec yes
settings.always_allow_hosts yes
settings.remembered_keeps / remembered_signal_allows yes (keys only)
settings.block_phishing / block_malware / block_stronger / threat_poll_hours yes (toggles only, not feed files)
settings.sensitive_* / body_pure_a / anti_chunk_enabled yes
settings.applied_pack_ids yes (ids only)
Audit JSONL, raw secret URLs, canaries, wrap secrets, account tokens never

Example blob:

{
 "schema_version": 1,
 "updated_at": "2026-11-14T12:00:00Z",
 "settings": {
 "notify_level": "normal",
 "always_allow_hosts": ["api.openai.com"],
 "block_phishing": true,
 "block_malware": true
 }
}

Account UI

Settings -> Advanced -> Account: email one-time code sign-in / sign out / Sync now / Delete cloud data. Trust line: works fully without an account. Protect is never gated on login. Delete cloud data removes the server account + synced blob, then signs out locally; Protect settings on disk stay.

Sync now

When signed in and Sync settings is on, Sync now pulls the cloud document, applies last-write-wins by updated_at, then pushes if local is newer (or cloud is empty).

Signed out or sync off -> local only (no upload).