144

Fitness App Website Template

£29 View live demo or the whole Vault, £79.20

A working mobile app for strength training: today's session as a photo poster, a live set logger with a rest timer, lift charts, a training crew, coach chat, settings and a four-step welcome. Full screen on phones; on desktop it runs in a phone frame on a bold orange stage.

Flip advanced
14 more details
touch-dragkeyboard-navigationdialog-animationcountdownsvg-drawcount-upfilterflip-layouttabsmicro-interactiontoken-themingprogressive-enhancementvalue-transitionclick-toggle

Released

About this template

A phone app, built as a mobile web app, for anyone training to a plan: a gym or studio member app, a personal trainer's coaching app, a running or cycling plan, a habit tracker or a physio exercise programme. The worked example is Setbook, a strength log for Dana, who trains four days a week with a small crew and a coach.

Read the full template overview

Each session is a photograph with its name set huge in heavy italic capitals, and one orange does every job that matters: start, done and the current screen. Selection inverts to ink, so the orange always means action. Light and dark themes share the same tokens.

On a phone the app fills the screen with its own bottom tab bar. On a desktop it runs at real phone size in a device frame on an orange stage, with the screen's name set large beside it, a short list of things to try and a numbered screen list, so a visitor can use every screen with a mouse and keyboard. The stage is one attribute to switch off.

Nine pages ship: Today, Train, Session, Progress, Crew, Chat, You, a welcome flow and a UI elements page that shows every building block live in each state. Everything runs in the browser and saves to local storage; there is no server, account or real messaging.

Fitness App - website template preview

What's included

11 items
  • Nine pages: Today, Train, Session, Progress, Crew, Chat, You, Welcome and a UI elements page with an index and search
  • Live set logger: last time's numbers beside this time's, tick to log, invalid entries refused with a message, add, swap or remove exercises and notes
  • Rest timer dock with a ring countdown, 15-second nudges and Skip, started by each logged set
  • Finish summary that counts up duration, volume, sets and records, then saves the session to Progress
  • Lift chart with a pointer and keyboard readout, records, weekly volume bars against a goal and a training calendar
  • Week strip of rings, a readiness check-in that rewrites today's plan, and session posters for done, planned and rest days
  • Session library with type filter, search, empty state and a draggable detail sheet
  • Crew leaderboard that reorders by week or month, kudos and comments; coach chat with quick replies
  • Settings that apply across the app: kilograms or pounds, weekly goal, default rest and theme
  • Desktop stage: the live app in a phone frame on a full colour ground, with a numbered screen list
  • Self-hosted Saira and Golos Text, light and dark themes on one token set, no build step

Perfect for

5 use cases
  • Fitness, gym and workout tracking apps
  • Personal trainer and coaching apps
  • Running, cycling and training plan apps
  • Habit, wellness and physio exercise apps
  • Mobile app UI prototypes and PWA front ends

How it works

5 sections

A phone app on phones, a stage on desktop

Below desktop width the app is the page and the bottom tab bar is its navigation. On a wide screen the same markup sits in a fixed-size device frame, so its sheets, dialogs, toasts and tab bar stay inside the phone, while the stage beside it lists every screen. Setting data-stage to off on the html element keeps a plain phone-width column instead.

Session data in a JSON block

The programme's sessions, exercises, set targets and last-time figures sit in a JSON block on the pages that use them. The Train sheet and the logger both read it, so adding or editing a session is one edit and every screen agrees.

The logger keeps its own state

Each tick, value, note and swap is saved as you go, so a reload or a trip to another screen returns to the same session. Finishing writes a short record that Today, the calendar and History all pick up.

Settings reach every screen

Units, the weekly goal, default rest and theme are stored once and read by each page as it loads. Any weight in the markup marked with a data attribute converts between kilograms and pounds without further code.

Motion only answers a tap

Rows sweep in when logged, rings draw, figures count and sheets slide, and none of it is needed to use the app. With reduced motion or without the animation library every control still works and every figure shows its final value; without JavaScript every screen still reads and links.

Plugins Flip
Difficulty Advanced
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this template's demo (9 pages, lowest score shown), from the latest scan. A measurement of the demo as shipped, not a promise for your page.

Accessibility
100
Best practices
100

No performance score, on purpose. That figure depends on how you deploy: your server's compression and caching, your CDN, the connection and the device doing the test, none of which the code controls. The same page can score very differently on two consecutive runs, so measure it where it will live.

