Archives
All the articles I've archived.
git-branch-switcher
A small CLI tool I built to switch, search, and delete git branches without typing long checkout commands.
TreeApp
A simple app that lets you plant a tree every day just by watching a short ad. I recently hit 500 trees.
Jailbreaking My Old Kindle
How a Kindle Paperwhite that Amazon considered dead came back to life, faster and more capable than before, after I jailbroke it and installed KOReader.
Getting Back to Inbox Zero, and Finding a new Read It Later App
How a 50-email backlog of newsletters and mailing lists pushed me to fix my inbox zero process, and finally settle on a self-hosted read-it-later app.
Final Fantasy XVI
A late playthrough of Final Fantasy XVI. A cinematic, enjoyable action game that drops most of the series' RPG depth for style, and never quite reaches the highs of its PlayStation-era games.
umami-digest: Bringing Email Recaps Back to Umami
A small Cloudflare Worker that emails me a daily or weekly recap of this blog's analytics, built on self-hosted Umami and Resend.
Southeast Asia: Northern Thailand and Laos, Solo
The second part of a five-week trip through Southeast Asia, a solo loop out of Bangkok through Chiang Mai's temples and hills, Chiang Rai's strange modern temples, two days down the Mekong, Laos, a viewpoint in Vang Vieng, and Vientiane Laos' capital.
Southeast Asia: Thailand, Malaysia, and Indonesia
The first part of a five-week trip through Southeast Asia, from an overnight train out of Bangkok to Penang's food, Cameron Highlands' tea, Kuala Lumpur's chaos, and temples in Bali and Java.
The Joy (and Despair) of Servicing My Own Bike
Updated:Five years with an inherited old bike, a rear wheel that wouldn't stop rubbing the frame, and a Sunday spent taking a hub apart for the first time in my life.
Be My Eyes
One of my favourite apps. It connects sighted volunteers with blind and low-vision people over a video call, so you can lend a hand whenever you're free.
Death Stranding
A belated playthrough of Kojima's walking game. A wild story, an elegant network-building system, and some of the best musical moments I've had in a game.
Prague, Brno, and Vienna
A ten-day trip through central Europe, starting in Prague for Charles Bridge and its mystique, a surprise brief stop in Brno, and continuing to Vienna for its museums, Klimt's Kiss, and far more good food than planned.
100km
Around North London. A loop from Archway through parks, fields, and forests. 109.3km in the end — the round number mattered.
Brighton to Hastings on Foot
Three days walking the East Sussex coast, from Brighton Pier to the Old Town of Hastings.
Accessibility in React Native: Beyond the Checklist
Practical approaches to building accessible React Native apps — from screen readers and font scaling to testing tools like Accessibility Inspector, VoiceOver, and BrowserStack.
Asset Format Strategy for React Native Apps
A practical guide to choosing between WebP, SVG, Lottie, and compressed MP4 in React Native with Expo — when to use each, how to convert, and how to organise your assets.
Storybook in Expo Router Without Replacing Your App
How to integrate on-device Storybook as an Expo Router route with three layers of production exclusion and zero bundle size impact.
Offline-First Mutations in React Native with Apollo Client
How to build a persistent offline mutation queue for React Native apps using Apollo Client, AsyncStorage, and a custom hook that survives app restarts.
The Right Tool for the Job: Replacing XState with Zustand
How we reduced state management code by 80% by recognising that a finite state machine was the wrong abstraction for what was fundamentally simple CRUD state.
Upgrading Through Three Major Expo Versions (and Getting to Zero Warnings)
What it takes to upgrade a production React Native app through Expo 53, 54, and 55 — the breaking changes, the dependency hell, the unmaintained packages, and the payoff.
A Year Building a React Native App with Expo
A retrospective on joining a React Native project, shaping its technical direction through ADRs, and shipping it to production — plus a series of deep-dive posts on the decisions that mattered most.
Commit Messages & PR Titles
A practical guide to writing clearer commits and PRs. What I arrived at after almost two decades of questioning whether I was doing it right.
Ode to ADRs
Why Architecture Decision Records are one of the most underrated tools in software engineering, and why I start every project with them.
One Year at FoodCycle
Reflections on my first year of volunteering with FoodCycle — cooking for the community, fighting food waste, and finding something that actually matters on a Saturday morning.
Quick Image Resizing with macOS Automator
Simple Automator Quick Actions to resize images to 25% or 50% directly from Finder's right-click menu.
The Invariant Pattern - Cleaner TypeScript with Assertion Functions
How the invariant pattern can eliminate endless null checks and make your TypeScript code more readable and type-safe.
Managing Default Code Editors on macOS
A simple bash script to quickly switch default file associations when jumping between code editors like VSCode, Cursor, and Windsurf.
Bulk Image Conversion to WebP with a Simple Zsh Function
A practical Zsh function to batch convert images to WebP format with ImageMagick.
Farewell, Twitter
After 15 years, I’ve said goodbye to Twitter — reflections on connections, lessons learned, and the bittersweet freedom of moving on.
My Default Apps at the End of 2024
Updated:List of the apps I use, updated at the end of 2024.
Efficient API Polling in Redux RTK Query with EtagCacher
How to build a reusable caching utility that optimises API requests through ETag tracking and smart polling strategies.
Conditionally run GitHub Actions based on PR labels
Enhancing GitHub Actions with conditional job execution, based on PR labels.
Merging Coverage from Jest and Cypress
How to unify unit and E2E test coverage into a single report. Solving inconsistency issues between SWC (Next.js/Jest) and Babel (Cypress).
dependencies vs devDependencies
npm or yarn, the dilemma is always the same, is this a dependency or a dev dependency?
(Untitled)
...
Update Ghost blog on Webfaction
The moment arrived, you want to update your Ghost blog, what to do?
.dotfiles - one to rule them all
My personal repository to rule all the dotfiles and set up my working environment in a matter of seconds.
Git: How to delete all the merged branches
How to delete all the merged branches.
Movember
my moustache adventure.
Git: How to get all the changes on a branch
How to get all the changes on a branch.
How to install User Scripts
guide how to install script
W3C Validation with Gulp
How to validate your code with Gulp
Gulp Blacklist Marker
Chrome extension that marks blacklisted Gulp modules when browsing NPM and GitHub.
Reasons.to 2015
comment of the conference
Shazamify (a.k.a. Zamify)
Updated:Shazamify allows you to play your Shazams in Spotify, directly from the browser.
Sproxify
Sproxify intercepts Spotify's links and lets you choose where to play it.