Recommended reading: Head First Design Patterns — a beginner-friendly, easy-going walkthrough of design patterns. Highly recommended for successful completion of this exercise.
| Layer | Technologies |
|---|---|
| Monorepo | pnpm workspaces, Turborepo |
| Backend | Hono, ClickHouse, Redis, dbmate migrations |
| CLI | Commander.js, Consola |
| Frontend | React, Vite, TanStack Router & Query, shadcn/ui, Tailwind CSS |
| Language | TypeScript, linted by oxlint |
-
Node 24+, see
.nvmrc. -
Docker, for ClickHouse and Redis.
-
dbmate, a standalone binary rather than an npm package:
brew install dbmate
docker compose up -d # ClickHouse and Redis
pnpm install
pnpm db:migrate # creates the schema
pnpm dev # API on :3001, web on :3000Then, in a second terminal:
pnpm cli healthStop the containers with docker compose down, or docker compose down -v to drop the data as well.
| Command | Description |
|---|---|
pnpm dev |
API and web app, both with hot reload |
pnpm typecheck |
Type-checks every package |
pnpm lint |
oxlint |
pnpm build |
Production bundle of the web app |
pnpm cli <args> |
Runs the CLI inside demo/ |
pnpm db:migrate |
Applies pending migrations |
pnpm db:status |
Applied and pending migrations |
interviewkit/
├── apps/
│ ├── api/ Hono backend, port 3001
│ ├── cli/ the `lng` command
│ └── web/ React + Vite app, port 3000
├── packages/
│ ├── config/ ports and connection strings
│ └── plugin-contract/ the interface file format plugins implement
├── demo/ sample project; the CLI runs here
├── db/migrations/ dbmate migrations
└── docker-compose.yml
There is no build step. Node runs TypeScript directly, so relative imports carry
their extension: import { api } from './index.ts'.
Workspace packages export source. @task/config resolves to
packages/config/src/index.ts, and nothing needs building before anything else
runs.
db/schema.sql is generated by dbmate. Change the schema with a migration
(dbmate new <name>), not by editing the dump.
The API's routes are a single chained expression whose type is exported as
ApiType, which hc<ApiType>() turns into a typed client. See
apps/cli/src/commands/health.ts.