A free, open-source PWA pushup coach modeled on Push Ups Workout (com.northpark.pushups) β an initial test sets your level, then an adaptive plan across 6 levels takes over. No account; progress is stored by a tiny bundled server so all your devices share one history.
Built as a single HTML file plus a tiny dependency-free Python server. Run it, open it in any browser, add it to your home screen, and go.
- Adaptive level program β an initial max-effort test sets your starting level; 6 levels Γ 3 groups, and after each workout you rate it (so hard / just right / so easy) to move up or repeat
- Initial test β one open-ended max set maps you to the right starting level
- Freestyle mode β free push-up counting with no plan, logged to your history
- Tap-to-count ring β tap the ring with a finger or your nose (phone face-up) to count each rep; auto-advances to rest when done
- Rest timer β visual countdown ring between sets; skip or auto-advance
- Dark / Light / Auto theme β follows system preference by default
- Offline β service worker caches the app after the first load (saving progress requires the server to be reachable)
- Server storage β progress lives in one JSON file on your own server (
data/data.json), shared across devices; existing on-device data is migrated automatically on first load - Export / Import β back up and restore progress as JSON
- Migrate from Push Ups Workout (Google Play) β import your existing progress via:
- Manual wizard β pick your current level and group
- Direct
.puudfile import β reads the app's backup file format (ZIP containing SQLite + JSON preferences), parsed entirely in the browser
Run the bundled server (Python stdlib only, no dependencies) and open it in a mobile browser:
docker compose up -d # serves on port 8081
# or without Docker:
python3 server.py # serves on port 8000Progress is stored in data/data.json next to the app (gitignored). To update a
deployment, git pull (or run update.sh, e.g. from cron) β updates never touch
the data directory.
- In the old app: Settings β Backup β save the
.puudfile to your device - In OpenPushups: Settings β Import .puud Backup β select the file
- Your full history and total rep count are imported automatically
Alternatively use the manual wizard (Settings β Migrate from Push Ups Workout) to set your current level/group without a backup file.
Everything stays on your own server. No analytics, no third-party requests β the app only talks to the host it was loaded from. The service worker caches the app for offline use immediately after first visit.
MIT




