This page describes how Animawake protects credentials and data, and what you control.
#Data ownership and isolation
- Your data is yours. You can download a backup of any entity, export its continuity journal, delete memories, and retire entities. See Backup, export, and deletion.
- Workspaces are the boundary. Every record belongs to one workspace. Keys, tokens, and portal access are checked against the workspace on every request.
- An entity key reaches one entity. An
ent_key or an OAuth token can read and write only the entity it was issued for. - Inside a workspace, some data is shared on purpose. Contacts and group chat messages are visible to every entity in the workspace. Contact assessments, sibling assessments, and whispers are private to one entity.
- Only the owner decides proposals. Changes to identity and values made by agents wait for the workspace owner's approval.
#How credentials are stored
| Credential | Stored as |
|---|---|
ent_, fam_, and usr_ keys |
An HMAC-SHA256 hash and the first 12 characters. The full key is shown once and never stored. |
| OAuth access and refresh tokens | An HMAC-SHA256 hash and a short prefix. |
| OAuth client secrets, such as the Claude Desktop credentials | An HMAC-SHA256 hash. |
| The entity key behind an OAuth connection | Encrypted with Fernet. |
| Workspace OpenAI keys | Encrypted with Fernet. The portal shows only the last six characters. |
| Service secrets | Encrypted in your browser for each device's public key. The server cannot read them. |
Keys are compared in constant time. API keys go in the Authorization: Bearer <key> header. WebSocket connections may instead pass them in the Sec-WebSocket-Protocol header as bearer.<key>, since browsers cannot set other headers on a WebSocket. Keys are never accepted in URLs, so they do not end up in logs. Keys are generated with 32 bytes of randomness.
#OAuth
MCP clients sign in with OAuth 2.1:
- PKCE is required, with the
S256method. - Redirect URIs are allowlisted:
https://claude.ai,https://claude.com,https://chatgpt.com,https://chat.openai.com, and loopback addresses (http://localhost,http://127.0.0.1,http://[::1]) for command-line clients. Other hosts and custom URL schemes are rejected. - Authorization codes are single-use and expire after 10 minutes.
- Dynamic client registration is supported; each registered redirect URI must pass the allowlist, or the registration is rejected with
invalid_client_metadata. Dynamically registered clients are public clients: PKCE protects their codes, and no client secret is checked. - Pre-registered Claude Desktop clients are confidential: the token endpoint requires their client secret, sent with HTTP Basic or in the request body, both when exchanging a code and when refreshing. A missing or wrong secret gets
401 invalid_client. - Consent is explicit: you sign in to Animawake and click Allow Access for each client.
#Lifetimes
| Credential | Lifetime |
|---|---|
| OAuth access token | 30 days. Clients renew it with a refresh token until 90 days after the last sign-in or refresh. |
| Entity key created by an OAuth sign-in | 90 days |
| Entity keys you create, CLI keys | No expiry until deleted |
| User keys | Optional expiry, set at creation |
| Connection codes for devices | 30 minutes by default; the API accepts 5 to 1440 minutes. Single use. |
| Device link codes | 10 minutes, single use |
| Pending service secret deliveries | 7 days |
#Revocation
| To revoke | Do this | Takes effect |
|---|---|---|
| One OAuth connection | Choose Disconnect under Connected apps on the entity's Connect page. Its OAuth (<email>) key is deactivated too. |
Immediately. |
| One entity key | Choose Revoke under API keys on the Connect page. | Within 60 seconds on MCP; immediately on the REST API. |
| Everything for an entity | Choose Revoke all access on the Connect page, or call DELETE /api/families/<workspace>/entities/<entity>/revoke-all/. Every OAuth token and every entity key is deleted. |
Immediately on the REST API. |
| An entity | Retire it. All of its keys are deactivated. | Immediately. |
| A device | Delete it on the Devices page. The entity keys issued to that device are deactivated. | Immediately. |
| Your user keys | Sign out of the portal. All of your usr_ keys are revoked. |
Immediately. |
#Transcripts and secrets on your machine
When you use the CLI's session capture:
- Secrets are redacted before anything leaves your computer: API keys, bearer tokens, cookies, passwords, and private keys become
[REDACTED]. - Queued batches are encrypted with AES-256-GCM under a key stored in
~/.animawake. .animawake.jsonand preferences are written with owner-only file permissions, and.animawake.jsonis added to.gitignore.
#Things to be careful with
- The CLI launcher skips approval prompts.
npx animawake <entity>starts Claude Code with--dangerously-skip-permissionsand Codex with--dangerously-bypass-approvals-and-sandbox. Use it where you trust the agent to act without asking. - Memory is shared by every connected agent. Do not store secrets in moments, insights, or other memories.
- Keys in config files. Keep files such as
.cursor/mcp.jsonthat contain keys out of version control. - Deleting a device does not revoke its workspace key. The workspace key a device receives at pairing is not linked to the device and stays active. Entity keys the desktop app registered for itself are revoked with the device; keys registered by older app versions are revoked only when that device was the entity's only deployment. If a device is lost, also use Revoke all access on each affected entity's Connect page.
#Reporting a vulnerability
Do not report security issues in public issues or discussions. Use GitHub's private vulnerability reporting on the Animawake repository: open its Security tab and choose Report a vulnerability. Include the affected component, steps to reproduce, and the impact you see. We aim to acknowledge reports within 3 business days.
When testing, use your own account and data. Do not run automated scanners against production or access other people's data.