Muscle-level recovery tracking from workout screenshots, with explainable recommendations.
This repository now treats Cloudflare runtime as the primary path:
- API: Cloudflare Workers + D1 + R2 (
cloudflare-api) - Frontend: Vue + Vite + Cloudflare Pages (
frontend)
The Python FastAPI backend remains in backend as a legacy read-only reference.
iPhone / Browser
-> Frontend (Cloudflare Pages)
-> API (Cloudflare Worker)
-> D1 (sessions/recovery data) + R2 (uploads)
Core flow:
- Upload screenshot + OCR text
- Parse and normalize workout sets
- Persist sessions/exercises/sets
- Compute muscle recovery with explainable contributors
cloudflare-api/: production API runtime and testsfrontend/: web UIbackend/: legacy FastAPI implementation (read-only reference)docs/: architecture, testing, deployment docsinfra/: local docker infra for legacy/backend workflows
cd /Users/moltbot/Projects/health-recovery-tracker/cloudflare-api
npm install
npm run devLocal endpoint is typically http://127.0.0.1:8787.
cd /Users/moltbot/Projects/health-recovery-tracker/frontend
npm install
npm run devIf needed, set API base URL in one of these ways:
VITE_API_BASE_URLenv var- Upload page's
API Base URLinput (stored in localStorage)
cd /Users/moltbot/Projects/health-recovery-tracker/cloudflare-api npm run typecheck npm test cd /Users/moltbot/Projects/health-recovery-tracker/frontend npm run typecheck npm run build
Current default policy in cloudflare-api/wrangler.toml:
| Scope Bucket | Example Endpoints | Limit / Window | Override Keys |
|---|---|---|---|
health:read |
GET /, GET /api/health |
120 / 60s |
RATE_LIMIT_MAX_HEALTH_READ, RATE_LIMIT_WINDOW_HEALTH_READ |
upload:write |
POST /api/uploads, POST /api/ocr/normalize |
120 / 60s |
RATE_LIMIT_MAX_UPLOAD_WRITE, RATE_LIMIT_WINDOW_UPLOAD_WRITE |
sessions:read |
GET /api/sessions, GET /api/sessions/:id |
100 / 45s |
RATE_LIMIT_MAX_SESSIONS_READ, RATE_LIMIT_WINDOW_SESSIONS_READ |
sessions:write |
PATCH/DELETE /api/sessions/:id, POST /api/sessions/:id/clone, POST /api/sessions/reset |
120 / 60s |
RATE_LIMIT_MAX_SESSIONS_WRITE, RATE_LIMIT_WINDOW_SESSIONS_WRITE |
recovery:read |
GET /api/recovery, GET /api/recovery/settings |
120 / 60s |
RATE_LIMIT_MAX_RECOVERY_READ, RATE_LIMIT_WINDOW_RECOVERY_READ |
recovery:write |
PUT /api/recovery/settings |
120 / 60s |
RATE_LIMIT_MAX_RECOVERY_WRITE, RATE_LIMIT_WINDOW_RECOVERY_WRITE |
bodyweight:read |
GET /api/bodyweight |
120 / 60s |
RATE_LIMIT_MAX_BODYWEIGHT_READ, RATE_LIMIT_WINDOW_BODYWEIGHT_READ |
bodyweight:write |
PUT /api/bodyweight |
120 / 60s |
RATE_LIMIT_MAX_BODYWEIGHT_WRITE, RATE_LIMIT_WINDOW_BODYWEIGHT_WRITE |
exercise_aliases:read |
GET /api/exercise-aliases |
120 / 60s |
RATE_LIMIT_MAX_EXERCISE_ALIASES_READ, RATE_LIMIT_WINDOW_EXERCISE_ALIASES_READ |
exercise_aliases:write |
POST/DELETE /api/exercise-aliases* |
120 / 60s |
RATE_LIMIT_MAX_EXERCISE_ALIASES_WRITE, RATE_LIMIT_WINDOW_EXERCISE_ALIASES_WRITE |
Fallback keys:
RATE_LIMIT_MAX_PER_MINUTERATE_LIMIT_WINDOW_SECONDS
Use the Cloudflare deployment guide:
- API routing:
cloudflare-api/src/router.ts - API handlers:
cloudflare-api/src/handlers/* - API services:
cloudflare-api/src/services/* - Recovery model:
cloudflare-api/src/recovery.ts
- Recovery model includes per-muscle rest settings and contributor visibility.
- Alias override is supported to fix recurring OCR exercise-name noise.
- Legacy backend is intentionally retained for reference, not active feature development.