From a developer’s perspective, it is no longer a hello-world testing world anymore. Todos are the new Hello World.
You’re doing groceries and you open the grocery list to find what items to buy and, boom, the list is no longer the last message in your WhatsApp chat thread anymore. Or, you have to scroll past a few messages to find the grocery list because you started another conversation.
Lastly, definitely it is possible to use Google Tasks or another application to create and share the lists, but as a developer you’d rather spend 10 days building something than 10 minutes using something that exists. I definitely chose the path to build something.
Developing the Backend
When I started working on the application’s API, I wanted to use TypeScript. I chose TypeScript for two reasons:
- I wanted to learn TypeScript-based complete app development, testing, deployment, and patching.
- I wanted to add a different tech stack to my belt–no, okay, I lied, I wanted to work with sequelize. It is one of my favorite ORMs (after Entity Framework Core, of course).
I developed the backend layer, which is barely an API that exposes certain actions that you can perform on the system. The API is exposed as a service, meaning, every interaction and action is done as a service; with your account + lists + tasks as the resources in the centre.
The application also has a static HTML page for the homepage. You can visit the website here: https://twodos.app.
The application is hosted on Microsoft Azure, and I am using Azure DevOps to manage the project and the entire software development lifecycle.
Using Flutter for UI development
Once I had the API ready, I tested it on Postman and via command-line based tests to perform user-journey actions. I knew it was time to do the UI. I wanted to give Flutter an opportunity to do the entire app development, cross-platform, and be able to patch and republish when possible and needed. The development went very smooth and I was able to target all major platforms. The objective I had was simple:
- Make the application available on as many platforms as possible.
- Keep the application simple.
- The UI flows should correspond to the services and their features (the actions available).
For this reason, the Flutter was the perfect choice. Even though I have not been able to deploy a Linux version of the application, the other platforms work perfectly fine.
Oh, the iOS app was rejected by the App Store because it was too similar to other applications on the platform.
Flutter made it very simple to write the application as a UI layer for the backend services and communicate when an action was made. I used the following packages to speed up the development:
- Retrofit: handling HTTP interactions with the server.
- Provider: to handle state management.
I did not use Firebase because of a few reasons:
- Firebase is not supported across all the Flutter platforms.
- Analytics is useful, but, let’s be real. It is not supported for Windows, and that would mean either more work or less supported platforms.
I still need to work on the push notification support, but the goal with push notifications is not to handle background messages rather the updates to UI. Here is a quick use case:
- You go to grocery shop and open the list for the grocery items.
- Your partner (with whom the list is shared) updates the list of items in real time.
- You receive the updated list in real-time without having to reload.
- The items you pick up are communicated in real-time with your partner as you “tick” them.

The challenge with Flutter is that it is just a UI-development framework and a platform. It does not support anything complex, and once you start going down that rabbit hole you really see how Flutter lacks the performance–due to its declarative nature.
Roadmap
While the application is not a high priority for me, I definitely want to keep it active. For myself, at least. I would continue to add features and improve features or fix bugs to make the application stable. The goal is to:
- Enable seamless accounts creation.
- Enable push-notifications for in-app updates.
- Allow blocking users or choose to keep your profile private.
- Delete the lists and requests that do not receive interactions.
- Make the app secure by running baseline privacy and vulnerability controls
- Make the app building, testing, validation, screenshots, and deployment automatic via Fastlane.
Finally, not right away but another goal is to make the UI simpler so the interactions happen naturally and give a cross-platform twodos experience.
Download the application
Check out the application on the Play Store. The application is only available on Android for mobile devices, but is available on macOS or Windows platforms.
In the next blog, I will share the next updates as the application grows.
Thank you for reading.

Leave a Reply
You must be logged in to post a comment.