Neon vs Supabase vs Turso 2026
Serverless databases for JavaScript developers split into two camps in 2026: serverless Postgres (Neon, Supabase) and distributed SQLite (Turso, Cloudflare D1). The choice isn't just about features — it's about the architecture trade-off between a familiar Postgres-compatible interface and the edge-native model of SQLite replicated globally.
Here's the honest comparison of the three most developer-relevant options.
TL;DR
Neon is the best pure serverless Postgres — scale-to-zero, instant branching for preview environments, and the fastest cold starts in managed Postgres. Supabase is more than a database — it's a full Backend-as-a-Service with auth, storage, and realtime built in. If you need a full backend platform, Supabase wins. If you need serverless Postgres for a Next.js app with your own auth layer, Neon wins. Turso is the right choice for edge/serverless apps that need read performance near users globally — SQLite replicated to 300+ edge locations, with sub-millisecond reads from anywhere.
Key Takeaways
- Neon free tier: 0.5 GB storage, 100 projects, scale-to-zero — best serverless Postgres for solo developers
- Supabase free tier: 500 MB storage, 2 projects, weekly pause after inactivity — full BaaS platform
- Turso free tier: 100 databases, 5 GB storage, 500M row reads/month — cheapest paid tier at $4.99/mo (500 active DBs, 9 GB)
- Cold start latency: Neon ~500ms (scale-to-zero resume), Supabase free ~10-30s pause resume (no cold start on paid), Turso effectively none (scale-to-zero deprecated Jan 2026)
- All three support Drizzle and Prisma — ORM choice is not a differentiator
- Branching/preview envs: Neon (instant, git-like) > Supabase (manual, slower) > Turso (per-database, instant)
At a Glance
| Neon | Supabase | Turso | |
|---|---|---|---|
| Database | PostgreSQL 16 | PostgreSQL 15 | SQLite (libSQL) |
| Free tier storage | 0.5 GB | 500 MB | 5 GB |
| Free tier DBs | 100 projects | 2 projects | 100 databases |
| Scale to zero | ✅ | ✅ (pauses weekly) | ⚠️ Deprecated Jan 2026 |
| Cold start | ~500ms | ~10-30s (free) / none (paid) | None (always-on) |
| Edge deployment | ❌ | ❌ | ✅ 300+ locations |
| Branching | ✅ Instant | ⚠️ Manual | ✅ Per-database |
| Auth built-in | ❌ | ✅ | ❌ |
| Storage built-in | ❌ | ✅ | ❌ |
| Realtime built-in | ❌ | ✅ | ❌ |
| Prisma support | ✅ | ✅ | ✅ (via adapter) |
| Drizzle support | ✅ | ✅ | ✅ Native |
| HTTP/fetch API | ✅ | ✅ | ✅ |
| Open source | ✅ (OSS server) | ✅ (AGPLv3) | ✅ (libSQL) |
| Pricing (paid) | From $19/mo | From $25/mo | From $4.99/mo |
Neon: Serverless Postgres Done Right
Neon's architecture separates compute from storage. When your database is idle, the compute shuts down (scale to zero) — you pay nothing. When a request arrives, Neon spins up in ~500ms. This is the fastest cold start in managed Postgres and is acceptable for most workloads — but if you're building a latency-sensitive user-facing API, factor it in. This model makes Neon uniquely cost-effective for intermittent traffic: development databases, preview environments, low-traffic apps.
// Neon connection with @neondatabase/serverless
import { neon } from '@neondatabase/serverless'
// HTTP-based driver — works in edge runtimes, no connection pooling needed
const sql = neon(process.env.DATABASE_URL!)
// In a Next.js route handler:
export async function GET(req: Request) {
const users = await sql`SELECT * FROM users LIMIT 10`
return Response.json(users)
}
// With Drizzle ORM:
import { drizzle } from 'drizzle-orm/neon-http'
import { neon } from '@neondatabase/serverless'
import * as schema from './schema'
const sql = neon(process.env.DATABASE_URL!)
export const db = drizzle(sql, { schema })
// Full type-safe queries:
const users = await db.select().from(schema.users).where(eq(schema.users.active, true))
Neon Branching is the killer feature for developer workflows:
# Create a branch for each PR — instant, costs nothing until data is written
neon branch create --name pr-feature-123 --parent main
# Branch has its own connection string — preview deploys use branch DB
# Merge PR → delete branch → no orphaned databases
# Reset a development database to production state instantly:
neon branch reset dev --parent main
Neon branches are copy-on-write — creating a branch from a 10GB database takes milliseconds and costs zero additional storage until you write to it. This makes preview environment databases viable at scale.
Neon's limitations:
- Postgres only — no built-in auth, storage, or realtime (you bring your own)
- Single-region compute (though storage is redundant) — not truly multi-region
- Cold start of ~500ms is the best in managed Postgres but noticeable for user-facing latency-sensitive APIs
- WebSockets not supported in the serverless HTTP driver (use
pgdriver + connection pooler for subscriptions)
Pricing:
- Free: 0.5 GB storage, 100 projects, 100 compute hours/month (scale to zero), no credit card
- Launch: $19/mo — 10 GB, unlimited projects, more compute hours
- Scale: $69/mo — 50 GB, auto-scaling compute, $0.35/GB-month storage (reduced post-Databricks acquisition)
Supabase: The Full Backend Platform
Supabase is positioned differently from Neon. It's not just a database — it's a Firebase alternative built on Postgres. Auth, storage, edge functions, realtime subscriptions, and vector (pgvector) come out of the box. If you need all of that, Supabase saves significant integration work.
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
// Auth — built-in, no separate service needed
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'github',
})
// Realtime subscriptions — Postgres changes via WebSocket
const channel = supabase
.channel('db-changes')
.on('postgres_changes', {
event: 'INSERT',
schema: 'public',
table: 'messages',
}, (payload) => console.log(payload.new))
.subscribe()
// Storage
const { data: uploadData } = await supabase.storage
.from('avatars')
.upload(`user-${userId}.jpg`, file)
Row Level Security (RLS) is Supabase's unique approach to data access control — define authorization rules directly in the database:
-- Supabase RLS: users can only read their own data
CREATE POLICY "Users can view own profile"
ON profiles
FOR SELECT
USING (auth.uid() = user_id);
-- Service role (server-side) bypasses RLS
-- Anon key respects RLS — safe to use in client-side code
Supabase's limitations:
- Free tier pauses after 1 week inactivity — resume can take 10-30s (no cold start on paid plans)
- Less flexible for pure database use cases — you're adopting a platform, not just a DB
- Self-hosting is more complex than competitors (12+ Docker containers)
- pgvector performance at scale lags dedicated vector databases (Pinecone, Qdrant)
Pricing:
- Free: 500 MB, 2 projects, pauses after 1 week inactivity
- Pro: $25/mo — 8 GB, unlimited projects, no pausing, daily backups
- Team: $599/mo — HIPAA, SSO, priority support
Turso: SQLite at the Edge
Turso is built on libSQL, a fork of SQLite, and replicates your database to edge locations worldwide. The model is fundamentally different from Neon and Supabase: instead of one centralized Postgres server, your SQLite database is embedded at edge nodes near your users.
January 2026 update: Turso deprecated scale-to-zero for new users. New databases on AWS are always-on — no cold starts, but no automatic idle savings either. The trade-off is better latency predictability; you pay the (very low) flat compute cost instead of cold start penalties.
import { createClient } from '@libsql/client'
// Turso HTTP client — works in Cloudflare Workers, Deno, Bun, Node.js
const client = createClient({
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
})
// Runs from the edge node closest to the user
const result = await client.execute('SELECT * FROM users WHERE id = ?', [userId])
const user = result.rows[0]
// With Drizzle ORM (native libSQL support):
import { drizzle } from 'drizzle-orm/libsql'
import { createClient } from '@libsql/client'
const client = createClient({ url: process.env.TURSO_DATABASE_URL!, authToken: '...' })
export const db = drizzle(client)
// Same Drizzle API — fully typed
const users = await db.select().from(usersTable).limit(10)
Multi-database architecture is Turso's unique feature — 100 databases on the free plan, unlimited on the $4.99/mo Developer tier:
# Create a database per tenant (multi-tenancy pattern)
turso db create tenant-acme # Isolated database for Acme Corp
turso db create tenant-widgets # Isolated database for Widgets Inc
# Each tenant gets completely isolated storage and query performance
# No cross-tenant query impact — unlike shared Postgres schemas
Performance characteristics:
Read latency (from user in Tokyo to database):
Turso (edge): ~5ms (replicated to Tokyo edge node)
Neon (us-east): ~180ms (round trip to Virginia)
Supabase (us-east): ~180ms
Write latency (all writes go to primary region):
Turso: ~80ms from Tokyo to primary
Neon: ~5ms (if in same region as primary)
Supabase: ~5ms (if in same region as primary)
Turso's edge model optimizes reads dramatically.
Writes require a round-trip to the primary region.
Turso's limitations:
- SQLite constraints: no stored procedures, limited JOIN performance at scale, different data types than Postgres
- Not a drop-in Postgres replacement — applications using Postgres-specific features need modification
- Writes are slower from edge locations (must reach primary region)
- Not suitable for write-heavy workloads
Pricing:
- Free: 100 databases, 5 GB storage, 500M row reads/month, 25M row writes/month
- Developer: $4.99/mo — unlimited databases (500 monthly active), 9 GB storage
- Scaler: $24.92/mo — 2,500 active databases, 24 GB
- Pro: $416.58/mo — 10,000 active databases, 50 GB
The Right Database for Common Stacks
Next.js on Vercel: → Neon — best cold-start Postgres, native Vercel integration, branching matches PR workflow
Cloudflare Workers / Edge-first app: → Turso — only option with true edge SQL reads; or Cloudflare D1 (Turso-compatible API)
Full-stack SaaS, need auth + storage + DB: → Supabase — avoid integrating three separate services; RLS handles access control elegantly
Multi-tenant SaaS, database-per-tenant: → Turso — unlimited databases at $4.99/mo, instant provisioning, isolated tenant performance
API with complex Postgres queries (CTEs, window functions, pgvector): → Neon or Supabase — SQLite's SQL dialect lacks Postgres-specific features
Serverless with unpredictable traffic spikes: → Neon — true scale-to-zero means no idle costs; autoscales compute instantly on load
Compare Neon, Supabase, and Turso on PkgPulse.
Related: Neon vs Supabase vs Tembo · Cloudflare Durable Objects vs Upstash vs Turso
See the live comparison
View neon vs. supabase vs turso on PkgPulse →