Core Technologies
React 18.3.1
What: UI library with concurrent rendering and automatic batchingWhy: Industry-standard component model, excellent TypeScript support, massive ecosystem
Location: All components in
src/components/
- Concurrent rendering for smooth UI updates during heavy calculations
- Automatic batching of state updates (reduces re-renders)
- Strict mode for detecting side effects in development
TypeScript 5.6.2
What: Statically-typed JavaScript supersetWhy: Catch bugs at compile time, better IDE autocomplete, self-documenting code
Location: All
.ts and .tsx files
tsconfig.json):
- Strict mode enabled (
strict: true) - Module resolution: Bundler
- Target: ES2020
The codebase maintains 100% TypeScript coverage — no
.js files except config. This eliminates entire classes of runtime errors.Build Tools
Vite 7.3.1
What: Next-generation frontend build toolWhy: Lightning-fast dev server (instant HMR), optimized production builds, zero-config
Location:
vite.config.ts
- Dev server starts in less than 1s (vs 10s+ with Webpack)
- HMR updates in less than 50ms
- Native ESM in development (no bundling needed)
- Optimized Rollup-based production builds
State Management
Zustand 5.0.11
What: Lightweight state management libraryWhy: Simpler than Redux, no Context boilerplate, less than 1KB minified
Location:
src/stores/
- No boilerplate (no actions, reducers, providers)
- Direct mutation syntax (no immer needed)
- Built-in TypeScript support
- Only used for ephemeral UI state, not persistence
TanStack Query 5.90.20
What: Async state management for server dataWhy: Built-in caching, retry logic, stale-while-revalidate, request deduplication
Location:
src/api/hooks.ts
- Declarative API for async operations (
useQuery,useMutation) - Automatic background refetching with configurable stale time
- Built-in error/retry handling (2 retries by default)
- Global cache with per-query keys (
['tasks', lang]) - Prevents duplicate requests (deduplication)
- Optimistic updates for mutations
gcTime: Infinity).
Database
Dexie 4.3.0
What: Minimalistic wrapper for IndexedDBWhy: Promise-based API, typed queries, transaction handling, compound indexes
Location:
src/db/database.ts
- IndexedDB API is callback-based and verbose
- Dexie provides async/await syntax
- Automatic transaction handling
- Built-in schema versioning for migrations
- TypeScript-first design (
Table<T, K>)
Routing
React Router 7.13.0
What: Declarative routing for ReactWhy: Standard routing solution, code-splitting support, nested routes
Location:
src/App.tsx:1
- Latest version with improved TypeScript types
- Built-in code-splitting with lazy loading
- Support for nested layouts (AppShell wrapper)
- URL-based state for share links (
/share?data=...)
Validation
Zod 4.3.6
What: TypeScript-first schema validationWhy: Runtime validation for user imports, API responses, QR code data
Location: Used in import/export flows
- Schema definition doubles as TypeScript type (
z.infer<typeof ExportSchema>) - Excellent error messages for validation failures
- Composable schemas (can extend/merge)
- Critical for data integrity when importing user-submitted JSON/QR codes
Styling
CSS Modules
What: Scoped CSS with local class namesWhy: No global namespace pollution, tree-shakeable, co-located with components
Location:
*.module.css files alongside components
Example:
- vs Tailwind: More semantic class names, easier to theme
- vs CSS-in-JS (styled-components): Zero runtime cost, better performance
- vs global CSS: Avoids class name collisions, co-located with components
Testing
Vitest 4.0.18
What: Vite-native unit test frameworkWhy: Instant test runs, same config as Vite, Jest-compatible API
Location:
src/domain/__tests__/
src/domain/__tests__/unlock.test.ts):
- Native Vite integration (no babel config needed)
- ~10x faster test runs (uses same transform pipeline as dev server)
- ESM support out of the box
- Jest-compatible API (easy migration path)
Utilities
pako 2.1.0
What: Zlib compression libraryWhy: Compress exported data for smaller QR codes
Location: QR export flow (
src/lib/share.ts)
- Uncompressed export JSON: ~50KB for full progress
- Compressed: ~5KB (90% reduction)
- QR codes have size limits; compression makes data shareable
qrcode.react 4.2.0
What: QR code generator for ReactWhy: Generate scannable QR codes for data sharing
Location: Share export page
react-helmet-async 2.0.5
What: Manage document head (title, meta tags)Why: Set page titles dynamically (“Dashboard | Tarkov Kappa Navi”)
Location:
src/App.tsx:3
Lucide React 0.575.0
What: Icon library (open-source Feather fork)Why: Lightweight SVG icons, tree-shakeable, TypeScript types
Location: Used throughout components
- vs react-icons: Smaller bundle (only imports used icons)
- vs Font Awesome: No font loading, better performance
- vs heroicons: More icons available (1000+ vs 200)
Linting
ESLint 9.13.0
What: JavaScript/TypeScript linterWhy: Enforce code style, catch bugs before runtime
Location:
eslint.config.js
typescript-eslint: TypeScript-specific ruleseslint-plugin-react-hooks: Enforce Hooks rules (prevent bugs)eslint-plugin-react-refresh: Ensure HMR compatibility
Summary Table
| Category | Technology | Version | Purpose |
|---|---|---|---|
| UI | React | 18.3.1 | Component library |
| Language | TypeScript | 5.6.2 | Type safety |
| Build | Vite | 7.3.1 | Dev server + bundler |
| State (UI) | Zustand | 5.0.11 | Ephemeral UI state |
| State (Server) | TanStack Query | 5.90.20 | API caching |
| Database | Dexie | 4.3.0 | IndexedDB wrapper |
| Routing | React Router | 7.13.0 | Client-side routing |
| Validation | Zod | 4.3.6 | Schema validation |
| Styling | CSS Modules | (native) | Scoped CSS |
| Testing | Vitest | 4.0.18 | Unit tests |
| Icons | Lucide React | 0.575.0 | SVG icons |
| Compression | pako | 2.1.0 | Zlib compression |
| QR Codes | qrcode.react | 4.2.0 | QR generation |
| Meta Tags | react-helmet-async | 2.0.5 | Document head |
| Linting | ESLint | 9.13.0 | Code quality |
Design Philosophy
Minimal Dependencies
The project uses only 13 runtime dependencies (vs 50+ in typical React apps). Each dependency must justify its inclusion:- Solves a complex problem (IndexedDB → Dexie)
- Provides significant DX improvement (TanStack Query)
- No good native/lightweight alternative (QR codes, compression)
Modern, Stable Versions
All dependencies use:- Latest stable major versions (no legacy cruft)
- Active maintenance (no abandoned packages)
- TypeScript-first design (no @types/* mismatches)
Performance-First Choices
- Vite over Webpack (10x faster builds)
- Zustand over Redux (99% smaller bundle)
- CSS Modules over CSS-in-JS (zero runtime)
- Vitest over Jest (instant test runs)
Local-First Optimized
- Dexie for robust offline storage
- TanStack Query for stale-while-revalidate caching
- pako for efficient data compression
- React Router for URL-based state (shareable links)