The joy of making small tools

How I rediscovered the joy in solving small problems.

The joy of making small tools
Seems like a good opportunity to show off my new split ortholinear low profile keyboard, the Unicorne LP.

It has been two years since I graduated and worked full-time. Since then, I’ve split my hours in the day between writing code and doing 'glue work' to move the needle on projects at the office. I gained new hobbies, developed deeper social relationships, and found other areas of my life to advance in. Still, being an engineer, solving problems has always been a big part of my identity.

Old man yells at cloud

It is very taxing to work on big personal projects after hours. Which framework to use, how to secure the endpoints, how to scale that side project with zero users. On the other hand, ever since I bought my NAS two years ago, it opened up a whole can of worms with small annoyances to solve. That was the sweet spot. Just a whole lot of small problems, I don't need to make big sweeping decisions that involves a bunch of scaffolding, just one small focused tiny annoyance at a time.

Here is a list of them in my homelab setup.

  • Changedetection doesn't run on a fixed schedule? I just want it to run at 4pm daily. I don't want a range, I want a cron.
  • Linkding has no lifecycle mechanism to delete links (nor do I think it should have one built-in).
  • I have to litter authentication tokens for all my services wherever they are consumed.
  • Most services expose a RESTful interface. It’s amazing that I can programmatically interact with them, but I strongly prefer a GET interface for personal use that I can interact with it via simple links sent through a Telegram bot or through an HTTP 302 redirect (my homelab runs entirely on Tailscale, the endpoints are protected by the VPN's encryption and ACLs).

Solving problems I gave myself

The keen-eye among you might notice an obvious and straightforward homelab solution right away. Just deploy a secrets manager, an auth service, put the two behind a gateway, and run k8s before writing a bunch of serverless functions to automate things. So easy, we do it all the time at work. Yea, obviously I am not going to do all of that. But the facade pattern seems like it could make waves here.

In 2021, I briefly wrote about a graphical automation tool with lots of cool integrations. Today, n8n helps me run a large part of my homelab. I also used it to make a series of small tools that make me much happier. I used it to glue webhooks, Telegram, Redis, MeTube, Changedetection, and other services together. I made n8n flows for

  • sending Telegram alerts via a bot via GET requests over Tailscale with URL query params.
  • downloading videos over MeTube via GET requests.
  • setting cron schedules for reading RSS feeds and sending me news over Telegram.
  • adding links to Linkding via GET requests and setting cron schedules to delete read links.

"Writing" "programs"

I made n8n workflows instead of coding small programs. And I liked it.

One that takes the query param of a GET, checks against a list of links in Redis and does a HTTP 302 redirect, effectively acting as a URL manager. Integrating that with Raycast's Quicklinks and Apple Shortcuts means I can have this redirection program on any device. Since its hosted on my homelab, it is 100% platform-agnostic (as long as the platform supports HTTP redirects, so if you want to open links on your iPod Nano, you are out of luck). Another one that reads a Reddit post and saves the content as a markdown file in a self-hosted MinIO container, before rendering it out as HTML content at another endpoint when called upon.

I like this process.

Since n8n is very mostly graphical, I don't need to do a bunch of scaffolding and be distracted by tactical decisions for hours before I can even start addressing my annoyance. I can implement changes visually and test them in seconds, not minutes. I can create inputs of various formats (forms, cron, webhooks) and glue them with services of all sorts (MinIO, Redis, webhooks).

This workflow is making me fall in love with solving problems again. I can address things quickly with little effort, at small iterations at a time. I started using MeTube through the web form.

Over time, I made a n8n flow to accept GET requests and used AppleShortcuts and Raycast Quicklinks to interact with it. After two weeks of tweaking, that workflow now includes a Redis list that acts as a downloaded queue that gets downloaded hourly (the goal is to prevent instant gratification). I can do that with a lambda function, yes, but that would involve multiple tools that are largely decoupled and require a lot of focus to tweak it once every few days.

Fin

I've always liked solving small problems. Running n8n on my Synology NAS helped me rediscover it, and maybe it will help you discover some joy too.