unsubbed.co

Exercise Diary

Self-hosted fitness & health tracking tool that provides workout diary with GitHub-style yearly visualization.

A no-frills workout diary for people who want their fitness data on their own server. Honestly reviewed.

TL;DR

  • What it is: A self-hosted workout diary built in Go, with a GitHub-style heatmap showing your training consistency across the year [README].
  • Who it’s for: Developers, homelab runners, and privacy-conscious fitness enthusiasts who want to log workouts locally without handing data to Strava, MyFitnessPal, or Whoop.
  • Cost savings: Strava Premium runs ~$11.99/mo ($143.88/year). MyFitnessPal Premium is ~$19.99/mo. Exercise Diary is MIT-licensed software that costs nothing — just the VPS you’re probably already running [README].
  • Key strength: The GitHub contribution-graph visualization for workouts is genuinely clever — at a glance you see where your consistency breaks down across the entire year.
  • Key weakness: This is a small one-developer project (445 stars, 16 forks, no community forum). It logs workouts. It doesn’t analyze them, coach you, sync wearables, or integrate with anything. If you want a fitness platform, look elsewhere.

What is Exercise Diary

Exercise Diary is a single-binary Go web app that runs in Docker and gives you a private workout journal. The defining visual feature is a matrix heatmap — identical in concept to GitHub’s contribution graph — that maps each day of the year to a colored square based on whether you trained that day. Green squares for active days, blank for rest days. Over a year, it becomes an honest picture of your consistency [README].

Beyond the heatmap, you get a paginated log of workout entries and Chart.js-powered charts. Configuration is minimal: you set your timezone, choose a Bootswatch theme, pick a background color, and optionally enable session-cookie authentication with bcrypt password hashing. The entire app fits in a single Docker container.

The project is maintained by one developer (aceberg), written entirely in Go on the backend with Bootstrap and Chart.js on the frontend. It has seen 10 releases, with the latest (0.1.9) landing in October 2024. There are 62 commits in the repo — this isn’t an abandoned proof-of-concept, but it’s also not a rapidly evolving platform. It does one thing and has been incrementally refined.

The MIT license means you can run it forever without the developer changing terms, charging you, or shutting down a server you depend on.


Why people choose it

There are no independent software review sites covering Exercise Diary — the project is too small. What the GitHub star count (445) and fork count (16) signal is a real but narrow audience: developers who want something minimal, offline-capable, and self-contained.

The broader reason to use something like this comes down to data ownership and motivation mechanics. Research consistently shows that tracking exercise improves adherence [1]. The typical non-technical workaround is a spreadsheet or a notes app. The typical commercial workaround is Strava, which locks your data behind an API you don’t control and upsells you on features you didn’t ask for.

The GitHub-style heatmap is the concrete product insight here. Fitness apps mostly show you a log — a list of past sessions. A heatmap shows you a pattern. Most people can tell within 10 seconds of looking at their heatmap exactly where their motivation collapsed and where they got back on track. That visual compression is why the GitHub contribution graph became so psychologically effective for developers [README], and it’s a reasonable hypothesis that the same mechanic applies to exercise consistency.

The REST API means you can pipe data in from other sources — a shell script, a habit tracker, a custom integration — rather than being limited to the web UI. For homelab users who already automate pieces of their life, this matters.


Features

Based on the README and repository contents:

Core logging:

  • Web-based workout entry form [README]
  • Paginated workout history (configurable items per page via PAGESTEP) [README]
  • GitHub-style heatmap visualization across the full year [README]
  • Chart.js charts for workout data [README]

Configuration:

  • Configure via config file, web GUI, or environment variables — all three paths work [README]
  • Timezone support (TZ variable) for correct date attribution [README]
  • Heatmap color customizable via HEATCOLOR variable [README]
  • 20+ Bootswatch themes plus additional custom themes (emerald, grass, grayscale, ocean, sand, wood) [README]
  • Light/dark background toggle [README]

Authentication:

  • Optional session-cookie auth, disabled by default [README]
  • Bcrypt password hashing [README]
  • Configurable session expiration (minutes, hours, days, months via AUTH_EXPIRE) [README]
  • No multi-user support — single-user by design

Deployment:

  • Docker one-liner or docker-compose [README]
  • Pre-built binary packages (amd64 .deb via PPA, other platforms in releases) [README]
  • Go Release builds for additional platforms [README]
  • Local network-only mode: can pull all themes, fonts, and JS from a local node-bootstrap container instead of CDN [README]
  • REST API available [merged profile]

