86 lines
3.0 KiB
Markdown
86 lines
3.0 KiB
Markdown
# 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. |