Inspiration
Most gym trackers fall into two camps: a plain logbook that leaves the math to you, or a polished app that wants an account, shows ads, and sends your training data to a server. We wanted a tracker that makes progression decisions for you, makes progress feel earned, and never sends your data off your phone.
Kyū (級) is the grading system used in Japanese martial arts. Kyulift brings that idea to strength training, letting you climb the ranks by lifting.
What it does
Kyulift is an Android gym tracker built around three ideas:
- Automatic progressive overload. Hit your target reps and the next session adds weight, whether that's the next dumbbell, an extra plate, or 2.5 kg on the bar. Extra reps can trigger a bigger jump, while repeated misses ease the load. Every target comes with an explanation, and deload weeks never shift your targets.
- Ranks from F to S. Bench press, squat, deadlift, overhead press, and row are evaluated against your bodyweight using published strength standards. A lift only counts after being demonstrated on two separate days, and every rank takes weeks of real training to earn. Ranks never drop.
- Privacy by design. No account, no ads, and no tracking. The Android INTERNET permission is removed entirely, keeping your training data on your phone. JSON backups and CSV exports are built in.
Beyond the core features, Kyulift includes previous-session numbers for every set, rest timers with lock-screen countdowns, supersets, 115+ exercises with step-by-step instructions, a workout generator, 1RM and plate calculators, personal records, 12-week charts, a muscle-balance radar, body measurements, a home-screen widget, and an AMRAP/EMOM/Tabata timer.
How we built it
- Native Android development with Kotlin, Jetpack Compose, and Material 3.
- Room (SQLite) for local data storage, with versioned schemas and testable migrations.
- WorkManager for reminders and Health Connect as an optional way to save workouts and sync bodyweight.
- Google Play Billing for the one-time Pro unlock, with a seven-day trial that survives reinstall through Block Store.
- Progression and rank rules implemented in plain Kotlin, validated against published strength standards from StrengthLevel and Kilgore/Rippetoe, and covered by unit tests.
Challenges we ran into
- Keeping the app fully offline. Google Play Billing introduces a telemetry dependency that can add the Android INTERNET permission. We remove that permission from the final app manifest and route billing through the Play Store app.
- Making ranks feel fair. One lucky set shouldn't earn a rank. Requiring successful demonstrations on two separate days and weeks of training took several rounds of tuning. Ranks also never decay, so achievements remain meaningful.
- Making progression explainable. Automatic weight changes only build trust when users understand the reasoning. We had to account for deloads, failed sets, available bar weights, and other training edge cases.
Accomplishments we're proud of
- A real strength-training app live on Google Play with no accounts or backend servers.
- An automatic progression system and rank framework that explain their decisions instead of behaving like a black box.
- Privacy enforced through architecture rather than relying solely on a policy page.
- A complete training experience built by a solo developer, from biomechanics research and Kotlin engineering to product design.
What we learned
Motivation is the real retention problem in fitness apps. A chart might show improvement, but a rank you worked hard to earn gives that progress meaning. We also learned that removing capabilities such as accounts, network access, and ads can be a stronger product decision than endlessly adding features.
What's next
- An optional web-based AI Coach that generates personalized plans and transfers them to the phone through QR codes or deep links, keeping the native app offline.
- More rank tracks and a more capable Rank Coach.
- iOS expansion if user demand justifies it.
Top comments (3)
Removing the INTERNET permission is a privacy claim anyone can check, which beats a policy page. And the note about the billing library's telemetry pulling that permission back in is a good catch most people would miss.
Two things about ranks, since they never drop:
The two-separate-days rule is a good answer to the lucky set.
Thanks, glad the INTERNET point landed. On bodyweight: Health Connect weights go to the body log only and never feed ranks. Rank bodyweight is what the user enters, and each workout keeps the weight from its own day, so a bad entry only skews nearby workouts. I only range-check it, though, with no median or outlier check. Because ranks never drop, I'm looking at adding one. Sex is asked and uses separate tables. Age isn't asked, so there's no age adjustment.
Thanks, that answers it: keeping Health Connect out of ranks removes the risky path. For the outlier check, asking beats filtering. If an entry is more than, say, 10% off the last one, show "Did you mean 72 kg?" before saving instead of dropping it silently. And since ranks never drop, letting a corrected weight re-run the rank for that day would undo a typo that already got through.