Seven months of early mornings for a tool that watches dates
It was Saturday. I distinctly remember. I was still knackered when I woke up. It shouldn’t have surprised me, really. I had been pulling overtime entire week. Again. As I usually do, I checked my side project apps before the kids were up in the morning. And what do you know?! One was unreachable. Turns out I had forgotten to enable “automatically extend Let’s Encrypt certificate” option for one of my apps and certificate silently expired.
That is the thing about certificates. They expire silently without any warning. Something just breaks. Preferably crucial and in production. And then you are on the frenzy to find out what went wrong.
I normally use calendars for this. But calendars have a habit of notifying you, when you are out and about with your family. And when you mark that notification as read? Gone. For good.
I needed and wanted something better. Something that would send an email or a slack message. Something that sticks. Not just a notification to my phone.
So, I built CertWatch. And unlike what you expect, this isn’t a post about TLS or certification expiry. Nope. This is a post about how “Pffft, I can do this in a month” turned into seven months of early morning hacking, while having full-time job and handling family life to get to “closed beta”.
The beginning
Idea for the app is simple enough, to make me believe that it could be done easily and quickly. A user would just enter a URL and application would obtain public key from certificate and store it. Then, when it expired or changed, a user would get notified about it via e-mail. It was March. I was sure, I can get it done by end of June. Easy, peasy. As long as I didn’t procrastinate.
There were just a few constraints. Full time job, family and about an hour of spare time to actually make something. The app had to be in .NET 10 using Microsoft MVC. And since I am hosting everything on a shared hosting, I had to use an embedded database.
I decided to use AI, but not for coding. Instead, I would use it as a personal fan club: tracking my progress, kicking my butt when I procrastinate and telling me I was the best in the world in between (obviously). Also, I use AI to learn marketing, because I really really suck at it. It worked. Most of the time.
The first month went on basics, like idea validation, database model and setting up basic application. The easiest was database model. I already knew what embedded database to pick (SQLite d’oh). Idea validation took time and a lot of reading. I also managed to find a few users interested in my non-existent app. Also, I created a very basic web site and published it.
Unsurprisingly, setting up the basic app took most of the time. Version 1.0 was a simple, single-user app that notified me when certificate expired. I had to enter certificate manually and directly into the database. But at least I had a script I could use to create a version.
I also did light Twitter marketing that yield about a hundred views in total and 0 traction. LinkedIn was a tad better and got a few people on my wait list.
The work continues
Encouraged by LinkedIn success, I spent April and May making sure CertWatch supports multiple users. I also created option to enter and view APIs being monitored. Still no login, though. But at least the app displayed errors nicely.
In June, work and family life kicked in and time got sparse. In first half of the month, I only managed to do some maintenance work on the part that handled expiration notifications and cleaned up the code. Thankfully, things changed and by the end of the month, I finished Login page. It took database model changes and a lot of elbow grease to finish. The app could login users now. I had no way to add them except by inserting them into the database by hand.
And this was Version 1.01.
July was spent on vacation, family and work. and the app lay forgotten until month of August. It was time to focus on user security features. Since I was entering users by hand, the app desperately needed a password change option. And I also had to redo the entire navigation, since navigation up till now had only been “Logout”. And that was basically it for August and Version 1.02.
The only thing left, was to give wait-listed users access and contact them. I assembled a nice email, sent it over and… none of them even tried to log in.
I spent zero time on marketing, which in hindsight was not the best idea. I did manage to convince a good friend to try it out for his own projects. So, my app now had two users, including me.
First bugs and improvements
Encouraged by getting one other soul on board, I started September strong. First, I needed to fix bugs and two of them were nasty. One was related to displaying error when trying to log in with invalid password. In production environment, the login error did not show. Users got 404 error instead. It ended up being a stupid redirect mistake, but it took time to find.
The other bug was related to storing certificate expiration dates in local time instead of UTC. A rookie mistake that took way too much time to fix. Version 1.10 was ready by mid September.
After that, my focus shifted to improve UX. Until now, users had to enter URLs with “https://” in front of them. This was unnecessary, as you cannot check a certificate over http. So, I removed that.
I also added sorting for entered URLs and a page showing certificate details including public key download. I am proud of that.
For once I at least pretended to do some marketing and for Version 1.11 that was released by the end of September, I also added a screenshot of the app to app’s web page and did minor tweaks to subtitle and call to action button. I pinged LinkedIn wait-listed people again and was met by a wall of silence.
User registration
The app still had no self-registration. And this is exactly what I have been working on in October. But, since I don’t want any odd spammer to gain access, I decided registration should require a promotion code. Which filled my to-do list. It is surprising how much time and energy a simple thing like promotion code generator and consumption takes.
But, come October 16th, Version 1.12 was released and users can finally register for themselves. Provided they somehow obtain a promotion code.
If you want to try it…
CertWatch is a quiet little tool for a quiet little problem: certificates that expire whether or not you remember to check.
If you run services, a side project, a company, anything with an HTTPS endpoint, I have a small number of closed-beta codes. Each one lets you set up an account, add your interfaces, and get notified before anything expires. Go to link below and click “Request access” button. No matter what the page says, you don’t have to pay to be a closed-beta user.
