Skip to content

Latest commit

 

History

History
48 lines (38 loc) · 1.9 KB

File metadata and controls

48 lines (38 loc) · 1.9 KB

Couch to 5K Trainer

A lightweight, mobile-friendly, PWA-ready Couch to 5K (C25K) style training web app built with vanilla HTML/CSS/JavaScript. Designed for easy deployment to GitHub Pages.

Features

  • Full 9-week C25K schedule (3 workouts per week)
  • Interval engine with pause, skip, progress ring
  • Speech cues, beep tones (configurable), haptics (if supported)
  • Hydration reminders (optional)
  • Auto-start next workout (optional)
  • Battery saver mode
  • Music launcher (Spotify / YouTube Music / Apple Music)
  • Progress stats (estimated distance, calories via MET + weight, workouts completed)
  • Share progress (text + generated image)
  • Export/import/reset progress
  • PWA: offline cache + install prompt
  • Theming and accessibility improvements

Getting Started

Open index.html directly in a browser OR deploy to any static host.

Run Locally

Just open index.html in Chrome/Edge/Firefox. For full PWA behavior (service worker scope), serve via a local HTTP server (for example with VS Code Live Server or python -m http.server).

Deploy to GitHub Pages

  1. Create a new GitHub repository and push this project.
  2. In GitHub UI: Settings → Pages → Build and deployment:
    • Source: Deploy from a branch
    • Branch: master (or main) / root
  3. Save. Wait for Pages to build. Your site will be at: https://<username>.github.io/<repo>/

Because the service worker is registered with a relative path (./sw.js), it will work under the repo subpath.

Service Worker / PWA Notes

  • The manifest.json and sw.js enable install + offline caching.
  • If you change file names, update the pre-cache list in sw.js.

Storage Keys Used

All data persists in localStorage under keys prefixed with c25k_.

Customization Ideas

  • Add km/mi unit toggle
  • Per-interval distance and calorie logging
  • Session history view
  • Theme via CSS variables

License

MIT (add LICENSE file if you need an explicit one)