Cli

gocrypt: a tiny AES-GCM file encryption CLI

A small Go command-line tool to encrypt and decrypt files with AES-128 or AES-256 in GCM mode

Sometimes you just need to encrypt a file. Not set up a key management system, not learn the gpg command line again, not pull a heavy dependency — just turn secrets.txt into secrets.bin with a key you control. That’s the niche gocrypt fills for me.

Tools golang encryption aes

httping-go: ping, but for HTTP endpoints

A tiny Go CLI that hits a URL on a loop and prints status code, response time and size — the HTTP equivalent of ping

When a service starts misbehaving, my first reflex is ping. It tells me almost instantly whether the box is up, whether latency is sane, and whether anything weird is going on at the network layer. The trouble is that for HTTP services, ping answers the wrong question. The host can answer ICMP just fine while the application returns 502s every other second.

httping-go is my Go take on the classic httping idea: a tiny CLI that hits a URL on a loop and prints status code, latency and response size. It’s the tool I reach for when I want a quick, continuous feel for how an HTTP endpoint is behaving.

Tools golang http monitoring

jwt-cli: encode and decode JWTs without a browser tab

A small Go CLI to encode, decode and inspect JWT tokens with HMAC, RSA and ECDSA signing

Every time I needed to inspect a JWT, I ended up doing the same thing: paste it into a website I half-trust, squint at the payload, then close the tab feeling vaguely guilty. I wanted a local tool, scriptable, that could both decode tokens and mint them for testing. So I wrote jwt-cli.

Tools golang jwt cli

logwrap: prefix any command's output with timestamps and log levels

A Go wrapper that intercepts stdout/stderr in real time and decorates each line with timestamps, levels, user, and PID

I have a recurring frustration: I run a script in CI, it produces output, something fails, and I have no idea when any of it happened. Did the failure come 200ms after start or two minutes in? Was it stdout or stderr? It’s the difference between “took a minute to figure out” and “took half an hour.”

The fix is to prefix every line with a timestamp. Easy in theory, annoying in practice — especially if you want the prefix to differ between stdout and stderr, or if you want UTC, or colors, or to drop the prefix in production. So I wrote logwrap: a small Go binary you put in front of any command and it adds a configurable prefix to every line, in real time, without buffering.

Tools golang cli logging

mdtohtml: Markdown to HTML with a GitHub-style skin

A Go CLI and library to render Markdown to standalone HTML with GitHub-flavoured styling, batch mode and validation

I write a lot of Markdown — for this blog, for READMEs, for one-off docs that need to be emailed as a single self-contained HTML file. Pandoc is overkill. gh markdown-preview requires a network round-trip. Most lightweight converters either don’t do GitHub-flavoured Markdown properly or render output that looks like 2003. So I wrote mdtohtml.

Tools golang markdown cli