019
AI ready Refreshed

Gym Template

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

Includes the original v1 design as a separate download.

A six-page gym website template for a strength gym or barbell club that sells a written program: suits gyms, personal-training studios, powerlifting and weightlifting clubs, boxing clubs and climbing walls. Worked example: a Brooklyn barbell club lifting since 1934, on one committed racing green with a book serif. The signature is a real loaded barbell you drag to set your one-rep max, set under the home page photograph and carried onto the Program page, where every week of a twelve-week block is worked out in plates.

ScrollTrigger Lenis advanced
10 more details
click-togglevalue-transitioncount-uptouch-dragsvg-animationscroll-revealstaggerkeyboard-navigationprogressive-enhancement 4 colour palettes
Colour

Updated

About this template

A complete six-page site for a strength gym or barbell club: Home, Program, Floor, Coaches, Membership and Visit. The worked example is Franklin Street Gymnasium, a barbell club on the top floor of an old rope works in Greenpoint, Brooklyn, lifting since 1934, and the copy is written in a clear, warm voice that says what each thing is and does.

Read the full template overview

The four lifts lead. The home page opens on a photograph of the head coach cueing a squat with a real loaded barbell beneath it: drag the bar to set your best squat, bench, deadlift or press, and the readout and plate list follow. The same bar carries onto the Program page, where twelve week cards each draw that week's bar and working weight from your number, and pressing a week loads it onto the big bar.

The Floor page has a plan of the room with eight platform buttons, each bringing up its bar, kit and who trains there at six in the morning, plus the kit as a specification sheet and the hours. Coaches swaps a portrait and best lifts per name. Membership sells the program with open gym, a program review, one-to-one coaching and a day pass, with a picker that turns an induction Saturday into the dates of your block. Visit has the induction form and a real street map.

The look is one committed racing green against warm paper, Spectral headings set upright, with italic saved for the one word that earns it, wide Archivo labels, flat bronze buttons and an invented crest. Three more measured presets ship beside it, charcoal, oxblood and petrol, each with its own display face and swapped from one attribute. Repaint seven tokens, swap the photographs and edit the training block at the top of the script to make it yours.

Gym Template - website template preview

What's included

12 items
  • Six plain pages (Home, Program, Floor, Coaches, Membership, Visit) with a short cross-document crossfade where browsers support it, and a designed phone menu
  • A real loaded barbell in the home hero, beside its readout: drag it, use the keyboard or pick a lift, and plates slide on and off at their true relative sizes
  • The same bar on the Program page, with twelve week cards that each draw that week's bar and working weight from your max; press a week to load it
  • Four lifts, each with its own remembered max, carried between pages by the URL and local storage
  • Video-ready hero: the coaching photograph shows on its own; set one attribute to your MP4 and a muted looping video plays over it, with a pause button and a reduced-motion path
  • Floor plan of the room: eight platform buttons, each bringing up its bar, kit, best use and who trains there at 6am
  • The floor in four figures that count up, and the kit as a two-column specification sheet
  • Block-start picker: choose an induction Saturday and see the week-one Monday, the easier weeks, the test day, a twelve-week calendar and the cost
  • Coaches roster where each name brings up that coach's portrait and best lifts
  • Saturday induction form (front end only) and a real street map with a routed walking line
  • Four measured color-and-type presets (racing green with Spectral, charcoal with Barlow Condensed, oxblood with Bodoni Moda, petrol with Alegreya Sans), swapped from one data-palette attribute; seven tokens reskin the site if none fit
  • Complete without JavaScript: every price, coach, platform and the program at a 100 kg default are in the markup

Perfect for

5 use cases
  • Strength gyms and barbell clubs
  • Powerlifting and weightlifting clubs
  • Personal trainers and coaching studios that write programs
  • Independent gyms with open-gym membership and inductions
  • Boxing clubs, climbing walls and rowing clubs, with the bar reskinned or removed

How it works

5 sections

Six plain pages, one script

Each page is an ordinary HTML file sharing one stylesheet and one script. Every feature looks for its own markup and does nothing when it is missing, so a page or section can be removed without touching the rest. Navigation is a normal page load with a CSS cross-document view transition where supported.

The loaded bar

