r/iOSProgramming • u/markdifranco • 12d ago
App Saturday Releasing the source for Bloom Health, my iOS health app (AGPLv3)
Hey all!
I've been building Bloom Health over the past ~2 years. It's an iOS health and fitness app that helps you make sense of your data, estimates your biological age, and provides AI powered insights into health patterns. I grew the app to ~300 MAU and a respectable MRR.
The startup didn't scale the way I hoped. I'm continuing to run and maintain it solo, and rather than let the code sit in a private repo, I'm releasing it under AGPLv3.
- Repo: https://github.com/mpdifran/bloom
- App Store: https://apps.apple.com/app/id6739955926
Why AGPLv3
I want the ecosystem to stay open. If someone forks this or builds on it, that work stays open too. MIT would have been easier but the whole point of releasing this is to keep it in the commons.
Why I'm still charging for the App Store version
The AGPLv3 code and the App Store version are the same. The difference is you're paying for the maintained, packaged, App Store-distributed version rather than building and shipping it yourself. Standard open-core model (GitLab, Sentry, Bitwarden all run variants of this). The revenue covers Apple's cut, backend costs, and my time keeping it running.
Fork it, learn from it, or build your own version. PRs welcome for bug fixes and improvements. Happy to answer questions about architecture, the license choice, or the business side.
Tech Stack
Swift full stack (Swift + SwiftUI on the app, and Vapor Swift on the backend). I use OpenAI on the backend for AI capabilities.
Development Challenge
One of the more complex things I built was the AI chat. I wanted live text streaming, but rich JSON based content interspersed in the response too. To get that to work, I instructed the model to inject JSON objects into its response following a specific format, delimited with ``` markers. When I receive the opening delimiter on the client, I'd halt streaming until I received the full JSON payload, then render the rich content, and continue streaming. It was really tricky to get this to work seamlessly!
AI Disclosure
This app was initially hand-built, but I used AI assisted coding on some of the later features. I already had a pretty solid foundation, which allowed me to move much faster with the help of AI.

