A Bloomberg-terminal for your lifting. A web app, Android and iOS apps, and home-screen widgets for people who log their training in Hevy, come from Strong, or want to log in Ironterm itself.
Unofficial. With Hevy, Ironterm uses Hevy's public API with your own API key. It is not affiliated with or endorsed by Hevy. Ironterm has no backend of its own: you run the server, or use the phone apps on their own.
- Runs your program from your real log. It includes ~60 templates: GZCLP and the GZCL family, 5/3/1 variants, nSuns, Sheiko, Candito, Calgary Barbell, SBS, Smolov, and more. Your Hevy history is replayed through the program's rules, so the weights pick up where you actually are. You can push the next sessions to Hevy as routines, or log them in the app's own gym mode and save the workout to Hevy.
- The year at a glance. A GitHub-style contribution graph, streaks, volume, e1RM trends, PR walls, and stalls caught early.
- Body map. Per-muscle weekly load and recovery from a detailed anatomical figure (male / female), with overlaps where a muscle is hit before it has recovered.
- Nerd stuff. e1RM formula shootout, INOL / Prilepin, lift ratios, strength projections, landmarks, sleep and recovery vs. performance (WHOOP), and program what-ifs.
- Life happens. A calendar, trips that pause your program instead of failing it, hotel-gym sessions, and a re-entry ramp after a break.
- Notes on workouts and exercises, synced back to Hevy (or kept in Ironterm without it).
- Not tied to Hevy. Import a full Strong export, or start an empty log and record sessions in gym mode: Ironterm then keeps the workouts itself, and every screen works the same.
- Native Android and iOS apps. Full apps rather than web wrappers:
- Gym mode for logging at the bar: big steppers, a plate loader, and a rest timer that keeps running on the lock screen (an Android notification, an iOS Live Activity).
- Works offline. A session survives a basement gym and a killed app, and syncs when you're back online.
- Every other screen too: lifts, history, calendar, program, body map, insights and stats.
- Friends, without a central database. Each person's server is their identity: add friends by handle or server URL, choose per friend what they see (no weights by default), react and comment, and compare lifts. Servers sign every request to each other; an optional directory only maps handles to servers. See docs/social.
- Widgets. Activity graph, next workout, this week, lifts, recovery and the current set, each in several sizes. Lock-screen widgets on iOS.
![]() |
![]() |
![]() |
![]() |
| Android · gym mode | Android · rest on the home screen | iOS · gym mode | iOS · Live Activity |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
More: web · Android (every widget at every size) · iOS.
Hevy ──API──▶ server (web/) ──/api/snapshot──▶ Android / iOS apps + widgets
▲ Cloudflare Workers + D1 (or Direct mode: phone ↔ Hevy API,
└─push/notes─ or Node + SQLite (Docker) no server at all)
Strong CSV ──import──▶ ┘ ▲ gym mode logs here when there's no Hevy key
| Directory | |
|---|---|
web/ |
The app: a Preact UI plus an API. Runs on Cloudflare Workers + D1 or anywhere with Docker / Node + SQLite (self-hosting). |
android/ |
Native Kotlin / Compose app with Glance widgets. Updates itself over the air from GitHub Releases. |
ios/ |
Native SwiftUI app with WidgetKit widgets, including the lock screen. |
web/cli/ |
ironterm-graph: a terminal CLI that prints your contribution graph. No dependencies beyond Node. |
docs/api/ |
The small JSON API the apps read. |
docs/SECURITY.md |
Threat model and how to report a vulnerability. |
1. Pick where your workouts come from. Any one of:
- Hevy: an API key from Settings → Developer (needs Hevy Pro). Hevy stays your log.
- Strong: export your data (Strong → Settings → Export Strong Data), then import the CSV in SETUP → IMPORT. Ironterm becomes your log.
- Nothing yet: press START FRESH (NO HEVY) in SETUP and log sessions in GYM mode.
See Where the workouts come from.
2. Run the web app.
cd web && pnpm install && pnpm dev # http://localhost:5173, demo data until you add a key or importThen host it on one of these:
- Docker / Node anywhere:
cp .env.example .env && docker compose up -d. See SELF_HOSTING.md. - Cloudflare (free tier): see web/README.md.
3. Phones. In the web app go to SETUP → APPS & WIDGETS → CREATE, then scan the QR code from the app's SETUP. The apps also have a Direct mode that needs nothing but your Hevy API key (graph, streaks and lifts; no program or recovery).
- Android: install the APK from Releases. After that it updates itself.
- iOS: build with Xcode. See ios/README.md; a free Apple ID works.
cd web && pnpm install
export HEVY_API_KEY="your-api-key"
pnpm cli # last 52 weeks
pnpm cli --weeks 26 --asciiEvery directory builds on its own, and CI runs each one:
| Check | |
|---|---|
| web (and the CLI) | pnpm typecheck && pnpm test && pnpm build:node (and the Docker image) |
| android | ./gradlew testDebugUnitTest assembleDebug (unit, network and screenshot tests) |
| ios | xcodebuild -project Ironterm.xcodeproj -scheme Ironterm test |
The male anatomy art is by Ryan Graves (CC BY 4.0), via muscle_mapper. The female figure outline is from react-native-body-highlighter (MIT). Program designs belong to their authors: Cody Lefever (GZCL), Jim Wendler, and others, as credited in each template.








