A polished, local-first disc golf course & round tracker for Android (and desktop), built with Flutter + Dart. Map out your courses on free satellite imagery, score rounds hole‑by‑hole, track players and history — all stored on your device.
No account, no servers, no API keys, no billing. Your data stays on your phone.
- Courses & holes — drop each hole's tee and basket on a satellite map.
- Build holes as you go — start a round with no baskets set and place each hole's tee/basket on the spot (tap the map, or drop them via GPS as you walk).
- Use my location (GPS) — recenter the map on where you're standing.
- Address / city / ZIP search — jump the map to any area.
- Live scoring — per‑player stroke steppers, par tracking, and relative score.
- Players & history — roster management and a log of past rounds.
- Backup & restore — export/import all data as JSON (compatible with the original .NET MAUI app's format).
- CSV import — bring in UDisc‑style scorecard exports.
- Free maps — Esri World Imagery via
flutter_map(no Google key/billing).
Courses → Course detail (map + holes) → Round (scoring), plus Players and
History tabs.
discgold/
├── app/ # The Flutter app (this is the real app you build & run)
│ ├── lib/ # Dart source: models, services, screens, widgets
│ ├── assets/ # Map markers + logo
│ └── pubspec.yaml
├── src/ # LEGACY .NET MAUI version (kept for reference; not maintained)
├── releases/ # CHANGELOG.md + archived APKs (gitignored binaries)
├── materials/ # Source art / icon references
├── reference/ # Design references
├── INSTRUCTIONS.md # Detailed setup, build & troubleshooting guide
└── .env.example # Template for local secrets (copy to .env)
Full prerequisites, install commands, and troubleshooting live in
INSTRUCTIONS.md.
# 1. Install Flutter (see INSTRUCTIONS.md for Java/Android setup)
flutter --version
# 2. Get dependencies
cd app
flutter pub get
# 3. Run on a connected device / emulator
flutter run
# 4. Build a release APK for your phone
flutter build apk --release
# Output: app/build/app/outputs/flutter-apk/app-release.apkFlutter • sqflite (SQLite) • flutter_map + latlong2 (maps) •
geolocator (GPS) • geocoding (search) • share_plus + file_selector
(backup/restore) • intl.
The current Flutter app needs no API keys — it uses free satellite tiles.
Secrets are kept out of git via .gitignore. If you build the
legacy MAUI version (which used Google Maps), provide a key locally:
cp .env.example .env
# then edit .env and set MAPS_API_KEY=your_key.envis gitignored — never commit it..env.exampleis the committed template (no real values).- The legacy manifest references
${MAPS_API_KEY}instead of a hardcoded key.
Keystores, key.properties, google-services.json, and built *.apk/*.aab
files are also gitignored. Distribute builds via GitHub Releases rather than
committing large binaries; releases/CHANGELOG.md documents each version.
- App version lives in
app/pubspec.yaml(version: x.y.z+build); the build number bumps each release so Android treats it as an update. - See
releases/CHANGELOG.mdfor the version history.
No license has been chosen yet. Until one is added, all rights are reserved —
add a LICENSE file (e.g. MIT) if you want others to reuse the code.