chameth.com posts

Automatically announces new blog posts on https://chameth.com/. Speak to @chameth.com if you want an actual human.

2 followers2 following67 stories

Longform Stories

Monthly Meanderings: May 2026

Another month, another wrap-up post. This is the first one I’ve felt reluctant to write, and I think it’s because I feel like I didn’t really do anything last month. Other than play a lot of World of …

6d ago·1 min read·73 words

Monthly Meanderings: April 2026

It’s apparently been a whole month since the last edition of Monthly Meanderings. Not sure when that happened. This month I’ve been to a LAN party, had an MRI, and have been trying unsuccessfully to g…

May 1·1 min read·72 words

Migrating from GitHub to Forgejo

When Microsoft bought GitHub in 2018 my kneejerk reaction — like so many others — was to start looking for alternatives. For a while I self hosted a Gitea instance but I never totally bought into it: …

Apr 30·1 min read·79 words

The Case of the Unchanging Config

Last week I was attempting to make it so I could share pictures on IRC directly from my client. This sounds simple, but it involves a bouncer that proxies the request to a standalone image hosting ser…

Apr 9·1 min read·58 words

Monthly Meanderings: March 2026

Since last month’s update I’ve been unpleasantly reminded that I’m middle aged, through the medium of a dodgy knee. There’s nothing quite like not being able to stand up without groaning to underscore…

Apr 1·1 min read·66 words

Modern CSS is fun

I’ve been doing a bunch of CSS tweaking recently, and keep being surprised by how nice modern CSS is to work with. As someone grey-haired enough to remember writing HTML without CSS, it’s amazing to t…

Mar 17·1 min read·72 words

The longest way to represent a date

The other day, someone on IRC posed this question: “What is the longest way to represent a date using any means possible that isn’t just repeated filler?” Some people jumped for writing the date out i…

Mar 14·1 min read·68 words

Monthly Meanderings: February 2026

It doesn’t feel like a whole month has gone past since I wrote the last instalment of Monthly Meanderings, even allowing for how short a month February is. For more context on this series, you can che…

Mar 1·1 min read·76 words

Just a nod

Last month I added a new feature to the bottom of almost all pages on this site: a “nod” button. It’s a bit like the upvote buttons you see on bear blog posts, or the ubiquitous like button you get on…

Feb 11·1 min read·77 words

Monthly Meanderings: January 2026

Welcome to the second edition of my monthly meanderings. For a bit of context, you can check out the introduction to the first edition. Website updates It’s been a pretty busy month for chameth.com. T…

Feb 1·1 min read·73 words

An interesting Tailscale + Docker gotcha

As I’ve written about before, I use Tailscale for a lot of things. I thought I had it set up in a reasonably secure manner, but I recently noticed a problem. I use Tailscale’s ACLs to limit what each …

Jan 29·1 min read·80 words

Surge protectors: marketing vs reality

A while back I went down a deep rabbit hole looking into surge protectors, and what all the different numbers mean, and how that affects things in case of a voltage spike. Then I didn’t really do anyt…

Jan 24·1 min read·79 words

The meaning of life

Now that’s a grandiose title for a blog post! Blame Jeremiah Lee, who selected it as the theme for January’s IndieWeb Carnival. I’ve not taken part in this before, but it’s basically a shared writing …

Jan 18·1 min read·70 words

Monthly Meanderings: December 2025

For a while I’ve been idly thinking about a way to get smaller bits of content onto my website without it being too annoying for me, or too hard to consume. Things like interesting links, small projec…

Jan 1·1 min read·75 words

Exposing game servers over Tailscale

I’ve recently been playing a lot of Factorio with a friend. I’ve been hosting, but my desktop computer is behind far too many layers of NAT, and I can’t be bothered dealing with setting up port forwar…

Dec 7·1 min read·73 words

Securing all the things with 1Password

For many years I’ve been a keen user of Bitwarden. Recently I’ve had a lot of small paper-cut problems. The browser extension was redesigned and just doesn’t quite work how I expect any more. The prom…

Nov 26·1 min read·74 words

