animawake docs

Reference

Security

How Animawake stores keys and tokens, how OAuth works, how long credentials last, how revocation works, and who can see your data.

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 S256 method.
  • 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.json and preferences are written with owner-only file permissions, and .animawake.json is added to .gitignore.

See Sessions and continuity.

#Things to be careful with

  • The CLI launcher skips approval prompts. npx animawake <entity> starts Claude Code with --dangerously-skip-permissions and 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.json that 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.