Questions about this template

Does this only suit a strength training app?

No. It is a general training app shell: a gym or studio member app, a personal trainer's client app, a running or cycling plan, a habit tracker or a physio programme all fit. Change the session JSON, the photographs and the names, and relabel the two logged columns per exercise (kilograms and reps, metres, calories or seconds).

Is this a native iPhone or Android app?

It is a mobile web app: HTML, CSS and JavaScript that run full screen in a phone browser, as a progressive web app or inside a WebView wrapper such as Capacitor. Nothing needs compiling. To publish it in the app stores you would wrap it with a tool like that and add the store assets yourself.

How do I save workouts to a real account?

Everything is saved in the browser's local storage under keys starting setbook-, so it stays on one device and there is no sign-in. To sync, replace the small store helper in the script with calls to your backend, such as Supabase, Firebase or your own API. The session, history, settings and chat each save as one object, which maps neatly to a table each.

Do the chat and crew features send real messages?

No. The coach replies are canned answers picked by keyword after a short typing indicator, and kudos and comments are stored on the device only. They show the full interface for a coach inbox and a group feed; connect them to a messaging service such as Stream, Sendbird or a realtime database to make them live.

Can I remove the orange stage around the phone on desktop?

Yes. Add data-stage set to off on the html element of each page and desktop visitors get the app as a centred phone-width column on its own ground, with no frame, screen list or large screen name. On phones nothing changes, because the stage only appears on wide screens.

How do I add my own sessions and exercises?

Edit the JSON block named setbook-plans at the foot of the Train and Session pages; keep the two copies the same. Each session lists exercises with a name, an alternative for the swap menu, the two units it logs, a rest time and its sets with last-time figures. The poster grid on Train is plain markup, so add a card that points at the new id.

Paid template

Purchase to unlock the code.

Buying Fitness App opens the HTML, CSS and JavaScript source, the full documentation, an AI setup prompt for your editor, and every update we ship to it. Standard license: unlimited personal and commercial projects. Every paid product is tested for desktop and mobile layouts, reduced-motion handling, animation cleanup and keyboard controls wherever there is something to operate.

£29 Standard license, unlimited projects

Browse free effects

Or the whole library: the Vault, £79.20, one payment.

Documentation

Quick Start

  1. Unzip the folder and serve it:

Code snippet omitted: it ships with the download.

  1. Open /index.html (or the folder with a trailing slash) so the relative assets/ paths resolve. Opening the files straight from disk also works.
  2. Open it on a phone on the same network, or use the browser's device toolbar, to see the full-screen app.

Using It With Your Own Design

  • Colours are tokens at the top of assets/style.css, light in :root and dark in :root[data-theme="dark"]. Change --accent first; keep --on-accent dark unless your accent is dark enough to carry white text.
  • Faces are two variables, --font-display and --font-body. Saira italic sets posters, titles and big figures; Golos Text runs the interface.
  • Rename the app in the stage (.stage-brand), the page titles and the profile. Replace the photographs in assets/img/ with files of the same name and size, or edit the <img> tags.
  • Every class on the UI elements page is the one the app uses, so restyling a component there restyles it everywhere.

Screens and Configuration

Desktop stage

Below 880px wide (or under 620px tall) the app is the page. Above that, .device becomes a 390px-wide phone frame with its own scroller, and its fixed chrome (tab bar, sheets, dialogs, toasts, rest dock) stays inside it. The stage beside it holds:

  • .stage-rail: the brand, the numbered screen list and the theme switch (1180px and wider).
  • .stage-copy: the large screen name (data-mark on .stage-word, sized from --chars), a one-line description and "Try this" hints. Between 880 and 1180px it also carries the screen list as pills.

To ship without the stage, add data-stage="off" to <html> on each page: desktop visitors then get a centred phone-width column and the stage markup is ignored. You can also delete the two stage- blocks from each page.

Session data

Sessions live in a JSON block, <script type="application/json" id="setbook-plans">, at the foot of train.html and session.html (keep the two the same). Each session has id, name, type, mins, img, alt, level, kit, blurb and ex, a list of exercises:

Code snippet omitted: it ships with the download.

