Skip to content

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

Development Tooling

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