Bohemian Gym
Summary
Bohemian Gym is a training app for athletes and gyms. Athletes build their own routines, and the app conducts the session itself (combat rounds, an audio-ducked rest bell, session recovery, retroactive RPE) and turns the history into progressive-overload recommendations. Gyms get white-label builds, custom roles and a coach-athlete workflow. It ships as 5 Flutter flavors (athlete, trainer, manager, consumer, console) over a shared offline-first core, backed by a NestJS 11 + MongoDB API with a Gemini assistant.
Highlights
App-conducted workout sessionsReal-time session execution as the product moat vs Excel-with-UI competitors
Differentiates Bohemian Gym from log-after-the-fact competitors (Strong, Hevy, Jefit) by conducting the workout session itself: combat rounds with rest timer, background bell with audio ducking, and PendingSet model for in-progress tracking.
No data lost on interruptionZero-data-loss continuity on phone interrupt, background or crash
Recovers interrupted training sessions through cubit snapshot and restoreFromSnapshot, so an interrupted session does not lose data and the user can pick up where they left off.
Five flavors, white-label per gym5 flavors from 1 codebase with per-gym white-label builds
Serves 5 flavors (athlete, trainer, manager, consumer and console) from one Flutter monorepo, with white-label builds per gym (gym slug mapped to applicationId / bundle id) and custom roles each gym defines through role bindings and app audiences.
Coach-athlete invite workflowCoach-athlete workflow shipped on invite codes
Enables coach-athlete collaboration through invite codes and assignment flow (accept, reject, revoke, pending), routine assignment dashboard, and shared gym exercise and system library.
Hardened auth and syncProduction-grade security and offline-resilient sync v2
Hardens authentication and data sync for production through client-side password hashing, refresh rotation with reuse detection, snapshot backup, drift detection, and conflict-resolution UI.
Hardened in-app AI assistantHardened in-product AI assistant with verified 0% attack success rate
Embeds an in-app AI assistant on Gemini (Assistant v2) with polymorphic chat, budget controls, and prompt-injection hardening across 7 defense layers (0% ASR on Spikee benchmark baseline).
Progressive-overload engineProgressive-overload engine differentiates from logging-only apps
Drives real strength progress through progressive-overload intelligence: tracks lift metrics across sessions and recommends weight / rep adjustments based on volume and intensity history, instead of leaving the athlete to guess.
NestJS 11 API on MongoDB13 feature modules, 45 spec files with about 470 Jest cases, plus integration tests on Supertest and mongodb-memory-server
Built the NestJS 11 + MongoDB (Mongoose) API: JWT and Google sign-in, throttling, Swagger, OpenTelemetry tracing, and a Gemini assistant that streams over SSE with fallback models and a token budget. It deploys as a Docker image to bohemian.accentio.dev through Statio, my own deploy tool.
Marionette across all five flavorsAn MCP agent drives all 5 flavors in debug builds
Wired a Marionette binding into debug builds of all 5 flavors, tree-shaken from release, plus a config that teaches the driver the design-system components, so an MCP agent reads each button's label instead of an empty node.
Code guide locked by tests20 architecture guard tests run with the suite
Wrote the project's code guide (a 2,300-line CLAUDE.md) and locked it with 20 architecture tests, such as design-system import purity and the console import graph.
CI to Firebase App DistributionAbout 1,360 Flutter test cases across 158 files
Ships the app through GitHub Actions and Fastlane to Firebase App Distribution, with the signing key pulled from GCP Secret Manager over OIDC and the APK signer checked in the pipeline.