I made a simple meditation app with Flutter in ONE WEEK
By: Jethro Lorenzo Garcia Lising
Tags: Software Engineering, Meditation, Software Development, Flutter, Dart

Photo by John King on Unsplash

I was just looking for a clean implementation of a meditation app. I just want something that would get me to meditating as fast as I can.

I don’t want to sign up or be offered a subscription or a paid course, or to even hear a guide. The most popular one like Headspace, and Calm had IAPs and probably some sort of analytics (to keep the shareholders informed! Results have to be measured somehow!).

I really just wanted a simple meditation app that got to the point as fast and as beautiful as possible.

So I made my own app: justBreathe

It’s simple a meditation timer. You determine how long the session is; if you want a ticking timer or a beautiful animation; and if you want to hear a gong at the beginning and end of the session.

This is my gift to the world. If this app helps someone attain clarity, and relaxation, even just one person, then all of the man-hours I’ve put into it would be worth it.

How Flutter enabled my Vision

Flutter really helps developers iterate VERY quickly. Especially for a solo-project, where you literally have the control to create and define your own features, the sky is the limit.

I didn’t need much to get started. I just needed a State Management solution outside of setState (because I needed an easy way to pass and share data between Widgets, without implementing my own InheritedWidget or ScopedModel). I read a few articles on it, like Simple App State Management and Flutter State Management: setState, BLoC, ValueNotifier, Provider. Provider and ChangeNotifier were more than enough for this use-case.

The implementation doesn’t have a clear or strong architecture. I just went with what I knew, which was a typical MVC-U architecture. Well, in this case, Data-Screen-Utils architecture. I separated the domain of data, business logic, and UI. Though there’s much more work to be done in terms of refactoring, getting to an MVP took less than 3 days.

The animations were easy to work with.

Having had experience with Pebble and animations using C language, working with Dart was a breeze and an absolute pleasure. I implemented page Route transitions with the help of some code from @gskinner_team with their article Flutter: Simplify your PageRoutes.

It was easy to add simple animations through the app to make the experience better.

When I finally had my MVP, I began to work on localization. I used the intl package and with the help of Localizely’s Intl extension, (and with the help of my GF and a generous and skilled translator on Reddit), I manage to implement french localizations!

Publishing

I was eager to publish. I just had to follow this article from flutter.dev on how to release an Android App. It was easy to do.

I used fastlane as my CD, but to get to the market fast, I just literally did `flutter build appbundle`. Took screenshots and published to production on Google Play Console.

The review process took 6 days. This means between planning, developing, publishing this app, the publishing review process took longer than the app creation process! Granted it’s a simple MVP, but I just want to emphasize how quick the development process was.

Final Thoughts

Overall, creating a Flutter App allows for the creation of beautiful and performant apps, very quickly. As a one-man team, this project was enjoyable. Flutter really allowed me to express my creativity and fulfill my vision.

I hope to learn more and create more complex apps.

What’s Next?

- More translations (Swedish namely)

- Use Codemagic to build, test, and release to both App Store and Play Store

- Write some tests (before I add updates and new features)

- And add more beautiful animations!

Check it out and I hope you find the way to ultimate happiness!

Source Code — https://github.com/jg-l/justBreathe

Play Store — https://play.google.com/store/apps/details?id=ca.lising.justbreathe

Official website — https://justbreathe.lising.ca/