Quantor
πŸ” Verifiable trust

Don't trust us. Verify us.

Quantor's production build is signed with an offline Ed25519 key that never leaves the founder's machine. The public key is open, and the signed build identity is published at /_identity.json. Anyone with curl and openssl can confirm the running site serves exactly the code we committed to the repository.

Self-custody by design β€” your API keys stay encrypted and operationally protected. The shield illustration shows the API Keys panel (encrypted), Security Status (all systems secure), Exchange Permissions (Trading enabled, Withdraw disabled, Read Access enabled), and the closing line: You stay in control. Always. We never access your funds.

πŸ›°οΈ Live build identity β€” verifying now

Status
βœ“ verified
Service
quantor-site
Commit
07fe7a206f6c982fcf932379ed159592c0fb3c44
Image SHA
sha256:29dee86a78e3ae9fd61788243394df5861f6523b95ac3815d7fd5af4a8587709
Built at
2026-10-10T14:21:30Z
Pubkey
ed25519:9b:ee:8a:26:a6:b0:75:04:a2:34:b5:80:24:db:3a:7c:4d:00:76:11:63:6b:53:bd:cf:6b:9c:bc:b6:c9:57:a0
Verify independently from your terminal β†’
# 1. Fetch the public key (committed in repo + served at /.well-known)
curl -s https://quantorsaas.app/.well-known/quantor-pubkey > pub.pem

# 2. Fetch the live, signed build identity
curl -s https://quantorsaas.app/_identity.json > id.json
jq -rj '.manifest'  id.json > manifest   # -rj (no trailing newline) or the signature won't match
jq -r  '.signature' id.json | base64 -d > sig

# 3. Verify with openssl
openssl pkeyutl -verify -pubin -inkey pub.pem -rawin -in manifest -sigfile sig
# β†’ "Signature Verified Successfully"

πŸ“ˆ Performance signing key

Monthly performance snapshots and signed audit rows are signed with a separate Ed25519 key. Its public half is served at /.well-known/quantor-perf-pubkey.

SPKI SHA-256
3ea917ace8401383af503f27bed9205195b56f21df89af21bd44a94aec5a25e5
Check the fingerprint yourself β†’
curl -sS https://quantorsaas.app/.well-known/quantor-perf-pubkey > key.pem
openssl pkey -pubin -in key.pem -outform DER | openssl dgst -sha256
# β†’ 3ea917ace8401383af503f27bed9205195b56f21df89af21bd44a94aec5a25e5

This fingerprint never changes during the project's lifetime; any rotation is announced β‰₯30 days in advance with cross-over verification. Full verify recipe for snapshots lives on /performance.

πŸ”Ž Verify a strategy audit

Turn any trade history into a signed, tamper-evident audit β€” net-of-cost PnL, drawdown, and whether the claimed edge survives realistic costs. Every report is Ed25519-signed, so a doctored number breaks verification. Independent, no account needed.

See a signed sample β†’

1. Cryptographic build identity (Layer A)

The Spring Boot api, Java worker, and Express site are all signed with the same offline key before rollout. An Ed25519 signature over the canonical manifest {service, commit, image_digest, builtAt} is written into Cloud Run env vars and exposed via identity endpoints. If someone swaps the image β€” the signature won't match. If someone forges the manifest β€” it won't verify against the committed public key.

What this closes

  • An attacker with Cloud Run or build-pipeline access who tries to push a malicious image β€” the Pulse probe catches the mismatch within an hour.
  • A contractor with temporary deploy rights cannot later sign their own build in our name β€” they don't hold the key.
  • "Someone swapped the bytes" stops being a guess and becomes arithmetic: either the signature is valid or it isn't.

2. Explicit risk gates before any LIVE order

Before a real order reaches the exchange, the request passes through a layered chain of independent checks in strict order. Each gate has a unit test and throws a structured ProductPolicyException with a specific risk_code. PAPER mode has only 2 gates β€” symbol allowlist + plan allows paper. LIVE passes the full chain.

  1. Symbol allowlist SYMBOL_NOT_ALLOWED
    Symbol must be on the permitted list.
  2. Regime guard DANGEROUS
    Market must not be in DANGEROUS regime (realised volatility + drawdown).
  3. Runtime kill switch quantor.trading.live.enabled
    Global flag must be on.
  4. User allowlist quantor.trading.live.allowedUserIds
    User ID must be in the runtime allowlist.
  5. Non-zero notional
    Cannot start LIVE on zero order size.
  6. Active subscription
    Subscription must be active and current.
  7. Account not frozen
    Account in good standing, bot count under plan limit.
  8. Plan allows LIVE
    The current plan permits LIVE β€” FREE does not. Starter allows LIVE on EMA only; advanced strategies (Breakout V1, TS Momentum V1, Adaptive Pro, Custom) require Pro or Teams.
  9. LIVE_ADVANCED mode advancedStrategies
    Advanced mode requires a plan with the advanced-strategies feature.
  10. Telegram linked
    Telegram account must be linked β€” dual-channel control.
  11. Strategy whitelist
    Strategy must be in the permitted set for the execution mode.
  12. Exchange keys verified
    Exchange API keys must be verified live, not just entered.
  13. Max-notional ladder
    Per-plan cap on order notional:
    Starter ≀ $250 Pro ≀ $5k Teams ≀ $25k
  14. Daily-loss ladder
    Per-plan daily-loss circuit breaker (source of truth: PlanLimitsCatalog.java):
    Free ≀ 1% Starter ≀ 2% Pro ≀ 5% Teams ≀ 10%

