How do I know my backend is safe to deploy?

The question is simple and almost nothing answers it: who can read this table? Here is how to find out before you ship, rather than after.

Why this keeps going wrong

More backends are shipping than ever, written faster than ever, often by people who did not read the access rules that came with them. The default gets shipped. Nobody notices until someone else does.

This is not hypothetical. A permissive default is what put thousands of indie apps online with their user tables readable by anyone holding a public key.

Why the usual tools do not help

Every scanner for this works from the outside. You hand it a live URL, it pulls your config out of your own frontend bundle, and it probes your tables the way an attacker would. That only works once the app is public, which means it only ever tells you about a leak after strangers could already read the data.

Answering it offline instead

CrescoDB owns your schema, so the same question can be answered from a file in version control, before anything leaves your machine.

$ cresco audit Appointment is readable by anyone, and holds sensitive personal data Anyone on the internet can list every row with no token. Columns: diagnosis. fix: Add "access": { "read": ["authenticated"] } to Appointment. 1 critical, 0 warning, 1 note This project would be refused by `cresco deploy`.

Graded by what is exposed, not whether

This is the part worth understanding, because it is why the check stays useful.

A checker that cries wolf gets muted, and a muted checker protects nobody.

Wiring it into CI

cresco audit --json gives machine-readable findings and a blocksDeploy verdict, and exits non-zero on a critical, so a pipeline can gate on it.

Catching it while you type

The VS Code extension runs the same audit on save and puts findings as squiggles on the offending line, with a quick fix on the lightbulb. Same implementation as the deploy check, so the editor and the deploy can never disagree.

Common questions

Does this need my app to be deployed?

No. The audit reads the schema file in your repo and runs offline. That is the point: it works before anything is public.

Will it block a deploy I actually want?

Only on a critical finding, which means a publicly readable table holding personal data. A deliberately public table with no personal data is reported as a note and does not block anything. There is also an escape hatch flag.

Is this the same as row level security?

They work together. The audit tells you which tables are exposed and which have no per-row ownership. Per-row rules are what actually stop one user reading another user's rows at runtime.

Keep reading
The CrescoDB VS Code extensionAccess findings as squiggles in schema.cresco on save, with quick fixes on the lightbulb and… Connecting your coding agentSet up the CrescoDB MCP server so Claude Code, Cursor or Codex can read your real schema, ch…

Try it

$ npm i -g crescodb

Local development is free forever. No account, no card. Read the docs or see pricing.