Latest
Updated 03:12 PMCall For Mentors
As I discussed in my last blog post, I recently joined Pursuit.org as their Director AI Product Engineering. And now I have a request: If you have the capacity to mentor a student at Pursuit for just one hour per week ov…
Build for iPhone Duo with new resources
Get Xcode 27.1 beta. View downloads and release notes Get Figma and Sketch design kits for iPhone Duo from the Apple Design Resources. Download design kits from the Apple Design Resources Sign up for workshops around the…
Get ready with the latest beta releases
The beta versions of iOS 27.2, iPadOS 27.2, macOS 27.2, tvOS 27.2, visionOS 27.2, and watchOS 27.2 are now available. Get your apps ready by confirming they work as expected on these releases. And make sure to build and …
Get your subscriptions ready for iOS 27
Discover how you can expand the reach of your subscriptions with new features in iOS 27. You can start preparing today by making sure your apps use StoreKit 2 to handle your Apple In-App Purchases. Request access to Bun…
Updates to App Tracking Transparency in the European Union
As part of agreements with select European competition authorities, Apple is introducing changes to its App Tracking Transparency framework in the European Union. Beginning with iOS 27.2 and iPadOS 27.2, developers will …
Authentication and Authorization: A Comprehensive Guide
OAuth 2.0, JWT, PKCE, OIDC, SAML, SSO: the auth ecosystem is big enough to misremember. This compendium builds a clear mental model for each concept and explains how they fit together.
Get ready for iPhone Duo
Start getting ready for iPhone Duo today. Watch new videos, sign up for Group Labs, and take part in Q&As on the Apple Developer Forums. Explore now
App Store submissions now open for the latest OS releases
iOS 27, iPadOS 27, macOS 27, tvOS 27, visionOS 27, and watchOS 27 will soon be available to customers worldwide, which means you can now submit apps and games that take advantage of the latest Apple technologies and inno…
In-House Over-the-Air Localizations in a Modular iOS App
How we built a minimalistic, elegant and effective remote localization system for the Just Eat Takeaway consumer app.
Why Swift is introducing a warning for weak captures within nested closures
Let’s take a look at a new Swift diagnostic which helps prevent memory issues with implicit self captures when nested closures are used.
Why Swift is introducing a warning for weak captures within nested closures
Let’s take a look at a new Swift diagnostic which helps prevent memory issues with implicit self captures when nested closures are used.
Using AI while exercising your critical thinking
The industry has been using the term AI Psychosis to describe a person who “blindly” believes everything that AI says, leading to scenarios where, if the person fails to realize the AI may be mistaken about a particular …
Everything about my smart home and homelab setup
I've written a couple of posts in the past about how my home network and home automation setup is laid out, but it changed so much over time that it's now time for an updated post! This time I'll put everything together …
Swift protocols and the main actor
How the main actor relates to Swift protocols, and what the practical differences are between isolating an entire protocol to the main actor, versus only marking specific requirements as isolated.
Swift protocols and the main actor
How the main actor relates to Swift protocols, and what the practical differences are between isolating an entire protocol to the main actor, versus only marking specific requirements as isolated.
A system prompt to get AI to stop pretending to be human
One of my issues with current AI models is how they try to mimic human social patterns (things like "great question!", "hmm, let me think", "you're absolutely right!", you know it). I'm not sure why these irk me as much …
I tried to record music onto a cassette tape using modern tech
I've always been a fan of retro tech, and this became even more true after AI swooped in and removed the soul and passion of all modern technology. I often go to my local second-hand stores to look at their games sectio…
Revisiting the JET iOS Modular Architecture in 2026
Revisiting the Modular iOS Architecture @ Just Eat from 2019 addressing previous limitations and refining the vocabulary.
Pursuit
tldr; Want to skip straight to the news and find out about my new job? On December 15, 2014 I went to dinner with Jukay Hsu. I was 25 years old and not too proud to say yes to a free meal, and my friend Josh said I reall…
10 Tips for Building iOS Apps That Handle Dynamic Type Well
Supporting Dynamic Type isn’t just about making text bigger. These 10 tips cover the layout, imagery, and edge cases your app needs to handle so text scaling actually works well in practice.
Generating image description alt text with Foundation Models on iOS 27
iOS 27 adds the ability to generate image descriptions on-device using Foundation Models. Here’s how to use it as a fallback when alt text is missing.
Should I add a dyslexia-friendly font to my app?
Many high-quality indie apps support dyslexia-friendly fonts as a customisation. Should you follow their lead? Well… probably not.
100 Small Acts Of Love
Around my birthday (which is today 🥳) I always feel a lot of love. I'm incredibly lucky to have so much love in my life. From the love of…
Open To Work
I won't bury the lede, I'm looking to go back to work full-time. I'm thankful to not be under financial strain, so I'm not rushing into anything. Instead I'm coming at this from a place of genuine interest in finding the…
Luca: A Decentralized Tool and Skills Manager for the AI-Augmented Developer Workflow
Introducing Luca. Luca manages tools, agentic skills and tasks on macOS and Linux. https://luca.tools/
Checking accessibility with SwiftUI Previews
SwiftUI previews offer a fast, practical way to see the output of our view code. But did you know you can also use them to test accessibility-related UI changes including Dynamic Type, localisation, and system accessibil…
No, SwiftUI is not “Accessible by default”
"SwiftUI is accessible by default" is one of the most repeated misconceptions in iOS development. Here’s why that’s wrong and what you actually need to watch out for.
Digitizing photos from the 1998 Game Boy Camera
One of my passions is retro game collecting, particularly things that I wanted to have as a kid but didn’t either because my parents couldn’t afford it or because those products weren’t available in Brazil. Recently, I …
Two Days In Tokyo
I'm riding on the bullet train from Tokyo to Kyoto and wanted to jot down my thoughts from the 48 hours I spent in Tokyo. I'll be back in a few days, but if I had to describe my initial impression it would be titled: Eve…
How my software engineering workflow has changed in the past year
Back in April 2025, I wrote a post about how AI has changed my software engineering workflow. However, the release of models like Opus 4.6 since then have changed the landscape of the industry so dramatically that most o…
Universal Links At Scale: The Challenges Nobody Talks About
A deep dive into the practical challenges of implementing, testing, and maintaining Universal Links at scale
I Should Blog More
Yesterday I posted this on Mastodon and Bluesky to share how much I've been enjoying blogging as a creative outlet.
Use 'git mv' to record filename case changes in Git
After my previous post Tracking renamed files in Git, here’s another entry in my ongoing series “I thought git mv was useless but I was wrong”. This one’s especially relevant to users on macOS and Windows, where the file…
Tracking renamed files in Git
Git famously doesn’t track file renames. That is, Git doesn’t store the information “file A has been renamed to B in commit X”. Instead, Git stores snapshots of the repository at each commit. It then uses a (customizable…
331: Reflection
330: Engaging with Reddit
329: Zero Utilization on Your Brain
328: Five Years of Enough
327: Ready for Distribution
Building a design system at Genius Scan
An example of how to approach the task of building a design system for an app, by focusing on creating an initial set of reusable components that can be tweaked using the SwiftUI environment.
Building a design system at Genius Scan
An example of how to approach the task of building a design system for an app, by focusing on creating an initial set of reusable components that can be tweaked using the SwiftUI environment.
326: Tree-Planting Features
Deciding between ‘let’ and ‘var’ for Swift struct properties
Does marking a given Swift struct property as either ‘let’ or ‘var’ simply determine its mutability, or is there more to it? Let’s explore!
Deciding between ‘let’ and ‘var’ for Swift struct properties
Does marking a given Swift struct property as either ‘let’ or ‘var’ simply determine its mutability, or is there more to it? Let’s explore!
How to Implement a Decentralised CLI Tool Manager
A design to implement a simple, generic and decentralised manager for CLI tools from the perspective of a Swift dev.
Decoding Swift types that require additional data
How Swift’s CodableWithConfiguration API can be used to inject additional, required data into a type’s decoding process, without having to use optionals or declare any additional decoding-specific types.
Decoding Swift types that require additional data
How Swift’s CodableWithConfiguration API can be used to inject additional, required data into a type’s decoding process, without having to use optionals or declare any additional decoding-specific types.
Tips and tricks for when using SwiftUI’s ViewBuilder
Let’s explore how we can use SwiftUI’s ViewBuilder within our own code, and a few things that can be good to keep in mind when doing so.
Tips and tricks for when using SwiftUI’s ViewBuilder
Let’s explore how we can use SwiftUI’s ViewBuilder within our own code, and a few things that can be good to keep in mind when doing so.
Swift 6 suitable notification observers in iOS
The author discusses challenges managing side projects, specifically updating SignalPath to Swift 6. They encountered errors related to multiple notification observations but resolved them by shifting to publishers, avoi…
AnyClass protocol and Objective-C methods
AnyClass is a protocol all classes conform to and it comes with a feature I was not aware of. But first, how to I ended up with using AnyClass. While working on code using CoreData, I needed a way to enumerate all the Co…
AnyView is everywhere in Xcode 16
Xcode 16 introduces a new execution engine for Previews, enhancing project configuration support and improving performance by up to 30%. However, it wraps SwiftUI views in AnyView for debug builds, which can hinder optim…
Sorting arrays in Swift: multi-criteria
Swift’s foundation library provides a sorted(by:) function for sorting arrays. The areInIncreasingOrder closure needs to return true if the closure’s arguments are increasing, false otherwise. How to use the closure for …
How to keep Date’s microseconds precision in Swift
DateFormatter is used for converting string representation of date and time to a Date type and visa-versa. Something to be aware of is that the conversion loses microseconds precision. This is extremely important if we u…
Wrapping async-await with a completion handler in Swift
It is not often when we need to wrap an async function with a completion handler. Typically, the reverse is what happens. This need can happen in codebases where the public interface can’t change just right now, but inte…
Building with nightly Swift toolchains on macOS
The Swift website provides nightly builds of the Swift compiler (called toolchains) for download. Building with a nightly compiler can be useful if you want to check if a bug has already been fixed on main, or if you wan…
How the Swift compiler knows that DispatchQueue.main implies @MainActor
You may have noticed that the Swift compiler automatically treats the closure of a DispatchQueue.main.async call as @MainActor. In other words, we can call a main-actor-isolated function in the closure: import Dispatch …
From Engineer to Manager: A Year of Growth and Transformation
It feels like it was yesterday when I became an engineering manager but it has been almost a year. I want to take this time to reflect on the challenges and learnings from this journey.
How the relative size modifier interacts with stack views
And what it can teach us about SwiftUI’s stack layout algorithm I have one more thing to say on the relative sizing view modifier from my previous post, Working with percentages in SwiftUI layout. I’m assuming you’ve rea…
Working with percentages in SwiftUI layout
SwiftUI’s layout primitives generally don’t provide relative sizing options, e.g. “make this view 50 % of the width of its container”. Let’s build our own! Use case: chat bubbles Consider this chat conversation view as a…