ua and ub name the two logged columns (kilograms and reps, metres, calories, seconds, kilometres). a and b are this session's targets, shown in grey and logged when a set is ticked empty; prev is last time's figure; warm: true marks a warm-up set. rest is in seconds; 0 uses the default rest from settings. The Train grid is plain markup: copy an <li data-plan-card> and point data-open-plan and the href at the new id.

Logger

session.html?plan=<id> opens a session. The session is saved as you go and restored on reload; finishing writes a history entry that Today, the Progress calendar and History read. Volume counts kilograms × reps, and kilograms once per set for carries and pushes. A record is any working set heavier than the best prev figure for that exercise.

Units

Any element with data-kg="120" shows that weight in the chosen unit ("120 kg" or "265 lb"). Logger inputs, the chart, records and volume convert too. Units, weekly goal (data-stepper), default rest and reminders are set on profile.html.

Progress figures

The chart, records and weekly volume read the setbook-progress JSON block in progress.html: 52 weekly estimated maxima per lift, four record tiles per lift and eight weeks of volume in tonnes with a goal.

Hooks you can reuse

Hook Behaviour
.seg[role=group], .chips[role=group], [data-single] Single-select buttons with aria-pressed, arrow keys; fires a select event
[data-stepper] with data-min/data-max Number stepper; fires change
[data-open-dialog="id"], [data-open-sheet="id"] Open an overlay; [data-dialog-close], [data-sheet-close], Escape and the scrim close it
[data-menu] + [data-menu-btn] + [role=menu] Menu button with arrow keys and Escape
[data-toast="text"] Shows a toast on click
[data-ring] on a ring circle Ring value in percent; draws in on load
[data-kudos], [data-comments-toggle] Kudos toggle with count; expandable comment thread with a form

Front end only

There is no server. Sessions, history, settings, kudos, comments, chat and the welcome answers are saved in localStorage under keys starting setbook-; "Reset demo data" clears them. The coach replies are canned and chosen by keyword. Sign out shows where your own authentication goes. To make it real, replace the store helper in assets/script.js with calls to your backend and the chat reply with your messaging service.

Palette

Token Light Dark Role
--ground #EDEEF0 #0D0E10 Page behind the app
--surface #FFFFFF #17191C Cards, sheets, lists
--raised #E3E5E8 #22252A Inputs, tracks, quiet buttons
--ink #121418 #F1F2F3 Text, selection
--accent #FF5A1F #FF6633 Start, done, current; always carries dark text
--accent-text #B23A0A #FF6633 Small orange text
--stage #FF5A1F #141518 Desktop stage ground

Measured contrast pairs are listed in the comment at the top of the stylesheet. The theme follows the system until the visitor picks one; the choice is stored and applied before first paint by the small script in each page's <head>.

Photographs

Baked WebP derivatives in assets/img/, graded from Pexels originals (Pexels licence). Sources are listed in assets/img-manifest.json; rebuild with bun scripts/build-template-assets.ts fitness-app-template in the GSAP Vault repository, or replace the files directly at the same sizes (720 × 900 posters, 720 × 480 feed photos, 780 × 1200 welcome).

Accessibility

  • Native buttons, links and inputs throughout, with a visible focus ring for keyboard use only.
  • Segmented controls, chips and the week strip use aria-pressed with arrow keys. The chart is a focusable slider whose value text names the week and weight.
  • Sheets and dialogs trap focus, close on Escape and return focus to their trigger; the rest of the page is made inert while they are open.
  • Invalid entries are refused with a written message tied to the field, never colour alone. Toasts and the chat thread are live regions.
  • Reduced motion keeps every interaction and shows final values without animating. Without JavaScript each screen still reads, links and stacks the welcome steps.

Dependencies

  • GSAP 3.12+ (demo built against 3.15.0) from jsDelivr, used only for motion. Flip is loaded on train.html and crew.html for the filter and leaderboard reflow. Every control works if the CDN is blocked.
  • Saira and Golos Text, self-hosted in assets/fonts/ (latin, the weights used). SIL Open Font License; see assets/fonts/OFL.txt.
  • No other libraries and no build step. Page changes crossfade with a CSS view transition where the browser supports it, with the phone frame held still on desktop.

Teardown

Each page is standalone and runs its own features on load, so ordinary page loads need no teardown. The script reverts its GSAP context on beforeunload. If you mount a screen inside a single-page app instead, revert that context and clear the logger's clock and rest-timer intervals when the view unmounts.

Worked examples, the events and programmatic API, and the class reference ship with the download, alongside the full source.