Golang

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

postgresql-mcp: a read-only PostgreSQL bridge for Claude Code

An MCP server that lets Claude Code inspect schemas, run SELECT queries, and explain plans against your PostgreSQL databases — safely

A surprising amount of debugging boils down to “let me check the database.” Schema lookups, sample row counts, “is this index actually being used,” EXPLAIN plans. None of that is hard to do in psql, but pulling Claude Code into the loop means copy-pasting schemas and query results back and forth, which gets old.

postgresql-mcp is an MCP server that gives Claude Code direct, read-only access to PostgreSQL. Claude does the inspection, you keep the conversation flowing.

Tools AI postgresql mcp claude-code

pplx: a CLI (and MCP server) for Perplexity AI

An unofficial command-line client for the Perplexity API — query, chat, profile-driven config, shell completions, and a built-in MCP server for Claude Code.

I maintain a Go library for the Perplexity API (perplexity-go). Once it existed, it was almost a sin not to wrap it in a CLI. So pplx is what I reach for when I want a cited, web-aware answer from the shell — and now also a Model Context Protocol server I plug into Claude Code.

Tools AI perplexity ai cli

retry: a tiny CLI for the things that almost always work

A Go CLI (and library) for retrying flaky commands with fixed delays or exponential backoff

There’s a category of bash one-liners I keep rewriting: “run this thing, and if it fails, try again a few times with a delay.” curl against a service that’s still booting. A kubectl rollout status that flickers. A flaky integration test. A docker pull from a registry having a bad five seconds.

You can write the loop yourself in five lines of bash. I’ve done it hundreds of times. But I always forget the exit code handling, the sleep arithmetic, the cap on retries. So I wrote retry — a single binary that does exactly this, with proper exponential backoff if you want it.

Tools golang cli devops

RunRun: a small web UI for running shell commands on a server

A self-hostable Go web app that schedules, executes and live-streams the output of shell tasks — with auth, CSRF and rate limiting baked in

I have a recurring problem: I want to give someone (sometimes future-me) a button to push that runs a specific shell command on a server. A backup, a deployment dry-run, a cache flush, a database snapshot. Cron isn’t quite right because the trigger isn’t time-based. SSH is fine but assumes the person has SSH and remembers the exact command. A bespoke Flask app is too much yak-shaving.

RunRun is my attempt at the smallest reasonable thing that fills that gap: a Go web app where you declare tasks in YAML, log in, click “run”, and watch the output stream live in your browser.

Tools golang automation self-hosted