Your agents have outgrown plan mode

When factories first got electricity, they did the obvious thing: unbolted the steam engine and bolted a giant electric motor in its place. Same central drive shaft, same belts, same layout. Productivity barely moved for thirty years.

Then someone realized electricity didn’t want to be one big motor–it wanted to be a small motor on every machine. Factories got rebuilt around that idea, and output exploded.

Plan mode is the giant motor bolted where the steam engine used to be.

Continue Reading

Software Tools Round Up 2024

Having had the need to do an OS reinstall or two lately, I’ve taken the opportunity to swap in a number of new tools and retire old tools. Unlike in my younger days when I would devote the time to survey every tool mentioned on Hacker News starting from time immemorial, the only tools that come into my awareness these days are the ones that people made a point to tell me about, or tools I found after getting fed up with a specific pain point and searched the web for a solution. All of which is to say, I’m not exactly Mr. Current Affairs. mad fish willy

Still, maybe you will discover something of use.

Continue Reading

Bash/Shell Substitution Cheat Sheet (Command vs. Process Substitution vs. Redirection etc.)

The premise of Unix is that everything is a file. Such simplicity. Yet somehow when it comes time to write the script to glue everything together, the number of concepts involved explodes:

  1. Pipes (cmd | …)
  2. Redirection (< some.file)
  3. Command substitution ($(cmd))
  4. Process substitution (<(cmd))
  5. Here docs (<<EOF … EOF)
  6. Here strings (<<<foo)

What gives?

Continue Reading

Rolling your own GitOps: DNS Zone files

I like to self-host my own infrastructure. You have full control. You learn a lot. It is also not hard to get started.

Managing your infrastructure though, wow, what a pain. Take DNS. To make a simple DNS record change first I have to edit the zone file, which is manual, but feels technical in a good way, like I am in control. Unfortunately the process only gets more tedious from there. First I commit the change and push it up. Then I SSH into my server and pull down the changes. Then I rebuild the Docker image. Then I kill the running container and start a new container with the new image. Then I SSH into the other server–you always need redundancy with DNS–and repeat the same steps again.

So tedious. Compare all that with a hosted DNS service, where you log into the web interface, tweak the record, and… that’s it.

Maybe there is a way we can have the best of both worlds. GitOps would be a good fit here. Like what if all you had to do was edit the zone file and commit the change, then let every step after that be handled automatically. You know, it probably wouldn’t be that hard…

system diagram

Continue Reading

How to host your transactional email for free

engineer with server

Everyone knows that if you want to send transactional1 email you should use a dedicated service like Twilio Sendgrid, Mailgun,2 or Amazon Simple Email Service (SES). First, they’ll scale. Second, they take care of all the details you’d rather not have to think about. At the other extreme–when you’re launching the proverbial weekend project–you can plug in your Gmail account credentials and call it done.

I am not here to dissuade you from the received wisdom of the internet.

Still, in my contrarian nature3 I feel compelled to point out a middle option: you can run your own MTA (specifically an email relay). It may not be a better option for the typical app, but it offers some advantages4 all the same. This post is not about selling you on self-hosting. What it is about is showing you how much simpler it is to self-host a transactional email server than most people imagine.

Continue Reading