A structured training log and analytics platform for competitive track & field throwers
Session tracking, progress visualization, competition management, and landing zone analysis — all running locally in the browser.
Throwing events generate structured, repetitive data — distances, attempt sequences, session RPE, landing zones, competition results. Every practice and every meet produces numbers that should compound into insight over a season. In practice, they don't.
Most throwers track marks in the Notes app, a spreadsheet they abandon after two weeks, or not at all. Coaches collect data on paper heat sheets that never get digitized. Competition day means scribbling six attempts in the margins. By the time anyone asks "how has your shot put progressed since October?", the answer is a guess.
ThrowingTracker was built to solve these specific problems.
git clone https://github.com/Waleee7/ThrowingTracker.git
cd ThrowingTracker
npm install
npm run dev
Install on your phone: open in Safari or Chrome → tap "Add to Home Screen" → runs offline in full-screen mode.
Deploy: connect to Vercel or build with npm run build and deploy /out to any static host.
| Dashboard Stats grid, PB cards, streak counter, compact achievement badges. |
Session Logging Event selection, individual throws, RPE, notes, media attachments. |
Meet Day Mode Six attempts, mark/foul entry, live best, animated PB alerts. |
Progress Charts Line charts, weekly volume bars, RPE overlays. |
| Landing Zones Canvas sector map with multi-session scatter analysis. |
Video Analysis Slow-mo 0.25x–1x, frame stepping, annotation overlay. |
Personal Bests Auto-calculated all-time & season PBs, animated alerts. |
Achievements 16 badges across milestone, streak, competition, volume, special. |
| Data Export JSON for backup, CSV for spreadsheets, JSON import merge/replace. |
Dark Mode Full dark theme with proper contrast throughout. |
PWA Offline-ready, installable on phone, optimized manifest & SVGs. |
Onboarding 3-step first-time flow — under 30 seconds to first session. |
Shot Put — Discus — Hammer — Weight Throw — Javelin
Multi-event athletes can track all events with separate PBs, progress charts, landing patterns, and achievement recognition.
16 unlockable badges: Milestone, Streak, Competition, Volume, Special. Toast notifications appear on unlock. Examples:
| Framework Next.js 15 with App Router, static export, Vercel integration. |
Language TypeScript strict mode, type safety across data & analytics. |
UI React 19, component architecture, hooks for state management. |
Styling Tailwind CSS v4, ~2000 lines, dark mode ready. |
| Charts Recharts — line, bar, composed charts. |
Canvas HTML5 sector map & video annotation overlay. |
Video HTML5 Video API, slow-mo, frame stepping. |
Storage localStorage + IndexedDB, fully offline-capable. |
Export regularly. Clearing browser data will permanently delete all stored info.
src/
├── app/
│ ├── layout.tsx
│ ├── page.tsx
│ └── globals.css
├── components/
│ ├── DashboardTab.tsx
│ ├── LogTab.tsx
│ ├── HistoryTab.tsx
│ ├── ProfileTab.tsx
│ ├── MeetDayMode.tsx
│ ├── ProgressChart.tsx
│ ├── SectorMap.tsx
│ ├── ThrowScatter.tsx
│ ├── VideoPlayer.tsx
│ ├── AchievementBadges.tsx
│ ├── AchievementToast.tsx
│ ├── PRAlert.tsx
│ ├── Onboarding.tsx
│ ├── Icons.tsx
│ ├── TabButton.tsx
│ └── FloatingElements.tsx
├── lib/
│ ├── types.ts
│ ├── constants.ts
│ ├── storage.ts
│ ├── analytics.ts
│ ├── personal-bests.ts
│ ├── achievements.ts
│ ├── export.ts
│ └── media-storage.ts
└── hooks/
├── useProfile.ts
└── useSessions.ts
Pull requests welcome! Contributions from throwers who code, developers working with athletes, or open-source enthusiasts are appreciated. Areas include cloud sync, additional events, accessibility, internationalization, and test coverage.
MIT — see LICENSE