Greed Terminal is a free portfolio view across Kalshi, Gemini Predictions and Polymarket. Sign in with a passkey. Your exchange API keys are encrypted in your browser with a key that only your passkey can produce, and they are never stored in cleartext on our side.
Create account with a passkeyNo email. No password. Free.
There is no password to leak and no email to phish. Your account is a passkey (WebAuthn, user verification required) stored in iCloud Keychain, Google Password Manager, 1Password, Bitwarden or a hardware security key. We store its public key.
The same passkey also unlocks your vault. Through the WebAuthn PRF extension your authenticator derives a secret from a fixed input. Only that passkey can compute it, it is computed on your device, and it is never sent to us. Without it the vault can't be opened, by you or by us.
your passkey (Face ID / Touch ID / security key)
│ WebAuthn PRF extension: a secret only this passkey can produce,
│ computed on your device, never sent to us
▼
wrapping key ── HKDF-SHA256
│ decrypts (AES-256-GCM)
▼
vault key ───── random 256-bit key, created in your browser at sign-up
│ stored by us only in wrapped (encrypted) form
├── HKDF ──▶ item key encrypts your exchange credentials (browser only)
└── HKDF ──▶ cache key encrypts cached exchange data (sent per request)Every ciphertext is bound to your account and to its slot through AES-GCM additional data, so blobs can't be swapped between users or items. Unlocking happens in the tab; the vault locks itself after 15 minutes of inactivity, when you click Lock, or when you close the tab.
browser Cloudflare terminal.greed.bot relay exchange
─────── ────────── ──────────────────────── ────────
decrypt credentials
with item key
│ TLS 1.2+ CDN / DDoS edge in memory only:
├─────────────▶ re-encrypts ──TLS─▶ sign request with your key ──────▶ Kalshi
│ credentials to our origin (fixed hosts, fixed endpoints) Gemini
│ + cache key Polymarket
│ encrypt the response with
│ your cache key, store ciphertext
│◀───────────────────────────────── return positions
render portfolio drop credentials + cache keyExchanges authenticate with request signatures that need your secret, and order entry needs the same credential, so every exchange call goes through one path: cleartext in flight only. The relay:
136.90.85.84. Add it to your key's IP allowlist where the exchange supports it.To keep the terminal fast and stay inside exchange rate limits, the latest snapshot of each account is cached for up to 24 hours. Your browser sends the cache key alongside the credential. The relay derives an encryption key and an HMAC key from it, stores the snapshot as AES-256-GCM ciphertext, and indexes it by an HMAC of the account ID. Without your cache key we can't read a cached snapshot or tell which account it belongs to.
| Data | Stored as | Readable by us? |
|---|---|---|
| Account | random ID, creation time | yes (no name, no email) |
| Passkey | credential ID, public key, signature counter | yes, but these are public values |
| Vault key | AES-256-GCM ciphertext under your passkey's PRF | no |
| Exchange credentials, labels, exchange names | AES-256-GCM ciphertext under your item key | no |
| Cached positions & balances | AES-256-GCM ciphertext under your cache key, HMAC-indexed, expires in 24h | no |
| Sessions | SHA-256 of a random token, expires in 12h | hash only |
"Delete account" removes all of it immediately.
| Kalshi | Account → API keys → create a key. Paste the key ID and the private key (PEM). RSA and Ed25519 keys are supported. Use a dedicated key, with a read-only scope if your account offers one. |
| Gemini | Create an API key with the Trader role (required by Gemini's positions endpoint), time-based nonce, and no fund-management permissions. Add 136.90.85.84 to the key's trusted IPs. |
| Polymarket | Paste your profile (proxy wallet) address. Positions are public on-chain data, so we never ask for a Polymarket private key. The address is still encrypted in your vault, because it links you to your positions. |
A current browser and a passkey provider that supports the WebAuthn PRF extension: iCloud Keychain (iOS / macOS 18+), Google Password Manager (Chrome), 1Password, Bitwarden, or a FIDO2 security key with hmac-secret. Older browsers are intentionally unsupported.