Skip to content

The Postgres backend you own.

Every project gets its own Postgres 17 database, auth, file storage, realtime and backups. Already on Supabase? Change two values in createClient and your app runs on Vulcbase.

Free plan: 2 projects, no card. Host it with us or on your own server.

lib/supabase.ts2 lines changed
import { createClient } from "@supabase/supabase-js" -const url = "https://xyzcompany.supabase.co"+const url = "https://xyzcompany.vulcbase.com"-const key = process.env.SUPABASE_ANON_KEY+const key = process.env.VULCBASE_ANON_KEY export const supabase = createClient(url, key)// the rest of your code stays as it is
Table editor · public.todos
+ Insert rowFilter RLS on
idtitle textdone boolcreated_at
1Ship the importerNov 3, 09:14
2Write the migration guideNov 4, 16:02
3Set up nightly backupsNov 7, 11:40
4Invite the teamNov 9, 08:55
5Turn on RLS for todosNov 10, 14:21
  • Postgres 17 per project
  • Compatible with supabase-js
  • No third-party APIs
  • Data on EU servers
  • Self-hostable

The migration, in code

Two values change. Everything else stays.

Your project has a URL and an anon key, just like on Supabase. Put them in createClient. Your tables, policies, auth users and files are already there if you used the importer.

these calls do not change
await supabase.auth.signInWithPassword({ email, password }); const { data } = await supabase.from("todos").select("*, tags(name)"); await supabase.storage.from("avatars").upload(path, file); supabase.channel("room").on("postgres_changes", filter, onChange).subscribe();

Product

Everything a backend needs, in one project.

A real Postgres database at the center, with the services around it that most apps end up needing.

Database and REST API

Your own Postgres 17 database with extensions and Row Level Security. The REST API is generated from your schema and understands the supabase-js filters, embedded resources and RPC. Connect with psql any time.

supabase-js
const { data } = await supabase  .from("orders")  .select("id, total, customer:customers(name)")  .gte("total", 100)  .order("created_at", { ascending: false })  .limit(3); // [{ id: 812, total: 240, customer: { name: "Ana" } }, ...]

Realtime

Listen to database changes, with Row Level Security applied so people only receive rows they may read. Broadcast messages and track presence on the same channel.

Realtime · channel room:42
Subscribed · 3 listeners
  • INSERTtodosInvite the teamana
  • UPDATEtodosSet up nightly backupssam
  • BROADCASTroom:42cursor { x: 412, y: 96 }lea
  • PRESENCEroom:42joined (3 online)kim
  • DELETEcommentsid 8812sam

Auth

Email and password, magic links, email codes, anonymous sign-ins and PKCE. Users live in your project's database.

Storage

Buckets with policies, signed URLs and on-the-fly image resizing. Same storage-js calls.

Backups

Nightly backups. Restore any of them with one click. A safety backup is taken right before.

Cron and webhooks

Schedule SQL with cron expressions. Send a request to your URL on every insert, update or delete.

Dashboard

Table editor, SQL editor, policy editor and API docs generated from your schema.

Logs and usage

Every REST, auth, storage and realtime request is logged. See database size, users and requests per plan.

Importer

Move from Supabase in one click.

Paste your Supabase connection string, choose what to copy, and start. The import runs in the background and shows a live log.

What it copies

  • Schema, functions and triggers
  • Table data
  • Auth users, with their passwords
  • Storage buckets and files
  • Row Level Security policies

What it does not

  • OAuth providers (not supported yet)
  • Edge functions
  • AI features
Import from Supabase
Schema and data

42 tables · 1.2M rows

Auth users

8,431 users, passwords kept

Policies

57 RLS policies

Storage files73%

3,902 / 5,310 files

Your data, your server

It is just Postgres. Run it where you want.

Use the hosted version, or run the same software on your own server with Docker Compose. No call goes to a third-party API, so it keeps working inside a private network.

  • Self-hostable

    Postgres, the web app and the gateway. Configure it with a handful of environment variables.

  • Plain Postgres access

    Connect with psql, your ORM or a BI tool. Dump it whenever you like.

  • No external dependencies

    No analytics SDKs, no AI service, no hosted auth provider behind the scenes.

  • No lock-in

    Standard SQL, standard storage, standard JWT. Leaving is a pg_dump away.

terminal
# connect to your project's databasepsql "postgresql://postgres:<password>@<db-host>:5432/<project>" # take a backup whenever you wantpg_dump "$DATABASE_URL" -Fc -f backup.dump # run the whole stack yourselfdocker compose up -d
policies.sql
alter table todos enable row level security; create policy "owners read their todos"  on todos for select  using (auth.uid() = user_id);

Pricing

Start free. Pay when it grows.

Three plans, flat monthly prices. Payment is by bank transfer or cash: contact us and we activate the plan.

Free

For side projects and trying things out.

€0

  • 2 projects
  • 500 MB database per project
  • 1 GB file storage
  • 50k monthly active users
  • Manual backups only
  • Paused after 7 idle days
Most picked

Pro

For apps with real users.

€15/ month

  • 10 projects
  • 8 GB database per project
  • 100 GB file storage
  • 100k monthly active users
  • Daily backups kept 7 days
  • Never paused for inactivity

Team

For teams running several products.

€49/ month

  • 50 projects
  • 50 GB database per project
  • 500 GB file storage
  • 1M monthly active users
  • Daily backups kept 30 days
  • Never paused for inactivity

All limits are on the pricing page and in the docs.

FAQ

Questions people ask first.

Anything else? Write to us and a person answers.

Make your next backend one you own.

Create a project in a minute, or import your Supabase project and keep your code.