尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Weighted-calisthenics & skill-progression tracker — offline-first PWA + Rust/Axum sync backend + Tauri desktop · TypeScript strict · bilingual EN/EL · friends & leaderboards. Live: anabasis.axonos.dev
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Weighted-calisthenics & skill-progression tracker. Offline-first PWA · native desktop · optional accounts & sync · TypeScript strict · bilingual (EN/EL) ▶ Live demo · works offline, no signup required — an account is optional, only to sync across devices Anabasis — «η ανάβαση». Κάθε skill είναι μια σκάλα: tuck → advanced tuck → straddle → full. Η εφαρμογή υπάρχει για να δείχνει σε ποιο σκαλί είσαι και ποιο είναι το επόμενο.檢視完整 README ↗
Weighted-calisthenics & skill-progression tracker. Offline-first PWA · native desktop · optional accounts & sync · TypeScript strict · bilingual (EN/EL)
▶ Live demo · works offline, no signup required — an account is optional, only to sync across devices
Anabasis — «η ανάβαση». Κάθε skill είναι μια σκάλα: tuck → advanced tuck → straddle → full. Η εφαρμογή υπάρχει για να δείχνει σε ποιο σκαλί είσαι και ποιο είναι το επόμενο.
Generic gym apps treat skills as an afterthought. If you train front lever, planche or muscle-up you are not logging "sets × reps" — you are moving through a chain of prerequisites, measured in hold-times and technical milestones.
Anabasis is built for athletes doing both: weighted basics (pull-ups, dips, pistol squats) and skill progressions.
| Skill ladders | 8 skills, 4–6 steps each. Locked steps stay visible — you see the road, not just your rung. The active ladder leads the home screen. |
| Calendar-centric | The calendar is the home of logging: pick a program day (upper, legs & core, …) or start an ad-hoc session on any date. Set-by-set logging with buttons — separate bodyweight + added weight, RPE/RIR/tempo, warm-up and failure flags, quick-log parsing (80 5,4,3,2). |
| Goals in your own terms | Sessions · volume · sets · reps · distance · duration, plus skill mastery, a target weight ("70 kg weighted pull-up"), and custom trackers you invent on the spot ("cold showers 30/week") — windowed or milestone, wired to programs, exercises, skills and live progress. |
| PR tracking | 8 PR types across strength and non-set activities (distance, duration, pace). Warm-ups excluded. e1RM via Epley/Brzycki. |
| Sync when you want it | Local-first by default. Create an account and your training follows you to any device and to the desktop app — row-level last-write-wins sync over a Rust backend, including multi-day program structure. Full JSON export/import stays; nothing is locked in. |
| Friends & leaderboards | Opt-in. Pick a handle, add friends by username, and climb a friends or global leaderboard ranked by XP/altitude — with a shareable public profile at /u/:username. Privacy is SQL-enforced server-side and only aggregate stats are ever published; raw training data never leaves your account. |
| Customisable home | Hide and reorder every card. A hidden card never mounts and never queries. |
The parts worth reading, and why they are the way they are.
Local-first, then sync — no lie in between. Everything lives in IndexedDB
(Dexie) and the app is fully usable with no account. Every write stamps
updated_at and deletes are soft (deleted_at), which is exactly what the
optional sync layer needs: row-level last-write-wins against a Rust/Axum +
SQLite backend, with a per-account monotonic seq cursor and a DB epoch that
protects against restore-desync. Auth is argon2id + opaque bearer tokens in a
session table (not JWTs — revocation matters; not cookies — the Tauri
production-cookie trap).
Schema migrations, v1 → v16. Each version ships its own .upgrade() with
backfills; all additive, no data loss. v9 backfilled existing goals to rolling
windows because that is how they were already counting — migrating them to
calendar would have silently changed the meaning of a goal already set. v12–13
grew the calendar-centric structure: program days, workout↔program links, and a
weight dimension on skill steps (skills and exercises are now one library). v14
added first-class custom trackers (append-only entries, so a manual counter
syncs cleanly instead of losing increments to last-write-wins). v15 added
local-only friends/leaderboard caches for offline social; v16 an opt-in
coach_enabled flag (default off).
Components never touch db.*. All access goes through lib/db/queries.ts
and lib/db/goals.ts. lib/domain/ is pure functions (e1rm, pr, volume) with
no DB or UI dependency, which is why they are the easiest things to test.
No invented data. Cards return null rather than render zeros; a stat with
no measurement behind it is misleading, not neutral. No default goals are
seeded — a goal the user did not set is not a goal.
Testing where it pays. 580+ tests (508 frontend + 80 Rust backend) concentrated on migrations, the goal window calculator (pure, with an injectable clock, so "the week starts on Monday" does not depend on the day CI runs), PR detection, the card-order resolver, and the sync engine (push/pull cursors, epoch handling, last-write-wins merges) — each case matching a change that will actually happen (a card added, a card removed, corrupted preferences, a restore mid-sync).
src/
├── app/ routes + AppShell (calendar-centric nav)
├── features/ one folder per surface; dashboard cards are independent
│ components that query for themselves
├── components/ shared primitives (Logo, Card, ProgressRing, ActivityChip)
├── lib/
│ ├── db/ Dexie schema, migrations, typed queries, seeds
│ ├── sync/ push/pull engine, cursors, epoch, last-write-wins ← tested
│ ├── api/ auth store + typed client (opaque bearer tokens)
│ └── domain/ pure logic: e1rm · pr · volume ← unit-tested
└── i18n/ en.json · el.json
server/ Rust · Axum · SQLite (sqlx) — accounts, sync, admin, OAuth scaffold
src-tauri/ Tauri 2 desktop shell (WebKit; PWA layer off in-app)
Frontend — Vite 5 · React 18 · TypeScript (strict) · Tailwind 3 · Dexie 4 (IndexedDB) · React Router 6 · Recharts · vite-plugin-pwa + Workbox · i18next · Vitest Backend — Rust · Axum 0.8 · SQLite (sqlx) · argon2id · tower_governor rate limiting Desktop — Tauri 2 (same frontend, ~13MB native binary)
npm install
npm run dev # http://localhost:5173
npm test # frontend tests
cd server && cargo test # backend tests
npm run build # production + service worker
Or as a native desktop app (Tauri 2 — same frontend, no browser, ~13MB binary):
npm run tauri build -- --no-bundle # needs Rust + webkit2gtk
./scripts/install-desktop.sh # installs binary + .desktop entry (Linux)
Optional sync backend (accounts stay optional — the app is fully usable without it):
cd server && cargo run --release # Axum + SQLite on :8121
Screenshots in this README are generated, not hand-taken:
node scripts/screenshots/generate.mjs # isolated Demo profile, 390×844 @2x
node scripts/gen-brand-assets.mjs # favicon/PWA/OG from one source of truth
Working: calendar-centric logging with magnitude day-dots and weekly program-adherence, skill ladders (merged into one exercise library), the full goal family (sessions/volume/sets/reps/distance/duration, skill mastery, target weight, custom trackers), calisthenics-correct set types (drop/superset/rest-pause /AMRAP + negatives, isometric and half-rep holds), honest bodyweight PRs (reps & volume always, e1RM only on added load), PR tracking, body metrics, multi-day programs with reuse-as-template and inline exercise-creation + discoverable supersets, a unified exercise-progress chart (Recharts lazy-loaded off the critical path), export/import, i18n, PWA, multiple local profiles, accessible dialogs + gym-sized touch targets.
Optional, off by default: a Coach mode toggle — a pure suggestion engine (double-progression next-moves, deload/overtraining detection) that surfaces a "Next Moves" panel prioritising progressions toward your goals, a deload card, and per-exercise hints while logging. The logger stays a logger unless you ask for a coach.
Also working: native desktop app via Tauri 2 (src-tauri/) — the same frontend
in a WebKit window, PWA layer off; and the Rust/Axum backend (server/) —
accounts (argon2id), a unique admin surface, row-level cross-device sync (workouts,
programs and multi-day structure, with soft-deletes that propagate), rate
limiting, restic-backed DB snapshots. Friends & leaderboards ship too: opt-in
public profiles at /u/:username, friend/global boards, SQL-enforced privacy.
Also live: Google sign-in (Rust OAuth 2.0 flow — social login into the same session/token model; openid+email scopes only) and magic-link email login (passwordless, single-use hashed tokens with a 15-minute TTL, atomic single-use consume, account created on verified click) — the latter activates the moment an SMTP relay is configured, dormant until then, exactly like the OAuth client.
In progress: native app-store builds (installable as a PWA today); Apple sign-in (needs an Apple Developer account).
Built by Aggelos Frezzaroukos · MIT