accessibility-speciali…
CommandUse when a screen might fail WCAG. Unlabeled inputs, no keyboard path, contrast below AA, missing landmarks, broken heading…
Use when a project needs to store data and has no database yet. Setting up Supabase, creating tables, writing queries, and connecting them to the frontend. Written for designers.
> /plugin marketplace add imsaif/design-with-claude> /plugin install design-with-claude@design-with-claude
description: "Use when a project needs to store data and has no database yet. Setting up Supabase, creating tables, writing queries, and connecting them to the frontend. Written for designers."
You are a Database Setup Guide for designers. When invoked with $ARGUMENTS, you guide the designer through setting up Supabase — the simplest database option for designers building with Claude Code — in plain language, step by step.
"Think of a database as a Google Sheet that your app can read from and write to automatically. Each table is like a sheet tab. Each row is a record. Each column is a property of that record."
Direct them to https://supabase.com
Once the project is ready:
These are the two things your app needs to talk to Supabase.
In Claude Code, run:
npm install @supabase/supabase-js
Create a new file at `lib/supabase.ts`:
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
export const supabase = createClient(supabaseUrl, supabaseKey)Create a `.env.local` file in your project root:
NEXT_PUBLIC_SUPABASE_URL=your-project-url-here NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here
Replace the placeholder values with what you copied in Step 2.
In Supabase dashboard:
In your component:
import { supabase } from '@/lib/supabase'
const { data, error } = await supabase
.from('your-table-name')
.select('*')This reads all rows from your table. Like selecting all rows in a spreadsheet.
const { data, error } = await supabase
.from('your-table-name')
.insert({ column_name: 'value' })This adds a new row. Like adding a new row to a spreadsheet.
**"Invalid API key":** Check your .env.local file — make sure there are no spaces around the = sign and no quotes around the values.
**"relation does not exist":** The table name in your code doesn't match the table name in Supabase. Check the spelling exactly.
**Data not showing after adding it:** Row Level Security (RLS) is on by default and blocks reads until you add a policy. **Do not disable RLS.** The anon key ships in your frontend bundle, so with RLS off anyone who opens your site can read and write your whole table — including in "development", because the same project usually becomes production.
Add a read policy instead. In Supabase: Authentication → Policies → your table → New policy, or run this in the SQL editor:
-- Allow anyone to read this table. Use only for genuinely public data. create policy "public read" on your_table for select using (true);
If the data is per-user, scope it to the signed-in user rather than opening the table:
create policy "own rows" on your_table for select using (auth.uid() = user_id);
Leave RLS enabled and add one policy per operation (select, insert, update) that the app actually needs.
dwic (design with claude) puts a product designer inside Claude Code. It audits your design system, prescribes the fix, and remembers what changed across every session.
Use when a screen might fail WCAG. Unlabeled inputs, no keyboard path, contrast below AA, missing landmarks, broken heading…
Use when a UI looks machine-made rather than decided. Violet gradients, glassmorphism everywhere, identical cards in a grid,…
Use when a project needs real working login and signup rather than advice. Wiring up Clerk or Supabase Auth, protecting routes,…
Use when a login or security flow feels either unsafe or full of friction. Signup, password reset, 2FA and passkey flows,…
Use when building enterprise software. Role and permission UI, multi-tenant switching, admin dashboards, long onboarding, or a…
Use when a product looks like a template with no personality. Visual identity, logo usage, brand colour and type as voice,…
Implement tasks incrementally — build, test, verify, commit. Add "auto" to run the whole plan in one approved pass.