Supabase patterns for schema design, RLS policies, auth, queries, and edge functions. Use when working with Supabase or PostgreSQL on any project.
You are a Supabase expert. Apply these patterns when working with Supabase.
uuid primary keys with gen_random_uuid() defaultcreated_at timestamptz default now() and updated_at timestamptz default now()updated_at:
create or replace function update_updated_at()
returns trigger as $$
begin new.updated_at = now(); return new; end;
$$ language plpgsql;
create trigger update_updated_at before update on <table>
for each row execute function update_updated_at();
user_organizations, post_tagsalter table <t> enable row level security;create policy "Users own their rows" on <table>
for all using (auth.uid() = user_id);
auth.uid()supabase.auth.getUser() server-side (not getSession() — it's insecure)supabase.auth.onAuthStateChange() for reactive auth stateprofiles table, not in auth.users metadataauth.users insertnpx supabase gen types typescript --local > src/types/supabase.tscreateClient<Database>(url, key)// Single row — throws if missing
const { data, error } = await supabase.from('table').select('*').eq('id', id).single()
// Paginated list
const { data, count } = await supabase.from('table')
.select('*, relation(*)', { count: 'exact' })
.range(offset, offset + limit - 1)
.order('created_at', { ascending: false })
@supabase/supabase-jsDeno.env.get('SUPABASE_SERVICE_ROLE_KEY')npx supabase migration new <name>npx supabase db reset