Security Model
Reinstate handles high-sensitivity material: coding-agent transcripts can contain source code, architecture decisions, and occasionally secrets that tools printed to the terminal. This document is the contract we design against.
Threat model (summary)
| Threat | Mitigation |
|---|---|
| Cloud storage provider reads your sessions | Client-side encryption; provider only sees ciphertext |
| Network eavesdropper | TLS to backend + encrypted payloads |
| Accidental sync of API keys / OAuth | Hard denylist of credential paths (default on) |
| Overwriting good local history | Timestamped backups + conflict forks |
| Weak passphrase | Documented guidance; Argon2 KDF; user responsibility |
| Compromised local machine | Out of scope (OS-level compromise) |
| Malicious release artifact | Checksums / supply-chain process (see SECURITY.md) |
Trust boundaries
[Agent CLI] --files--> [Reinstate CLI] --ciphertext--> [Your bucket]
^ |
| +-- keys never leave machine
+-- only process that "understands" sessions
- Reinstate does not call vendor agent APIs
- Reinstate does not require Anthropic/OpenAI/Google account credentials
- Remote backends never receive your passphrase or age identity in plaintext form beyond ciphertext + opaque object keys
Encryption
| Property | Default |
|---|---|
| Algorithm | age (X25519 / scrypt or Argon2-derived as configured) |
| Key UX | Passphrase — same phrase on every device derives the same key |
| At rest (remote) | Ciphertext only |
| At rest (local keys) | Restricted file permissions (0600) |
| In transit | HTTPS/TLS to object storage |
Passphrase guidance
- Prefer a long passphrase (diceware / password manager)
- Never commit passphrases to git or shell history
- Losing the passphrase = losing ability to decrypt remote data (by design)
What is never synced (defaults)
| Path / pattern | Reason |
|---|---|
**/auth.json |
API keys / OAuth |
**/.credentials.json |
Tokens |
| Claude OAuth / keychain material | Credentials |
Plugin node_modules, .venv |
Huge, non-portable, regenerable |
| User-configured globs | Local policy |
Overrides that enable syncing credentials must be explicit and warn loudly.
Secrets inside transcripts
Agents sometimes echo .env values or tokens into session logs. Reinstate:
- Encrypts everything it does sync (reduces blast radius of cloud leaks)
- Offers opt-in redaction patterns (Phase 2+) for high-entropy strings
- Encourages
--scope sessionsawareness — you choose what leaves the machine
You remain responsible for not pasting production secrets into agent chats.
Restore safety
--dry-runavailable on pull- Existing files backed up under
~/.reinstate/backups/<timestamp>/ - Writes via temp file + atomic rename
- Conflicts create
.conflictforks — never silent last-writer-wins without notice
Reporting issues
Follow SECURITY.md. Private disclosure only for vulnerabilities.
Independent review
We welcome security review PRs and responsible disclosure. A formal audit is not claimed for pre-1.0 software — treat early versions accordingly.
Non-affiliation
Reinstate is independent of Anthropic, OpenAI, Google, xAI, and other agent vendors. Using those tools’ local files does not imply partnership.