![]() |
![]() |
![]() |
![]() |
![]() |
|---|
- Create Workouts (very customizable - many more parameters than the offical app are exposed in what I think is a fairly user-friendly way)
- Partner workouts (select which users are working out, will go 1:1 and change both the app color scheme and trainer color to indicate whose turn it is)
- Workout modes (mostly match up with the Echo/Pump/OldSchool/TuT, but I have some extra ones I've been experimenting with)
- Audio Cues
- Workout Tracking
- Performance Tracking (records best efforts per exercise)
- 1RM Estimation (I use a formula based on Lombardi that allows inputting variable weights per rep so it works on things like TuT/Echo - it's not perfect but also not half bad)
The app is configured as a Progressive Web App (PWA) and can be installed on mobile devices:
- Open the app in a supported browser
- Look for "Install App" or "Add to Home Screen" prompt
- Follow browser-specific installation steps
The app has evolved around the way I've been using it. I have the Trainer next to my desk. The idea was to have something I could just pick up do a few sets and then return to work.
- It just remembers the last workout, but if you stop mid workout it will pickup where you left off
- There's an auto progression system where it increases the weight of a set the next time you do it (by roughly 1%)
- When there are multiple users (partner workout), the weights of the second (and third, etc.) are based on 1RM%
- Only one saved workout. Definitely an area for improvement.
- Users are currently hard coded
- Limited exercise selection. We should pull in the full Vitrivian library.
- Cross-device data syncing requires you to point to your own couchdb instance - not very user friendly. It also doesn't seem to scale well. It has started to choke when syncing my full workout history to a new device.
- Frontend: SolidJS + TypeScript
- Build Tool: Vite
- Styling: TailwindCSS
- Database: PouchDB (local storage)
- Charts: Chart.js + Solid-ChartJS
- Development: Storybook for component development
- PWA: Service Worker support with manifest
- Node.js (version 16 or higher)
- npm or yarn
- A modern browser with Web Bluetooth support (Chrome, Edge, Opera)
-
Clone the repository
git clone <repository-url> cd smart-fitness
-
Install dependencies
npm install
-
Start development server
npm run dev-server
The app will be available at
https://localhost:5173(HTTPS is required for Web Bluetooth API) -
Start Storybook (for component development)
npm run dev
Storybook will be available at
http://localhost:6006
npm run dev- Start Storybook development servernpm run dev-server- Start Vite development servernpm run build- Build for productionnpm run build-storybook- Build Storybook for productionnpm run serve- Preview production build
- Chrome 56+ / Edge 79+ / Opera 43+ (Web Bluetooth support required)
- HTTPS connection (required for Web Bluetooth API)
βββ data/ # Static data (exercises, categories)
βββ services/ # Business logic and utilities
β βββ db/ # Database services (PouchDB)
β βββ device/ # Bluetooth device integration
β βββ user/ # User preferences and settings
β βββ util/ # Shared utilities
β βββ workout/ # Workout logic and management
βββ ui/ # Frontend components and pages
β βββ _common/ # Shared UI components
β βββ _public/ # Static assets and PWA files
β βββ Activity/ # Activity tracking components
β βββ AnalyzeExercise/ # Exercise analysis views
β βββ AnalyzeSet/ # Set analysis components
β βββ App/ # Main app component
β βββ Manual/ # Manual entry components
β βββ Settings/ # Settings and preferences
β βββ Workout/ # Workout-related components
βββ Configuration files # Vite, TypeScript, Tailwind configs
Storybook is used for isolated component development. Each component has corresponding .stories.tsx files:
npm run dev # Start StorybookBluetooth device configuration is handled in services/device/. Modify connection parameters in:
services/device/index.ts- Main device serviceservices/device/cables.ts- Cable resistance parsingservices/device/mode.ts- Training mode configuration
Under the "Manual" tab at the bottom you have a playground that gives raw access to the 3 commands that control the Trainer. You can use these to test new modes and such.
![]() |
![]() |
![]() |
|---|
Contributions welcome! Please follow these steps:
-
Fork the repository
-
Create a feature branch
git checkout -b feature/your-feature-name
-
Make your changes
- Follow the existing code style
- Add tests if applicable
- Update documentation as needed
-
Test your changes
npm run build # Ensure it builds npm run dev # Test in Storybook
-
Commit your changes
git commit -m "feat: add your feature description" -
Push to your fork
git push origin feature/your-feature-name
-
Create a Pull Request







