// Writing
Articles
Tutorials, opinion pieces, tech reviews, and personal reflections. Covering web engineering, AI, the tools I use, and the things I've learned along the way.
Your Website Needs an MOT
You built the website, paid the bill, and watched it go live. Job done. Except it isn't — and the longer that assumption goes unchallenged, the more expensive the correction becomes.
Who's Watching Your Code?
What happens when the people building your software are the only ones who ever look at it? A pattern that surfaces time and again in outsourced projects — and one that AI-generated codebases are rapidly making more common.
Your LLM Isn't Quite As Smart As You Think
When you ask an AI assistant to draw a picture, search the web, or simply tell you the time, it's almost never the model itself doing the work. Here's what's actually going on — and why it matters.
The Accidental Telephony Engineer
What happens when a chat and AI specialist suddenly becomes the go-to person for SIP trunks, packet captures and telephony implementations? This is the story of how I accidentally became a telephony engineer — and what I learned along the way.
Can Claude Really Build an App with No Engineer Required?
Can someone with no technical background really build a production-ready app using Claude? I put it to the test — here's what I found, warts and all.
Accepting PayPal Payments in Laravel with drewdan/paypal
A guide to installing and using the drewdan/paypal open source package — covering installation, creating orders with the builder pattern, retrieving and capturing orders, and handling PayPal webhooks.
Deploying Laravel on a LAMP Stack
A step-by-step guide to manually setting up a Linux server with Apache, MySQL, and PHP to host a Laravel application — covering everything from package installation to firewall configuration.
Fixing 413 Errors When Uploading Files Through Expose
Getting a 413 Request Entity Too Large when uploading files through BeyondCode's Expose tunnel? It's an Nginx body size limit on the server. Here's the fix.
Fixing Expose 504 Gateway Timeout on WSL2
Getting a 504 Gateway Timeout when using BeyondCode's Expose tunnel on WSL2? It's almost certainly a DNS misconfiguration. Here's the one-line fix.
Sideloading Extensions in Microsoft Edge
How to load an unpacked browser extension into Microsoft Edge without publishing it to the add-on store — useful for developers building extensions and companies distributing internal tools.
Git is Marking Every File as Modified — Here's Why
If git status suddenly shows every file in your project as modified but you haven't changed anything, file permission changes are almost certainly the culprit. Here's the one-line fix.
Switching PHP Versions in Apache
How to change the PHP version your Apache web server is using — useful when upgrading between PHP releases. A quick two-command swap with a2dismod and a2enmod.
Loading Timezone Data into MySQL
If your MySQL queries using CONVERT_TZ are returning no results despite data being present, you're probably missing timezone table data. Here's how to fix it on Ubuntu.

