major-ai-skills
Version:
Installable agentic skills / AI agent skills (SKILL.md) for Claude Code, Cursor, Codex CLI, Gemini CLI & Antigravity - 402+ professional app, token-efficiency, and common-sense skills. SEO/GEO ready.
152 lines (119 loc) • 6.32 kB
Markdown
name: supabase
description: "Build Supabase-backed applications with SQL migrations, Auth, row-level security, Edge Functions, the JavaScript client, and CLI development workflows."
category: devops
risk: safe
source: self
source_type: self
date_added: "2026-08-26"
tags: ["supabase", "postgres", "rls", "edge-functions", "auth", "cli", "claude"]
tools: ["claude", "cursor", "gemini", "codex"]
# Supabase Postgres Platform AI Skill Guide (Claude)
## Overview & Engine Architecture
Supabase is an open-source backend platform centered on **PostgreSQL**, with **Auth**, **Storage**, **Realtime**, **Edge Functions** (Deno), and auto-generated **PostgREST** APIs. Security hinges on **Row Level Security (RLS)**. Claude operates as a Principal Backend Platform Engineer, specializing in **migration-first schema design**, **RLS policies**, **`@supabase/supabase-js` clients**, and **`supabase` CLI** local/prod workflows.
### Supabase Platform Stack
```
┌─────────────────────────────────────────────────────────────┐
│ Supabase Architecture │
│ │
│ Data Plane │
│ ├── PostgreSQL + extensions (pgcrypto, pgvector, ...) │
│ ├── PostgREST (auto API) / Realtime │
│ └── Storage (S3-compatible objects + policies) │
│ │
│ Auth & Edge │
│ ├── GoTrue Auth (JWT, providers, SSR helpers) │
│ ├── Edge Functions (Deno) │
│ └── Service role vs anon keys │
│ │
│ Tooling │
│ ├── supabase CLI (start, db push, functions deploy) │
│ ├── SQL migrations │
│ └── Dashboard SQL / advisors │
└─────────────────────────────────────────────────────────────┘
```
## Operational Capabilities & Agent Directives
1. **RLS by Default**: Enable RLS on user data tables; write explicit policies.
2. **Key Separation**: Use `anon` key in clients; reserve `service_role` for trusted servers only.
3. **Migrations First**: Never “click-ops” prod schema without SQL migration files.
4. **Least Privilege SQL**: Prefer constrained RPCs (`security definer` carefully) over broad policies.
5. **Local Parity**: Use `supabase start` for local Authed/API testing before push.
## Production SQL + JS Client Examples
Migration `supabase/migrations/20260826120000_profiles.sql`:
```sql
-- ==============================================================================
-- Supabase: profiles table with RLS (user can read/update own row)
-- ==============================================================================
create table public.profiles (
id uuid primary key references auth.users (id) on delete cascade,
display_name text,
updated_at timestamptz not null default now()
);
alter table public.profiles enable row level security;
create policy "Profiles are viewable by owner"
on public.profiles for select
using (auth.uid() = id);
create policy "Profiles are updatable by owner"
on public.profiles for update
using (auth.uid() = id)
with check (auth.uid() = id);
create policy "Profiles are insertable by owner"
on public.profiles for insert
with check (auth.uid() = id);
```
Client usage:
```typescript
// ==============================================================================
// Supabase JS: upsert current user's profile
// npm i @supabase/supabase-js
// ==============================================================================
import { createClient } from "@supabase/supabase-js";
const supabase = createClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
);
export async function upsertMyProfile(displayName: string) {
const { data: userData, error: userError } = await supabase.auth.getUser();
if (userError) throw userError;
const user = userData.user;
if (!user) throw new Error("Not authenticated");
const { data, error } = await supabase
.from("profiles")
.upsert({ id: user.id, display_name: displayName })
.select()
.single();
if (error) throw error;
return data;
}
```
CLI:
```bash
supabase login
supabase link --project-ref <ref>
supabase db push
supabase functions deploy hello
supabase start
```
## Technical Troubleshooting Matrix
| Issue & Failure Signature | Root Cause Analysis | Diagnostic & Resolution Pathway |
| :--- | :--- | :--- |
| **JWT / RLS returns empty** | Policy missing or `auth.uid()` null. | Confirm session; test policies with SQL `auth.uid()`. |
| **`permission denied for table`** | RLS enabled with no policy / wrong role. | Add policies; avoid using service_role in browser. |
| **Migration drift** | Dashboard edits not captured. | Generate/write migrations; `db pull` carefully. |
| **CORS / auth on Edge Function** | Missing headers / verify JWT config. | Align function config and gateway JWT settings. |
## Best Practices
1. Put secrets in env; never ship `service_role` to browsers.
2. Add indexes for filter columns used by policies and queries.
3. Use typed database codegen when the stack supports it.
### Essential Paths
- `supabase/config.toml`
- `supabase/migrations/`
- `supabase/functions/`
## Agent Operational Directive
> **MANDATORY**: Enable RLS on user-owned tables and pair with explicit policies. Keep `service_role` server-side only. Manage schema via SQL migrations and the Supabase CLI - not one-off production console edits.