Blog
2026
InstaSane: forcing Instagram's home feed back to chronological

A short write-up of InstaSane, a tweak that drops Instagram's algorithmic For You and keeps the home feed on chronological Following.

Recreating FotMob's excellent bracket UI in UIKit

Notes from building a FotMob-inspired tournament bracket view for UIKit and SwiftUI.

Uniqcount: estimating unique elements with a tiny amount of memory

A practical look at building a memory-efficient distinct-elements estimator in Swift, based on the CVM streaming algorithm.

2025
Building a Type-Safe Routing System for SwiftUI

A deep dive into creating a declarative, type-safe routing system for SwiftUI applications, with support for deep linking, state restoration, and universal links.

Contributing audio track switching and default audio track selection to Yattee

How I added MPV audio track switching in Yattee and improved default audio track selection.

2024
XNotForMe: removing the 'For You' tab from X on iOS

A practical breakdown of the tiny tweak I wrote to hide X/Twitter's For You timeline and force the Following timeline.

2023
Modeling view state in SwiftUI

How to reduce boilerplate code when modeling view state in SwiftUI views by using a generic enum to handle common scenarios such as loading, success, and error states.

Automating Mastodon Posts with OpenAI's ChatGPT

Building Mastofact, a silly ChatGPT-powered Mastodon bot that toots a random fact every hour, using Python and the Mastodon.py library.

Long live Tweetbot

How to continue using the Tweetbot iOS app after it has been suspended by replacing its Twitter API key with your own, using a man-in-the-middle proxy to redirect authentication requests.

2022
A first look at Swift Charts: building a horizontal bar chart

An introduction to the Swift Charts library and a look at how to build a horizontal bar chart using some sample data.