Directory: launch-agent-skills/skills/rag-database/skill.md
name: Supabase Database Setup description: Set up Supabase database for launch-rag or launch-agentic-rag using CLI automation or manual setup triggers: - supabase - database setup - vector database - pgvector - postgres - supabase setup
Supabase Database Setup Skill
Purpose
Set up a Supabase database for RAG applications using either:
- CLI Automation (recommended) - Fully automated via
supabaseCLI - Manual Setup - Web dashboard guided walkthrough
Works with both:
- launch-rag - Basic RAG
- launch-agentic-rag - Agentic RAG
Both repos use the identical SQL schema (rag_chunks table with pgvector, 1536 dimensions).
IMPORTANT: This skill should be used AFTER cloning/setting up your FastAPI project (use rag-setup skill first).
Instructions
Step 0: Choose Setup Method
Ask the user which method they prefer:
Option A: CLI Automation (faster, fully automated)
- Requires: Supabase CLI installed
- Check with:
which supabase - Install if needed:
brew install supabase/tap/supabase(macOS)
Option B: Manual Setup (web dashboard)
- No CLI required
- Step-by-step web interface
🚀 OPTION A: CLI Automation (Recommended)
Security Note for Demos/Tutorials
IMPORTANT: When setting up Supabase for live demos, YouTube tutorials, or presentations:
- ✅ Use JSON output mode to parse values programmatically
- ✅ Generate strong passwords without displaying them
- ✅ Mask all sensitive outputs (API keys, passwords, tokens)
- ✅ Show process, not secrets - display steps and confirmations, not actual values
- ✅ Auto-update .env - write credentials directly to file without showing them
- ✅ Confirm success with "✅ Credentials saved to .env" messages
Step 1: Check Requirements
# Check if Supabase CLI is installed
which supabase
# Check if SQL file exists
ls -la sql/init_supabase.sql
If CLI is not installed:
# macOS
brew install supabase/tap/supabase
# Other platforms: https://supabase.com/docs/guides/cli/getting-started
Step 2: Login to Supabase
# Login to Supabase (opens browser for auth)
supabase login
This will:
- Open your browser for authentication
- Save access token locally
- Allow CLI to manage your projects
For demos: The login only needs to happen once and won't expose credentials.
Step 3: Ask User for Project Details
Always ask the user for:
Project name
- Suggest:
demo-agent-rag,youtube-rag-demo,agent-skills-demo, orrag-agent-test - For demos: Use names that clearly indicate it's for testing/demo purposes
- Suggest:
Database password handling
- For production: Ask user to provide their own strong password
- For demos/tutorials: Generate a strong random password automatically
- NEVER display the password - store it directly in
.env
Region
- List options:
us-east-1,us-west-1,eu-west-1,ap-southeast-1, etc. - Default to user's closest region
- List options:
Organization
- Get via:
supabase orgs list --output json - Use the first org or ask user to select
- Get via:
Step 4: Generate Secure Password (for demos)
# Generate a strong 32-character password
DB_PASSWORD=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32)
# Tell user (but don't show password)
echo "✅ Generated strong database password (saved to .env)"
Step 5: Get or Create YouTube Organization
# Get org list in JSON format
ORGS_JSON=$(supabase orgs list --output json)
# Check if "YouTube" org exists
YOUTUBE_ORG=$(echo "$ORGS_JSON" | jq -r '.[] | select(.name == "YouTube") | .id')
if [ -z "$YOUTUBE_ORG" ]; then
# YouTube org doesn't exist, check for alternatives or create one
echo "ℹ️ No 'YouTube' organization found"
echo " Creating a new 'YouTube' organization for demo projects..."
# Create YouTube org (requires web UI or API - CLI may not support org creation)
# Guide user to create it manually if needed
echo " Please create a 'YouTube' organization in Supabase dashboard"
echo " Or using the first available organization..."
ORG_ID=$(echo "$ORGS_JSON" | jq -r '.[0].id')
ORG_NAME=$(echo "$ORGS_JSON" | jq -r '.[0].name')
echo "✅ Using organization: $ORG_NAME"
else
ORG_ID="$YOUTUBE_ORG"
echo "✅ Using organization: YouTube (perfect for demos!)"
fi
IMPORTANT:
- For demo/tutorial projects, always prefer the "YouTube" organization if it exists
- This keeps demo projects organized separately from production
- If "YouTube" org doesn't exist, use the first available or ask user to create one
Step 6: Create Project via CLI
# Create project with JSON output to capture details
supabase projects create <project-name> \
--org-id "$ORG_ID" \
--region us-east-1 \
--db-password "$DB_PASSWORD" \
--output json > project_output.json
# Parse project details
PROJECT_REF=$(cat project_output.json | jq -r '.id')
PROJECT_URL="https://${PROJECT_REF}.supabase.co"
echo "✅ Project created: <project-name>"
echo "✅ Project URL: $PROJECT_URL (saved to .env)"
# Clean up temp file (don't leave it around)
rm project_output.json
Important:
- Use
--output jsonto get machine-readable output - Parse with
jqor Python for safety - Never echo sensitive values directly
- Wait for project to be ready (~2 minutes)
Step 7: Wait for Project Initialization
# Wait for project to be fully ready (usually ~2 minutes)
echo "⏳ Waiting for project initialization..."
sleep 120
echo "✅ Project should be ready now"
Step 8: Get API Keys (Securely)
# Get API keys (default table output is more reliable than JSON)
supabase projects api-keys --project-ref "$PROJECT_REF" > /tmp/api_keys_output.txt
# Parse the table output (more reliable than JSON for this command)
ANON_KEY=$(grep "anon" /tmp/api_keys_output.txt | awk '{print $3}')
SERVICE_KEY=$(grep "service_role" /tmp/api_keys_output.txt | awk '{print $3}')
# Confirm without showing values
echo "✅ Retrieved API keys (saved to .env)"
echo " - Anon key: ${ANON_KEY:0:20}... (hidden)"
echo " - Service key: ${SERVICE_KEY:0:20}... (hidden)"
# Clean up temp file
rm /tmp/api_keys_output.txt
IMPORTANT: The --output json flag for api-keys command may not work correctly in all Supabase CLI versions. Use the default table output and parse with awk/grep for reliability.
Step 9: Link Local Project
# Link the local directory to the Supabase project
cd fastapi-project # or current project directory
supabase link --project-ref "$PROJECT_REF"
echo "✅ Linked local project to Supabase"
Step 10: Run SQL Initialization
# Execute the SQL file directly via psql connection
echo "🔧 Running database initialization..."
# Use Supabase CLI to execute SQL
supabase db reset --linked
# Or manually run the SQL
PGPASSWORD="$DB_PASSWORD" psql \
"postgresql://postgres:$DB_PASSWORD@db.$PROJECT_REF.supabase.co:5432/postgres" \
-f sql/init_supabase.sql
echo "✅ Database initialized with pgvector and RAG schema"
Alternative migration approach:
# Initialize Supabase in project
supabase init
# Copy SQL file to migrations
mkdir -p supabase/migrations
cp sql/init_supabase.sql supabase/migrations/$(date +%Y%m%d%H%M%S)_init.sql
# Push migrations
supabase db push
echo "✅ Migrations applied successfully"
Step 11: Auto-Update .env File (Secure)
Use Edit tool to update .env WITHOUT displaying sensitive values:
# Update .env file securely
# Use the Edit tool to modify the .env file programmatically
# Values to update:
# SUPABASE_URL="$PROJECT_URL"
# SUPABASE_ANON_KEY="$ANON_KEY"
# SUPABASE_SERVICE_ROLE_KEY="$SERVICE_KEY"
echo "✅ Updated .env file with Supabase credentials"
echo " Location: fastapi-project/.env"
IMPORTANT for Claude Code:
- Use the
Edittool to modify.envfile - Replace placeholder values with actual credentials
- Do NOT echo or display the actual keys in output
- Confirm with generic success message
Step 11b: Configure AI Provider (Critical!)
After updating Supabase credentials, check and fix AI provider settings:
# Check if user has valid API keys
if grep -q "your_anthropic_api_key_here" .env; then
echo "⚠️ Anthropic key is placeholder - switching to OpenAI"
# Use Edit tool to change AI_PROVIDER to openai
# sed -i '' 's/AI_PROVIDER=anthropic/AI_PROVIDER=openai/' .env
echo "✅ Set AI_PROVIDER=openai (change to 'anthropic' if you add Anthropic key later)"
fi
# Verify OpenAI key exists
if grep -q "your_openai_api_key_here" .env; then
echo "❌ ERROR: OpenAI API key is required!"
echo " Please update OPENAI_API_KEY in .env with your actual key"
echo " Get your key from: https://platform.openai.com/api-keys"
fi
Key Points:
- ✅ OpenAI key is REQUIRED - used for embeddings (text-embedding-3-small)
- ✅ Default to AI_PROVIDER=openai unless user explicitly has Anthropic key
- ⚠️ Check for placeholder values and warn user to replace them
- ⚠️ Don't leave placeholder API keys - they cause runtime 401 errors
Step 12: Verify Setup
# Test database connection (in project directory)
cd fastapi-project
source venv/bin/activate
python test_setup.py
echo "✅ Setup verification complete"
Step 13: Display Summary (Safe for Demos)
echo ""
echo "=================================================="
echo "🎉 Supabase Setup Complete!"
echo "=================================================="
echo ""
echo "Project Details:"
echo " Name: <project-name>"
echo " URL: $PROJECT_URL"
echo " Region: us-east-1"
echo ""
echo "Database:"
echo " ✅ pgvector extension enabled"
echo " ✅ rag_chunks table created"
echo " ✅ Vector search functions ready"
echo " ✅ Row-level security configured"
echo ""
echo "Credentials:"
echo " ✅ Supabase credentials saved to .env"
echo " ✅ AI_PROVIDER set to: openai"
echo ""
echo "⚠️ IMPORTANT: Verify Your API Keys"
echo " • OpenAI key is REQUIRED (for embeddings)"
echo " • If you see 401 errors, check .env for placeholder values"
echo " • Don't use placeholder keys like 'your_api_key_here'"
echo ""
echo "Next Steps:"
echo " 1. Verify your OpenAI API key is set in .env"
echo " 2. cd fastapi-project"
echo " 3. source venv/bin/activate"
echo " 4. uvicorn main:app --reload --port 8000"
echo " 5. Visit http://localhost:8000/docs"
echo " 6. Try /seed endpoint to populate database"
echo " 7. Ask questions at http://localhost:8000/chat"
echo ""
echo "=================================================="
📋 OPTION B: Manual Setup
Step 1: Check for SQL Initialization File
# Check if SQL init file exists
ls -la sql/
Expected: sql/init_supabase.sql
Step 2: Create Supabase Project (Manual)
Tell the user:
- Go to https://supabase.com
- Sign in or create an account
- Click "New Project"
- Fill in project details:
- Name: Choose a project name (e.g., "my-rag-agent")
- Database Password: Create a strong password (save it!)
- Region: Choose closest to you
- Pricing Plan: Free tier is sufficient for development
- Click "Create new project"
- Wait ~2 minutes for project to initialize
Step 3: Retrieve API Keys
Once the project is ready, guide the user to get their API keys:
Tell the user:
- In your Supabase dashboard, go to Settings (gear icon in sidebar)
- Click API in the settings menu
- Copy these three values (you'll need them for
.env):- Project URL:
https://xxxxx.supabase.co - anon public key: Starts with
eyJ...(long string) - service_role secret key: Starts with
eyJ...(different long string)
- Project URL:
Important: Keep the service_role key SECRET - it has full database access!
Step 4: Run SQL Initialization Script
Tell the user:
- In Supabase dashboard, go to SQL Editor (left sidebar)
- Click New query button
- Open the local file
sql/init_supabase.sqland copy its ENTIRE contents - Paste into the SQL Editor
- Click Run (or press Cmd/Ctrl + Enter)
- You should see success messages and verification results at the bottom
What this script creates:
- ✅ pgvector extension for vector operations
- ✅
rag_chunkstable with VECTOR(1536) for embeddings - ✅ IVFFlat index for fast vector similarity search
- ✅
match_chunks()function for semantic search - ✅
get_chunk_stats()function for database statistics - ✅ Row Level Security policies
- ✅ Performance indexes
Step 5: Update Environment Variables
Help the user update their .env file:
# Open .env file
# Edit these values with your Supabase credentials:
SUPABASE_URL=https://your-project-ref.supabase.co
SUPABASE_ANON_KEY=eyJ...your_anon_key_from_step_3
SUPABASE_SERVICE_ROLE_KEY=eyJ...your_service_role_key_from_step_3
Also ensure these are set:
# OpenAI (required for embeddings)
OPENAI_API_KEY=sk-your_openai_key
OPENAI_EMBED_MODEL=text-embedding-3-small
OPENAI_CHAT_MODEL=gpt-4o
# AI Provider
AI_PROVIDER=openai
# Optional: Anthropic
ANTHROPIC_API_KEY=your_anthropic_key
ANTHROPIC_CHAT_MODEL=claude-3-5-sonnet-20241022
Step 6: Verify Setup
After configuration, test the database connection:
# Run the test script
python test_setup.py
This script will verify:
- ✅ Environment variables are set
- ✅ Supabase connection works
- ✅ Database tables exist
- ✅ Vector functions are available
Step 7: Seed Initial Data (Optional)
If the project has sample data, seed it:
# Start the server
uvicorn main:app --reload --port 8000
# In another terminal, seed the database
curl -X POST http://localhost:8000/seed
What Gets Created
The sql/init_supabase.sql script from launch-rag creates:
| Component | Description |
|---|---|
| pgvector extension | Enables vector operations in PostgreSQL |
| rag_chunks table | Stores text chunks with 1536-dim embeddings |
| Vector indexes | IVFFlat index for fast similarity search |
| match_chunks() | Function for semantic search queries |
| get_chunk_stats() | Helper to check database statistics |
| RLS policies | Security rules for service/auth/anon access |
Checklist
When setting up Supabase:
- Create new project at supabase.com (~2 min wait)
- Copy Project URL from Settings → API
- Copy anon key from Settings → API
- Copy service_role key from Settings → API
- Open SQL Editor in Supabase dashboard
- Copy entire contents of
sql/init_supabase.sql - Run the SQL script in Supabase
- Verify success messages appear
- Update
.envwith Supabase credentials - Run
python test_setup.pyto verify - Test
/healthzendpoint
Common Issues & Solutions
| Issue | Solution |
|---|---|
| "Extension not found" | Make sure you ran the full SQL script |
| "Function does not exist" | Check if match_chunks() was created |
| "Permission denied" | Use service_role key for backend operations |
| Connection timeout | Check SUPABASE_URL is correct |
| Dimension mismatch | launch-rag uses 1536 (text-embedding-3-small) |
Important Notes
- Use service_role key for backend operations (has full access)
- Keep service_role secret - never expose in frontend code
- Vector dimension is 1536 - matches text-embedding-3-small
- The SQL file is self-contained - run it once on a fresh project
- Verification queries are included at the end of the SQL script
Related Skills
rag-setup- Clone and set up the launch-rag backend first- Use this skill AFTER
rag-setupto complete the database setup