The home hero and the Program page each keep one state, the chosen lift and a max for each of four lifts, and work the bar drawing, the readout and the week cards out from it with the same arithmetic. Plates slide on and off the sleeves as you drag, at their true relative sizes, and the state is remembered between pages.

The video-ready hero

The hero ships with a photograph. When data-video-src names a file, the script attaches it over the photograph, muted and looping, with a pause button; shipped empty, nothing is requested. Under reduced motion it waits on the photograph until the visitor presses Play.

The floor plan

An SVG plan of the room carries eight platform buttons placed by percentage. Each platform's facts are written once, in a list under the plan that shows without JavaScript; with it, pressing a platform copies that entry into the panel beside the plan.

The block-start picker

A select lists the next six Saturdays. Choosing one works out the Monday week one starts, the easier weeks and the test day from the same twelve-week block the bar uses, draws a calendar strip and prices the block at the monthly membership.

Plugins ScrollTrigger
Difficulty Advanced
Smooth scroll Lenis integration
Colour palettes 4 ready-made palettes, each measured for AA contrast. Switch with one attribute, or copy the values you want into :root. Try them in the preview above.
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this template's demo (6 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

Will this suit a gym that is not a barbell club?

Yes. The structure is a gym website: a program page, the floor, coaches, membership and a visit page with a booking form and map. For a personal-training studio, boxing club or climbing wall, swap the photographs and copy, redraw the floor plan for your room and repaint the racing green. The bar can be reskinned as your own calculator or deleted.

How do I change the training program?

The whole model is one commented block at the top of script.js: the twelve weeks with their sets, reps and percentages, the bar weight, the plate set and each lift's default max. The bar, the readout, the week cards and the membership picker all follow it. Update the week cards written into program.html too, since they are what a visitor without JavaScript reads.

Does the induction form actually book anything?

No. It is an unwired static front end: it lists the next six Saturdays, checks the name and email and shows a confirmation in the browser. Point it at your booking system, Formspree, Netlify Forms or your CRM at the marked lines in script.js.

How do I add my own video to the hero?

Save a short muted MP4 in the folder, such as assets/video/hero.mp4, and set data-video-src on the hero in index.html to that path. The video then plays muted and looping over the photograph with a pause button. Left empty, as shipped, no video is requested. Keep the action in the middle of the frame, because the band is cropped short on laptop screens.

How do I redraw the floor plan for my own room?

The plan is an inline SVG in floor.html drawn in a 1000 by 560 box, with each platform a button positioned by percentage. Move or add buttons, and give each one a matching list item under the plan with its heading and details; the panel copies that entry when the button is pressed. Delete the section and nothing else breaks.

How do I change the prices and the block picker?

Prices appear as plain text (US dollars in the worked example) on the home and membership pages. The block picker reads its monthly price from MONTHLY in script.js and its easier weeks and test day from the training block, so change the copy and MONTHLY together.

Paid template

Purchase to unlock the code.

Buying Gym Template 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 open index.html in a browser, or upload the whole folder to any static host. There is no build step.
  2. Every page (index.html, program.html, floor.html, coaches.html, membership.html, visit.html) loads the same assets/style.css and assets/script.js.
  3. Edit the copy in the HTML, repaint the seven color tokens at the top of assets/style.css, and change the training model in the "YOUR PROGRAM" block at the top of assets/script.js.

script.min.js is a minified copy of script.js. Point the pages at it in production, or keep the readable file; they behave the same.

Using It With Your Own Design

  • Color. The site runs on seven tokens in :root: --plate (the committed racing-green ground and display type), --plate-deep, --paper, --paper-dim, --ink, --bronze (buttons and the announcement bar) and --bronze-lt. Each has an -rgb twin for translucent uses. Measured contrast pairs are recorded in the comment above them; re-measure if you change them.
  • Type. Spectral (a book serif with a real italic) carries body copy and, in the default palette, the headings; Archivo at its widest carries small-caps labels. Headings, lift words and the big figures read --font-display and --font-display-weight, so each palette below can bring its own display face. Change --font-serif, --font-display and --font-label and the Google Fonts link in each page head; drop the families you do not use from that link.
  • The crest is drawn once per page as <symbol id="crest"> at the top of <body> and reused with <use href="#crest">. Edit its two textPath lines and the center letter, or replace it with your own mark.
  • Headings are set upright. Italic (<em>) is kept for the one word in a heading that genuinely carries emphasis, as on "barbell" in the home hero; use it sparingly.
  • Another kind of club. For a boxing club, climbing wall or rowing club, keep the structure, swap the photographs and copy, redraw the floor plan for your room, and either reskin the bar as your own calculator or delete it (see Program below).

