Next.js app for tracking wear on bicycle components using Strava ride data.
Next.js 16 (App Router, Turbopack) · React 19 · TypeScript 5.9 (strict) · Auth.js v5 (Strava OAuth) · Supabase · Tailwind CSS v4 · shadcn/ui · Biome (format + lint) · Husky (git hooks).
pnpm install # also installs Husky hooks via the `prepare` script
pnpm dev # http://localhost:3000Required env vars in .env.local — see CLAUDE.md for the full list (Strava OAuth, Supabase, Auth.js secret, optional Resend).
| Script | Purpose |
|---|---|
pnpm dev |
Start the dev server (Turbopack). |
pnpm build |
Production build. |
pnpm start |
Run the production build. |
pnpm typecheck |
tsc --noEmit. |
pnpm lint |
Biome format + lint check (no writes). |
pnpm lint:fix |
Biome with safe auto-fixes. |
pnpm format |
Format the repo with Biome. |
pnpm format:check |
Check formatting without writing. |
Husky runs a pre-commit hook (.husky/pre-commit) on every commit:
lint-staged→ Biome auto-formats and lints the staged files in place. Configured inpackage.jsonunderlint-stagedto run against*.{ts,tsx,js,jsx,mjs,cjs,json,jsonc,css}. Files undersrc/components/ui/are skipped because they are generated by the shadcn CLI.pnpm typecheckrunstsc --noEmitacross the whole project so type errors block the commit.
The hook is installed automatically by the prepare script during pnpm install. If hooks are not firing, re-run pnpm exec husky to re-install.
To bypass the hook in an emergency (discouraged): git commit --no-verify.
biome.json enables both the formatter and linter with these conventions: 2-space indent, double quotes, semicolons, 100-character line width, ES5 trailing commas. Lint uses Biome's recommended rule set with a few project-specific overrides (a11y rules tuned for decorative icons, etc.). Biome handles everything ESLint used to — there is no ESLint config in the repo.