Everything here comes from frontend/package.json, managed with bun. Same idea as the backend page — you don’t need to know every package deeply, just what to blame.
Package
What it does
react / react-dom
The UI framework
vite
Dev server and build tool
@tanstack/react-router
File-based routing — see Architecture
Package
What it does
@tanstack/react-query
Fetches, caches, and re-fetches server data — wraps every call to the generated client
axios
The actual HTTP client underneath the generated API client
Package
What it does
tailwindcss
Utility-class styling
shadcn/ui (via components.json + components/ui/)
Pre-built, copy-into-your-repo components — not a library you npm install and forget
@radix-ui/*
The unstyled, accessible primitives shadcn/ui components are built on
lucide-react
Icons
class-variance-authority, clsx, tailwind-merge
Small helpers for combining Tailwind classes conditionally
Package
What it does
react-hook-form
Form state and submission
zod
Schema validation for form inputs
@hookform/resolvers
Connects the two above together
Package
What it does
@biomejs/biome
Lint and format — this project doesn’t use ESLint/Prettier
typescript
Type checking
@playwright/test
End-to-end tests
@hey-api/openapi-ts
Generates src/client/ from the backend’s OpenAPI schema
Where to look when something’s wrong
A styling issue → Tailwind/shadcn. A form won’t submit → zod/react-hook-form. Data looks stale after a change → check the TanStack Query cache. A type error right after a backend change → the generated client is probably out of date — see The Generated API Client .