Full-stack · Backend · Mobile
Easy Gym
A full-stack fitness product built solo, end-to-end — Android app, Spring Boot API, and marketing site.
published · Android
Live on Google Play.
Overview
Easy Gym is a fitness app I conceived, designed, built, and published on Google Play — but the app is only the visible tip of it. Behind the scenes I built and operate the entire product as a one-person team: a native Android client, a Spring Boot backend, and a marketing site. It's the clearest single proof that I can own a product from the database all the way to the store listing.
Demo
The app in action:
What I built
- Android app — Kotlin, Jetpack Compose (Material 3), offline-first.
- Backend API — Java 25, Spring Boot 4, Spring Modulith, JDBI, PostgreSQL, Dockerized and self-hosted on a VPS.
- Marketing site — a static Astro site at easygym.fitness.
Technical highlights
Offline-first mobile architecture
The app treats a local Room database as the single source of truth. The UI reads
only from the database via reactive Flow queries, so screens stay instant and fully
functional offline. A dedicated sync layer (Retrofit + WorkManager) pushes local changes and
pulls server updates in the background, with caching rules that fetch from the API only when the
local copy is missing or stale.
Modular backend
The API is organized with Spring Modulith to keep clear boundaries between modules, uses JDBI over a PostgreSQL schema isolated from other apps sharing the database, and runs from Docker on a VPS — with Flyway migrations and an OpenAPI/Swagger spec the mobile client is built against.
End-to-end ownership
Beyond code, I handled the things that make a product real: the Play Store release pipeline, signed release builds, store assets and screenshots, the domain and DNS, and the production deployment. Shipping solo forced deliberate scope and architecture decisions at every layer.
Outcome
Easy Gym is live on Google Play, backed by a running API and a public marketing site — a complete, maintained product rather than a prototype.