PlanetScale Killed Its Free Tier — So Where Do You Go Now?
In early 2024, PlanetScale quietly ended its Hobby plan — the free tier that tens of thousands of developers had been using for side projects, prototypes, and small production apps. The announcement landed like a cold shower. Suddenly, projects that had been humming along on zero-cost MySQL infrastructure needed a new home.
That moment accelerated something that was already happening: developers switching to PostgreSQL. And in 2026, the two best free PostgreSQL options for developers are Supabase and Neon.
Both are free. Both run PostgreSQL. Both work with your existing ORM and database client. But they’re built around very different philosophies — and the right choice depends entirely on what you’re building. This guide breaks down everything you need to know to pick the right one.
Quick Comparison: Supabase vs Neon Free Tiers
| Feature | Supabase (Free) | Neon (Free) |
|---|---|---|
| Database | PostgreSQL 15 | PostgreSQL 16 |
| Storage | 500 MB | 512 MB |
| Compute | Shared, pauses after 1 week inactivity | 0.25 vCPU / 1 GB RAM, auto-suspends after 5 min |
| Projects / Databases | 2 active projects | 10 databases per project |
| Branching | No | Yes — unlimited branches |
| Built-in Auth | Yes — email, OAuth, magic links | No |
| REST/GraphQL API | Auto-generated from your schema | No |
| Edge Functions | 500K invocations/month | No |
| Storage (Files) | 1 GB | No |
| Realtime | Yes (200 concurrent connections) | No |
| pgvector | Yes | Yes |
| Connection Pooling | PgBouncer built-in | Neon proxy (HTTP + WebSocket) |
| Credit Card Required | No | No |
| Best For | Full-stack apps with auth + storage | Dev branches, AI/serverless workloads |
The short version: Supabase is a full Firebase replacement — it bundles auth, file storage, realtime, and edge functions on top of PostgreSQL. Neon is laser-focused on the database itself, with a standout feature called branching that every developer should know about.
What Is Supabase?
Supabase is an open-source Firebase alternative built entirely on PostgreSQL. Founded in 2020, it raised $80 million and now serves millions of developers. The hosted version is free to start, and the entire platform can also be self-hosted.
The pitch is simple: instead of wiring together a database + auth provider + file storage + API layer yourself, Supabase gives you all of that in one place, all talking to the same PostgreSQL database underneath.
When you create a Supabase project, you get:
- A real PostgreSQL database (not a wrapper, not a proxy — actual Postgres)
- A PostgREST layer that auto-generates a REST API from your tables
- GoTrue for authentication (email/password, OAuth, magic links, phone OTP)
- A storage service for files and images
- Realtime subscriptions via WebSocket
- Deno-based edge functions
- A dashboard UI that’s genuinely pleasant to use
For a lot of projects, this completely replaces what you’d previously build with Express + Passport + Multer + a websocket server + a bunch of custom middleware.
Supabase Free Tier: What You Actually Get
The free tier is called the Free Plan. Here’s what matters in practice:
- Database storage: 500 MB — enough for most side projects and prototypes. A typical app with a few thousand users and moderate data rarely hits this.
- File storage: 1 GB via Supabase Storage
- Auth: Up to 50,000 monthly active users — this is enormous. Most free-tier apps will never hit this ceiling.
- Edge Functions: 500,000 invocations per month
- Realtime: 200 concurrent connections, 2 million messages/month
- Bandwidth: 5 GB per month
- 2 active projects — you can have more, but only 2 are active at once
The one catch: projects pause after 1 week of inactivity. When a paused project gets its first request, it restarts — but this takes 1–2 seconds. For a side project you check occasionally, this is annoying. For anything in active development or light production use, you likely won’t notice it.
Getting Started with Supabase
1. Create Your Free Project
- Go to supabase.com and sign up with GitHub
- Click “New Project”, choose a region close to your users
- Set a strong database password (save it — you’ll need it for direct connections)
- Wait ~2 minutes while Supabase provisions your instance
Once your project is ready, grab your credentials from Project Settings → API. You’ll need the URL and anon key for client-side usage, or the connection string for direct Postgres access.
2. Connect with the Supabase JavaScript Client
npm install @supabase/supabase-js
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
'https://yourproject.supabase.co',
'your-anon-key'
)
// Insert a row
const { data, error } = await supabase
.from('notes')
.insert({ title: 'My first note', content: 'Hello from Supabase' })
.select()
console.log(data)
// Query with filters
const { data: notes } = await supabase
.from('notes')
.select('*')
.eq('published', true)
.order('created_at', { ascending: false })
.limit(10)
console.log(notes)
3. Connect with Python (psycopg2 / SQLAlchemy)
pip install psycopg2-binary sqlalchemy
import psycopg2
conn = psycopg2.connect(
host="db.yourproject.supabase.co",
database="postgres",
user="postgres",
password="your-db-password",
port=5432
)
For Python apps that need connection pooling (e.g. FastAPI, Django), use the Transaction mode connection string from Project Settings → Database → Connection string → Transaction mode. This routes through PgBouncer and is much more efficient for serverless or high-concurrency scenarios.
4. Built-in Auth — Zero Config
// Sign up a new user
const { data, error } = await supabase.auth.signUp({
email: 'user@example.com',
password: 'securepassword123'
})
// Sign in
const { data: session } = await supabase.auth.signInWithPassword({
email: 'user@example.com',
password: 'securepassword123'
})
// OAuth (GitHub, Google, Discord, etc.)
await supabase.auth.signInWithOAuth({ provider: 'github' })
Authentication rows are stored in a auth.users table that Supabase manages internally. You can join against it from your own tables and use Row Level Security (RLS) to enforce “users can only read their own data” rules directly in the database.
5. Row Level Security Example
-- In the Supabase SQL editor:
-- Create a notes table
CREATE TABLE notes (
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
user_id uuid REFERENCES auth.users NOT NULL,
content text,
created_at timestamptz DEFAULT now()
);
-- Enable RLS
ALTER TABLE notes ENABLE ROW LEVEL SECURITY;
-- Users can only see their own notes
CREATE POLICY "Users can read own notes"
ON notes FOR SELECT
USING (auth.uid() = user_id);
-- Users can only insert their own notes
CREATE POLICY "Users can insert own notes"
ON notes FOR INSERT
WITH CHECK (auth.uid() = user_id);
This is one of Supabase’s best features: security rules live in the database, not scattered across API handlers. Whether a request comes through the JavaScript SDK, REST API, or direct SQL, the same rules apply.
What Is Neon?
Neon is a serverless PostgreSQL platform that launched in 2022 with a fresh take on the database problem: separate storage from compute. Instead of a traditional “always on” Postgres instance, Neon’s compute nodes can scale down to zero when idle and spin back up on demand.
This architecture has one major practical benefit for the free tier: you’re not paying for idle compute. Neon’s free tier genuinely handles this well — your database suspends after 5 minutes of inactivity and wakes up in a few hundred milliseconds when the next query arrives.
Neon is 100% standard PostgreSQL (currently PG 16). There’s no proprietary query language or SDK. If you can connect to Postgres, you can connect to Neon. It’s also the database used by Vercel Postgres (which is built on Neon under the hood).
The feature that sets Neon apart from everything else: database branching.
Neon Free Tier: What You Actually Get
- Compute: 191.9 compute hours per month — at 0.25 vCPU, that works out to roughly 767 active hours/month (or most of the month if you’re not running heavy queries)
- Storage: 512 MB
- Databases: Unlimited databases within one project
- Projects: 1 project on the free tier
- Branches: 10 branches (each branch is an instant copy-on-write snapshot)
- Connection pooling: Neon’s built-in HTTP proxy
- Autoscaling: Suspends after 5 minutes of inactivity; wakes in ~300ms
The 1-project limit on the free tier is the main constraint. Everything runs inside that one project — but you can create multiple databases and branches within it, so in practice it’s less limiting than it sounds.
Neon’s Killer Feature: Database Branching
Branching is what makes Neon genuinely different from every other hosted database. Here’s how it works: a branch is an instant, zero-cost copy-on-write snapshot of your database. Creating a branch takes milliseconds and costs almost no storage because unchanged pages are shared between branches.
Why does this matter?
- Preview deployments: Vercel and other platforms can create a fresh database branch for every pull request. Your PR gets its own isolated database with real production data (or a sanitized copy). No more “PR broke staging because someone else was testing there.”
- Testing with production data: Branch from production, run your migration, test it. If something breaks, delete the branch. Your production database is untouched.
- Development environments: Each developer gets their own branch. No shared dev database with conflicting data.
# Install Neon CLI
npm install -g neonctl
# Authenticate
neonctl auth
# Create a branch from main
neonctl branches create --name feature/add-users --parent main
# List your branches
neonctl branches list
# Get connection string for a specific branch
neonctl connection-string feature/add-users
You can also manage branches via the Neon dashboard or REST API. GitHub Actions integration is available for automating branch creation on PR open and deletion on PR merge.
Getting Started with Neon
1. Create Your Free Account
- Go to neon.tech and sign up with GitHub
- Create your first project — choose a region and PostgreSQL version
- Copy your connection string from the dashboard
2. Connect with Python
pip install psycopg2-binary
import psycopg2
import os
conn = psycopg2.connect(os.environ['DATABASE_URL'])
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
)
""")
cursor.execute(
"INSERT INTO users (email) VALUES (%s) RETURNING id",
("alice@example.com",)
)
user_id = cursor.fetchone()[0]
conn.commit()
print(f"Created user with ID: {user_id}")
3. Connect with JavaScript (Neon Serverless Driver)
Neon has a serverless HTTP driver that works in edge runtimes like Cloudflare Workers and Vercel Edge Functions — environments where you can’t use TCP connections:
npm install @neondatabase/serverless
import { neon } from '@neondatabase/serverless'
const sql = neon(process.env.DATABASE_URL)
// Simple query
const users = await sql`SELECT * FROM users WHERE active = true LIMIT 10`
console.log(users)
// Parameterized query (safe from SQL injection)
const email = 'alice@example.com'
const user = await sql`SELECT * FROM users WHERE email = ${email}`
console.log(user[0])
4. Use with an ORM (Drizzle)
Neon works great with Drizzle, the TypeScript-first ORM that’s become popular for edge deployments:
npm install drizzle-orm @neondatabase/serverless
npm install -D drizzle-kit
import { drizzle } from 'drizzle-orm/neon-http'
import { neon } from '@neondatabase/serverless'
import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core'
const sql = neon(process.env.DATABASE_URL!)
const db = drizzle(sql)
const users = pgTable('users', {
id: serial('id').primaryKey(),
email: text('email').notNull().unique(),
createdAt: timestamp('created_at').defaultNow()
})
// Query
const allUsers = await db.select().from(users).limit(10)
console.log(allUsers)
5. Database Branching in CI/CD
# .github/workflows/preview.yml
name: Preview Deployment
on:
pull_request:
types: [opened, synchronize]
jobs:
create-preview-db:
runs-on: ubuntu-latest
steps:
- uses: neondatabase/create-branch-action@v5
id: create-branch
with:
project_id: ${{ vars.NEON_PROJECT_ID }}
branch_name: preview/pr-${{ github.event.pull_request.number }}
api_key: ${{ secrets.NEON_API_KEY }}
- name: Run migrations on preview branch
run: |
DATABASE_URL="${{ steps.create-branch.outputs.db_url }}" \
npm run db:migrate
- name: Output connection string
run: echo "Preview DB: ${{ steps.create-branch.outputs.db_url_with_pooler }}"
Head-to-Head: Supabase vs Neon
Storage and Database Limits
Both offer ~500 MB of free storage. In practice, this is enough for a portfolio project, a small SaaS with a few hundred users, or any active development workload. Once you hit the limit, Supabase’s paid tier starts at $25/month and Neon’s at $19/month.
Connection Handling
This is where experience diverges depending on your stack.
Supabase includes PgBouncer connection pooling out of the box. If you’re deploying to a serverless environment (Vercel, AWS Lambda, Cloudflare Workers), you must use the pooled connection string — direct connections will exhaust your Postgres connection limit quickly. Supabase makes this easy: just use the “Transaction mode” connection string.
Neon‘s serverless driver solves this problem differently. It communicates over HTTP instead of TCP, which means it works natively in edge runtimes without any connection pooling configuration. For serverless deployments, this is genuinely more convenient. For traditional servers, you use the standard connection string through pgBouncer just like any other database.
Branching: Neon Wins Clearly
Supabase does not have database branching on the free tier (it’s available on paid plans). Neon’s branching is available on the free tier and works extremely well.
If you’re doing serious development — running migrations, testing new schemas, doing preview deployments — Neon’s branching workflow is genuinely better. It’s not a gimmick; it changes how you think about database testing. Being able to branch from production to test a migration, then delete the branch if anything looks wrong, removes a whole category of risk from database changes.
Auth and APIs: Supabase Wins Clearly
Neon is a database. Full stop. It has no built-in auth, no file storage, no REST API layer. You bring your own authentication (NextAuth, Clerk, Auth0, etc.) and your own API framework.
Supabase bundles all of this. For full-stack JavaScript apps where you want everything wired together with minimal configuration, Supabase is a massive time saver. The auto-generated REST API alone can replace days of writing CRUD endpoints. Combined with Row Level Security, you can build apps where the frontend reads directly from the database securely — no separate API server needed.
Vector Search (pgvector)
Both Supabase and Neon support the pgvector extension, making either one a solid choice for AI applications that need to store and search vector embeddings.
-- Works on both Supabase and Neon
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
embedding vector(1536) -- for OpenAI text-embedding-3-small
);
-- Create an index for fast similarity search
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- Semantic similarity search
SELECT content, 1 - (embedding <=> '[0.1, 0.2, ...]'::vector) AS similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 5;
Supabase has better documentation and official guides for pgvector. Neon works just as well but you’ll rely more on upstream pgvector docs.
Ecosystem and Integrations
Supabase has integrations with Vercel, Netlify, Cloudflare Workers, and a growing list of tools. It also has official client libraries for JavaScript, Python, Swift, Kotlin, Flutter, and others.
Neon is deeply integrated with Vercel (Vercel Postgres is Neon), which means it has first-class support in the Vercel ecosystem. It also has an official GitHub Actions integration for branch management.
Which Should You Use? Use Case Breakdown
Choose Supabase if you’re building:
- A full-stack web app with user accounts — Supabase Auth handles the entire user lifecycle. Combined with RLS, you get secure multi-tenant data isolation with almost no backend code.
- A mobile app (React Native, Flutter) — Supabase’s official mobile SDKs are excellent. Auth, storage, and realtime all just work.
- A Firebase migration — The API design is deliberately Firebase-like. If you’re moving away from Firebase/Firestore, Supabase has the most similar mental model.
- Something that needs file uploads — Supabase Storage with 1 GB free is a clean built-in solution.
- A realtime application — Supabase Realtime works via Postgres logical replication and is included in the free tier.
Choose Neon if you’re building:
- A Next.js / Vercel app — Neon is Vercel’s recommended database. The integration is tight, and Vercel Postgres is literally Neon with a Vercel wrapper.
- Something that needs database branches — CI/CD with preview databases, migration testing, multiple developers sharing an environment.
- A serverless or edge function-heavy app — Neon’s HTTP driver is the cleanest solution for edge runtimes.
- A backend where you already have auth — If you’re using Clerk, Auth0, NextAuth, or Lucia for authentication, you don’t need Supabase’s auth layer. Neon gives you a clean Postgres without anything extra in the way.
- A team doing serious database migrations — Branch from production, test your migration on real data, merge or discard. This workflow is worth a lot.
Connecting Your Database to AI Applications (pgvector + OpenClaw)
One of the most popular use cases for both platforms is building AI applications with semantic search. Both Supabase and Neon support pgvector, so you can store embeddings alongside your regular data and run fast similarity searches without a separate vector database like Pinecone or Chroma.
Here’s a complete Python example that generates embeddings with a free API and stores them in either Supabase or Neon:
import psycopg2
import requests
import json
import os
# Works with both Supabase and Neon - just change DATABASE_URL
conn = psycopg2.connect(os.environ['DATABASE_URL'])
cursor = conn.cursor()
# Create the table with vector column
cursor.execute("""
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE IF NOT EXISTS knowledge_base (
id SERIAL PRIMARY KEY,
title TEXT,
content TEXT,
embedding vector(768),
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS knowledge_embedding_idx
ON knowledge_base USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 50);
""")
conn.commit()
def get_embedding(text: str) -> list[float]:
# Using Gemini embeddings (free tier: 1500 requests/day)
response = requests.post(
f"https://generativelanguage.googleapis.com/v1beta/models/text-embedding-004:embedContent",
params={"key": os.environ['GEMINI_API_KEY']},
json={"model": "models/text-embedding-004", "content": {"parts": [{"text": text}]}}
)
return response.json()['embedding']['values']
def add_document(title: str, content: str):
embedding = get_embedding(content)
cursor.execute(
"INSERT INTO knowledge_base (title, content, embedding) VALUES (%s, %s, %s)",
(title, content, json.dumps(embedding))
)
conn.commit()
def semantic_search(query: str, limit: int = 5):
query_embedding = get_embedding(query)
cursor.execute("""
SELECT title, content, 1 - (embedding <=> %s::vector) AS similarity
FROM knowledge_base
ORDER BY embedding <=> %s::vector
LIMIT %s
""", (json.dumps(query_embedding), json.dumps(query_embedding), limit))
return cursor.fetchall()
# Example usage
add_document("Python async", "asyncio allows concurrent code using async/await syntax...")
results = semantic_search("how to write concurrent Python code")
for title, content, score in results:
print(f"{score:.3f} | {title}")
If you’re using OpenClaw for your AI agent, you can connect this knowledge base to give your agent long-term memory and semantic recall. The agent can call a tool that runs similarity search against your Postgres/Neon/Supabase database and retrieve relevant context before generating a response — a simple but powerful RAG architecture that runs entirely for free.
Free Alternatives Worth Mentioning
Supabase and Neon cover most use cases, but a few others are worth knowing:
- Turso (LibSQL / SQLite edge): 9 GB storage free, 500 databases, perfect for edge deployments if you can use SQLite instead of Postgres
- Render PostgreSQL: Free tier exists but the instance expires after 90 days — good for testing, not production
- ElephantSQL: Free 20 MB Postgres — effectively only useful for learning, not real projects
- Fly.io Postgres: Free within Fly’s allowance — requires running a Postgres container on Fly, more DevOps effort but very flexible
For the vast majority of developers choosing between real hosted Postgres options with sustainable free tiers, the choice is Supabase vs Neon.
Limitations to Know Before You Commit
Supabase Free Tier Limitations
- Project pause: The database pauses after 1 week of inactivity. The cold start adds 1–2 seconds to the first request. For anything that needs to be always-available, either keep the project warm or upgrade.
- Only 2 active projects: You can create more, but only 2 run at once. This is a real constraint if you’re spinning up experiments frequently.
- Shared compute: The free tier runs on shared infrastructure. Don’t expect consistent query performance. For latency-sensitive apps, the Pro plan gives you dedicated compute.
- Edge Functions cold starts: Free tier edge functions have cold starts up to a few seconds.
- No custom domains on free tier: Your API URL is on supabase.co — upgrade for custom domain mapping.
Neon Free Tier Limitations
- Auto-suspend after 5 minutes: The compute node suspends. Wake time is ~300ms, which is usually fine but will fail some health checks that expect sub-100ms responses.
- Only 1 project: Everything has to fit inside one Neon project. In practice, this means one production app per account on the free tier.
- No dedicated support: Free tier gets community support only.
- Storage limit is shared across branches: Your 512 MB total is shared between main and all branches. Branches are copy-on-write so they’re efficient, but large datasets with many active branches can still hit limits.
- No built-in auth, APIs, or storage: These are all things you need to add yourself. For developers who want a complete backend, this requires more configuration.
Performance: What to Expect
Both platforms run standard PostgreSQL, so query performance is mostly about your indexing and query design rather than the platform. That said, there are platform-level differences worth noting.
Connection overhead: Supabase uses PgBouncer, which is industry-standard and well-understood. Neon’s HTTP proxy introduces an additional round-trip for the first query in a cold-start scenario, but subsequent queries in the same session are comparable.
Cold start: Neon’s 300ms wake-up time is better than Supabase’s 1–2 second project resume. For apps with intermittent traffic, Neon handles cold starts more gracefully.
Query throughput: Both platforms will handle typical side project and small production loads easily. Under heavy concurrent load (many connections, complex queries), dedicated compute (paid) is better on both platforms. The free tier on either is not suitable for high-traffic production without careful connection pooling and query optimization.
The Verdict: Supabase or Neon?
After building apps with both, here’s the honest take:
Supabase is the better choice if this is your first database, if you’re building a full-stack app, or if you want a complete backend-as-a-service.. The included auth, storage, and auto-generated APIs mean you can ship a working app with user accounts in an afternoon. The free tier is genuinely usable for small production workloads. If you’ve been on Firebase and want something better, this is where you go.
Neon is the better choice if you already have auth figured out, if you’re deploying to Vercel, or if you’re doing serious database development work. The branching feature is the best developer experience improvement in database tooling in years. Being able to branch from production to test a migration, preview each pull request against its own database copy, and give each developer an isolated environment — this is how database development should work. If you’re doing anything beyond hobby projects, Neon’s branching workflow is worth the slightly more DIY setup.
They’re not mutually exclusive either. Some projects use Neon for the main database (for branching and Vercel integration) and Supabase Storage for file uploads. The free tiers on both are available simultaneously with different email addresses — though managing two platforms adds complexity, so most developers pick one and stick with it.
Both Supabase and Neon are significantly better than the pre-PlanetScale landscape for free Postgres hosting. The loss of PlanetScale’s free tier hurt, but the alternatives are strong — and in Neon’s case, the branching feature is something PlanetScale never offered in the first place.
Start with Supabase if you want a complete Firebase replacement. Start with Neon if you want the best free Postgres for serious development workflows.
Related Reads
- Render Free Hosting Review 2026: Deploy Web Apps, Databases, and Cron Jobs for Free
- Vercel vs Netlify vs Cloudflare Pages: Free Frontend Hosting Compared
- Railway App Review 2026: The Best Heroku Alternative for Developers
- Oracle Cloud Always Free: Get a 4-Core 24GB ARM VPS for Free
- 7 Best Free Web Hosting for Developers: Cloudflare Pages, Vercel, Netlify and More
Originally published at toolfreebie.com.
Top comments (0)