How I write software

In this post I am collecting techniques, languages, and tools that I use to write and maintain software


My dotfiles are open source.

For version control I default to using Git, GitHub or Gitea (when I need to self-host, eg airgap).

GNU Bash is my shell, Starship is my prompt, tmux is my terminal multiplexer.

Vim is my editor.

I use Secretive for storing SSH keys when using Mac OS, otherwise I use YubiKeys.


The standard library is excellent and makes it easy to write programs and applications without many dependencies. The built in profiling tools are excellent.

When writing tests, I reach for ginkgo, gomega, and httpmock.

gopacket is an excellent library for network programming.

I don’t use a debugger as much as I should, when I do it is delve.


I use Ruby for writing tests (eg for infrastructure configuration) and small automation scripts.

RSpec and friends for writing tests.

Mechanize for automating web interactions.

For simple web applications it is difficult to beat rack-test and sinatra.


curl is always useful, I’ve also written my own HTTP waterfall profiler.

In addition to the usual suspects: dig, ss, netstat, ping, traceroute, tcpdump; mtr is especially useful.

socat is an extremely versatile tool.


Grafana and Prometheus is what I use for everything metrics related: networks, applications, VMs, my bank account, democracy, and the weather.

I use kubernetes for my personal cloud and for my homelab.

Concourse is the CI/CD tool with which I am most familiar, and is the automation system which I use personally.

I use Cloudflare for DNS and Cloudflare workers for a few projects.


I use a MacBook Air (M1) as my daily driver with Mac OS X. My Thinkpad X220 runs Arch and Void. My Linux development VMs run Ubuntu.