Local-first pull-up training PWA.
One built-in evidence-based program, full offline. No ads, no accounts, no cloud.
Open live app →
Pull-up Trainer is a mobile-first progressive web app for structured pull-up training. Everything runs locally in your browser via IndexedDB. Your history and progress never leave the device.
The built-in program generates each workout from your max-rep anchor (M*) and current step in a 6-workout cycle. Progression, deloads, retests, and scheduling follow rules described on the in-app Why this program page. Install as a PWA for offline use and quick access from your home screen.
Each workout has five sets: four working sets at fixed percentages of your anchor M*, plus a final max set with a step-specific minimum Nk.
| M* | Working sets (1–4) | Final-set minimums N₁…N₆ |
|---|---|---|
| 3 | 3, 2, 2, 2 | 2, 3, 4, 4, 4, 4 |
| 7 | 5, 5, 5, 4 | 5, 6, 7, 8, 8, 8 |
| 15 | 11, 9, 9, 8 | 9, 10, 11, 12, 13, 14 |
| 25 | 18, 15, 15, 13 | 15, 16, 17, 18, 19, 20 |
Default schedule: three non-consecutive days per week with at least 48 hours between sessions. Two failures on the same step trigger an automatic deload; six successful steps complete a cycle.
- Vue 3 (Composition API), Vue Router, Pinia, vue-i18n (EN / RU)
- Vite, TypeScript, vite-plugin-pwa
- Dexie (IndexedDB), JSON export/import for history and full backup
- Vitest, Vue Test Utils, Playwright, ESLint, Prettier
- GitHub Pages with CI deploy
npm ci
npm run dev # local dev server
npm run typecheck # vue-tsc
npm run lint
npm run test # unit tests
npm run test:e2e # Playwright (auto-builds preview server)
npm run build
npm run preview # preview production buildThe app uses Poster / Swiss: flat fills, 2px borders, 2px radius, offset shadows, mono caps labels, and display uppercase headings. Default palette is P01 Volt (14 palettes × light/dark).
| Resource | Path |
|---|---|
| Design spec | spec/design/poster-design.md |
| Theme tokens | spec/design/theme-tokens.css |
| App icon | spec/design/assets/logo/icon.svg |
| Asset gallery | spec/design/assets/preview.html |
| Swiss grid pattern | spec/design/assets/patterns/swiss-grid.svg |
GPL-3.0. Copyright Gregory Koganovsky.
Third-party notice: icons by Lucide (ISC). See public/NOTICE and spec/design/assets/LICENSES/Lucide-ISC.txt.
What this app does NOT include
- Ads, donations, paywalls, or subscriptions
- User accounts or cloud sync
- Push reminders (not feasible in a static PWA v1)
- Voice cues, background music, camera, or social features