Security
The controls, and the things we deliberately cannot do.
Written for somebody who intends to check. Every control below corresponds to code in this repository, and everything we have not built is listed as plainly as everything we have.
- Isolation policies
- 95Forced on every tenant table, binding on writes
- Capabilities
- 69Across 8 roles
- Integrity rules
- 26Over the whole ledger
- Government connections
- 0By design, and by absence of credentials
Isolation on every query, and in the database
It refuses to start in an unsafe posture
A tamper-evident audit trail
Capability-based permissions
API keys that cannot exceed their holder
Uploads treated as hostile
Never stored
The list, in full
Not a philosophy. Seven specific things that are absent from the schema, and can be confirmed to be absent from it.
- Plaintext passwords — credentials are hashed with a slow, salted algorithm and never logged.
- Bank credentials. There is no bank feed, so there is nothing to store; statements are files you import.
- GST portal credentials. Nothing here can log in to a government system.
- API keys in the repository. `.env.example` carries names, never values.
- Payroll figures in logs. Salary data never reaches a log line, at any level.
- Card or payment details. There is no payment provider connected.
- Anything from a government portal. No portal is scraped, ever.
The chain is per tenant and sequenced, so two companies writing at the same moment cannot interleave into each other’s history. Verification walks it end to end and reports the first sequence number where the recomputed hash stops matching.
Statutory work
Nothing is filed on your behalf. Ever.
This is the single most important sentence on the site, so it gets a section rather than a footnote.
- No credential exists. There is no field, column or environment variable anywhere in this system for a GST portal login, a digital signature, or an e-invoicing provider’s production key.
- The integration is a mock. The e-invoicing and e-way bill screens run against a provider interface with a mock implementation. It returns SANDBOX identifiers and the screen says so before it shows you one.
- Those identifiers must not reach a customer. A SANDBOX IRN issued as a real e-invoice is a compliance failure. The screen states this in as many words, and it is repeated in the footer of every page on this site.
- If a real provider is ever connected, it will be behind an explicit authorised action, a final validation, a confirmation screen, logged consent, stored provider responses, and idempotency protection — the design is already written that way, and none of those steps exist to be skipped.
Questions
Asked by the people who ask hardest
Are you SOC 2 or ISO 27001 certified?
What happens if someone gets read access to the database?
Where does my data live?
Has it been penetration-tested?
Does any of my data go to an AI provider?
How do I report a vulnerability?
Ask the hard question, then decide.
Everything on this page is a property of the system rather than a policy about it. If something here is not specific enough, ask.