AI-powered hiring platform that replaces first-round screening with structured async interviews, voice assessment, and explainable candidate reports.
Licensed under MIT.
- Framework: TanStack Start (React 19 with React Compiler, Vite 8)
- Runtime: Cloudflare Worker (Workflows + scheduled handlers)
- Database: Postgres via Hyperdrive (local Docker for dev/test)
- AI: OpenRouter via Vercel AI SDK v7 + TanStack AI (
@tanstack/ai-openrouterfor text interviews) - Workflows: Cloudflare Workflows — pre-eval, post-eval, batch orchestration, pool-check, eval-retry, account-cleanup
- Voice: ElevenLabs Conversational AI (signed URL +
@elevenlabs/client) - Billing: Polar subscriptions with plan-gated entitlements
- Models: Code-level chains in
app/shared/openrouter.ts— Sonnet/Haiku in prod; free/OpenRouter models in dev - Storage: Cloudflare R2 (resumes, voice audio)
- Email: Cloudflare Email Service (secondary to in-app notifications)
- UI: shadcn/ui, Tailwind CSS v4, Huge Icons
- Linting & Formatting: Oxlint + Oxfmt
- Finding Unused Code & Dependencies: Knip
Use setup.ts — do not install, copy env, or start Postgres by hand:
bun run setupThat installs dependencies, copies .env.example → .env if needed, starts Postgres (dev on :6311, test on :6312), and generates SQLC types.
Then edit .env:
- Set
SESSION_SECRET(openssl rand -hex 32) - Set
VITE_GOOGLE_CLIENT_IDfrom Google Cloud Console (OAuth client, authorized originhttp://localhost:3000) - Keep the Polar placeholders if you are not testing billing. The app still expects those keys to be present.
- Add
OPENROUTER_API_KEYfor interviews and evaluations. Leave ElevenLabs empty to skip voice.
bun run devOptional: sign up as a company, then bun run db:seed (or bun run db:seed you@company.com).
Self-hosting production also needs Cloudflare (Workers, Hyperdrive, R2, Email), Polar, and Sentry. Bindings and account IDs live in wrangler.jsonc — replace them with your own.
| Command | Description |
|---|---|
bun run setup |
Install, env, local Postgres, SQLC |
bun run dev |
Start dev server (port 3000) |
bun run build |
Production build |
bun run check |
Format + lint + typecheck |
bun run typecheck |
TypeScript check only |
bun run sqlgen |
Generate typed queries from SQL (SQLC) |
bun run db:migrate |
Run database migrations |
bun run db:seed |
Seed local demo data |
bun run test |
Run Vitest suite |
app/
├── routes/ # TanStack file-based routes
├── features/ # Feature modules (auth, jobs, applications, accounts, etc.)
├── workflows/ # Cloudflare Workflow classes
├── shared/ # Cross-cutting utilities (db, auth, openrouter, middleware)
├── components/ # Global UI components + shadcn/ui
└── server.ts # Worker entrypoint (fetch + scheduled crons)
- PLATFORM.md — Product specification
- ARCHITECTURE.md — Technical architecture
- AI-LAYER.md — AI funnel, interviews, evaluation, batching
- AGENTS.md — Agent/AI coding conventions
- CONTRIBUTING.md — Local setup and PR checks
- SECURITY.md — Vulnerability reports