I created my own status page
Status pages are a single HTML page that somehow costs thousands. So I built an open source, config-as-code one on Cloudflare, almost entirely with agents.
150 posts
I turned on Ring's End-to-End Encryption for a bit more privacy. Previews vanished, recordings broke and answering the door stopped working. Here's what happened.
Everything else
Status pages are a single HTML page that somehow costs thousands. So I built an open source, config-as-code one on Cloudflare, almost entirely with agents.
Most software changes aren't for the customer. They're for the profit line, or because the team had spare capacity.
A repeatable setup for building products agentically: one stack, one AGENT.md, and deterministic checks the agent can't argue with.
Four years of GitHub Actions with teams and on personal projects. Custom scripts, reusable workflows, pinning to SHAs, and protecting yourself in CI.
A running list of the coffee roasters I've tried, rated out of 10.
Authy removed its export feature, so Claude Code built a MITM proxy, pulled the encrypted database off my phone and moved 30 codes into 1Password.
A personal checklist for conducting technical discovery on legacy systems before planning a migration.
Three months in. The product has grown teeth: security patching, license flagging, weekly digests, audit-friendly evidence trails, and a CVE catalogue.
A single online order now generates ten emails. A look at how retail email got this far out of hand.
A book club where everyone reads a different book around a shared theme. How it works and why it beats the usual format.
Enterprises run due diligence on every supplier, then let their developers npm install anything they like.
My Todoist setup after a decade and 50,000 completed tasks, and why I dropped the standard GTD project structure.
Bundling all the tiny jobs that never justify their own time into one scheduled power hour.
Repowarden automates dependency updates, test generation, and custom code tasks as clean pull requests.
The death of thinking, games of telephone and magical parrots.
I made a thing! Here is how and why I built PlanPacer
My brief thoughts on the Mezzanine by Nicholson Baker.
A simple, slightly opinionated guide to event driven architectures
We get it you use Terraform. Your infra can be fragile though. Just saying...
My journey to stop typing like an ape and improve my typing speed.
Why and how I created allgood
Anyone ever actually moved from AWS to Azure? No, me neither.
Why you shouldn't use DynamoDB pretty much ever.
How you can bridge the gap between business and technology
Many fear that AI will replace software engineers, here are my thoughts.
The parts that make an architecture diagram actually useful: a key, an author, a version history, and clear flows.
A pro tip based on a mistake I made
My experience, notes and tips from AWS Summit London 2024.
If you hate powerpoint like I do, this is for you.
An ever expanding list of links from around the world wide web.
If you hear these things, run.
Sift the signal from the noise with these tips on how to prevent alert fatigue in your SaaS platform.
TDD has lost all meaning. Here is why...
The story of how I migrated my site from Gatsby to 11ty
Lambda warming is a common strategy to mitigate cold start times. But is it the right solution?
A checklist for buying a used car, from MOT history and common faults to what to check before you hand over the money.
Pivoting the business away from pure freelancing towards a broader set of products and services for teams.
How to send an SQS message from a Lambda inside a VPC, including the VPC endpoint and policy AWS makes you configure.
How to create a pull request environment in GitHub Actions using SST, AWS and Cloudflare pages
Why working three days a week has been the best career move I have made, and why part time is the next remote work.
Shipping LoginLlama with no dev environment and no process was the fastest I have ever built. Most companies do the opposite.
A running list of the heuristics and rules I have picked up over the years and actually use.
My default GitHub repository setup: conventional commit checks, branch protection, CI and a modular monolith structure.
SQS, SNS, EventBridge, Amazon MQ or DynamoDB streams? How to pick the right AWS messaging service for the job.
Running my first half marathon to raise £1,000 for Medecins Sans Frontieres, and how running became a habit.
Software optimised purely for revenue has stopped being fun. A case for whimsy and building things that delight.
Devblog 001: starting an API-as-a-service that detects suspicious logins, and where the existing tools fall short.
Practical rules of thumb for designing REST APIs, sitting somewhere between rigid rules and abstract principles.
A collection of small, minimalist tools, and why this class of software is worth protecting.
'Communication' is the default diagnosis for every engineering culture problem, and it is almost always the wrong one.
Measuring engineering inputs like test counts and code coverage incentivises exactly the behaviour you did not want.
Five lessons from a decade of engineering and freelancing, starting with attaching metrics to your work.
A collection of my favourite subreddits.
Every album I listened to in 2022 with a rating out of ten, kept so I can rediscover them later.
Gear I use to live and travel lightly
General rules to use when doing software architecture.
Notes about the seven deaths of evelyn hardcastle.
Paring my library down to five.
A review of my favourite book of 2022.
Demystifying the principles behind the title.
It doesn't have to be all meetings and time blocks.
There is no excuse at this stage.
Eliminate and simplify. Specifically, your retrospective meetings.
Reclaiming my data and building my corner of the internet.
Fixing 'Public key authentication failed' when cloning an Azure DevOps repository over SSH on a Mac.
Websites I like reading
If you are struggling to implement CI/CD in your team, here is how to do it.
Rate limits are not a silver bullet for spam. Here is why, and how to address spam concerns.
Upgrading the site from Gatsby V2 to V4 and adding webmentions, after it stopped running locally altogether.
Estimations are something we do daily. But they are estimations, not deadlines as many believe. Where did we go wrong?
What worked and what didn't.
How to remove a specific key from an object, even in nested structures
As devs, we want to create things that outlive us. Here's why you shouldn't worry.
Interviews are for both parties. These are questions to ask to make sure the role is a great fit.
All the books I own
Slow down, there is always more to do.
It can often seem like you're stuck in a rut where you can not progress further. Here is how to get out of the mid-level and onto the next stage of your career
Why quarterly based planning is perfect for keeping you happy, healthy and productive.
Microservices are the defacto standard for large scale systems. But is it always the right choice?
Learn how to stick to development principles when the rest of your team doesn't.
Engineers often look down upon recruiters, here's why you shouldn't.
Mistakes and pitfalls that I fell into when learning to become a software developer.
Time and distance doesn't need to prevent your team being collaborative
Be the hero of your team and face the monster that is legacy systems.
Releasing new versions of software be a panic-inducing experience. Here's how to ship faster quickly and calmly
How to cache Auth0 M2M Tokens to extend your free plan
Figuring out how you work best, is a superpower.
Your product is in huge demand! Quick hire more staff. Or, maybe don't - here is why.
Why you should strive for beauty in software, why it's forgotten and how to make software beautiful.
You need to update your API, but Terraform holds the container definition. What do you do?
Web performance is a vital part of your business to ensure customers keep returning. But, it can be difficult to get the time for it. Here's a guide on how to improve your website's performance on a deadline
How to use Azure Pipelines to migrate and seed your databases
The keyboard is the primary interface between my brain and the computer. So increasing the bandwidth of this connection is super valuable. In this post, I dig into why I started practising typing daily and how you can start
How I reduced our GitHub Actions jobs from 13 minutes to less than 3
Some thoughts on NIH, Boilerplate code and Solving core problems
How to use mdspell and GitHub Actions to spellcheck your markdown blog
The definitive guide on how to setup LightHouse CI for your React app inside GitHub Actions or any other CI provider
What to do when you've messed up at work... big time.
My shutdown routine to leave me clear, and ready for tomorrow
10 red flags to avoid when writing your resumé
A letter to my 17-year-old self on how to become a software developer.
Scheduling can be maddening, here's how to make commitments more reliably
A story about how I redesigned my site for accessibility, privacy and performance - to reach a perfect 100 in the Google Page speed insights score.
Simple Cron for downloading your favorite Youtube playlist
How to use RDS Snapshots and get access to your data
How we analysed performance pain points and improved them
Error messages are a critical part of your systems user experience. Here's how to craft error messages your users would be happy to see.
Creating Application health checks seems simple, but is easy to get wrong. Here's how to create an awesome health check for your Application or API
Forwarding data on to a third party sounds easy but has a lot of potholes you can easily get stuck in.
Why we chose to combine over 3 microservices into one central API
How a seemingly simple problem was more challenging than expected
How we successfully preserved links across our system whilst migrating domains
In the 'move fast, and break things' world, backwards compatibility has been cast into the realms of insignificance, but here is why it's so important even now
The work that makes the rest of the work faster: better notes, sharper tooling, and cutting cognitive overhead.
How I took my ZSH load times from 1.5 seconds to 0.19 seconds
My personal infrastructure: the scripts, services and setup I use, and the two principles behind every change.
How to use private github packages in your TravisCI jobs
Build a pinned gist bot with GitHub Actions in about ten minutes, using RescueTime data as the example.
Sharing Terraform secrets across a team by storing an encrypted tar in git and decrypting it in CI.
How to use gitleaks in TravisCI to monitor secrets
How to stay current in technology by finding the 20% of content that gives you 80% of the value.
What came back from an independent penetration test, what the findings actually meant, and how we fixed them.
How I made an SMS and instant messaging backend resilient after it shipped, and the principles that transferred.
Moving my blog off Medium and my site off static HTML, and why I combined the two into a Gatsby site.
A 30-day plan for handing in your notice well: documentation, handover, playbooks, and leaving cleanly.
How eventual consistency in Elasticsearch caused missing messages and channels, and what the bug taught us about architecture.
Monitoring a Node.js application with Grafana: the metrics worth graphing and how to wire them up.
What NTP actually is, how distributed systems keep their clocks in sync with UTC, and why the protocol matters.
Applying first principles thinking to engineering decisions, and why knowing the 'why' is what moves your career.
Architecting a platform-agnostic messaging system with websockets, SMS and email, built to a deadline.
Designing resiliency into an architecture: backing off, retries, timeouts, and accepting that dependencies will fail.
What it takes to run a tech meetup, learnt from four months of organising LeicesterJS.
Thoughts on the event-stream npm breach, package vetting, and the cost of pulling in a dependency for trivial code.
Ten things I wish I had known before giving my first conference talk at a meetup.
How to talk to people at tech meetups when you are introverted, including the questions that actually start conversations.
How to track short and long term goals in Todoist instead of buying yet another dedicated goals app.
Lessons from maintaining an open source project: code ownership, letting go, and reviewing other people's contributions.
What code review is not (style, bug catching) and the principles that make a review genuinely useful.
Principles for building fast websites that hold regardless of the stack you use, starting with network round trips.
How developers should actually use LinkedIn, and why recruiters are worth talking to rather than ignoring.
Three straightforward changes that will lift your Google PageSpeed Insights score by at least 20 points.
Turning a phone from an endless scroll into a purposeful tool, treating the home screen like a tidy desk.
Why developers pile on PHP, from inconsistent method naming to its history, and what the criticism gets right.
What a year of tracking every expense in a Google Sheet taught me about personal finance.
A beginner's primer on designing a relational database, from entities and keys to normalisation.
What to expect at your first programming meetup, why they are worth going to, and how to start talking to people.
Security changes you can make to a Node application right now without a large refactor.
A faster way to pick up a second programming language by learning the 20% of it you will actually use.
Which programming language should you learn first? It matters far less than the noise suggests.