What we store, where, and what happens if any of it leaks. Plain English. No marketing copy.
| Asset | Where stored | Form | Worst case if leaked |
|---|---|---|---|
Your Mirror API key (ce_mirror_…) |
Browser localStorage + your records (Catalyst Edge never has the cleartext after signup) |
Cleartext on your side; only sha256 hash on our side | Read your paper portfolio + place paper orders for your account. No real money. Zero financial loss. |
| Your email address | Postgres mirror_users.email |
Cleartext (used for recovery) | Spam. We do not share it. |
| Catalyst Edge admin keys (real-money brokers) | Cerebro filesystem only — /opt/catalyst/.sec_email_env, mode 0600, root-only |
Cleartext (legacy; encryption-at-rest planned) | NEVER reachable from any web endpoint. Verified by grep across the entire web stack. Architecturally separated. |
| Phase B: your real Alpaca tokens (when you connect a live broker) | Postgres, encrypted at rest with Fernet (AES-128 + HMAC) | Encrypted; master key only on cerebro filesystem | Database breach alone is useless without the master key. Two systems must be compromised at once. |
This is not a policy — it's a code property. The web-facing API server (api_server.py, api_v1_router.py) never imports the modules that hold real-money broker credentials (agent_tradier_equities.py, agent_coinbase.py). A user calling /api/v1/mirror/* with their key only writes to mirror_orders — a paper-only table. Real-money agents run as separate cron jobs with their own root-owned environment.
You can verify this yourself: grep -E 'TRADIER_TOKEN|COINBASE_API_KEY' <web-stack-files> returns zero matches.
sha256(key), not the key. We literally cannot show it to you again — recovery issues a new one./api/v1/portfolio/{client_id} verifies the API key matches the client_id and returns 403 otherwise.pick_id hash; replay attacks have no effect.POST /api/v1/mirror/rotate issues a new key + invalidates the old, atomically. POST /api/v1/mirror/revoke permanently disables the account.POST /api/v1/mirror/email_recovery issues a fresh key for an existing email. Returns 200 even for non-registered emails (prevents enumeration).MIRROR_VAULT_KEY on cerebro).POST /api/v1/mirror/rotate.POST /api/v1/mirror/pause.Email [email protected] with subject [security]. Mention "Mirror" or "API" in the body. We aim to acknowledge within 48 hours and have a fix or workaround within 7 days for high-severity findings. We do not yet run a paid bounty but will publicly credit good-faith reports.
Last reviewed: 2026-05-08. This page is the source of truth for our current security posture. We commit to updating it any time the posture changes — encryption, scope, or process. Legal & full disclosures →
You are one page deep in a scanner that grades its own picks in public, wins and losses alike.
Tier 1 setups touched +2% intraday 48.9% of the time across 374 tracked calls. Baseline for everything else: 40.9%. That is a +8.0 point edge, measured from the NEXT OPEN — the first price you could actually pay, not the prior close. We publish the misses too: https://catalystedgescanner.com/trust/
29 of 30 founding seats left. The price goes up when they are gone.
Become a Founding Member — $99 onceOne payment. Lifetime access. The free daily picks stay free — this is for people who want the full console. Not buying today? Get tomorrow's ranked list free →