Track workouts, crush intervals, watch streaks grow — all from your browser.
No accounts. No subscriptions. No servers harvesting your data. Just you and the iron.
FitLog is a free, open-source progressive web app built for lifters, runners, and anyone who believes fitness tracking shouldn't require a monthly fee or a privacy policy longer than your workout.
Most fitness apps want your email, your credit card, and your training data on their servers. FitLog wants none of it.
- Zero backend — your data lives in your browser's IndexedDB, never leaves your device
- Zero cost — no premium tiers, no "upgrade to unlock," no ads
- Zero friction — open the app, start lifting, close it when you're done
- Installable PWA — add to home screen for a native app feel without the App Store
Browse a curated library of 199 exercises sourced from ExerciseDB — each with images, video demos, step-by-step instructions, pro tips, and variations. Fuzzy search finds what you need in milliseconds.
Built-in interval timer with six protocols: Tabata, EMOM, AMRAP, 30/30, 45/15, and Custom. Each mode has a dedicated detail page explaining the science, instructions, pro tips, and variations — so you understand why you're suffering, not just how long.
Not all workouts are created equal. The heatmap doesn't just count days — it scores each session using a multi-factor composite:
score = setPoints + volumePoints + bodyweightPoints + durationPoints
+ exerciseVariety + bodyPartCoverage + timeSpent
- Volume is sqrt-compressed (
sqrt(weight x reps) x 2) so a 500kg deadlift session doesn't dwarf everything else - Exercise type multipliers — Olympic lifts get 1.2x, cardio duration gets 1.5x, plyometrics get 1.5x per rep
- Variety bonus — hitting more muscle groups and using more exercises earns extra points
- Result: a 20-minute bodyweight circuit can score comparably to a heavy squat day. Effort is effort.
Streaks count consecutive days with at least one completed set. The algorithm is forgiving — it checks both today and yesterday, so your streak survives if you log at 11 PM and don't train until the next evening. Skipping a day resets it. No gaming the system.
Full-featured session tracker with live timer, per-exercise set logging (weight/reps/duration), configurable rest timer with audio/haptic alerts, and confetti on completion. Auto-saves to IndexedDB so closing the app mid-workout doesn't lose progress.
At-a-glance stats: current streak, weekly workout count, weekly volume, activity heatmap, and recent workout history. Time-of-day greeting with rotating motivational quotes.
Full workout log with date grouping. Tap any past workout to view details or repeat it with the same exercises pre-loaded.
Service worker precaches the app shell. Exercise images and videos are cached on first view. Works offline, installs to home screen, updates silently in the background.
Dark/light theme, kg/lbs unit toggle, configurable rest timer defaults, sound and vibration preferences, full data export/import as JSON.
| Layer | Technology |
|---|---|
| Framework | SvelteKit (Svelte 5 runes) + TypeScript |
| UI | shadcn-svelte + Tailwind CSS v4 + bits-ui |
| Icons | @lucide/svelte |
| Storage | IndexedDB via idb, localStorage for preferences |
| Search | Fuse.js (fuzzy, weighted multi-field) |
| Animations | View Transitions API, CSS keyframes, canvas-confetti |
| Deploy | @sveltejs/adapter-vercel |
| Native | Capacitor (iOS/Android) with native haptics |
# Clone
git clone https://github.com/your-username/fitlog.git
cd fitlog
# Install dependencies
npm install
# Start dev server
npm run dev
# Build for production
npm run build
# Preview production build
npm run previewAll 199 exercises are bundled in static/data/exercises.json with local image and video assets:
static/exercises/images/{exerciseId}.jpg # ~5.9 MB total
static/exercises/videos/{exerciseId}.mp4 # ~38.2 MB total
Zero CDN dependency. Everything runs from your origin.
src/
lib/
components/ # Reusable UI (exercise cards, muscle tags, filters, HIIT setup)
data/ # Templates, HIIT presets, HIIT exercise detail data
db/ # IndexedDB schema + workout CRUD + effort scoring
stores/ # Svelte 5 rune stores (exercises, workout, preferences, HIIT)
types/ # TypeScript interfaces (Exercise, WorkoutLog, etc.)
utils/ # Stats, gradients, formatting helpers
routes/
+page.svelte # Dashboard (heatmap, stats, recent workouts)
exercises/ # Exercise library + detail pages
exercises/hiit/[id]/ # HIIT workout detail pages
workout/ # Workout start (templates, exercise picker)
workout/active/ # Live workout session
workout/hiit/ # HIIT interval timer
history/ # Workout history log
settings/ # App preferences
onboarding/ # First-launch welcome flow
static/
data/exercises.json # Exercise database
exercises/images/ # Exercise images
exercises/videos/ # Exercise video demos
Coming soon — screenshots of the dashboard, workout session, exercise library, HIIT timer, and heatmap in both dark and light modes.
Contributions are welcome. If you lift and you code, this is your project.
- Fork the repo
- Create a feature branch (
git checkout -b feat/your-feature) - Make your changes — follow the existing patterns:
- Svelte 5 runes (not legacy stores)
- Real tabs for indentation
- OKLCH colors, dark-mode-first design
- No emojis in UI — use Lucide icons
- Test locally (
npm run buildmust pass) - Open a PR with a clear description
- Add more exercise variations/tips to existing exercise data
- Improve heatmap color scale for different effort ranges
- Add workout templates for specific sports (climbing, swimming, martial arts)
- Accessibility improvements (screen reader labels, focus management)
MIT License. Use it, fork it, modify it, ship it. No attribution required, but a star is always appreciated.
Stop paying for fitness apps. Start lifting.
Peace :)