What it does not have:

  • Wearable sync (Garmin, Fitbit, Apple Watch, Whoop)
  • Exercise library or movement guides
  • Calorie or nutrition tracking
  • Goal-setting or progress milestones
  • Social features
  • Mobile app
  • Multi-user support

Pricing: SaaS vs self-hosted math

Exercise Diary is MIT-licensed. The software costs nothing.

What you’re replacing:

ServiceMonthlyAnnual
Strava Premium~$11.99~$143.88
MyFitnessPal Premium~$19.99~$239.88
Whoop membership~$30.00~$360.00
Garmin Connect Premium~$6.99~$83.88

Exercise Diary self-hosted:

  • Software: $0 (MIT) [README]
  • VPS: $5–10/mo if you don’t already have one running
  • If you already run a homeserver or homelab: effectively $0 marginal cost

The honest caveat: Exercise Diary doesn’t replace Strava’s GPS route tracking, Whoop’s recovery scoring, or Garmin’s wearable sync. What it replaces is the basic “did I work out today?” logging and history review — which is all many people actually use those apps for. The 2020-2025 Dietary Guidelines for Americans recommend at least 150 minutes of moderate aerobic activity per week [2]. Tracking whether you hit that target doesn’t require a $12/month subscription.

If you’re paying for premium fitness tracking and primarily using it to log sessions and look at history, the math is obvious. Annual savings: $84–$360 depending on what you’re currently paying.


Deployment reality check

The quick start is a single docker run command [README]:

docker run --name exdiary \
  -e "TZ=Asia/Novosibirsk" \
  -v ~/.dockerdata/ExerciseDiary:/data/ExerciseDiary \
  -p 8851:8851 \
  aceberg/exercisediary

That’s it. No database to provision, no Redis, no SMTP — the app is self-contained with local file storage. Compared to the deployment complexity of tools like Activepieces or Nextcloud, this is about as simple as self-hosted software gets.

What you actually need:

  • Docker installed (any Linux host, or Docker Desktop on Mac/Windows)
  • Port 8851 open (or remapped to whatever you want)
  • A volume mount for persistent data
  • Optional: a reverse proxy (Caddy, nginx) for HTTPS if you want external access

For local-network-only mode (complete offline operation): Run the companion node-bootstrap container, which serves Bootstrap themes and fonts locally. Then point Exercise Diary at it with the -n flag [README]. Useful for air-gapped setups or if you’re philosophically opposed to CDN requests from your fitness app.

What can go sideways:

  • Authentication is disabled by default. If you expose this to the internet without enabling AUTH, your workout log is public. Not catastrophic, but worth noting [README].
  • The bcrypt password setup requires generating an encrypted password separately — there’s a doc for it, but it’s an extra manual step compared to apps that handle account creation in the UI [README].
  • No upgrade migration tooling documented. With a small project like this, check the CHANGELOG before pulling a new image.
  • The project has one maintainer. If aceberg stops maintaining it, you’re on your own — the MIT license means you can fork, but you’d be maintaining a Go web app.
  • Last release was October 2024. Not abandoned, but not under active feature development. The roadmap exists but there’s no indication of timeline.

Realistic time estimate: 5–15 minutes to a working instance on a machine with Docker already installed. If you need to set up Docker first, add 20–30 minutes. This is one of the simplest self-hosted deployments you’ll find.


Pros and Cons

Pros

  • Genuinely simple deployment. One Docker command, one volume, one port. No database setup, no dependency chain [README].
  • MIT licensed. No licensing surprises, no usage limits, no vendor lock-in. Fork it if you need to [README].
  • GitHub-style heatmap. The year visualization is the actual differentiating feature — it surfaces consistency patterns that a plain log doesn’t [README].
  • Offline capable. The node-bootstrap companion eliminates all external CDN dependencies for fully air-gapped operation [README].
  • REST API. You can script data entry or integrate it with other homelab tooling [merged profile].
  • No data leaving your server. Your workout history doesn’t go to a SaaS database, doesn’t train someone’s ML model, doesn’t get sold. Relevant given that fitness data is health-adjacent [README].
  • Small binary, small footprint. Go-compiled binary in a Docker image — this isn’t going to eat your server resources.
  • Optional auth. Off by default for local network use (appropriate), configurable for internet-facing deployments [README].

