Keychain & secrets

Furx never writes secrets to disk in plaintext. All provider keys, MCP server tokens, and license tokens live in your OS's native credential store.

macOS

Apple Keychain via security CLI. Service names use the prefix furx-.

# List all Furx entries
security dump-keychain | grep -A1 "furx-"

# Read a specific provider key
security find-generic-password -a hernan -s furx-provider-openrouter -w

# Delete (Furx wizard does this for you)
security delete-generic-password -a hernan -s furx-provider-openrouter

Linux

Secret Service via libsecret. On GNOME (Keyring) or KDE (KWallet).

# List
secret-tool search service furx-provider-openrouter

# Read
secret-tool lookup service furx-provider-openrouter

# Delete
secret-tool clear service furx-provider-openrouter

If you're on a headless server without a keyring service, install gnome-keyring and run dbus-launch first. For Docker / CI, use the env-var fallback (see below).

Windows

Credential Manager via CredRead / CredWrite. Target name is furx:provider:<alias>.

# PowerShell
Get-StoredCredential -Target furx:provider:openrouter

# Or via cmd.exe
cmdkey /list:furx:*

Env-var fallback (Docker / CI only)

For CI/headless contexts where no keyring is available, Furx reads from env vars prefixed with FURX_KEY_. This path is disabled by default on user installs and requires FURX_ALLOW_ENV_KEYS=1.

export FURX_ALLOW_ENV_KEYS=1
export FURX_KEY_OPENROUTER=sk-or-v1-...
export FURX_KEY_ANTHROPIC=sk-ant-...
furx council --preset frontier --prompt "review this diff"

Never set this in a normal shell session — env vars leak into child processes, command history, and crash dumps. Only use in scoped CI/Docker.

Rotation

From the running app: Settings → Connect → click a provider → "Update key". The new key overwrites the old in Keychain; nothing remains in memory beyond in-flight requests.

Revocation

  1. Settings → Connect → Delete (removes from Keychain locally).
  2. Go to the provider's dashboard (openrouter.ai, console.anthropic.com, etc.) and revoke the key there.
  3. Audit log entries continue to reference the alias (e.g., provider:openrouter), never the secret itself.

Export & backup

Furx does notprovide a built-in export of secrets — by design, you should use your OS's Keychain export tool if you need a backup. For team-wide sharing, use a proxy/gateway with org-managed credentials, not shared user keys.

Audit

Every Keychain read/write writes a row to ~/.furx/furx.db:

SELECT ts, op, alias, caller_pid
FROM events
WHERE kind = 'keychain'
ORDER BY ts DESC
LIMIT 20;

Op = read / write / delete. Caller PID lets you trace which pane/CLI requested it.

Reset Furx's Keychain entries

furx doctor --reset-keychain deletes all furx-* entries (prompts twice). Useful before transferring the machine.