Premium Fitness & Workout Tracker — PWA Mobile HTML Template
Thank you for purchasing Fitova — a modern, mobile-first PWA template designed for fitness apps, workout trackers, and health platforms. It bridges the gap between web and native apps, delivering a true app-like experience directly in the browser — no App Store required.
Built entirely with Tailwind CSS and
Vanilla JavaScript (no frameworks, no dependencies
beyond Chart.js), Fitova is a complete, production-ready foundation
with a stunning dark-green design, smooth micro-interactions, and a
fully dynamic data layer powered by localStorage.
| Feature | Details |
|---|---|
| PWA Ready | Service Worker + Web App Manifest — fully installable, offline-capable. |
| Tailwind CSS |
Utility-first CSS via compiled output.css.
Tailwind config included for rebuilding.
|
| W3C Semantic HTML | Clean HTML5 with proper ARIA roles, labels, and landmarks throughout. |
| Mobile-First (430px) | Designed and optimized exclusively for handheld devices. |
| Fully Dynamic Data |
Goals, metrics, bookmarks, food logs — all via
localStorage, ready to connect to any real API.
|
| Food Scanner | Native camera access, gallery upload, animated green scan overlay, live nutrition results. |
| Chart.js Integration | Interactive line chart for calories, steps, distance, heart rate, and weight tracking. |
| Bottom Navigation | Active icon swapping, context-aware active state detection by URL filename. |
| Toast Notifications |
Global showToast(msg, type) used everywhere — no
browser alerts.
|
| Safe Area Support |
iPhone notch & home indicator handled via CSS
env() variables.
|
| Retina Ready | SVG icons and WebP images for crisp display on all screen densities. |
| Cross-Browser | Tested on Chrome, Safari (iOS), Firefox, and Edge. |
No build step required to view the template. Simply open the files in a local server:
app.html →
Open with Live Server.
onboarding.html after 2.5 seconds.
Only needed if you modify tailwind.config.js or add new
Tailwind classes:
npm install
npm run build # Compiles src/css/input.css → src/css/output.css
output.css is already
included. You do not need to run npm to view or use the template.
Open app.html in the project root as your starting point.
It is the splash screen and the app's entry point.
Fitova includes 30+ HTML screens covering the complete fitness app user journey.
Fitova uses two typefaces — each with a specific purpose:
app.html (splash screen) only.
Both fonts are loaded from Google Fonts in the
<head> of the relevant pages:
<!-- Poppins — included on ALL pages -->
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap" rel="stylesheet" />
<!-- Anek Bangla — included on app.html ONLY -->
<link href="https://fonts.googleapis.com/css2?family=Anek+Bangla:wght@600&display=swap" rel="stylesheet" />
// tailwind.config.js
fontFamily: {
sans: ["Poppins", "system-ui", "sans-serif"], // default font for all pages
}
| Tailwind Class | Size | Used For |
|---|---|---|
text-xs |
12px | Captions, labels, timestamps |
text-sm |
14px | Body text, nav labels, descriptions |
text-base |
16px | Standard body, card titles |
text-lg |
18px | Section headings |
text-xl |
20px | Page titles in headers |
text-2xl |
24px | Stats numbers, large values |
text-[44px] |
44px | FITOVA logotype (app.html only) |
The primary brand color is #94F608. Change it in two places:
/* 1. tailwind.config.js */
colors: {
primary: {
DEFAULT: "#94F608", // ← Change here
}
}
/* 2. src/css/custom-styles.css */
:root {
--color-primary: #94F608; /* ← And here */
--color-bg-main: #070A03; /* App background */
}
All hero images are CSS utility classes in
custom-styles.css. To swap an image, find its class and
update the URL:
/* src/css/custom-styles.css */
.bg-workout-detail {
background-image: url('../assets/images/detail-workout-400x273.png');
background-size: cover;
background-position: center;
}
.training-card-bg-1 {
background-image: url('../assets/images/card-400x239.png'),
linear-gradient(180deg, rgba(0,0,0,0) 40%, rgba(0,0,0,0.8) 100%);
background-size: cover;
}
<link> in all HTML
<head> tags with your chosen font.
tailwind.config.js
fontFamily.sans to the new font name.
npm run build
Edit src/js/navbar.js to update routes and active-state
detection:
// src/js/navbar.js
const routes = {
home: "./home.html",
explore: "./shedule.html",
statistic: "./statistic.html",
scan: "./scan.html",
profile: "./profile.html",
};
To add a page to the profile group (so profile nav stays active on sub-pages):
if (
filename.includes("profile") ||
filename.includes("settings") ||
filename.includes("security") ||
filename.includes("edit-profile") // ← add new pages here
) {
return "profile";
}
All JavaScript follows a strict IIFE pattern — each page has one self-contained file with no global variable leaks between pages.
Always load scripts in this order before </body>:
<!-- 1. Global utilities (required on every page) -->
<script src="../js/toast.js"></script>
<script src="../js/navbar.js"></script>
<!-- 2. Page-specific JS (last) -->
<script src="../js/pages/home.js"></script>
Show a toast from any page script using the global function:
showToast("Workout saved! 💪", "success");
showToast("Please fill all fields", "error");
showToast("Coming soon!", "info");
| Type | Color | Use For |
|---|---|---|
"success" |
Green | Confirmations, saved actions |
"error" |
Red | Validation errors, failures |
"info" |
Gray | Neutral messages, coming soon |
| Key | Used By | Contains |
|---|---|---|
userGoal |
home.html | Selected fitness goal |
userProfile |
edit-profile.html | Name, email, gender, DOB, weight |
favoriteWorkouts |
my-favorite.html | Array of bookmarked workouts |
recentSearches |
search.html | Array of recent search terms |
weeklyActivity |
statistic.html | Per-day calorie data |
healthMetrics |
statistic.html | Heart rate, blood pressure |
trainerProfile |
trainers-profile.html | Follow state, button uses |
scannedImage |
scan.js → scan-result.html | Base64 captured food image (sessionStorage) |
Fitova is fully PWA-ready. Users can install it on their home screen like a native app.
{
"name": "Fitova",
"short_name": "Fitova",
"start_url": "./app.html",
"display": "standalone",
"background_color": "#070A03",
"theme_color": "#94F608",
"icons": [
{ "src": "src/assets/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "src/assets/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
]
}
When you add new pages or assets, add them to the cache list in
service-worker.js:
const urlsToCache = [
"./app.html",
"./src/pages/home.html",
"./src/css/output.css",
// ← add new files here
];
localhost for local development — it is
treated as a secure context.
| Library / Resource | Version | Used For | Link |
|---|---|---|---|
| Tailwind CSS | v3 | All styling (utility-first CSS) | tailwindcss.com |
| Chart.js | v4 | Weekly progress line chart on statistic.html | chartjs.org |
| Google Fonts — Poppins | — | Primary typeface across all pages | fonts.google.com |
| Google Fonts — Anek Bangla | — | FITOVA logotype on app.html only | fonts.google.com |
| Custom SVG Icons | — | All UI icons (included in assets/icons/) | Original / custom |
| WebP Images | — | All app images (optimized for web) | Original / custom |
If you have questions beyond the scope of this documentation, please contact me via the ThemeForest item page. I typically respond within 24–48 hours.
Before reaching out, please:
Fitova v1.0.0 — © 2026. All rights reserved.