Thinking more about backups

Almost a year ago I wrote about how I do backups with Restic and Hetzner. That system has been ticking along well ever since, but recently I had some… thoughts. These backups are all well and good if …

Nov 1·1 min read·73 words

Moving back to a dynamic website

For the past few weeks I’ve been working on converting chameth.com from a static site into a dynamically generated site backed by a database. This is the exact opposite process to one I went through m…

Oct 28·1 min read·75 words

Avoiding the Consequences of Dumb Laws with Tailscale

More and more sites are implementing privacy-invading age checks or just completely blocking the UK thanks to the Online Safety Act. Protecting kids from some content online is certainly a noble goal,…

Sep 30·1 min read·71 words

Further Adventures in Music Organisation

I wrote before about how I’d dropped Spotify in favour of locally stored music, but things have advanced a bit since. I had a few issues: Tauon would occasionally manage to lose its database and along…

Sep 21·1 min read·78 words

Blogging and the Imaginary Quality Bar

Recently I realised that I’ve developed a self-imposed quality bar for blog posts. They need to be a certain length, and have a certain substance to them. They need to be generally useful in some way …

Sep 18·1 min read·75 words

10 Weeks with an Apple Watch 10

Around ten weeks ago I picked up an Apple Watch 10, and have been wearing it almost constantly since. It’s not my first Apple Watch — I had a Series 5 for a bit back in 2020 — but it’s the first time …

Sep 9·1 min read·85 words

Making a font of my handwriting

Recently I’ve been on a small campaign to try to make my personal website more… personal. Little ways to make it obvious it’s mine and personal, not just another piece of the boring corporate dystopia…

Aug 8·1 min read·76 words

Fixing a loud PSU fan without dying

Three months after I built my new computer, it started annoying me. There would occasionally be a noise that sounded like a fan was catching on a cable, but there weren’t any loose cables to be a prob…

Jul 30·1 min read·81 words

Escaping Spotify the hard way

For the longest time I used Spotify for all my music needs. And I listen to a lot of music: sometimes actively, but mostly passively as background noise. I cancelled my premium subscription last Decem…

Jul 25·1 min read·71 words

How tech companies failed to build the Star Trek computer

In most Star Trek series, the ship or station computer is ever-present in the background, waiting to be called on by the main characters. It nearly always does exactly the right thing, and there’s lit…

Jul 16·1 min read·58 words

Finding an awkward bug with Claude Code

I recently encountered a bug in one of my projects that I couldn’t immediately figure out. It was an issue in Centauri, my reverse proxy. After its config was updated, I noticed it stopped serving res…

Jun 30·1 min read·74 words

How I use Tailscale

I’ve been using Tailscale for around four years to connect my disparate devices, servers and apps together. I wanted to talk a bit about how I use it, some cool features you might not know about, and …

Jun 25·1 min read·71 words

The Ethics of LLMs

I’ve written about LLMs a few times recently, carefully dodging the issue of ethics each time. I didn’t want to bog down the other posts with it, and I wanted some time to think over the issues. Now I…

Jun 22·1 min read·78 words

If all you have is a hammer…

I presume everyone is familiar with the idiom “if all you have is a hammer, everything looks like a nail”. If not, well, there it is. It’s generally used pejoratively about being single-minded, but I …

Jun 18·1 min read·75 words

An app can be a ready meal

Three years ago I read “an app can be a home-cooked meal” by Robin Sloan. It’s a great article about how Robin cooked up an app for his family to replace a commercial one that died. It’s been stuck in…

Jun 11·1 min read·77 words

Building a new Computer

I recently built a new computer, after exclusively using a laptop for three years. It’s also the first time I’ve departed from the usual combo of an Intel CPU and Nvidia GPU. While the form factor of …

Jun 3·1 min read·76 words

Coming around on LLMs

For a long time I’ve been a sceptic of LLMs and how they’re being used and marketed. I tried ChatGPT when it first launched, and was totally underwhelmed. Don’t get me wrong: I find the technology dam…

May 28·1 min read·69 words

