Gear Tracker App is a bike maintenance and suspension tracking app that syncs ride and gear data from Strava.
Bike maintenance and suspension tracking powered by your ride history.
Most ride apps know how far your bike has gone, but they do not help you manage real maintenance work: suspension service dates, component intervals, baseline resets, and per-bike service history. Gear Tracker App focuses on turning ride history into actionable bike maintenance records.
- Strava integration: OAuth sign-in, connect/disconnect, activity sync, and linked bike gear IDs.
- Bike maintenance records: Track components, maintenance intervals, last-service baselines, and service history.
- Suspension-first workflow: Fork/shock settings, last service date, service provider notes, and suspension tracking toggles.
- Dashboard metrics: Tracked bike count, total distance, recent distance, since-maintenance distance, due items, and ride load.
- Type-safe full stack: Next.js 15, TypeScript, tRPC, Prisma, SQLite, NextAuth, Tailwind CSS.
- Self-hostable: Docker Compose setup with persistent SQLite storage.
This project integrates with Strava but is not affiliated with, endorsed by, or sponsored by Strava. The app name intentionally avoids using “Strava” as part of the product identity.
- Framework: Next.js 15 App Router
- Language: TypeScript
- API: tRPC
- Auth: NextAuth with Strava OAuth
- Database: SQLite with Prisma ORM
- UI: Tailwind CSS and shadcn/ui-style components
- Deployment: Docker / Docker Compose
- Node.js
>=20.19 <21 - npm
- Strava API credentials from https://www.strava.com/settings/api
cp .env.example .env.localThen update .env.local:
DATABASE_URL="file:./dev.db"
NEXTAUTH_SECRET="replace-with-long-random-secret"
NEXTAUTH_URL="http://localhost:3000"
STRAVA_CLIENT_ID="replace-with-strava-client-id"
STRAVA_CLIENT_SECRET="replace-with-strava-client-secret"
STRAVA_SYNC_COOLDOWN_MINUTES="5"
ADMIN_EMAILS="admin@example.com"For production Docker deployments, use:
DATABASE_URL="file:/app/data/dev.db"
NEXTAUTH_URL="https://your-domain.example"npm install
npm run generate
npx prisma migrate dev
npm run devOpen http://localhost:3000.
docker compose up -d --buildThe default Compose file runs the app on http://localhost:3002 and stores SQLite data in the gear_tracker_app_data volume.
For an isolated local preview instance on port 3005:
docker compose -f docker-compose.preview.yml up -d --buildsrc/
├── app/ # Next.js App Router pages
├── components/ # React components
│ ├── mobile/ # Mobile-first dashboard sections
│ └── ui/ # Shared UI primitives
├── lib/ # Utility libraries and recommendation logic
├── pages/api/ # NextAuth, Strava sync/disconnect, health endpoints
├── server/ # tRPC routers, auth, Prisma, Strava helpers
└── utils/ # Client API utilities
prisma/
├── schema.prisma # Database schema
└── migrations/ # Production migrations
npm run dev # Start dev server
npm run build # Build production app
npm run start # Start production server
npm run generate # Generate Prisma client
npm run migrate # Run Prisma migrate dev
npm run seed # Seed local databaseSee ROADMAP.md for current product direction and delivery phases.
See SECURITY.md and STRAVA-AUTH-SYNC.md for auth/sync operational notes.
MIT