Back in 2023 I wrote a five-part series describing the infrastructure that hosts my websites and projects. Almost none of it is true any more. The workloads are mostly the same; nearly everything underneath them has been replaced. This is the update. Read more
I’ve published a small collection of Claude Code skills as a plugin. There are two so far: one that runs a technical interview against you and then tells you the truth about how it went, and one that walks you through configuring a GitHub repository properly. Read more
imgsrv is a small open source Go service that resizes and transcodes images on demand, sitting behind nginx. There’s nothing revolutionary about the idea: nginx serves everything it can straight from disk, and only a cache miss ever reaches the Go service. When that happens it generates the requested version of the image, writes it to disk, and returns it. Every request after that is a plain static file serve that never touches the Go code at all. Read more
Wakuwi is an open source, lightweight, read-only web interface for exploring Kubernetes clusters. It runs locally, uses the contexts already present in your kubeconfig, and requires no additional configuration. Install it, run it, and point your browser at localhost. It can also be run in your Kubernetes cluster. Read more
Note: This series is now very out of date; a lot has changed since it was written back in 2023. Read the update: My Server Setup, 2026 Edition. Read more
I own nearly 100 domain names, which is a pretty modest number against some people and organisations I know. Most of them are currently registered with Gandi.net and I’ve always found their service to be good value for money and that’s still true today. Read more
HTTP authentication is the easiest way to make a page or area of a website secure. It’s very easy to accomplish with pure PHP, so no web server configuration is required making it a lot more portable. Read more
Twitter sends notifications of new followers and direct messages by email. While you can use the API to keep track of those things it wastes hits and it’s incredibly inefficient especially for accounts with minimal activity. Read more
When I get bored while working I choose something from a list of things I want to have a go at someday. Some things are “read this blog post”, or “learn about this technology”, but most are along the lines of “make this”. Today I picked a “make this” item… to implement the game Fortune’s Tower. Read more
A common logic pattern that’s seen when dealing with GET and POST parameters in PHP is to check whether the array element exists, then set another variable to that or a default. It usually looks something like this… Read more
A couple of days ago, Ryan Sarver of Twitter sent an email to the API developers mailing list notifying us of changes to their terms of service. As per usual the community have exaggerated the implications of these changes to the point where it’s now pure comedy. As has happened every time Twitter make any changes that may affect developers, developers are panicking, and for no good reason that I can find. Read more
My thoughts on ISPs and how they’re whiney little kids who like to throw their toys out of the pram have been previously documented on this site. Apparently the advertising industry is set to get involved, and, according to NMA, is poised to ask the public for their thoughts on how broadband suppliers advertise their services. Read more
The other day I was continuing my long-term quest to sort through all the flotsam and jetsam of accumulated crap on my hard drive when I came across the following video (click through if you don’t see the video below). Recorded in April 2009, it shows the first version of the TweetMeme Live functionality without any rate or minimum retweet restrictions. As you can see it moved pretty quickly. Read more
One of the pillars of a scalable website is ensuring that only activity which is required to build a page should be performed during the processing of a page request. Activities that fall under this category commonly include sending emails, recording statistics and general housekeeping such as removing temporary files. Read more
A couple of days ago I released a new TwitApps tool called Follows. I know I haven’t talked about TwitApps on this blog yet – that post is coming – but if you follow me on Twitter you should be aware of it. Read more
Twitter promised OAuth support a l-o-o-ong time ago, and it would appear to finally be here. Alex Payne sent a “Call for OAuth beta participants” to the developers list yesterday and had an overwhelming response. This predictably triggered a deluge of tweets and blog posts, but the one that caught my eye was on ReadWriteWeb titled “Why Twitter’s New Security Solution Could Pave the Way to a Future Web of Mashups”. Read more
My latest project went live on Monday this week. It’s another Twitter-based toy along the same lines as hotornot but it uses your Twitter account and profile picture. Since launch it’s proved very successful and has spread quickly due to its viral nature. Read more
Several templating systems exist for PHP, but since PHP was originally created as a templating language I’ve never understood why more developers don’t use pure PHP in their view layer. The following snippet is a small function that facilitates precisely that. Read more
Really short snippet today – a password generator. Not much to say about this one since it’s pretty simple. Pass it the length of password you want and optionally a string of valid characters it can use and it’ll give you a random string back. Read more
Today’s snippet describes the singleton pattern. The singleton pattern is a method of creating a class that statically maintains an instance of itself and ensures that no other instances can be created. This is useful for classes that implement app-wide services such as logging, DB access and other shared resources. Read more
Pretty boring snippet today, but I find it immensely useful. My time class provides representations of periods from OneMinute to OneYear. It only has one method which will calculate an absolute time by adding a given time period to the current time. You can optionally provide a format intended for use by the date function to return a formatted string rather than a timestamp. Read more
Today’s snippet is a complete class for normalising cookie usage. In addition to providing methods to set and get cookies you can also check to see if a cookie exists, is empty and delete them without needing to concern yourself with more detail than necessary. Features include… Read more
This is the first of what I hope will be a series of posts showing snippets of code from my personal library. My intention is to highlight useful techniques I’ve developed or picked up over the years. Comments, questions, suggestions and requests are welcomed. Read more
Ok, so the title is a little misleading, but hopefully only until I explain what I mean. The first session refers to PHP sessions, and the second refers to the concept of sessions. Maybe it needs a little more explanation than that. Read more
TLDR: If you’re using PHP you want PHPMailer. If you’re using something else there’s probably an equivalent library (Google is your friend). However, regardless of how you do it you should always consider the impact of your email activities on your users. Read more
While catching up on Twitter this morning I came across a blog post by David Cushman on the simplicity of riding a bicycle compared to using ebay or iTunes. Read more
This is really daft. It’s been widely covered recently that the BBC iPlayer service is taking off in a big way which is great news for the future of TV. Unfortunately some ISPs are throwing their toys out of the pram and complaining that the increased bandwidth usage is costing them a lot of money and that the BBC should help cover the cost. Read more
It is with great regret that I must inform you that SharedServer.net will cease trading at the end of this year. This has been a difficult decision to make, but for various reasons it is not practical to continue. Me, In An Email To My Customers, Early November 2007 Read more
One thought keeps spinning round my head and has been for a while now. There are too many social networks for global participation to be practical. The core problem is that each site has their own list of your friends. This list is usually referred to as the social map and for the idea of social networking to really become a permanent part of the Web this aspect needs to be extracted and standardised. Read more
Amazon have announced an SLA for their S3 service which is, you know, good news. But like every other company on the planet they place responsibility for monitoring whether they meet it on the customer. Read more