Tech Stack
Core Technologies
| Category |
Technology |
Version |
Purpose |
Rationale |
| Language |
TypeScript |
v5.7 (backend) / v5 (frontend) |
Shared across frontend and backend |
Type safety and a good fit with OpenAPI-driven type generation |
| Runtime (backend) |
Bun |
v1 |
Execution, package management, test runner |
Native TS execution and fast dependency resolution |
| Framework (backend) |
Hono |
^4.6 |
HTTP server |
Lightweight and well suited to edge / Lambda |
| API definition (backend) |
@hono/zod-openapi |
^1.2 |
Generates OpenAPI from route definitions |
Definition and handler live together, so schemas are not duplicated |
| ORM |
Drizzle ORM |
^0.38 |
DB access |
Types inferred from the schema, with SQL-like ergonomics |
| DB |
PostgreSQL |
17 |
Persistence |
Proven handling of JSON columns and enums |
| Framework (frontend) |
Next.js |
16.1 (App Router) |
Admin console |
App Router routing and server components |
| UI library |
React |
19.2 |
Rendering |
Required by Next.js 16 |
| Styling |
Tailwind CSS |
v4 |
Styles |
Utility-first, with in-house UI components |
| Server state |
TanStack Query (React Query) |
^5.90 |
API caching and revalidation |
Orval generates React Query hooks |
| API client generation |
Orval |
^8.1 |
Types and hooks from OpenAPI |
Automates the seam between backend and frontend |
| Auth |
Google OAuth 2.0 + JWT (jose) |
jose ^5.9 |
Login and API authorization |
Organizational use on Google Workspace |
| Infrastructure |
AWS Lambda / ECS Fargate / App Runner / ECR |
- |
Runtime environments |
See Infrastructure |
| Data integration |
Databricks |
none (SQL Statement Execution API called with fetch) |
Fetch Creative Survey / Ask One answers |
Read-only; no driver dependency |
Key Libraries
Backend
| Library |
Version |
Purpose |
hono |
^4.6.18 |
HTTP framework |
@hono/zod-openapi |
^1.2.0 |
Route definitions with OpenAPI |
@hono/swagger-ui |
^0.5.3 |
Swagger UI at /docs |
@hono/zod-validator |
^0.4.2 |
Request validation |
zod |
^4.0.0 |
Schemas and env validation |
drizzle-orm |
^0.38.4 |
ORM |
drizzle-kit |
^0.30.4 |
Schema push, migrations, Studio |
pg |
^8.16.0 |
PostgreSQL driver |
jose |
^5.9.6 |
JWT signing and verification |
googleapis |
^144.0.0 |
Google Calendar / Gmail |
@aws-sdk/client-ecs |
^3.1045.0 |
Launch sync batches as ECS tasks |
csv-parse |
^6.1.0 |
CSV / TSV parsing |
winston |
^3.17.0 |
Structured logging |
uuid |
^11.0.5 |
Uploaded file IDs |
vitest |
^2.1.8 |
Test runner |
Frontend
| Library |
Version |
Purpose |
next |
16.1.6 |
Framework |
react / react-dom |
19.2.3 |
UI |
@tanstack/react-query |
^5.90.20 |
Server state |
orval |
^8.1.0 |
API client generation (dev-time) |
axios |
^1.13.4 |
HTTP (Orval peer dependency) |
date-fns |
^4.1.0 |
Date handling |
lucide-react |
^0.563.0 |
Icons |
clsx / tailwind-merge |
^2.1.1 / ^3.4.0 |
Class name composition (cn()) |
tailwindcss |
^4 |
Styling |
| Tool |
Purpose |
| ESLint |
Static analysis (eslint.config.js / eslint.config.mjs) |
| Prettier |
Formatting |
| husky + lint-staged |
Runs prettier --write and eslint --fix over src/** on commit |
| Vitest |
Backend unit tests |
| Drizzle Studio |
GUI for browsing the DB |
| Swagger UI |
Manual API exploration (/docs) |
No test runner on the frontend
The frontend has no test runner. Type checking (bun run check-types) and linting are the quality gates.
Under Consideration / Deprecated
| Technology |
State |
Notes |
GET /api/v1/surveys/{surveyId}/respondents |
Deprecated |
Legacy endpoint; replaced by the /panels endpoints |
arrangeSettings.step1.mainInterviewerId / subInterviewerId |
Deprecated |
Singular fields; superseded by mainInterviewerIds / subInterviewerIds |