Skip to content
Writing

Notes, fixes and guides.

Sixteen years of working notes on Linux and networking, Django and Laravel deployment, SwiftUI and AWS. Written down mostly so I can find them again.

Android Sep 13, 2026 3 min read

Flutter Login and Signup Screen tutorial: iOS + Android + PHP 8 + Biometrics

A Flutter app for iOS and Android with signup, login, logout and Face ID or fingerprint unlock, talking to a PHP 8 API. The session token goes in the Keychain or the Android Keystore, and the forms work with password AutoFill on both platforms.

iOS Sep 13, 2026 4 min read

iOS Login and Signup Screen tutorial: SwiftUI + iOS 26 + PHP 8 + Face ID

Eleven years after the Swift 2 version, here is the login and signup tutorial again: SwiftUI screens, async/await networking, the session token in the Keychain, Face ID unlock, and a PHP 8 API that stores passwords and tokens the way they should be stored.

iOS Sep 13, 2026 2 min read

SwiftUI navigation bars on iOS 26: style the system bar, don’t hide it

Hiding the navigation bar to draw your own has always cost you swipe to go back. On iOS 26 both swipe gestures stop working, and the usual delegate workaround never even gets asked. Here's what the system bar can do instead, and where a custom bar still makes sense.

WordPress Sep 12, 2026 8 min read

wp cache flush doesn’t flush what your site is actually serving

Three times in one week I changed something on this site, verified the change, and watched the old version keep going out. Each time the change was correct. Each time a different cache was holding it, and the command I used to check was testing a layer that wasn't the problem.

Python Sep 11, 2026 3 min read

edge-tts won’t give you WordBoundary events until you ask

One keyword argument, keyword-only and missing from most tutorials, and then two things about ASS that cost me a lot longer than the keyword did.

Django Sep 9, 2026 7 min read

Never run django.template.Template() on HTML you didn’t write

A single stored record took an endpoint down for a week. It contained valid, working markup for a different template language. Django compiled it anyway, because that is what you asked it to do.

Django Sep 9, 2026 7 min read

Fix Gunicorn’s TimeoutError: [Errno 110] Connection timed out in sock.sendall()

Your view already finished. The worker got stuck handing the response over - and raising --timeout, the usual first move, makes it last longer instead of fixing it.

iOS Aug 28, 2023 2 min read

SwiftUI: Create a Custom Navigation Bar

In this article we create a reusable navigation bar in SwiftUI: a centred or large title, leading and trailing buttons, your own colours, and a Back button that actually pops the screen. It's applied as a modifier, so it sits where the system bar would.

PHP Aug 24, 2023 1 min read

How to Use msmtp with PHP’s mail() Function to Send Email

In this guide, let's explore how to set up PHP to use msmtp, a lightweight SMTP client, as its MTA.

Django Aug 14, 2023 1 min read

How To Deploy a Django project on an Ubuntu server with Nginx

Here's a general outline of How to Deploy a Django project on an Ubuntu server with Nginx: Server Setup: Start by setting up an Ubuntu server. SSH into…

AWS Jul 21, 2023 1 min read

How To Mount an AWS S3 bucket on an Ubuntu Server

To mount an AWS S3 bucket on Ubuntu, you can use a tool called "s3fs." S3fs allows you to access your AWS S3 bucket as if it were…

Ubuntu Jul 6, 2023 2 min read

How To Mount a Remote hard drive on an Ubuntu server

If you want to mount a remote hard drive on an AWS Ubuntu instance, you can use the SSHFS (SSH File System) utility. SSHFS allows you to mount…