AI voice interview practice that analyses not just what you say, but how you say it -- tone, hesitation, enthusiasm, and confidence.
git clone https://github.com/planetaryescape/interviewoptimiser.git
cd interviewoptimiser
bun installWith Doppler (recommended):
doppler setupWithout Doppler -- copy .env.example and add keys from each service below:
cp .env.example .env.localbun run db:migrate:devbun run devVisit http://localhost:3000.
| Service | Purpose | Get Keys |
|---|---|---|
| Clerk | Authentication | Dashboard > API Keys |
| Hume AI | Voice-to-voice interviews | Platform > API Keys |
| Stripe | Payments | Developers > API Keys |
| OpenAI | AI analysis | API Keys |
| PostgreSQL | Database | Local or hosted (Neon, Supabase) |
| AWS S3 | Audio file storage | IAM > Access Keys |
| Upstash Redis | Rate limiting, caching | Console > REST API |
| Sentry | Error monitoring | Settings > Client Keys |
All keys are managed via Doppler. See .env.example for variable names.
bun run dev # Dev server (Doppler injects secrets)
bun run build # Production build
bun run test # Run tests
bun run lint:fix # Fix linting (Biome)
bun run typecheck # TypeScript check
bun run db:studio # Drizzle Studio GUI
bun run dev:webhooks # Start ngrok for webhook testingsrc/app/ # Next.js pages and API routes
lib/ai/ # AI analysis and interview logic
db/ # Database schema, queries, migrations
lib/inngest/ # Background job processing
lib/utils/ # Shared utilities
src/components/ # React components
src/emails/ # Email templates (React Email)
terraform/ # AWS infrastructure (Lambda, S3)
docs/ # Detailed documentation
- Framework: Next.js 15, React 19, TypeScript
- Styling: Tailwind CSS, shadcn/ui
- Database: PostgreSQL, Drizzle ORM
- AI/Voice: Hume AI Voice SDK, AI SDK v6 + OpenAI
- Auth: Clerk
- Payments: Stripe
- Background Jobs: Inngest
- Storage: AWS S3, CloudFront
- Monitoring: Sentry, PostHog
- Technical Architecture
- Product Spec
- Development Guides -- auth, audio, caching, migrations
- Security -- CSRF, webhooks, rate limiting
- Fork and clone
- Create feature branch
- Use Bun exclusively (never npm/yarn)
- Biome for linting (not ESLint)
- Commit format:
type: description - Run
bun run lint:fix && bun run typecheckbefore PRs
MIT