Frontend + backend. One project.
Your application.
It all fits.
Publish your static frontend alongside PostgreSQL, Auth, Storage and Edge Functions. Built with Supabase’s open-source services and one shared console.
Private pilot. Not open to the public, no pricing or SLA; backups are still in development.
The platform
A base to build on.
Frontend and backend in one project
Upload your static build as a ZIP. It is served next to the project's PostgreSQL, Auth, Storage and Edge Functions, with release rollback that never touches the database.
Available in pilot02Works with @supabase/supabase-js v2
Each project runs Supabase's open-source services: tables, RPC, Row Level Security, email Auth, Storage buckets and Postgres Changes.
Available in pilot03MCP scoped to one project
Coding agents get 13 tools through tokens bound to one project that expire in 24 hours or 7 days, with an operation_id on every write.
Available in pilot04Git deploys
Connecting a GitHub repository and publishing every push is in development. Today a frontend is published by uploading a ZIP.
In development05Off-host backups
The pilot has no backups today. Daily encrypted backups with a restore drill are in development; do not store data you cannot lose.
In development06Against Supabase and Vercel
What is equivalent, what is not, and how to move an application between the three platforms, without parity claims.
ComparisonCode you already know
Your frontend. Your data.
Use supabase-js v2 with your project services. Review what is tested and what is still in development before moving an application.
Review compatibility →import { createClient } from '@supabase/supabase-js'
const reply = await fetch('./__simplybase/config.json', {
credentials: 'omit', cache: 'no-store', redirect: 'error'
})
if (!reply.ok) throw new Error('Project connection unavailable')
const config = await reply.json()
const supabase = createClient(config.api_url, config.publishable_key, {
auth: { persistSession: false, detectSessionInUrl: false },
global: { fetch: (input, init) =>
fetch(input, { ...init, credentials: 'omit' }) }
})
const { data, error } = await supabase
.from('notes').select('*').order('created_at')Example for Sites with an opaque origin. Sessions stay in memory; RLS governs access to rows.
Together, with clear boundaries