supabase-hello-world
Provides a quick-start guide and code pattern to test your Supabase connection and database operations.
Install
mkdir -p .claude/skills/supabase-hello-world && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/7744" && unzip -o skill.zip -d .claude/skills/supabase-hello-world && rm skill.zipInstalls to .claude/skills/supabase-hello-world
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Run your first Supabase query \u2014 insert a row and read it back.\n\Key capabilities
- →Create a todos table in Supabase
- →Insert a row using the Supabase JS client
- →Read a row back from Supabase
- →Validate project URL and anon key configuration
- →Verify Row Level Security policies
How it works
The skill guides the user through creating a table, inserting data, and reading it back using the Supabase JS client. This validates the project setup and RLS policies.
Inputs & outputs
When to use supabase-hello-world
- →Test Supabase database connectivity
- →Learn basic Supabase API patterns
- →Verify Row Level Security setup
- →Initialize new Supabase integration
About this skill
Supabase Hello World — First Query
Overview
Execute your first real Supabase query: create a todos table in the dashboard, insert a row with the JS client, and read it back. This validates that your project URL, anon key, and Row Level Security are configured correctly before you build anything else.
Prerequisites
- Completed
supabase-install-authsetup (project URL + anon key in.env) @supabase/supabase-jsv2+ installed (npm install @supabase/supabase-js)- A Supabase project at supabase.com/dashboard
Instructions
The workflow is three steps: create the table (dashboard SQL), insert a row with the JS client, and read it back to prove the round-trip. The skeleton below is enough to follow along; the fully annotated code for every step — including the error-branch comments and expected console output — lives in the full implementation walkthrough.
Step 1: Create the todos Table
In the Supabase dashboard SQL Editor, create the table, enable Row Level Security (required for anon-key access), and add permissive read + insert policies for the hello-world exercise:
create table public.todos (
id bigint generated always as identity primary key,
task text not null,
is_complete boolean default false,
inserted_at timestamptz default now()
);
alter table public.todos enable row level security;
create policy "Allow public read" on public.todos
for select using (true);
create policy "Allow public insert" on public.todos
for insert with check (true);
Lock these policies down before production. Verify the table appears under Table Editor before continuing.
Step 2: Insert a Row
Create the client from your env vars, then insert. Chain .select() to get
the inserted row back — .insert() alone returns { data: null }:
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(
process.env.SUPABASE_URL!,
process.env.SUPABASE_ANON_KEY!
)
const { data, error } = await supabase
.from('todos')
.insert({ task: 'Hello from Supabase!' })
.select()
Step 3: Read It Back
Select all rows and confirm the row you inserted is present:
const { data: todos } = await supabase.from('todos').select('*')
// [{ id: 1, task: "Hello from Supabase!", is_complete: false, ... }]
Open the Table Editor in the dashboard to visually confirm the row is there. See implementation.md for the fully error-handled version of each step.
Output
todostable created with RLS enabled- One row inserted via the JS client
- Same row read back with
.select('*') - Dashboard confirms the data round-trip
Error Handling
| Error | Cause | Solution |
|---|---|---|
relation "public.todos" does not exist | Table not created | Run the Step 1 SQL in the dashboard SQL Editor |
new row violates row-level security policy | RLS blocks the insert | Add the permissive insert policy from Step 1 |
Invalid API key | Wrong anon key in .env | Copy from Settings > API in the dashboard |
FetchError: request to https://... failed | Wrong project URL | Verify SUPABASE_URL matches dashboard URL |
data is null after insert | Missing .select() chain | Add .select() after .insert() |
| Empty array returned from select | RLS blocks reads | Add the select policy from Step 1 |
Examples
Complete, runnable end-to-end scripts live in
references/examples.md — a full TypeScript script
(insert with .single(), then an ordered/limited read-back) and the Python
equivalent. Minimal TypeScript shape:
const { data } = await supabase
.from('todos')
.insert({ task: 'Hello!' })
.select()
.single()
- TypeScript — full script
- Python — full script (
pip install supabase)
Resources
Next Steps
Once the round-trip works, proceed to supabase-local-dev-loop for the local
development workflow with the Supabase CLI — running Postgres locally, applying
migrations, and syncing schema to your hosted project. Before shipping,
replace the permissive using (true) / with check (true) policies from
Step 1 with real per-user Row Level Security rules, since the hello-world
policies expose the table to anyone holding the anon key.
Prerequisites
How it compares
This skill provides a structured, minimal example to verify a Supabase setup, which is more direct than exploring the full documentation for basic connectivity.
Compared to similar skills
supabase-hello-world side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| supabase-hello-world (this skill) | 1 | 27d | Review | Beginner |
| cloudbase-document-database-web-sdk | 1 | 2mo | No flags | Intermediate |
| relational-database-web-cloudbase | 1 | 2mo | Review | Intermediate |
| convex | 0 | 6mo | No flags | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
cloudbase-document-database-web-sdk
TencentCloudBase
Use CloudBase document database Web SDK to query, create, update, and delete data. Supports complex queries, pagination, aggregation, and geolocation queries.
relational-database-web-cloudbase
TencentCloudBase
Use when building frontend Web apps that talk to CloudBase Relational Database via @cloudbase/js-sdk – provides the canonical init pattern so you can then use Supabase-style queries from the browser.
convex
waynesutton
Umbrella skill for all Convex development patterns. Routes to specific skills like convex-functions, convex-realtime, convex-agents, etc.
dev-supabase
aibot88
Backend development with Supabase. Trigger when the user wants to configure auth, the database, or Supabase storage.
shopify-development
davila7
Build Shopify apps, extensions, themes using GraphQL Admin API, Shopify CLI, Polaris UI, and Liquid. TRIGGER: "shopify", "shopify app", "checkout extension", "admin extension", "POS extension", "shopify theme", "liquid template", "polaris", "shopify graphql", "shopify webhook", "shopify billing", "app subscription", "metafields", "shopify functions"
nuxt
antfu
Nuxt full-stack Vue framework with SSR, auto-imports, and file-based routing. Use when working with Nuxt apps, server routes, useFetch, middleware, or hybrid rendering.