Cons

  • One-developer project. 445 stars and 16 forks is a real but small community. Bus factor of one is a real risk for anyone betting on long-term maintenance [GitHub].
  • No wearable sync. You’re typing in workouts manually or scripting the REST API. Garmin, Apple Watch, Fitbit — none of them integrate [README].
  • No exercise library. No movement catalog, no guided workouts, no suggested routines. It’s a diary, not a coach [README].
  • No mobile app. The web UI is mobile-accessible in a browser, but there’s no native app [README].
  • Single-user only. No household or team sharing. Each person needs their own instance [README].
  • No calorie or nutrition data. Exercise Diary tracks that you worked out, not what you burned or ate. Not a replacement for MyFitnessPal’s core use case [README].
  • No analytics beyond basic charts. You won’t get trend analysis, VO2 max estimates, or recovery recommendations [README].
  • Last release October 2024. Active but not rapidly developed — if a feature isn’t in the roadmap, don’t expect it soon.

Who should use this / who shouldn’t

Use Exercise Diary if:

  • You already run a homelab and want workout tracking without adding another SaaS subscription.
  • You care about owning your fitness data and don’t trust it to a company that might change pricing, get acquired, or shut down.
  • Your tracking need is simple: “did I work out, and when?”
  • You want the year heatmap visualization and are willing to log manually to get it.
  • You’re paying for a fitness app premium tier and primarily using it as a session log.

Skip it if:

  • You use a GPS watch or wearable and want automatic activity sync — Exercise Diary has no wearable integrations.
  • You want coaching, exercise libraries, or guided programming.
  • You need calorie tracking or nutrition logging.
  • You want a mobile app experience rather than a browser-based form.
  • You share fitness tracking with a partner or household.
  • You’re not comfortable running Docker at all — there’s no managed SaaS option.

Skip it (pick a more capable self-hosted option) if:

  • You want full fitness platform features: look at wger (workout manager with exercise database and routines) or FitTrackee (GPS-integrated running and cycling).
  • You’re primarily a cyclist or runner tracking GPS routes: GoldenCheetah or FitTrackee are better fits.

Alternatives worth considering

Self-hosted:

  • wger — more complete fitness platform: exercise database, routines, nutrition tracking, REST API, multi-user. More complex to deploy [not reviewed here].
  • FitTrackee — focused on running and cycling with GPX route tracking and map visualization. Better for endurance sports [not reviewed here].
  • GoldenCheetah — desktop app for serious cyclists and triathletes with deep analytics. Different category.

SaaS with free tiers:

  • Strava — GPS route tracking, social feed, segment analysis. Free tier is usable. Premium adds route planning and advanced stats (~$11.99/mo).
  • Garmin Connect — strong if you own Garmin hardware. Free with device, data stays on Garmin’s servers.
  • Strong (mobile app) — clean workout logging for weight training. No self-hosted option, free with limitations.

For the specific use case of year-view consistency visualization with full data ownership, there isn’t a close SaaS competitor — that combination is the reason to choose Exercise Diary specifically over a generic habit tracker or spreadsheet.


Bottom line

Exercise Diary does one thing: it gives you a private, self-hosted workout log with a GitHub-style heatmap that makes training consistency visible at a glance. It won’t replace Strava, coach you through a program, or sync with your watch. What it will do is run reliably on any Docker host, cost nothing in software licensing, and keep your fitness history on hardware you control.

The limitations are real — single developer, no wearable integration, no mobile app, manual data entry. But for the homelab runner who wants to know if they’re actually training consistently without paying $12/month for a SaaS diary, the 15-minute Docker setup pays for itself immediately. The honest audience for this tool is narrow, and if you’re in it, you already know it.

If the Docker setup feels like a blocker, that’s exactly what upready.dev deploys for clients — one-time fee, you own the infrastructure.


Sources

  1. Mayo Clinic“Exercise: How much do I need every day?” (Jul 26, 2023). https://www.mayoclinic.org/healthy-lifestyle/fitness/expert-answers/exercise/faq-20057916

  2. Mayo Clinic“Exercise for weight loss: Calories burned in 1 hour” (May 8, 2024). https://www.mayoclinic.org/healthy-lifestyle/weight-loss/in-depth/exercise/art-20050999

  3. Mayo Clinic“Eating and exercise: 5 tips to maximize your workouts” (Dec 21, 2023). https://www.mayoclinic.org/healthy-lifestyle/fitness/in-depth/exercise/art-20045506

  4. Mayo Clinic“Aerobic exercise: Top 10 reasons to get physical” (Nov 18, 2023). https://www.mayoclinic.org/healthy-lifestyle/fitness/in-depth/aerobic-exercise/art-20045541

  5. Mayo Clinic“Depression and anxiety: Exercise eases symptoms” (Dec 23, 2023). https://www.mayoclinic.org/diseases-conditions/depression/in-depth/depression-and-exercise/art-20046495

Primary sources:

Features

Integrations & APIs

  • REST API