Pages and Configuration

Home (index.html)

Hero (crest, headline, the coaching photograph with a slot for your own video, and the deck under it: the readout and the loaded bar side by side), then the program in one line with four figures, the four lifts set as display type, a full-bleed photograph of the floor, the history, the coaches, three prices and the Saturday induction.

The hero is the bar's first home. Everything inside data-rig shares one state, so dragging the bar, pressing a lift name or using the keyboard updates the readout, the plate list and the "See your twelve weeks" link ([data-program-link]), which opens the Program page on that lift and weight.

Adding a hero video

The hero is a video-ready slot:

Code snippet omitted: it ships with the download.

The photograph shows on its own, and the slot ships with data-video-src="", so no video is requested. To add one, save a muted MP4 in the folder and set data-video-src in index.html to its path, for example data-video-src="assets/video/hero.mp4". The script then attaches it over the photograph, muted and looping, and shows the Pause button. Under reduced motion it waits on the photograph until the visitor presses Play. The band is cropped short on laptop screens so the bar's deck stays in the first view, so keep the action in the middle of the frame.

Aim for 1280x720, 25fps, H.264, no audio, a seamless loop of 6 to 10 seconds and about 3MB or less, for example:

Code snippet omitted: it ships with the download.

Program (program.html)

The signature page. Everything inside data-rig reads one state: the chosen lift and a max for each of the four lifts. The bar ([data-bar]) is dragged, or focused and moved with the arrow keys (2.5 kg), Page Up/Down (10 kg), Home and End; there is also a number field and steppers. The four lift words choose the lift, and the twelve week cards are buttons that load that week's working weight onto the big bar.

At the top of script.js:

Code snippet omitted: it ships with the download.

If you change BLOCK or DEFAULT_MAX.squat, update the week cards and plates written into program.html and the hero bar in index.html, which is what a visitor without JavaScript reads. Maxes are remembered in localStorage under franklin-street-bar, so a weight set on the home page is still there on the Program page, and ?lift=deadlift&max=180 loads a lift and weight.

To remove the bar entirely, delete program.html and its links, and replace the home hero's hero__bar and hero__deck blocks with your own copy.

Floor (floor.html)

A full-bleed photograph of the room, the floor in four figures (two of which count up: <span data-count-to="1840">1,840</span>, change both the attribute and the text), the floor plan, the kit as a specification sheet and the opening hours.

The floor plan is an SVG of the room with eight platform buttons laid over it:

Code snippet omitted: it ships with the download.

Positions are percentages of the plan, which is drawn in a 1000 x 560 box. Each platform's facts live once, in the list under the plan (<li data-platform="3"> with a heading and a <dl>). Without JavaScript that list is what shows; with it, the list is hidden and pressing a platform copies its entry into the panel beside the plan. To redraw the plan for your room, edit the SVG shapes (windows, columns, racks, stairs) and move, add or remove the buttons and list items in pairs.

Coaches (coaches.html)

Name buttons ([data-coach="0"]) and cards ([data-coach-card="0"]) pair by index; with JavaScript the cards share one stage and the best lifts count up, without it they are listed in turn. The program review band links to the induction form.

Membership (membership.html)

Prices are plain text: the program and open gym, a program review, a day pass, one-to-one coaching and the free induction. The block-start picker ([data-picker]) lists the next six Saturdays; choosing one shows the induction date, the Monday week 1 starts, the two easier weeks and the test day (all read from BLOCK), a twelve-week calendar strip and what the block costs at MONTHLY in script.js. Change the price in the copy and MONTHLY together. Without JavaScript the picker shows a worked example.

Visit (visit.html)

  • Induction form ([data-induction-form]) lists the next six Saturdays, validates name and email and shows a confirmation, but sends nothing. Replace the marked lines in initInduction() with a fetch() to Formspree, Netlify Forms or your CRM.
  • Map ([data-map]) is MapLibre GL on OpenFreeMap tiles (no key). Change GYM, STATION and ROUTE at the top of initMap(), and keep the OpenStreetMap credit.

