Routinie: shutting down and opening its source code

Sometimes things just don’t go according to plan. While I can say the same about the last ~7 months of my life, in this particular post I want to be very specific and talk about the product called Routinie, which I launched in January, 2022.

The story is as simple as it gets: the effort was not worth it. I got three paying clients, and that was clearly not enough to keep the project going. In addition, I didn't feel motivated enough to focus on it, and that's one of the most important factors that made me close Routinie. In fact, it's been shut down for a while now, so take this as a delayed announcement.

But I don't want it to disappear, and I think it might be useful for some programmers, especially for beginners. It’s not very complicated, yet it has some parts that some of you might find interesting — for example, how it uses the Redux Toolkit, how the trackers work, how Routinie decides that the tracker is “fulfilled”, and how logging and instrumenting work on the backend side. That's why I decided to open its source code — here is the backend and here is the frontend.

Here is what I think might be interesting about this project:

  1. The backend a nice example of a full-featured Golang web app that uses go-chi, Postgres and, contains a bunch of API methods, logging and instumenting, e-mail sender (powered by Sendgrid), session manager, and Stripe integration.
  2. It can also be interesting for those who want to see how to deploy an app like that using Docker and Docker Compose (even though the deployment process is relatively simple and straightforward in this particular case).
  3. The streak detection mechanism and the SQL queries to detect streaks can be interesting for everybody doing something like that in their apps (see pkg/db/trackers.go)
  4. The frontend a nice example of a TypeScript app that uses Redux Toolkit (which still seems to be not very popular in 2022).
  5. I'm personally proud of my custom component for the context menu, which does proper positioning and allows for deep customization.
  6. The code for trackers and tracker events (including streak detection, "fulfillment" and all the related concepts) is also pretty nice. It is also covered by tests (check tests/utils/trackers.test.ts).

Routinie was a good exercise for me, now I want it to be a good source of knowledge for everyone. All the code is available under the MIT license, which means you must retain copyright and license notices when using it in your project or as part of your project.

Have fun exploring!

September 20, 2022