Execute collect Supabase debug evidence for support tickets and troubleshooting.
Use when encountering persistent issues, preparing support tickets,
or collecting diagnostic information for Supabase problems.
Trigger with phrases like "supabase debug", "supabase support bundle",
"collect supabase logs", "supabase diagnostic".
Collect a comprehensive, redacted diagnostic bundle from a Supabase project. Tests connectivity, auth, Realtime, Storage, RLS policy behavior, and database health — then packages everything into a single archive safe for sharing with Supabase support.
Current State
!node --version 2>/dev/null || echo 'Node.js not found'
!npx supabase --version 2>/dev/null || echo 'Supabase CLI not found'
!npm list @supabase/supabase-js 2>/dev/null | grep supabase || echo '@supabase/supabase-js not installed'
Prerequisites
Node.js 18+ with @supabase/supabase-js v2 installed in the project
Supabase CLI installed (npm i -g supabase or npx supabase)
Environment variables set: SUPABASE_URL and (minimum); for full diagnostics
SUPABASE_ANON_KEY
SUPABASE_SERVICE_ROLE_KEY
Project linked via supabase link --project-ref <ref> (for CLI commands)
Instructions
Step 1: Gather Environment and Connectivity
Collect SDK version, project URL, key type, and test basic connectivity against the REST and Auth endpoints.
What to check: REST API should return 200. Auth should return ok. Database probe returning 42P01 (relation not found) is normal — it confirms the PostgREST connection works.
Step 2: Test Realtime, Storage, and RLS
Probe the three subsystems that cause the most support tickets.
What to check: Realtime should reach SUBSCRIBED within 5 seconds. Storage should list buckets without error. RLS comparison showing identical row counts for anon and service_role on a table you expect to be protected means RLS policies may be missing.
Step 3: Collect Database Health and Package the Bundle
Pull database statistics via the Supabase CLI inspect commands and the platform status page, then archive everything.
#!/bin/bash
set -euo pipefail
BUNDLE_DIR="supabase-debug-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BUNDLE_DIR"
# 3a — Supabase CLI status (local dev)
npx supabase status > "$BUNDLE_DIR/cli-status.txt" 2>&1 || echo "CLI status unavailable (not linked or no local dev)" > "$BUNDLE_DIR/cli-status.txt"
# 3b — Database inspection via CLI
npx supabase inspect db table-sizes > "$BUNDLE_DIR/table-sizes.txt" 2>&1 || true
npx supabase inspect db index-usage > "$BUNDLE_DIR/index-usage.txt" 2>&1 || true
npx supabase inspect db cache-hit > "$BUNDLE_DIR/cache-hit.txt" 2>&1 || true
npx supabase inspect db seq-scans > "$BUNDLE_DIR/seq-scans.txt" 2>&1 || true
npx supabase inspect db long-running-queries > "$BUNDLE_DIR/long-queries.txt" 2>&1 || true
npx supabase inspect db bloat > "$BUNDLE_DIR/bloat.txt" 2>&1 || true
npx supabase inspect db replication-slots > "$BUNDLE_DIR/replication.txt" 2>&1 || true
# 3c — Platform status page
curl -sf https://status.supabase.com/api/v2/status.json \
| python3 -m json.tool > "$BUNDLE_DIR/platform-status.json" 2>/dev/null \
|| echo '{"error": "Could not reach status.supabase.com"}' > "$BUNDLE_DIR/platform-status.json"
# 3d — Redact secrets from all collected files
find "$BUNDLE_DIR" -type f -exec sed -i \
-e 's/eyJ[A-Za-z0-9_-]\{20,\}\(\.[A-Za-z0-9_-]*\)*/[JWT_REDACTED]/g' \
-e 's/sbp_[A-Za-z0-9]\{20,\}/[SBP_KEY_REDACTED]/g' \
-e 's/[A-Za-z0-9._%+-]\+@[A-Za-z0-9.-]\+\.[A-Za-z]\{2,\}/[EMAIL_REDACTED]/g' {} +
# 3e — Package
tar czf "${BUNDLE_DIR}.tar.gz" "$BUNDLE_DIR"
echo "Debug bundle created: ${BUNDLE_DIR}.tar.gz"
echo "Contents:"
ls -lh "$BUNDLE_DIR"/
What to check: Review cache-hit.txt — index and table hit rates below 99% indicate memory pressure. bloat.txt values above 50% on large tables warrant a VACUUM. seq-scans.txt highlights tables needing indexes.
Output
The skill produces supabase-debug-YYYYMMDD-HHMMSS.tar.gz containing:
File
Contents
cli-status.txt
Local Supabase stack status (services, ports, URLs)
table-sizes.txt
All tables with row counts and disk usage
index-usage.txt
Index scan frequency — unused indexes are candidates for removal
cache-hit.txt
Buffer cache and index cache hit ratios
seq-scans.txt
Tables with high sequential scan counts (missing indexes)
long-queries.txt
Currently running queries over the duration threshold
bloat.txt
Table and index bloat percentages
replication.txt
Replication slot status (relevant for Realtime)
platform-status.json
Supabase platform health from status.supabase.com
Plus the TypeScript diagnostics output (connectivity, auth, Realtime, Storage, RLS) printed to stdout.
All JWT tokens, Supabase project keys (sbp_*), and email addresses are automatically redacted before archiving.
Error Handling
Symptom
Cause
Fix
REST API returns 401
Invalid or expired anon key
Regenerate key in Dashboard > Settings > API
REST API returns 000 or times out
Wrong SUPABASE_URL or project paused
Verify URL; unpause project in Dashboard
Realtime returns CHANNEL_ERROR
WebSocket blocked by firewall/proxy
Check corporate proxy; try from a different network
Realtime times out (5s)
Realtime addon not enabled or quota hit
Enable Realtime on the table in Dashboard > Database > Replication
Storage listBuckets returns 403
RLS enabled on storage without policy
Add a storage policy or use service_role key
supabase inspect db fails
CLI not linked to remote project
Run supabase link --project-ref <ref> first
cache-hit below 95%
Database instance too small for workload
Upgrade compute size or optimize queries
RLS shows identical counts
No RLS policies on the table
Add policies via ALTER TABLE ... ENABLE ROW LEVEL SECURITY