A personal physio exercise companion built as a Progressive Web App. Designed to be installed on Android and used daily without an account or backend. Reliant on local storage and sticky tape.
- Exercise tracking — log sessions, track daily and weekly exercises with pip indicators
- Timers — built-in countdown timer for timed exercises, with auto-reset between sessions
- Streak — counts consecutive days all daily exercises were completed
- History — per-day completion log for the last 30 days
- Exercise editor — add custom exercises, edit or hide any built-in exercise, set timers on anything
- Push notifications — morning, midday, and evening reminders scheduled via service worker
- Offline support — all app assets cached; works without a network connection after first load
- Installable — full PWA with manifest, service worker, and install prompt
Plain HTML, CSS, and JavaScript — no build step, no framework, no dependencies. State is persisted in localStorage with a versioned migration system.
node server.jsOpens on http://localhost:3000. The server adds correct MIME types for .mp3 files and serves the root directory statically.
The app deploys automatically to GitHub Pages via .github/workflows/deploy.yml on every push to main.
To enable it on a new repo: Settings → Pages → Source → GitHub Actions.
The live URL will be https://<username>.github.io/<repo>/.
All data lives in localStorage under physioo-state:
{
version: 4,
completions: { 'YYYY-MM-DD': { 'exercise-id': sessionCount } },
customExercises: [], // user-added exercises
exerciseEdits: {}, // overrides for built-in exercises
hiddenExercises: [], // built-ins removed from the program
settings: {
daily: false,
morningTime: '08:00',
middayTime: '13:00',
eveningTime: '19:00'
},
streak: 0
}Migrations run automatically on load when version is behind the current STATE_VERSION.