Files
GearBox/.planning/PROJECT.md

5.3 KiB

GearBox

What This Is

A web-based gear management and purchase planning app. Users catalog their gear collections (bikepacking, sim racing, or any hobby), track weight, price, and source details, and use planning threads to research and compare new purchases. Named setups let users compose loadouts from their collection with live weight/cost totals. Built as a single-user app with a clean, minimalist interface.

Core Value

Make it effortless to manage gear and plan new purchases — see how a potential buy affects your total setup weight and cost before committing.

Requirements

Validated

  • ✓ Gear collection with item CRUD (name, weight, price, category, notes, product link) — v1.0
  • ✓ Image uploads for gear items — v1.0
  • ✓ User-defined categories with automatic weight/cost totals — v1.0
  • ✓ Planning threads for purchase research with candidate products — v1.0
  • ✓ Thread resolution: pick a winner, it moves to collection — v1.0
  • ✓ Named setups (loadouts) composed from collection items — v1.0
  • ✓ Live weight and cost totals per setup — v1.0
  • ✓ Dashboard home page with summary cards — v1.0
  • ✓ Onboarding wizard for first-time setup — v1.0
  • ✓ Thread creation with category assignment via modal dialog — v1.1
  • ✓ Planning tab with educational empty state and pill tab navigation — v1.1
  • ✓ Image display on item detail views and gear cards with placeholders — v1.1
  • ✓ Hero image upload area with preview and click-to-upload — v1.1
  • ✓ Lucide icon picker for categories (119 curated icons, 8 groups) — v1.1
  • ✓ Automatic emoji-to-Lucide icon migration for existing categories — v1.1

Active — v1.2 Collection Power-Ups

Goal: Make core gear management significantly more useful as collections grow — better search, proper weight classification, richer planning threads.

Target features:

  • Search items by name and filter by category
  • Classify items as base weight, worn, or consumable per setup
  • Weight distribution visualization (chart by category/classification)
  • Candidate status tracking (researching → ordered → arrived)
  • Weight unit selection (g, oz, lb, kg)
  • Planning category filter with icon-aware dropdown

Future

  • Side-by-side candidate comparison on weight and price
  • Candidate ranking/prioritization within threads
  • Impact preview: how a candidate affects setup weight/cost
  • CSV import/export for gear collections
  • Multi-user accounts with authentication
  • Collection sharing and social features (public profiles, shared setups)
  • Auto-fill product information (price, weight, images) from external sources

Out of Scope

  • Custom comparison parameters — complexity trap, weight/price covers 80% of cases
  • Mobile native app — web-first, responsive design sufficient
  • Price tracking / deal alerts — requires scraping, fragile
  • Barcode scanning / product database — requires external database
  • Community gear database — requires moderation, accounts
  • Real-time weather integration — only outdoor-specific, GearBox is hobby-agnostic

Context

Shipped v1.1 with 6,134 LOC TypeScript. Tech stack: React 19, Hono, Drizzle ORM, SQLite, TanStack Router/Query, Tailwind CSS v4, Lucide React, all on Bun. Primary use case is bikepacking gear but data model is hobby-agnostic. Replaces spreadsheet-based gear tracking workflow.

Constraints

  • Runtime: Bun — used as package manager and runtime
  • Design: Light, airy, minimalist — white/light backgrounds, lots of whitespace, no visual clutter
  • Navigation: Dashboard-based home page, not sidebar or top-nav tabs
  • Scope: No auth, single user for v1

Key Decisions

Decision Rationale Outcome
No auth for v1 Single user, simplicity first ✓ Good
Generic data model Support any hobby, not just bikepacking ✓ Good
Dashboard navigation Clean entry point, not persistent nav ✓ Good
Bun runtime User preference ✓ Good
Service layer with DI Accept db as first param for testability ✓ Good
Hono context variables for DB Enables in-memory SQLite integration tests ✓ Good
Prices stored as cents Avoids float rounding issues ✓ Good
Vite proxy dev setup Required by TanStack Router plugin ✓ Good
drizzle-kit needs better-sqlite3 bun:sqlite not supported by CLI ✓ Good
Tab navigation via URL params Shareable URLs between gear/planning ✓ Good
Setup item sync: delete-all + re-insert Simpler than diffing, atomic in transaction ✓ Good
Onboarding state in SQLite settings Source of truth in DB, not Zustand ✓ Good
Stay with SQLite Single-user app, no need for Postgres complexity ✓ Good
Lucide Icons for categories Best outdoor/gear icon coverage, tree-shakeable, clean style ✓ Good
categoryId on threads (NOT NULL FK) Every thread belongs to a category ✓ Good
Modal dialog for thread creation Cleaner UX, supports category selection ✓ Good
Hero image area at top of forms Image-first UX, 4:3 aspect ratio consistent with cards ✓ Good
Emoji-to-icon automatic migration One-time schema rename + data conversion via Drizzle migration ✓ Good
ALTER TABLE RENAME COLUMN for SQLite Simpler than table recreation for column rename ✓ Good

Last updated: 2026-03-16 after v1.2 milestone start