An internal annotation review tool that automatically evaluates human-labeled answers using AI judges.
Upload a batch of annotation submissions → assign AI judges to questions → run evaluations → view pass/fail results with filters and aggregate stats.
- Frontend: React 19 + TypeScript + Vite + Tailwind CSS v4
- Backend: Supabase (PostgreSQL + Edge Functions)
- Data fetching: TanStack Query v5
- Validation: Zod
- LLM: Anthropic Claude (configurable; OpenAI also supported)
npm installGo to supabase.com and create a new project.
In the Supabase dashboard → SQL Editor, paste and run the contents of:
supabase/migrations/001_initial_schema.sql
Copy .env.example to .env.local and fill in your Supabase credentials:
cp .env.example .env.localVITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-keynpx supabase functions deploy run-judge --project-ref YOUR_PROJECT_REFSet the required secrets:
npx supabase secrets set ANTHROPIC_API_KEY=sk-ant-... --project-ref YOUR_PROJECT_REF
# Optional — only needed for GPT models:
npx supabase secrets set OPENAI_API_KEY=sk-... --project-ref YOUR_PROJECT_REFnpm run dev- Queues — Upload a
sample_input.jsonfile. Submissions are grouped by queue. - Judges — Create AI judges with a name, system prompt/rubric, and target model.
- Assign — On the Queues page, expand a submission and toggle judges onto each question.
- Run — Click "Run AI Judges" on a queue to evaluate all assigned (question × judge) pairs.
- Results — View verdicts with filters by judge, question, and verdict. Pass rate shown at the top.
See OBJECTIVES.md for full architectural reasoning.
Key decisions:
- Supabase over Firebase — SQL aggregates make pass-rate trivial; no client-side assembly
- Edge Functions for LLM calls — API keys never touch the browser bundle
- Soft-delete judges — preserves evaluation history integrity
- Native structured output — Zod schema passed to LLM for guaranteed verdict shape
- Judge assignment at queue-question level — configure once, runs across all submissions in the queue
~4 hours (AI-assisted development)
Trade-offs made under time pressure:
- Question filter on Results page derives options from loaded evaluations (no separate questions endpoint)
- No pagination on the results table — acceptable for demo scale
- Gemini provider not yet implemented (Claude + OpenAI covered)