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. πͺ
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.)
- 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.
- 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
.icsfeed.
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.
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:3000Build and run in production mode:
npm run build
npm startThe 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.
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_PASSWORDis set the app requires sign-in and the landing page is served at/login. Run behind HTTPS for any non-local deployment.
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.
npm test # node:test unit/integration suite
npx tsc --noEmit # type-checkTrainingGeeks collects nothing and phones nowhere. See the in-app
Privacy Policy (served at /privacy).
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).
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.
- intervals.icu for the sync API.
- Several features were inspired by the open-source OpenAthlete project (reimplemented here, not copied).