Home Automation Without the Megacorps

I first experimented with home automation in 2016, by picking up a Samsung “SmartThings” hub. It was terrible. The UI to configure things was slow and clunky, firmware updates were applied whether you…

May 21·1 min read·68 words

The Curse of Knowledge and Blogging

The single worst part about blogging for me is trying to come up with ideas for what to write about. Not because they’re hard to come up with, but because every idea seems too basic or not worth talki…

May 16·1 min read·72 words

Building a travel toolkit

For a while now, whenever I’ve traveled anywhere I’ve dumped a selection of tools into my backpack just in case I need them. Originally this was mostly focused around being able to open and fix my lap…

Jan 2·1 min read·71 words

Simple backups with Restic and Hetzner Cloud

I have a confession: for the past few years I’ve not been backing up any of my computers. Everyone knows that you should do backups, but actually getting around to doing it is another story. Don’t get…

Dec 6·1 min read·73 words

How I Get Things Done

I always quite like reading about how other people do things. What software or hardware they use, or how they manage reminders, todo lists, and so on. I’ve never actually written about how I do any of…

Sep 1·1 min read·77 words

Further adventures in 3D printing

Not quite a year ago, I bought a Sovol SV06 3D printer and wrote about my initial experiences. At the end I joked:

Aug 4·1 min read·28 words

A year of boardgames

I realised the other day that it’s a little over a year since I started building out a collection of board games, and thought it’d be fun to go through the collection and what I think about the games …

Jul 26·1 min read·73 words

HTTP/2 and TLS Server Name Indication

I was recently alerted to a bug in Centauri, a simple reverse proxy I wrote. The initial report was that it was serving completely the wrong website, but only sometimes, and it behaved differently in …

May 25·1 min read·74 words

Project log: Filament weight display

One problem I have when 3D printing is that it’s hard to gauge whether there’s enough filament left on a roll to complete a print. Sometimes it’s obvious when the print is small or the roll is full, b…

Dec 3·1 min read·78 words

Adventures in 3D printing

I’d been idly considering getting a 3D printer for a while, but have only recently taken the plunge. I picked up a Sovol SV06 from Amazon for £199.99, which is a model commonly recommended for beginne…

Sep 17·1 min read·72 words

Upgrading the RAM in a Dell G15 laptop

I currently use a Dell G15 laptop for work. It has served me well for a little over a year, but recently it has been struggling a little with my day-to-day workload. It came with 32GB of RAM — the hig…

Jul 29·1 min read·85 words

Generating infinite avatars

I recently added a new ‘about’ section to the top of my website. Like most about pages, it has a picture. Instead of a normal photograph, however, you’ll see an AI-generated avatar. This is admittedly…

Dec 30·1 min read·72 words

Docker reverse proxying, redux

Six years ago, I described my system for configuring a reverse proxy for docker containers. It involved six containers including a key-value store and a webserver. Nothing in that system has persisted…

Dec 6·1 min read·71 words

Adventures in IPv6 routing in Docker

One of the biggest flaws in Docker’s design is that it wasn’t created with IPv6 in mind. Out of the box Docker assigns each container a private IPv4 address, and they won’t be able to reach IPv6-only …

Oct 24·1 min read·69 words

Reproducible Builds and Docker Images

Reproducible builds are builds which you are able to reproduce byte-for-byte, given the same source input. Your initial reaction to that statement might be “Aren’t nearly all builds ‘reproducible buil…

Feb 18·1 min read·65 words

Artisanal Docker images

I run a fair number of services as docker containers. Recently, I’ve been moving away from pre-built images pulled from Docker Hub in favour of those I’ve hand-crafted myself. If you’re thinking “that…

Feb 5·1 min read·67 words

On the utility of user stories

User stories are a staple of most agile methodologies. You’d be hard-pressed to find an experienced software developer that’s not come across them at some point in their career. In case you haven’t, t…

Oct 16·1 min read·44 words

Reverse engineering an Arctis Pro Wireless Headset

