A programming-themed idle/incremental game.
- React 19 + TypeScript + Vite
- Zustand with
subscribeWithSelectorfor state management - Tailwind CSS v4 for styling
- Biome for linting/formatting
- Bun as package manager
- Vaul for drawer components
src/data/— Game data as typed constants (buildings, upgrades, achievements, hacks, bugs, buffs, prestige)src/store/gameStore.ts— Single Zustand store for all game state and actionssrc/store/selectors.ts— Pure functions computing derived state (production, click value, tech debt penalty, mastery)src/types/game.ts— All TypeScript interfaces and discriminated unionssrc/hooks/— Game loop (50ms tick), auto-save, achievement checkersrc/utils/— Number formatting, cost calculations, save/load (localStorage with versioned migrations)
- Data-driven: All game content defined in
src/data/. Adding a building/upgrade means editing one array. - Multiplicative production chain: Each building's output passes through ~10 independent multiplier layers (upgrades, prestige, buffs, tech debt, mastery).
- Tech debt as organic mechanic: Every building generates TD proportional to output. Penalty scales dynamically with production rate, not static thresholds.
- Save versioning:
SAVE_VERSIONin saveManager.ts with chained migration functions for backward compatibility. - Granular Zustand selectors: Components subscribe to specific state slices to avoid full-app re-renders on 50ms ticks.
bun dev # Start dev server
bun run build # Type-check + production build
bun run lint # Biome check