Skip to content

arin-jaff/TrainingGeeks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

88 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

TrainingGeeks

Next.js TypeScript SQLite Self-hosted Stars Issues PRs welcome

The training log you actually own β€” open-source, self-hosted, and gloriously subscription-free. πŸƒβ€β™‚οΈπŸš΄β€β™€οΈπŸŠ

Calendar, performance-management charts, dashboards, zones, peak performances, training plans, wellness metrics, and injury tracking β€” a full analytics suite that runs on your machine, stores data in a single file you control, and never asks for your credit card. All the numbers you love, none of the paywall. πŸ’ͺ

πŸ”΄ Live demo

See it running on real data β†’

Not a mockup β€” that's the founder's actual, live training history, served read-only from a Raspberry Pi at home and auto-syncing from intervals.icu and Garmin. (Maintainers: set this URL once your demo box is online.)


Why

  • Your data, your machine. Everything is stored in a local SQLite database. There is no TrainingGeeks cloud, account, or server collecting anything.
  • No subscription, no upsell, no ads, no telemetry.
  • You're in control. Don't like a chart? Change it. Missing a feature? Build it, or open an issue.

Features

  • Calendar β€” plan and log workouts, drag to reschedule, quick-add any workout/metric/injury on any date. Completed days show a green banner, past-due planned days go red.
  • Performance Management Chart β€” per-sport CTL / ATL / TSB (Fitness, Fatigue, Form) with a 60-day forward projection.
  • Configurable dashboards β€” add/remove charts: PMC, fitness summary, time-in-zone, weekly distance/duration/elevation/kJ/calories, longest workout, fitness history, wellness metrics, and mean-maximal peak power/HR/pace curves.
  • Activity analysis β€” streams (uPlot), route maps (MapLibre + OSM), and the full metric set: NP, IF, TSS/rTSS, VI, EF, decoupling, work.
  • Strength load (SΒ³) β€” a duration Γ— perceived-effort model for lifting/core.
  • Zones β€” HR / power / pace zones from real published methods, editable and persisted.
  • Peak performances β€” bests by distance/duration with medals.
  • Training plans β€” schedule structured plans (e.g. Hal Higdon) onto the calendar.
  • Wellness & injuries β€” weight, HRV, resting HR, sleep, mood, plus injury logs with calendar indicators.
  • intervals.icu sync β€” import activities and planned workouts automatically.
  • Export β€” CSV export and a calendar .ics feed.

Tech stack

Next.js (App Router, TypeScript) Β· Tailwind CSS Β· node:sqlite (built-in) with embedded SQL migrations Β· @garmin/fitsdk Β· ECharts + uPlot Β· dnd-kit Β· MapLibre. The src/lib/{fit,metrics,db,connectors} layers are kept pure and framework-agnostic to ease the planned Tauri macOS build.

Quick start

Requires Node.js 22.6+ (24 LTS recommended β€” uses the built-in node:sqlite) and git.

git clone https://github.com/arin-jaff/TrainingGeeks.git
cd TrainingGeeks
npm install
cp .env.example .env.local   # then edit (see Configuration)
npm run dev                  # http://localhost:3000

Build and run in production mode:

npm run build
npm start

The SQLite database and migrations are created automatically on first run. Then add your data from Settings β†’ Apps & Devices (intervals.icu sync), the Import page (FIT files), or by hand from the calendar.

πŸ“˜ Full setup & deployment β€” including running a public read-only demo on a Raspberry Pi β€” is in DEPLOYMENT.md. πŸ“ How every number is calculated (TSS, NP, CTL/ATL/TSB, the SΒ³ Strength Score, zones, plans) is in METHODOLOGY.md.

Configuration

Create a .env.local (all variables are optional):

Variable Purpose
TG_PASSWORD Enables single-password auth. If unset, the app is open (good for a trusted LAN / localhost).
TG_SESSION_SECRET Secret used to sign the session cookie. Set this whenever TG_PASSWORD is set.
TG_INTERVALS_ATHLETE_ID Your intervals.icu athlete ID (or set it in Settings β†’ Apps & Devices).
TG_INTERVALS_API_KEY Your intervals.icu API key.
TG_SYNC_TOKEN Bearer token allowing a background sync daemon to call /api/sync.

When TG_PASSWORD is set the app requires sign-in and the landing page is served at /login. Run behind HTTPS for any non-local deployment.

intervals.icu sync

In Settings β†’ Apps & Devices, enter your Athlete ID and API key (found at intervals.icu β†’ Settings β†’ Developer), enable sync, and use Sync now or Sync history to backfill. Sync is entirely opt-in and runs between your instance and intervals.icu only.

Tests

npm test          # node:test unit/integration suite
npx tsc --noEmit  # type-check

Privacy

TrainingGeeks collects nothing and phones nowhere. See the in-app Privacy Policy (served at /privacy).

Contributing

Issues and pull requests are very welcome. See CONTRIBUTING.md for local setup, the test workflow, and the commit conventions. Metrics follow standard endurance-training definitions (documented in METHODOLOGY.md).

Bring PRs (Pull Requests) so we can keep hitting PRs (Personal Records).

License

Licensed under the GNU Affero General Public License v3.0 or later β€” see LICENSE. In short: you can use, modify, and self-host this freely, but if you run a modified version as a network service, you must make your source available to its users under the same license.

Acknowledgements

  • intervals.icu for the sync API.
  • Several features were inspired by the open-source OpenAthlete project (reimplemented here, not copied).