For the last year and a bit, I’ve been using a SteelSeries Arctis Pro Wireless Headset for gaming and talking to friends. It’s a fine headset, but because there’s an always-on receiver there’s no way …

Jun 12·1 min read·77 words

Apple, Google and aligned incentives

For the past decade I’ve exclusively used Android phones. I got the HTC Dream (aka the T-Mobile G1) shortly after it came out, and dutifully upgraded every 1-2 years. In that timespan I used Android a…

Oct 17·1 min read·74 words

How to break everything by fuzz testing

Fuzz testing, if you’re not aware, is a form of testing that uses procedurally generated random inputs to see how a program behaves. For instance, if you were fuzz testing a web page renderer you migh…

Apr 26·1 min read·78 words

An introduction to containers

I’m a huge fan of (software) containers. Most people I know fall in to one of two camps: either they also use, and are fans of, containers, or they haven’t yet really figured them out and view them as…

Mar 1·1 min read·75 words

Obfuscating Kotlin code with ProGuard

Obfuscating code is the process of modifying source code or build output in order to make it harder for humans to understand. It’s often employed as a tactic to deter reverse engineering of commercial…

Oct 21·1 min read·73 words

Debugging beyond the debugger

Most programming — and sysadmin — problems can be debugged in a fairly straight forward manner using logs, print statements, educated guesses, or an actual debugger. Sometimes, though, the problem is …

May 8·1 min read·67 words

Understanding Docker volume mounts

One thing that always confuses me with Docker is how exactly mounting volumes behaves. At a basic level it’s fairly straight forward: you declare a volume in a Dockerfile, and then either explicitly m…

Apr 1·1 min read·67 words

Over-the-top optimisations with Nim

For the past few years I’ve been taking part in Eric Wastl’s Advent of Code, a coding challenge that provides a 2-part problem each day from the 1st of December through to Christmas Day. The puzzles a…

Dec 9·1 min read·71 words

DNS-over-TLS on the EdgeRouter Lite

DNS-over-TLS is a fairly recent specification described in RFC7858, which enables DNS clients to communicate with servers over a TLS (encrypted) connection instead of requests and responses being sent…

Dec 17·1 min read·66 words

A look at the DNS habits of the top 100k websites

I was thinking about switching DNS providers recently, and found myself whoising random domains and looking at their nameservers. One thing lead to another and I ended up doing a survey of the nameser…

Aug 16·1 min read·77 words

Android testing with Espresso and Spoon

I’ve been spending some time recently setting up automated testing for our collection of Android apps and libraries at work. We have a mixture of unit tests, integration tests, and UI tests for most p…

May 16·1 min read·71 words

Shoring up SSHd configuration

I recently came across a useful tool on GitHub called ssh-audit. It’s a small Python script that connects to an SSH server, gathers a bunch of information, and then highlights any problems it has dete…

Oct 18·1 min read·70 words

Creating an offline GnuPG master key with Yubikey-stored subkeys

I recently noticed that I’d accidentally lost my previous GPG private key — whoops. It was on a drive that I’d since formatted and used for a fair amount of time, so there’s no hope of getting it back…

Aug 11·1 min read·85 words

Why you should be using HTTPS

One of my favourite hobbyhorses recently has been the use of HTTPS, or lack thereof. HTTPS is the thing that makes the little padlock appear in your browser, and has existed for over 20 years. In the …

Jun 17·1 min read·74 words

Automatic reverse proxying with Docker and nginx

Over the past few weeks I’ve gradually been migrating services from running in LXC containers to Docker containers. It takes a while to get into the right mindset for Docker - thinking of containers a…

May 21·1 min read·68 words

Monitoring power draw with WeMo Insight Switches

I recently picked up a couple of Belkin’s WeMo Insight Switches to monitor power usage for my PC and networking equipment. WeMo is Belkin’s home automation brand, and the switches allow you to toggle …

May 2·1 min read·74 words

Reverse engineering the Sense API

Sense is a little device that sits by your bedside and, in conjunction with a little ‘pill’ attached to your pillow, monitors your sleeping patterns and any environmental conditions that might hamper …

Apr 10·1 min read·68 words