Troubleshooting
Common problems and how to fix them.
Self-hosting
Section titled “Self-hosting”Blank page after deploying to Vercel
Section titled “Blank page after deploying to Vercel”Almost always missing environment variables.
- Go to Vercel → your project → Settings → Environment Variables
- Verify both
VITE_SUPABASE_URLandVITE_SUPABASE_ANON_KEYare set - Make sure the URL doesn’t have a trailing slash:
https://abcd.supabase.conothttps://abcd.supabase.co/ - After adding or changing variables, trigger a redeployment: Deployments → three-dot menu → Redeploy
Can’t log in / “Email provider not enabled”
Section titled “Can’t log in / “Email provider not enabled””Supabase doesn’t enable email auth by default.
- Go to your Supabase project → Authentication → Providers
- Find Email and toggle it on
- Under Auth Settings, if you want immediate access without email confirmation, disable Confirm email
”Invalid API key” error in the browser
Section titled “”Invalid API key” error in the browser”You’re likely using the wrong Supabase key. The VITE_SUPABASE_ANON_KEY should be the anon / public key, not the service role key. Both are JWTs but serve different purposes. Find the correct one at Supabase → Project Settings → API → Project API keys → anon public.
Data not appearing after running migrations
Section titled “Data not appearing after running migrations”Check that the migrations ran successfully:
- Go to Supabase → Table Editor
- You should see tables like
claude_usage,openclaw_usage,uptime_checks,relay_checks,custom_metrics - If tables are missing, the migration didn’t run — go to the SQL editor and run the migration files from
supabase/migrations/in order
If tables exist but data isn’t showing, the RLS policies may not have been applied. Go to Supabase → Authentication → Policies and verify each table has policies defined. The migrations should create these, but if a migration failed partway through, policies may be missing.
Collector scripts
Section titled “Collector scripts””synced 0 sessions” — no data appearing
Section titled “”synced 0 sessions” — no data appearing”The collector only processes files modified in the last 2 hours by default. A few possibilities:
- No recent sessions — if you haven’t used Claude Code in the last 2 hours, nothing will sync. That’s expected.
- Backfilling needed — if you just set up the collector, your historical data is outside the 2-hour window. Set
cutoff = 0in the script temporarily to import everything. - Wrong path — verify the session files exist:
ls ~/.claude/projects/andls ~/.openclaw/agents/main/sessions/
HTTP 401 or 403 from Supabase
Section titled “HTTP 401 or 403 from Supabase”You’re using the wrong key. Collector scripts require the service role key (bypasses RLS), not the anon key. Find it at Supabase → Project Settings → API → service_role. It’s a longer JWT.
Cron job not running
Section titled “Cron job not running”Verify the cron entry exists: crontab -l
If the entry is there but the script isn’t running, check the log file you specified (e.g., tail -f /tmp/numbrs-claude.log). Common issues:
- Full paths required — cron runs with a minimal environment. Use full paths like
/bin/bash /Users/you/script.sh, notbash ~/script.sh - Environment variables not set — they must be in the crontab line itself, not in your shell profile
- macOS cron permissions — on macOS, cron may need Full Disk Access. Go to System Preferences → Security & Privacy → Privacy → Full Disk Access and add
/usr/sbin/cron
Script exits immediately with no output
Section titled “Script exits immediately with no output”All three environment variables must be set: NUMBRS_SUPABASE_URL, NUMBRS_SUPABASE_SERVICE_KEY, and NUMBRS_OWNER_ID. The script exits with an error message if any are missing — check your terminal output or log file.
”delivery-mirror” model showing in Claude data
Section titled “”delivery-mirror” model showing in Claude data”This is an internal routing model that older versions of the collector didn’t filter out. Update to the latest collector script — it explicitly skips delivery-mirror entries.
Wrong project names in Claude Code data
Section titled “Wrong project names in Claude Code data”The script strips your username from directory names to create readable project labels. If the stripping logic produces odd results (can happen with unusual home directory paths), set CLAUDE_USERNAME explicitly:
CLAUDE_USERNAME=yourusername bash ~/numbrs-claude-collector.shDashboard and charts
Section titled “Dashboard and charts”Panels not loading / “No data”
Section titled “Panels not loading / “No data””- Check the time range — if it’s set to “Last 1 hour” and you have no recent data, nothing will show. Extend the range.
- Verify the metric name in the panel config matches exactly what you’re pushing. Metric names are case-sensitive.
- Check that data is actually in the database: go to Supabase → Table Editor → find your table and see if rows exist.
Chart appears empty after pushing metrics
Section titled “Chart appears empty after pushing metrics”There may be a short delay (up to a minute) before data appears on dashboards. Refresh the page after a moment.
If data still doesn’t appear, check the API response when you push the metric — a 200 OK confirms the data was accepted. A 401 means your API key is wrong.
Tags not filtering correctly
Section titled “Tags not filtering correctly”Tags in numbrs are exact string matches. Make sure the tag keys and values you’re filtering by in the dashboard match exactly what you’re pushing in your metric payload.
Getting more help
Section titled “Getting more help”- GitHub Issues — github.com/satsdisco/numbrs/issues for bugs and feature requests
- Quick Start — /getting-started/quick-start if you’re just getting started
- Self-Hosting — /getting-started/self-hosting for deployment help