Local-first & secrets

OSW is a local-first tool: it runs on your own machine and proxies your requests to various upstreams. Apart from requests sent to the upstreams you configured and the anonymous telemetry described below, it sends content nowhere else.

Traffic that leaves this machine

TrafficWhere it goesContent
Model requestsThe upstreams you configured in Model managementYour request content, sent verbatim per the upstream protocol.
Anonymous usage telemetryAn endpoint of oursClosed-set events and attributes, containing no user content.
Config cloud syncThe Gist you choseYour config snapshot (sent only when you trigger it).

No other egress path

Model requests go to your configured upstreams and can optionally use an outbound proxy; telemetry connects directly and independently; sync connects directly to your chosen Gist. Beyond that there is no implicit egress.

Keys and credentials

  • Upstream API keys are stored only on this machine, encrypted, in secrets.json in the data directory.
  • The local service does not verify auth: the API key a client fills in is only a placeholder, replaced at forward time with the real key for that provider.
  • A provider export with plaintext keys is equivalent to a usable credential (see Providers & models).
  • A cloud-sync snapshot contains API keys and is only base64-encoded, not encrypted (see Config cloud sync).

Anonymous usage telemetry

Telemetry answers "how many people are using it, which version, which features actually get used", and is on by default.

  • There is no switch in the UI, and it is not shown in the console either.
  • Event and attribute names are a closed set shared by the client and the Worker; fields outside the closed set are rejected wholesale server-side, not warned about or downgraded.
  • No user content is collected: no prompts, no responses, no token usage, no error text, no request latency.
  • The local database is not read: the request-completed event is emitted right where the proxy finishes, on a different path from Request logs (the latter being a debug feature you can turn off).
  • It never uses your outbound proxy — it is an independent direct connector, so it never appears in proxy logs.
  • Installations ≠ users: multiple users on one machine, or multiple data directories, count as multiple installations. A local tool has no reliable notion of a "person", and does not pretend to.

On identity:

  • On first enable, a random UUID v4 is generated in the data directory and written to telemetry-id (permissions 0600); it is not written into the config database — it should not be exported, backed up, or included in a provider package along with your config.
  • No derivation, no rotation: the identifier itself is tied to no personal information (no account, no email, no device fingerprint); deleting telemetry-id gives you a new identity.

Rotating doesn't buy anonymity

Rotating the identifier daily does not make you more anonymous, but it wrecks every retention report. Keeping one long-lived identifier is more honest than manufacturing a batch of fake "new installs".

What you control

What you want to doWhere
Turn off request body recordingSettings → Data → Request logs
Shorten request content retentionSettings → Data → Request logs
Change the data directorySettings → Data → Data directory
Send model requests through your own egressSettings → Network → Outbound proxy

For the full settings list, go to Settings.