Privacy
Local mode's only network call downloads the list of pre-built rosters, at most once a day. Cloud mode stores rosters and draft state on the rostr API; tasks and repo names are encrypted on your machine before they're sent.
Data
| Data | Local | Cloud (server) |
|---|---|---|
| Rosters | Disk | Plaintext |
| Drafts (member, session ID, timestamps) | Disk | Plaintext. Session IDs are random |
| Tasks | Disk | AES-256-GCM ciphertext |
| Repo identity (owner/repo) | Disk | HMAC-SHA256 fingerprint + AES-256-GCM ciphertext |
| rostr key | — | Never transmitted |
Keys
The CLI derives three independent keys from your rostr key. Only the auth token leaves your machine.
rostr key ├─ HKDF-SHA256(info="auth") → auth token ├─ HKDF-SHA256(info="encrypt") → encryption key └─ HKDF-SHA256(info="fingerprint") → fingerprint key- Auth token: bearer credential for the API. The server stores only its SHA-256 hash.
- Encryption key: encrypts tasks and repo names with AES-256-GCM, with a random 96-bit nonce per value.
- Fingerprint key: HMAC-SHA256 over
owner/repo, so the server can match project links without learning repo names.
Distinct HKDF labels make the keys independent: none reveals the rostr key or any other derived key.
What the server sees
- Visible: roster contents, which members are drafted and when, session IDs, repo fingerprints, and the size and timing of task ciphertext.
- Not visible: your rostr key, task plaintext, repo names, prompts, or code.
Consequences
- No recovery. A lost key means your cloud data is unrecoverable, by you or by us.
- API responses contain task ciphertext.
rostr stats --jsondecrypts it for you. - Cloud environments need
ROSTR_KEYto decrypt tasks. Never commit it.