Jamorham
Nightscout용 xDrip+ 버전
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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