Repository navigation
Spec 02 Tech Stack
Section of Quizzivy — Frontend Portal & Data Model Specification · Previous · Next
Fixed unless Thuong approves a change. Do not swap libraries silently.
| Concern | Choice | Notes |
|---|---|---|
| Build | Vite + React 19 + TypeScript (strict) | pnpm |
| Routing | React Router v7 (SPA mode) | Route-level code splitting via lazy
|
| Server state | TanStack Query v5 | All API reads/writes go through query/mutation hooks |
| Client state | Zustand (minimal) | Auth session, test-taking engine, UI prefs only |
| Forms | react-hook-form + zod | Zod schemas are the single source of validation and TS types |
| Styling | Tailwind CSS v4 + shadcn/ui (neutral/zinc base) | See §12 |
| Icons | lucide-react | One icon set only |
| i18n | i18next + react-i18next |
vi default, en secondary. All strings via t() from day one. |
| Dates | date-fns + date-fns-tz |
Asia/Ho_Chi_Minh default |
| HTTP | native fetch wrapped in src/lib/api/client.ts
|
No axios |
| Google auth | Google Identity Services | Authorization Code + PKCE, exchanged server-side (§5.3) |
| AI assistant | Anthropic's API, through the official Go SDK in platform/anthropic
|
Reached only through the ai module's Completer port, wired in core. Two tiers, fast and capable (the capable one reads images and PDF pages); each tier's model and its three prices are configuration (AI_TIER_*), and no model identifier is written in the code or the documents. Off unless ANTHROPIC_API_KEY is set. §8, §15, §16, §17 |
| Audio | native <audio> element + custom React controls |
No wavesurfer.js, no howler. See §11.3 |
| Object storage | Cloudflare R2 (S3-compatible) | Audio and image assets. aws-sdk-go-v2/s3 on the backend |
| Markdown | react-markdown + rehype-sanitize | Never dangerouslySetInnerHTML with server content |
| Drag & drop |
@dnd-kit/core + @dnd-kit/sortable
|
Builder reordering only; lazy-loaded |
| Testing | Vitest + Testing Library; Playwright e2e; MSW mocks | See §14 |
| Lint/format | ESLint (typescript-eslint, react-hooks, jsx-a11y) + Prettier | CI fails on lint errors |
Single SPA, three route trees. /teacher/*, /app/*, and a small public tree (/login, /join/*). Split at the route level so a student never downloads teacher code and an anonymous visitor downloads neither. A /admin/* address redirects to the same path under /teacher until R5 builds the Admin console at /admin.
Section of Quizzivy — Frontend Portal & Data Model Specification · Previous · Next
Generated from docs/quizzivy-spec-v0.3.md. Edit that file in the repository; changes made on this page are overwritten.
Generated from the repository's documentation on every push to develop.
Start here
Product
Implementation plan
- 00 Architecture overview
- 10 Phase 0: Scaffold and contract
- 11 Phase 1: Auth, join, shells
- 12 Phase 2: Admin authoring
- 13 Phase 3: Assign and take
- 14 Phase 4: Grade and results
- 15 Phase 5: Hardening
- 16 Phase 4.5: The student at a desk
- 17 Word import: milestone plan
- 18 Word import: teacher workflow
- 19 Versioned content contract
- 20 Data model
- 30 Risk register
- 40 Open items
- 50 Non-functional requirements
- 60 Backend architecture
- 91 September 2026 issue remediation
- 92 Student layouts and interaction rules
Redesign (Phase R)
- 70 Redesign overview
- 71 R1: Foundations (v0.7.0)
- 72 R2: Access (v0.8.0)
- 73 R3: Student console (v0.9.0)
- 74 R4: Teacher workspace (v0.10.0)
- 74d D4: Deck update (v0.11.0)
- 74e E1: Moving a question across a group
- 75 R5: Admin console and email (v0.12.0)
- 76 R6: Question types and scoring (v0.13.0)
- 77 R7: Collaboration (v0.14.0)
- 78 R8: Schedule (v0.15.0)
- 79 R9: Insights (v0.16.0)
- 80 R10: Learn (v0.17.0)
- 81 R11: Landing, leads, v1.0 (v1.0.0)
Setup and operations
- CI
- Deploying
- DNS for quizzivy.com
- Google OAuth client
- Production operations
- Cloudflare R2 bucket
- Word import worker
- R4 rehearsal on a Neon branch
Design
Team
- Agent team
- Verification environment
- Team ledger
- R4 readiness
- R4 verification strategy
- T-R4.51 browser verification
Code READMEs