Real server work, done by hand — then written up so others can use it
This week
See all
Cloudflare Token Error 9109 Despite an IP Allowlist: IPv6
A Cloudflare token restricted by an IP allowlist worked on one machine while another got error 9109, even though the list already covered the ISP's ranges. This is my account of fetching prefixes from RIPEstat, using audit logs to establish which IPs were ours, and finding the real cause in IPv6.
Start here
Learning paths for sysadminsLatest articles
View all →
Renaming 1,707 Images in Thai for SEO Without Breaking Links
Every gallery image on the site had a meaningless random filename that told search engines nothing. This article covers renaming 1,707 files in Thai while updating every reference in a single transaction, and the trap that cost me a full day when curl returned 400 for raw Thai paths even though browsers opened them normally.

Passing the Sandbox Doesn't Mean It Works — 7 False Signals
The automated ordering system I wrote passed every command in a provider's sandbox, but almost everything the sandbox told me differed from reality, from response times and charges to accepted names and items that were created successfully but could not be found. Here are 7 false signals and how to write code that does not fall for them.

Cross-Model Audits of AI-Written Code — Process, Not Faith
After using AI to port a calculator from a 35-sheet engineering spreadsheet, how do I know it is correct? This article covers three independent audit rounds by an agent from another provider, the rules to set before starting, confidence levels that keep claims within the evidence, and the classes of errors AI kept making in every round.

Labels Printing Off-Center? Calibrate the Print Offset Once
After getting the label printer to fire its printhead, the next problem was that the text missed the sticker. I stopped guessing and printed rulers and corner markers to measure it, then clearly separated paper size, printable area, and offset into three distinct values.

Bank Open API QR Payments — From Sandbox to Status Lifecycle
A static PromptPay QR is easy to build yourself, but nothing tells you whether the customer has paid. This article walks through a bank's Open API sandbox, from requesting a token and issuing a dynamic QR to tracking REQUESTED/PAID/CANCELLED/VOIDED states and the requestDt trap that rejects requests even when the entire payload is correct.

Drawing SVG Electrical Panels You Can Measure on Paper
The electrical panel drawings I generated from HTML looked good, but the technician said the proportions were wrong. I rebuilt the whole sheet, anchored it to actual catalog dimensions, wrote the viewBox directly in millimeters, and added a scale bar so the technician could use a ruler to verify that the drawing in hand really was at 1:10.

Silent Overwrites on Upload: Three File Copying Traps
Upload two files with the same name together, and the second silently overwrites the first. No error, no failing exit code, and every page still returns 200. The English page just becomes a Thai page. These are three traps that let file copying cause damage without any warning.

Migrating an Old .aspx Site to a JSON Catalog and Filtering Images
The owner of an old .aspx site asked me to rebuild it, but more than a decade of content was in a database I could no longer access. I collected the pages from the site itself to build a JSON catalog that preserved every legacy_id, then wrote a three-layer image filter to keep stray QR codes from becoming article covers.

Let Clients Pick Photos on a Web Page Without a Login
When the person choosing photos for a website is not comfortable with computers, adding registration and login means the work stops at the login screen. This article covers a photo picker with no authentication at all, but with a server endpoint that checks every value against an allowlist strict enough to leave nothing from arbitrary input, plus limits at every layer and a backup before every write.
Want us to set this up?
Get help with server setup, configuration, migration, or troubleshooting. Save time for the work that matters.