Comparison

SvelteKit + Postgres vs SvelteKit + Supabase

Two SvelteKit paths to Postgres: connect to your own Postgres with Drizzle, or let Supabase manage auth, database, realtime, storage, and RLS for you. Both are valid — here is the honest tradeoff, with the VerdantStack Postgres starter and Supabase starter as concrete implementations.

Feature comparison

Database

Postgres Starter: Any Postgres — Neon, Railway, Supabase-direct, Fly.io, or self-hosted (docker-compose). Drizzle ORM + postgres.js pooled driver, drizzle-kit migrations.
Supabase Starter: Postgres managed by Supabase — the same engine, hosted, dashboarded, and upgraded for you.

Same database engine. Ours is provider-neutral; Supabase bundles and manages it.

Authentication

Postgres Starter: Custom auth in your codebase: scrypt password hashing, DB-backed hashed sessions (revocable), sliding-window failed-attempt rate limiting.
Supabase Starter: Supabase Auth managed: email+password, magic links, OAuth, password recovery.

Supabase wires faster; ours keeps auth fully under your control with no external service.

Row-level security

Postgres Starter: Opt-in Postgres RLS (rls/ policies): low-privilege app role, FORCE RLS, per-request app.current_user_id GUC. App layer is the tenancy boundary by default because pooled connections carry no per-user identity.
Supabase Starter: Native Supabase RLS with per-request auth.uid() — tenant isolation at the database by default.

Both reach database-level RLS; Supabase is turnkey, ours is a documented defense-in-depth layer you enable.

Connection pooling

Postgres Starter: In-process postgres.js pool (PG_MAX_CONNECTIONS, default 20) plus PgBouncer/Supavisor config guidance for higher concurrency.
Supabase Starter: Managed pooling (Supavisor) built into the platform.

Supabase ships pooling; ours ships the config plus docs to set it up on any provider.

Realtime

Postgres Starter: Not included — add your own (WebSockets or a service).
Supabase Starter: Supabase Realtime built in — subscribe to database changes out of the box.

Clear Supabase win if your product needs live updates.

Storage

Postgres Starter: Not included — use S3-compatible storage or a service.
Supabase Starter: Supabase Storage built in (S3-compatible).

Supabase wins for bundled file storage.

Dashboard & tooling

Postgres Starter: None — psql or your own tooling, plus whatever your Postgres provider offers.
Supabase Starter: Supabase Dashboard — table editor, SQL editor, auth users, logs.

Supabase gives you a GUI; ours keeps you in your own tooling.

Provider lock-in

Postgres Starter: None — a connection string is the only dependency. Point it anywhere and re-run migrations.
Supabase Starter: Auth, RLS, realtime, and storage all tie you to the Supabase platform.

This is the crux: neutrality and control vs managed convenience.

Cost at scale

Postgres Starter: Postgres only — roughly $0–$7/mo on Neon or Railway free/small tiers plus your app hosting [ESTIMATE from our market research].
Supabase Starter: Generous free tier; features like read replicas and advanced pooling sit on the paid plan at roughly $25/mo+ [ESTIMATE].

Direct Postgres is generally cheaper as you grow; Supabase charges for managed extras.

Multi-tenant foundation

Postgres Starter: SvelteKit + Postgres Starter (v0.1.0): orgs, memberships, single-use hashed invites, RBAC (owner > admin > member), seat billing seam, append-only audit log — 194 tests against a real Postgres test database.
Supabase Starter: SvelteKit + Supabase Starter (v0.2.1): the same service layer — orgs, invites, RBAC, billing, audit — with Supabase RLS as the tenancy boundary; 198 tests.

Same SaaS seams and hardening; the tenancy boundary differs (service layer vs RLS-first).

Price & license

Postgres Starter: $79 early-bird → $129 standard, one-time, one license, lifetime updates + lifetime standard support, 30-day refund.
Supabase Starter: $99 early-bird → $179 standard (per our market research), one-time license with the same support terms.

Same value proposition; the Postgres kit is priced a little lower.

The tradeoffs

Managed convenience (Supabase)

Auth, realtime, storage, a dashboard, and RLS with a real per-request identity come out of the box. The tradeoff is that you now operate inside Supabase ecosystem, its feature set, its pricing, and its upgrade path. Migration away means moving auth, RLS policies, and storage, not just a connection string.

Control and neutrality (Postgres direct)

A connection string is the whole dependency. You can use any provider, switch providers, or self-host. You keep full Postgres power — read replicas, JSONB, full-text search, extensions — which the starter documents as add-yourself patterns. The cost is that auth and tooling are yours: the starter ships custom scrypt auth and 194 tests so you are not starting from zero.

What both share

Both VerdantStack kits run the identical SvelteKit service layer for orgs, invites, RBAC, seat billing, and the append-only audit log. Choosing between them is mostly choosing your tenancy boundary and your infrastructure appetite — which is exactly why both starters exist.

When to choose which

Choose SvelteKit + Postgres (this starter) if you need:

  • • No provider lock-in — any Postgres, switchable at will
  • • Full Postgres control: read replicas, JSONB, full-text search, extensions
  • • Custom auth in your codebase, not a managed service
  • • Lower cost at scale: $0–$7/mo direct Postgres [ESTIMATE]
  • • A tested tenancy layer: 194 tests, RBAC, invites, billing, audit

Choose SvelteKit + Supabase (the other starter) if you need:

  • • Managed auth (OAuth, magic links) without building it
  • • Realtime and storage without standing up services
  • • A dashboard for day-to-day database work
  • • RLS as the default tenancy model with per-request identity
  • • Least infrastructure to think about at launch

Bottom line

There is no wrong answer — the same SvelteKit service layer powers both. Supabase trades a little control for a lot of convenience: turnkey auth, realtime, storage, and RLS. Direct Postgres trades that convenience for provider neutrality, full database control, and a lower cost trajectory. If your product is live-data-heavy or you want the cheapest path to scale, Postgres direct wins. If you want to move fastest with managed batteries included, Supabase wins. Neither choice locks your architecture in permanently — the driver is the only thing that changed between the two kits.

Related reading

Get in touch

Questions about the product, team licenses, or anything else? We'll respond within 48 hours.

Max 2000 characters

Stored in our own database — no third party. Deleted on request.