Skip to main content

Command Palette

Search for a command to run...

My side project: 8 years in production, €13M invoiced

Updated

In early 2017, I launched a side project called Siikli. It’s a simple, mission-critical ERP that has been used to invoice over €13M. (To clarify: That figure is the amount invoiced by my users, not my revenue.)

How it started

In 2016, a friend asked for my help with invoicing. They were invoicing manually using Excel and wanted me to improve their Excel setup. I suggested dropping Excel and built a small ERP prototype for orders and invoices. It was enough to convince them that this was the right approach.

Soon, a lot of new feature requests and ideas started to accumulate. I insisted that they start using the application in their daily work to clarify what they actually need to complete the full end-to-end process — and only after that we’ll look at other ideas.

I launched Siikli in early 2017. We quickly realized we were missing some core functionality and a lot of the nice-to-haves were eventually forgotten.

Siikli order listing view. It also allows bulk printing of waybills (kuormakirjat).

Siikli order listing view. Used to manage orders and bulk-print waybills (kuormakirjat).

Reliability learned on a Saturday morning

One Saturday morning in 2017, I woke up to multiple WhatsApp messages: Siikli was down and it was blocking their shipments since there was no way to print waybills for truck deliveries.

I quickly noticed that Tomcat had crashed. No logs, no errors, it just wasn’t running anymore. I restarted it, and they were able to continue deliveries. Clearly, I never wanted to start my Saturday like that anymore. I added a cron job that checked every five minutes that Tomcat was still running and restarted it if needed.

A few months later, I received similar messages again: This time MySQL had crashed. I added a similar script for it.

After two stressful situations, I really started to prioritize reliability. I changed daily backups to hourly backups and started copying them to two different countries. I added a notification emails if the application stopped responding.

As the system became more critical, I started to become more and more worried about security. I limited SSH access to my own IP and started hiding version numbers. I got worried about the access logs showing huge amount of crawlers looking for .env files and other vulnerabilities, so I added a firewall to only allow traffic from Finland.

These were pretty basic things, but improved the quality of my sleep.

Ownership when you’re the solo dev

I already felt that I had been taking a lot of ownership at my day work, but Siikli felt different.

When something failed, there was no one else to blame. I realized how easy it would’ve been to blame someone else for forcing me to rush to keep a deadline, which led to mistakes. No, all mistakes were mine.

What would I do differently

Siikli never became a major success. The mental overhead of maintaining a mission-critical application as a solo dev has been too taxing compared to the income I’ve made. The security, backups and reliability were all bigger headaches than I had anticipated. Even though I’ve not done any coding for Siikli in 3 years, I feel the stress is like a sub-process somewhere in my brain, taking 1-2 % of mental capacity.

After 8 years, I’m now considering either growing the app or discontinuing it. Even discontinuing an app is not easy when your users rely on it.