I built an offline-first lifting tracker to ditch spreadsheets and subscription bloat (Angular 20, Capacitor, Health Connect)

Wait 5 sec.

I started on this project last year but stepped away after setting up the bones and initial UI design. A month or so ago I decided to revisit it when I discovered my brother had been using his phone's notes app to record his workouts. I had been tracking mine in Google Sheets and nearly had a stroke when he showed me what essentially looked like an unformatted CSV. I asked him why he wasn't using a dedicated fitness app, and his reasoning matched mine: too much bloat, mandatory subscriptions, overly restrictive free tiers, and prohibitively expensive lifetime unlocks. I also really disliked the aggressive styling typical of most fitness trackers. So I built Sisyphean, themed around the labour of Sisyphus. I wanted an app that was calm and muted, but functional and fast to use on the gym floor. More importantly, I wanted something practical so my wife, my brother, and I could easily log sessions and share progress. The goal was to build a tool for us first, and then make it available to anyone else looking for the same thing. The frontend is built on Angular 20 with state management handled entirely by Signal stores. I originally picked Angular because we were adopting it at work and I thought it would be a practical way to upskill. What I quickly realised, however, was that I had zero desire to write boilerplate by hand after a full day of development work. I directed the system architecture, data flow, and code structure upfront, and ended up settling on a workflow where I had Claude Code perform planning and implementation details while Gemini reviewed both the plan and code changes. All up, it was roughly 8 weeks of active part-time development: an initial four weeks late last year to lay the foundation and UI structure, followed by a four-week sprint this past month to take it from a prototype to a feature-complete web app and closed Android test. To keep things organised, I used Claude to brainstorm feature requirements and implementation details, breaking the work down into discrete tasks. I tracked everything across GitHub issues and project documentation. Across the past month alone, that workflow saw 196 pull requests raised and 198 issues closed, with 13 still open in the backlog. The biggest bottlenecks weren't the code itself, but infrastructure and tool limits. I have Pro subscriptions for both Claude and Gemini and frequently hit usage caps on both tools. In addition, running automated CI test suites and builds on every pull request quickly burned through my baseline GitHub Actions minutes. That forced an upgrade to GitHub Pro and a dedicated Actions budget buffer just to keep the build and test pipelines unblocked. I built the website first, so I was able to test functionality immediately and ensure device-agnostic compatibility (my brother is on iOS and I use Android). Once I was satisfied with how the app worked, I used Capacitor to build the native Android app so I wouldn't have to manage separate codebases, though I did build a custom Kotlin plugin to interface directly with Google Health Connect. I use Firebase for the backend and hosting, and Cloudflare for DNS. For security, I enabled reCAPTCHA Enterprise to prevent unauthorised API abuse, alongside strict Content Security Policy (CSP) headers to forbid inline scripts and block XSS vectors. A few key design and product decisions: Reasonable resource limits: I set upper bounds on total program and workout counts to prevent payload bloat and avoid database spam (e.g. someone generating thousands of programs). Logged workout history, however, is never capped. Local-only guest mode: This avoids creating throwaway anonymous accounts in Firebase and allows people to try the app without committing any data to the backend. Everything runs client-side in local storage. If someone decides to create an account later, they can choose to start fresh or sync their local guest data. Offline-first: You shouldn't be reliant on a mobile connection to work out in a concrete gym basement. The app works fully offline and syncs automatically once connectivity is re-established. Complete data access and deletion: You can export all your data in JSON format at any time, or hard-delete your sessions and account entirely. Daily backups run automatically, but are purged on a rolling 7-day window. Immutable program sharing: Programs and workouts are copied as separate instances when shared with someone. Warm-ups, rest timers, and rep targets all carry over, but recipients get their own copy that they can freely modify without altering the original. No functional paywalls: While I plan to introduce an optional one-time premium unlock down the track, the core tracking, social feed, and progression tools are completely unrestricted. Smart progressive overload: The app tracks rep streaks across consecutive sessions to prompt weight increases when targets are met. This can be customised per exercise, switched to auto (bumping weights automatically without prompting), or turned off entirely. You can check out the web app and try guest mode here: https://sisyphean.bytomi.dev/ The Android build isn't officially released yet, but the closed test track is open. If you want to try it on Android, join the Google Group first to get access, then follow the Play Store link to download: https://groups.google.com/g/sisyphean-testers/about https://play.google.com/apps/testing/dev.bytomi.sisyfit I haven't started on the native iOS build yet, but iOS users can run the web app and install it directly to their home screen as a PWA. Down the track, I also plan to build dedicated WearOS and Apple Watch companion apps.   submitted by   /u/bytomi_dev [link]   [comments]