Supabase and Postgres.
Where your data lives, and who can reach it.
Most systems we build keep their data in Postgres, through Supabase. The interesting part is not the database, it is where the access rules live — and the answer should always be "at the data", not "in the pages".
Start a projectThe rules that keep your data yours
Deny by default, at the table
Every table has row-level security on, and anonymous access revoked, before it holds anything. A missed check in a page then cannot expose a record, because the database refuses it. That is the difference between a bug and a breach.
Private storage and links that expire
Documents, CVs and uploads live in private buckets reached through signed links with an expiry, never in a public folder with an unguessable name. An unguessable URL is not a permission.
Server-side keys stay server-side
The key that can read everything never reaches a browser. We check the built output for it rather than assuming, because that mistake is invisible until somebody finds it.
Writes that cannot fail silently
The client library does not throw on a failed write, so every money or customer write is checked explicitly. "200 OK, no row" is a real failure mode and it has cost other people real orders.
Migrations, honestly
Applied means proved
A migration is applied when the database’s own schema says the column exists, not when a file is in a folder. We check the live schema rather than the ledger, because the two disagree more often than anybody expects.
Migrate first, deploy second
Pages degrade when a table is missing, so schema goes first and the deploy follows. Hosting platforms do not run your migrations for you.
Row counts before and after
Taken on every deploy that touches data, and reported. "No data changed" should be a measurement, not a reassurance.
When Postgres is the wrong answer
A single JSON document is sometimes enough
One of our live ordering systems keeps its whole store in one document, deliberately, because it is read constantly and written by one shop. The cost is that concurrent writes need care, and we chose it knowing that.
Files are not database rows
Images, PDFs and video belong in storage with a reference in the database. Putting them in the database is how a small system becomes a slow one.
Before you ask.
Who can see our data?
Can we get our data out?
Is it GDPR-appropriate?
What about backups?
- Cloud and security →The wider picture: hosting, access, monitoring.
- Controller and processor →Who is responsible for what, in plain words.
- Next.js →The application layer in front of it.
- Stripe →Server-side re-pricing, webhooks as the only writer of paid orders, Apple Pay, and Connect.
- React Native and Expo →Cross-platform apps in one codebase, and an honest answer about whether you need one.
Ready to get started?
Tell us what you need. We will scope it, price it and build it.
Start a project →