3. Regime detector β€” we're willing to sit on the bench

Quantor calculates the current market regime from realised volatility and drawdown from peak. When the regime is DANGEROUS, LIVE starts are blocked β€” regardless of plan, allowlist, or any other permission. PAPER works in DANGEROUS: a hostile market is a great time to test strategies on paper rather than on real money. The current regime is open to everyone: api/v1/market/regime.

The kind of contract this is

Most bots in this category optimise for volume β€” more trades, more fees, more vendor revenue. We optimise for "don't lose the user's money on a bad day." This reduces our own revenue during volatile periods, and we consider that a conscious trade-off.

4. Self-custody β€” by construction, not by promise

Quantor doesn't hold your money. Ever. By design:

  • You create the exchange API key yourself on the venue you pick in the dashboard. Required permissions: spot trading only, withdrawals disabled β€” keys with withdrawal permission are rejected during save and verification.
  • The key is encrypted with an AES-GCM master key that lives in GCP Secret Manager β€” a separate trust boundary from the database.
  • The database holds only the encrypted blob + last4 + a verified=true/false flag.
  • Even if Quantor's database leaks β€” keys can't be decrypted without the master key. And even if decrypted, funds can't be withdrawn β€” the exchange key forbids it.

5. Tamper-evident audit chain (Layer B)

Every audit-relevant event written through the API is recorded with a keyed hash that depends on the previous one: chain_hash = HMAC‑SHA256(secret, prev_hash || sha256(canonical_payload)). Any attempt to silently modify or delete a record after the fact breaks the chain β€” subsequent hashes stop matching. The HMAC secret lives in Secret Manager, outside the database, which is the point: an intruder holding the database cannot recompute a forged chain. The verifier endpoint reproduces the head hash server-side, and the Pulse probe obs.audit-chain.head checks integrity every hour.

The one exception, stated rather than buried

If the worker cannot reach the API at the moment a trade closes, it writes the fill straight to the ledger rather than lose it β€” a missing close would corrupt a track record far worse than an unchained one would. A row written that way carries no per-trade signature and no chain entry, because both are produced on the API path. As of 2026-08-31 this has happened twice: two closes on 2026-07-21, out of 203 rows since per-trade signing began. Both sit in the ledger with correct PnL, and neither is ever served as β€œverified” β€” the public verifier returns not-found for an unsigned row instead of pretending. A separate hourly sweep — the ledger-integrity sentinel, not the head-integrity probe above — counts the unsigned rows and any audit-chain shortfall, so the number is measured rather than discovered later.

Threat model

The scenario "a future intruder with database access quietly deletes a bad trade and pretends it never happened" β€” caught arithmetically. The scenario "a future founder edits history to suit themselves" β€” same. The chain cannot be forged without holding every key and every hash.

6. Pulse β€” one-click synthetic probe

13 probes through every layer of the stack in ~10 seconds. Side-effect free β€” writes nothing, sends no messages to real users, buys nothing. If anything turns red, the row shows the exact file:method:line where the chain broke. It isn't a "notification" β€” it's a real synthetic test scenario the operator runs after every deploy.

What it checks

ProbeWhat it verifies
healthAPI is alive
db.readSELECT 1 round-trip via JPA
db.writeinsert + delete on pulse_runs
plan.catalog3 paid plans, limits match the source code
strategy.catalog7 strategies registered
market.regimeregime detector returns a valid MarketRegime
worker.heartbeatworker wrote a heartbeat ≀ 60s ago
pipeline.dry-runEMA strategy processes 100 synthetic candles
audit-chain.headhash chain reproduces correctly
sentryDSN is configured
build.signatureEd25519 signature verifies against the committed public key

Compared to a typical crypto-bot SaaS

Open numbers from public pricing pages as of June 2026. Not an attack on competitors β€” just facts.

Typical bot SaaS Quantor
Build signature none β€” unverifiable Ed25519, public key
Risk policy usually one β€” a stop-loss 14 gates + regime guard
Custody sometimes opaque API keys, withdraw disabled
Audit chain plain log (deletable) hash chain (delete = break it)
Entry price $25–30/mo $19/mo
Telegram-native control notifications only bot commands + Mini-App

Ready to verify it yourself?

Everything above is not a promise β€” it's a set of endpoints open right now. Start by checking the current signature, then take a look at pricing.

The same discipline applied to money: what our API keys can and cannot do, why the founder's real capital is parked rather than traded, and what is signed monthly β€” the Treasury policy.