Palette

Token Hex Use
--plate #1F4A38 Ground, display type on paper
--plate-deep #133326 The deck under the bar, deeper bands, footer
--paper #F2EDE3 Reading ground, the plates on the bar
--paper-dim #CADCCF Secondary text on green
--ink #17181C Body text on paper
--bronze #86643A Buttons, announcement bar, collars
--bronze-lt #C9A774 Large labels on green only (4.42:1)

Palettes

Four color-and-type presets ship in assets/style.css. Racing green is the :root default; the other three are :root[data-palette="..."] blocks that restate every color token and swap the display face. Paper, ink and both bronzes are shared, and the photo scrims are drawn in ink, so no preset changes what sits on a photograph.

Palette data-palette Ground (--plate / --plate-deep / --paper-dim) Display face Paper on plate
Racing green (none, the default) #1F4A38 / #133326 / #CADCCF Spectral 300 8.59:1
Charcoal charcoal #2D3237 / #1E2226 / #CBD0D5 Barlow Condensed 600 11.09:1
Oxblood oxblood #6B2131 / #481520 / #E6CDD1 Bodoni Moda 500 9.54:1
Petrol petrol #1C4A55 / #12323A / #C9DCE0 Alegreya Sans 500 8.33:1

To use one, set it on every page's root tag, for example <html lang="en-US" data-palette="oxblood">, and change the theme-color meta to its --plate. Or copy that block's values into :root and delete the other blocks. Either way, trim the Google Fonts link in each page head to the display face you keep. --bronze-lt stays a large-label color on every ground (4.29:1 on petrol, the lowest).

Accessibility and Fallbacks

  • The bar is a focusable role="slider" with a spoken value; on touch a horizontal drag loads it and a vertical swipe scrolls.
  • Lift words, week cards and floor-plan platforms are native buttons with aria-pressed; results are announced politely.
  • The phone menu is a real button with aria-expanded; Escape or a click outside closes it and focus returns.
  • With JavaScript off, every price, coach, platform and the program at its default are in the markup; controls that need the script stay hidden.
  • If the GSAP CDN is blocked, reveals are skipped and the interactive parts still work.
  • Under prefers-reduced-motion reveals and count-ups are off, the bar redraws without sliding, any video waits on its photograph and the page crossfade is disabled.

Dependencies

  • GSAP 3.12+ and ScrollTrigger (demo pinned to 3.15.0 from jsDelivr)
  • Lenis 1.1+ for optional smooth scrolling (demo pinned to 1.3.17); delete its script tag or add data-smooth="off" to <html> to turn it off
  • MapLibre GL 4.x on visit.html only (demo pinned to 4.7.1)
  • Google Fonts: Spectral and Archivo

Images and Credits

Bundled images are WebP derivatives in assets/img/, cropped, resized and lightly eased in saturation, listed with their sources in assets/img-manifest.json. Rebuild them with bun scripts/build-template-assets.ts strength-gym-template --force (in the GSAP Vault repo), or replace a file with your own at the same name and size.

  • Pexels photographs under the Pexels license (https://www.pexels.com/license/), page URLs https://www.pexels.com/photo/<id>/:
    • floor-racks (Floor page head): 15679567
    • lift-deadlift: 19132573
    • visit-corner: 6999117
    • review-log: 39219660
    • deadlift-setup: 39219674
    • induction: 39219652
    • member-bench: 6922167
    • plate-rack: 6389853
  • AI-generated images made for this template, of the fictional gym and its coaches; they do not show real people:
    • hero-coach (Home hero and thumbnail): the head coach cueing a back squat
    • floor-room (Home, the floor section): the empty room, eight platforms and racks
    • coach-1 to coach-4 (coach portraits)

No video is bundled; see "Adding a hero video".

Franklin Street Gymnasium, its address number, coaches, members, history, floor plan and prices are fictional. Franklin Street, Greenpoint Avenue, the Greenpoint Av G train station and the walking route on the map are real. Prices are in US dollars; the bar and the program load in kilos, as competition plates do.

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