| One workspace reading another’s layouts, drawings, watchlists or alerts | The workspace filter is applied by the database client rather than by each query, and foreign keys carry the workspace so a cross-workspace reference cannot even be stored. A test sets up two workspaces and tries to read, count and write across, on every release. | Market data itself is public and deliberately unscoped: instruments and candles are identical for every workspace and are not workspace-owned rows. |
| A stolen database dump becoming a set of live credentials | Passwords are scrypt hashes. Session tokens, invitations and API keys are stored as SHA-256 digests — the key itself is shown once, at creation, and never stored. Provider keys you supply are encrypted with a server key that is not in the database. | A dump still contains your email address, your workspace’s contents and your instrument choices. Hashing protects credentials, not data. |
| A password-guessing script against the sign-in form | Per-IP throttling on the authentication endpoints, and scrypt’s deliberate cost, which makes offline guessing expensive even if hashes leak. | The throttle is in-process and per replica, so it is sized for a script and not for a distributed attack. It is not a web application firewall and nothing important is defended by it alone. |
| A webhook target used to reach something inside our network | A URL you supply is resolved first, and refused if the resolved address is private, loopback, link-local or a cloud metadata endpoint — checked at the address rather than at the hostname, because a name can resolve somewhere else the second time it is asked. | We cannot vouch for what happens at your endpoint. Payloads are signed with your secret so you can verify the sender; verifying is your side of that. |
| A runaway integration spending a whole workspace’s API allowance | The request budget is per key rather than per workspace, so one looping cron cannot take the other integrations down with it. Keys are revocable individually. | The per-minute budget is an in-memory throttle per replica, honest about its weight. The durable usage number is metered separately and is the one a plan would ever be argued over. |
| A member of your workspace doing something expensive | Roles gate writing: settings, billing, members and provider credentials are admin-only, and a viewer seat can read everything and change nothing. | Reading is workspace-wide by design — anyone in a workspace can open any layout in it. And a role check cannot stop a member spending a shared provider budget, so that is bounded by a counter on the key instead. |