1. Create a project

1

Sign up and create a project

We're in private beta — join the waitlist and we'll email you an invite. Once you're in, click New project, give it a name, and we'll provision a dedicated Postgres database, Auth, Storage and REST API for it. This takes under two minutes.

2

Copy your URL and keys

Your project home shows everything you need:

ItemLooks likeUse it for
Project URLhttps://<project-ref>.aidb.ukAll API calls
anon keyeyJhbGciOi…Browsers & mobile apps (safe to ship)
service_role keyeyJhbGciOi…Servers only — bypasses row security. Never expose it.
3

Connect with @supabase/supabase-js

Install the standard Supabase client and point it at your project:

# npm install @supabase/supabase-js
import { createClient } from '@supabase/supabase-js'

const supabase = createClient(
  'https://your-project-ref.aidb.uk',  // your project URL
  'your-anon-key'                       // your anon key
)

Or load it straight from a CDN in plain HTML:

<script type="module">
  import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'
  const supabase = createClient('https://your-project-ref.aidb.uk', 'your-anon-key')
</script>

2. Create a table and query it

Open Studio from your project page and create a table — say todos with a task text column — using the table editor or the SQL editor:

create table todos (
  id bigint generated always as identity primary key,
  task text not null,
  done boolean default false
);

It's instantly available over the API:

const { data, error } = await supabase
  .from('todos')
  .select('*')

Prefer raw HTTP? The same data is one curl away:

curl "https://your-project-ref.aidb.uk/rest/v1/todos?select=*" \
  -H "apikey: your-anon-key" \
  -H "Authorization: Bearer your-anon-key"
Heads-up on row-level security: new tables are protected by Postgres RLS. Until you add a policy, the anon key can't read them — that's a feature, not a bug. Add a policy in Studio, e.g. create policy "own rows" on todos for select using (auth.uid() = user_id);

3. Add auth

User accounts work exactly as you'd expect from the Supabase client:

// sign a user up (sends a confirmation email)
await supabase.auth.signUp({ email, password })

// sign in
await supabase.auth.signInWithPassword({ email, password })

// the current user
const { data: { user } } = await supabase.auth.getUser()

4. Upload a file

Create a bucket in Studio (e.g. avatars), then:

await supabase.storage
  .from('avatars')
  .upload(`${user.id}.png`, file)

// public URL, resized on the fly
const { data } = supabase.storage
  .from('avatars')
  .getPublicUrl(`${user.id}.png`, { transform: { width: 128 } })

Direct database access

Every project is a real, dedicated Postgres database. Your project page shows a connection string for psql, migrations tools, or anything else that speaks Postgres.

What's next