Background: As you may have seen, I built myself a goal-setting, planning and execution app that helps me to consistently, every day, work towards my dreams. After reading several motivational books, they usually would boil down to the advice to “Set a goal, make a plan and make progress every single day.” I think that’s solid advice.
With that in mind, I tried to follow this advice but I couldn’t find a tool that would allow me to do it all in one place. I tried every task manager and todo list out there, but none allowed me to (inclusively)
- Set high-level goals
- Plan, break down and prioritize those goals into tiny, bite-sized tasks and
- Execute on a simple todo list that’s auto-generated based on my planning, break down and prioritization
For years, I had tried to represent this flow with apps like Evernote and Google Docs (for writing down my goals), Omni Outliner (for breaking down and prioritizing the tasks needed) and Trello (for keeping an active backlog that I could work off of.) But nothing was integrated.
So, two months ago, I knew exactly what I wanted and built a simple Rails web app that gave me that flow. The app itself worked but it wasn’t particularly well-built. My biggest question, the reason I built it, was “Will this actually help me be more motivated and productive?”
I started to use my app for 6 weeks. It did precisely what I wanted it to and I concluded two weeks ago, that this wasn’t just a nice idea but a valuable tool.
Now, as I had added new goals and broken them down into easy, 5-minute tasks, my database had grown to 300+ nested tasks.
That’s when the app got slow. To the point where I couldn’t use it anymore without feeling frustrated again. (Because to me, Flow is everything.)
I figured this is the right time to throw away the prototype and start building a “real” piece of production software that has:
- Complete feature-parity and look-and-feel to the prototype
- Full automated test-coverage for all features
- A significant speed-up even with hundreds or thousands of sub-tasks
The list of features from the prototype became my backlog so it would be the "same app” overall. Since the prototype had gone through several iterations already, I knew exactly what I wanted.

I decided to write feature-level automated tests because I think they’re the highest level of quality assurance that makes sense at this stage (I still might throw the app out if it doesn’t work for me down the line.)

To give you a sense, here is the ‘Completing a task’ feature-test story in prose and then in code:
- Given I am on the execute tab
- And I have an un-started task
- When I click start
- Then I see the button complete
...becomes..

I experimented with different performance improvements and landed on storing the “task tree” (the slowest piece in the prototype) directly in the database, as a binary object using Ruby’s Marshal.load and Marshal.dump. Here is an example of what I’m talking about.

Overall the development experience has been great. I use strict outside-in TDD/BDD, where I
- Write the test based on the “Given, When, Then” prose from the backlog.
- Run the test and see it fail
- Fix exactly the reason the test failed
- Rinse and repeat until the feature is done and the test passes
Anyways, after a few evenings, the app has now MVP/prototype feature-parity and I’m using it every day. It’s fast. It’s a bit nicer now and maintainable because of the tests.