hpasic3k downloadsMobile-first gym workout tracker. Log sets, reps, and weights with speed-optimized UX. Data stored as markdown in your vault.
Mobile-first gym workout tracker for Obsidian. Log sets, reps, and weights with speed-optimized UX. All data stored as markdown in your vault.
Log sets with weight and reps. Previous session data is pre-filled so you can pick up where you left off. Tap the set number to cycle its type — Warmup, working, Drop, or Failure — and warmups and drop sets are automatically excluded from volume and PR calculations. Add a free-text note to any exercise to capture how it felt. Next session, that note appears under the exercise name, so "increase weight next time" is right where you need it. An exercise with a note is saved even if you completed no sets, and it doesn't hide your previous numbers: pre-fill still comes from the last session where you actually logged sets. An interval timer you never started is saved as not started, with its note but without its settings.
Each weight row has a unit badge: tap it to switch that row between kg and lbs without changing the number you typed. For one-sided exercises, mark the exercise Left / right in the library (or Per side in a template) and each set row takes L and R reps. Notes show them as 10 / 8, volume counts both sides, and PRs use the weaker side.

When a working set beats your history, LiftOff flashes a 🏆 badge on the row. It tracks four kinds of PR:
weight × (1 + reps / 30))weight × reps)Bests update mid-workout, so back-to-back PRs both light up. PRs and total volume stay correct when an exercise mixes kg and lbs rows.
Every saved workout gets a ## Summary section with total duration, working-set count, total volume, and the PRs you hit — a clean, readable record right in the note.

A built-in rest timer with preset durations, an interval timer for HIIT-style work/rest sets, and count-up duration holds for static exercises like planks, dead hangs, and L-sits.
Starting a hold first counts down a short get-set buffer (5 seconds by default) so you can get into position. The same buffer is subtracted when you stop, covering the time it takes to get back to your phone, so the saved time is the hold itself. Stopping before the hold outlasts the buffer records nothing. Enter an added weight on a hold for loaded carries and weighted planks; leave it empty for bodyweight. A weight carried over from last time keeps its original unit, even if you've since switched the default unit.
While any timer or hold is running, LiftOff keeps the screen from turning off. The rest timer keeps it on for up to 10 minutes of rest.
Adding an exercise searches your own library and a built-in catalog of 1,300+ exercises at once. Search by name, muscle, or equipment — shorthand like db curl works — or tap a body-part chip to browse. Each result shows its target muscle and equipment, and anything missing is one tap away with + Create. The catalog is bundled with the plugin, so it works offline.
You can change an exercise's type (weight, interval timer, or hold) after creating it. Editing the type in the library updates every template that uses it, and Change type… in an exercise card's menu changes it mid-workout, asking first if completed sets would be dropped. Template rows also have a type dropdown.
Configure workout and template folders, default weight unit, rest timer presets, the hold buffer (0 to 60 seconds; 0 turns it off), and whether to keep the screen awake while timers run.
After an update, LiftOff shows what's new since the version you last used on that device. Turn this off with Show what's new after updates. The full history is in CHANGELOG.md.

main.js, manifest.json, and styles.css from the latest releaseyour-vault/.obsidian/plugins/liftoff/LiftOff is free and built in my spare time. If it helps your training, you can buy me a coffee on Ko-fi ☕
The built-in exercise catalog is generated from the MIT-licensed exercises-dataset by Hasan Emir Yıldırım — text fields only, no media. See src/data/EXERCISE-DATASET-LICENSE.md.