Endika/ekin

Bodyweight home-workout PWA: deterministic routine generator, exercise demos, per-exercise progression. Offline, mobile-first, optional Gemini AI.

★ 0Forks 0TypeScriptGitHub ↗Compare

Project website ↗

bodyweightfitnesshiiti18nofflinepwatypescriptviteworkout

README

Ekin

Bodyweight home workouts — build your own routines, train anywhere. No equipment, no account, offline-first.

Try it now →

Latest release CI Last commit Conventional Commits License: MIT

What you can do

  • Build your own workout by hand: pick a zone, add bodyweight exercises from a searchable library, set sets/reps/rest.
  • Auto-fill a routine in one tap from a zone, time budget and level — then edit anything.
  • Reuse saved workouts: load a past routine back into the builder and tweak it.
  • Train with a guided session player — timer, rest countdown, exercise demo, and on-screen wake-lock so the screen never sleeps mid-set.
  • Log the reps you actually did, then track progress: current streak, totals, and a per-exercise rep-evolution chart.
  • Optional AI assistant (Gemini): bring your own API key to swap an exercise or make a workout easier/harder. Hidden entirely without a key.
  • Available in 6 languages: English, Spanish, Basque, Galician, Catalan and Valencian (auto-detected, switchable in Settings).
  • Works offline after first load. Install it as a PWA on your phone. Exercise demo images are the exception: each free-exercise-db image is cached the first time it is shown, and the wger ones always need the network.
  • Local-only data, stored on your device. No signup, no email, no backend.

How to start

  1. Open Ekin on your phone.
  2. Name your workout, pick a zone, and add a few exercises.
  3. Tap Start and train.

Install on your device

Open the site in your browser and choose Add to Home Screen (iOS Safari) or Install (Chrome/Android). It runs full-screen and works offline.

Tech stack

  • Svelte 5 + Vite + TypeScript
  • PWA (service worker + manifest via vite-plugin-pwa), self-hosted fonts, offline-first
  • IndexedDB for local persistence
  • svelte-i18n for localization; optional direct-to-Gemini AI assist (browser-side, user's own key)

Development

npm install
npm run dev      # local dev server
npm run check    # format:check + lint + type:check + test:run
npm run build    # production build to dist/

npm run sync-exercises refreshes the free-exercise-db catalog and npm run import-wger the wger one; npm run icons regenerates the PWA icons from public/favicon.svg.

Credits

The code is MIT. The exercise data is not all under the same terms:

  • free-exercise-db — the Unlicense (public domain).
  • wger — CC-BY-SA, kept in its own file and credited per exercise, both in the app's credits screen and on each exercise. Adaptations we publish, such as our Basque, Galician, Catalan and Valencian translations of that text, carry the same licence.

See NOTICE.md for the details.

Contributors

Endikagithub-actions[bot]dependabot[bot]

Issues