Plan, track, and progress your workouts — offline-first, mobile (Android via Tauri Mobile) and desktop ready.
- Weekly and custom training cycles with sparse rotation (shift active training days only — rest days stay rest)
- Offline-first data via SQLite (
@tauri-apps/plugin-sql) - Local notifications for reminders (
@tauri-apps/plugin-notification) - Clean Vue 3 + TypeScript + Pinia architecture
- Tauri Mobile (Android) support and Desktop-ready foundation
Add your screenshots or short GIFs here to show the flow. For now, placeholders:
- Vue 3 (TypeScript), Vite, Vue Router, Pinia, Vant UI
- Tauri 2 (Mobile + Desktop), Rust side with plugins
- SQLite (local, via Tauri SQL plugin)
- Day.js / date-fns
Prerequisites:
- Node.js 20+ and a package manager (npm/pnpm/bun)
- Rust toolchain and Tauri CLI (
npm i -D @tauri-apps/cliis already in devDependencies) - For Android builds: Android Studio + SDK + NDK, Java 17 (see
scripts/android-setup-mac.sh)
Install deps:
npm iRun web dev server:
npm run devRun desktop (Tauri) dev:
npm run tauri devAndroid (Tauri Mobile):
# one-time
npm run android:init
# run on device/emulator
npm run android:dev
# if your env vars are local-only
npm run android:dev-local
# build APK/AAB
npm run android:buildOther useful scripts:
npm run preview— local preview of built web assetsnpm run android:studio— open the Android project in Android Studionpm run android:uninstall— uninstall the app from a device/emulator
To keep rest days intact while rotating training days across the week:
- Treat
planner.currentProgram.config.dayOffsetas a shift over active days - Active days are indices where
weekly.days[i] > 0 - For a calendar day
d, findk = activeDays.indexOf(d); ifk >= 0thenprogramDay = activeDays[(k + trainingShift) % activeDays.length] - Always read the shifted program from the sessions store getters:
useSessionsApiStore().getAllShiftedExercises()getShiftedExercises(dayIndex)nextWorkout,nextWorkoutExercises,nextWorkoutSummary,nextWorkoutDate
More details:
- Docs:
docs/cycle-shifting-architecture.mdanddocs/supplements-architecture.md
- Typecheck + build:
npm run build - Codebase uses script-setup SFCs and centralized Pinia stores
- Sessions store constructs
shiftedProgramand normalizes shifts; bumpshiftedProgramVersionto refresh - After changes affecting shifts, call
sessions.invalidateAndReload
- Unit: Vitest (see
src/__tests__), e.g.npx vitest run - E2E: Playwright (see
tests/e2e)
- Training diary and results analytics
- Interval timer and rest alerts (sound/vibration)
- Data export/import and backups
- Optional sync in the future
Contributions are welcome. A simple flow:
- Fork and create a feature branch
- Add/adjust unit tests for changes in shifting logic when relevant
- Keep edits surgical; prefer stores/composables over ad-hoc logic
- Run
npm run buildand at least the unit tests - Open a PR with a clear description and screenshots if UI changes
- RU: проект задуман как офлайн‑планировщик тренировок с «разрежённой» ротацией тренировочных дней, напоминаниями и журналом результатов.
This project is licensed under the MIT License — see the LICENSE file for details.