# Disc Golf Tracker A private, on-device disc golf scorecard app. Log rounds, track your bag, and follow your progress over time — no account or server needed. **Live at [dgt.hannu.be](https://dgt.hannu.be)** -> server is not on 247 but app does not need page reloads. --- ## Features ### Scoring - Log rounds hole by hole with − / + controls - Scores default to par — tap through a hole without entering a number and par is recorded automatically - Birdie / Eagle / Par / Bogey labels appear in real time (no aces yet!) - Running total vs. par shown throughout the round - Auto-save on every tap — leave mid-round and resume from the Home screen ### Courses - Add courses with custom hole counts (9, 18, or 24) and per-hole par - Saved courses are reusable across rounds - Multiple players per round, roster remembered between sessions ### Bag - Build a disc bag with name, type (Distance Driver, Fairway Driver, Midrange, Putter), and color - Tag which disc was thrown on each hole during play - Per-disc stats: throw count and average score vs. par ### Stats & History - Leaderboard ranked by average score vs. par across all rounds - Per-player breakdown: eagles, birdies, pars, bogeys with a visual bar - Score trend chart across rounds (line chart per player) - Average score by course - Full scorecard for every finished round with disc usage overlay --- ## Tech stack - [React](https://react.dev/) — UI - [Vite](https://vite.dev/) — build tool - [Tailwind CSS v4](https://tailwindcss.com/) — styling - [Recharts](https://recharts.org/) — trend charts - [lucide-react](https://lucide.dev/) — icons No backend. All data is stored in the browser's `localStorage` — private to the device browser, no account required. ## About localStorage Persistence — survives page reloads and closing the browser. Unlike sessionStorage which clears when the tab closes, localStorage stays until explicitly deleted or the user clears browser data. Scope — dgt.hannu.be can only read its own data. Another website cannot read dgt.hannu.be's data and vice versa. Completely isolated per origin. Chrome/Edge: install the site as a PWA (Add to Home Screen / Install App). Installed PWAs are treated differently — the browser is less aggressive about clearing their storage. --- ## Run locally Requires Node.js 20+. ```bash git clone https://git.hannu.be/dev-hannu/disc-golf-tracker.git cd disc-golf-tracker npm install npm run build npm run preview # serves the built app at http://localhost:4173 ``` `npm run dev` is only needed if you're actively editing the code (gives you hot reload). --- ## Deploy ```bash npm run build # outputs to dist/ ``` The `dist/` folder is plain static files — drop it on any web server or static host (Caddy, Nginx, Netlify, Vercel, GitHub Pages, etc.). --- ## Origin The app was built as a [Claude](https://claude.ai) artifact and then deployed as a standalone site. The storage layer uses `localStorage` shim so it runs in any browser unchanged.