A quick, anonymous temperature check for your team. No tracking, no judgments — just honest signals.
- Go to supabase.com and create a free project.
- Once the project is ready, go to Settings → API and note your:
- Project URL (looks like
https://abc123.supabase.co) - anon public key (a long
eyJ...string)
- Project URL (looks like
- In your Supabase dashboard, go to SQL Editor.
- Paste the contents of
supabase/schema.sqland run it. This creates all the tables. - Then paste the contents of
supabase/seed.sqland run it. This creates a demo team called "Example Team" with sample data.
cp .env.local.example .env.localEdit .env.local and fill in your Supabase credentials:
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here
npm install
npm run devOpen http://localhost:3000.
After running the seed script, you have a team "Example Team" with:
- Admin page: /admin/demo-admin-token-abc123
- Dashboard: /t/example
- Open round (respond): /r/demo-round-4
- Tables appear in Supabase Table Editor
-
teamshas one row ("Example Team") -
question_bankhas 10 questions (4 fixed + 6 rotating) -
roundshas 4 rows (3 closed, 1 open)
- Go to
/admin/demo-admin-token-abc123 - See existing rounds listed with status badges
- Click "Create new round" — a new round appears with a respond link
- "Copy link" copies the
/r/[token]URL
- Open a respond link (e.g.,
/r/demo-round-4) - See one question at a time with progress bar
- Select an answer — auto-advances to next question
- After last question, see optional free-text field
- Submit and see "Thanks — temperature recorded"
- Going back to the same link still works (no duplicate prevention yet)
- Go to
/t/example - See cards for each fixed question with sparklines
- See "What seems different since last time?" section
- "Mixed signals" badge appears where spread is high
- If fewer than 4 responses exist for a round, it shows "Not enough responses yet"
- Click "Open retro view for latest round" from dashboard
- See "Signals worth discussing" with lowest avg and highest spread
- See "Questions to ask" and "Small experiments to try"
- On admin page, scroll to Settings section
- Change cadence, scale, min responses, free text toggle
- Changes persist after page refresh
src/
app/
page.tsx Landing page
layout.tsx Root layout
globals.css Tailwind + theme colors
r/[token]/page.tsx Response flow
t/[teamSlug]/page.tsx Dashboard (server component)
t/[teamSlug]/DashboardClient.tsx Dashboard UI (client)
t/[teamSlug]/retro/[roundId]/page.tsx Retro view
admin/[token]/page.tsx Admin area
api/
respond/route.ts POST submit responses
admin/
create-round/route.ts POST create round
close-round/route.ts POST close round
settings/route.ts GET/PUT team settings
questions/route.ts POST/DELETE questions
lib/
supabase.ts Supabase client
queries.ts All database queries
components/
Sparkline.tsx SVG sparkline chart
MixedSignals.tsx "Mixed signals" badge
supabase/
schema.sql Database schema
seed.sql Demo data
- Push this repo to GitHub.
- Go to vercel.com/new and import your repo.
- Add environment variables in Vercel project settings:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEY
- Deploy. That's it.
The seed data and current setup use the Supabase anon key without RLS policies. For a production deployment, you should add RLS policies. For this internal-tool prototype, the anon key + obscure tokens provide basic access control.