Writing on engineering, AI and leadership
Deep-dives on AI systems, Apple platforms, cloud architecture and enterprise modernisation, plus field notes on leading the teams that ship them. Updated most weeks.
- Engineering16 min read
A Cost-Capped AI Assistant on Next.js, with No Vendor in the Middle
How I added an AI chat assistant to a Next.js website on Vercel with no chatbot vendor, no database and no vector store. Vercel AI Gateway with our own Anthropic key, prompt caching instead of RAG, and a hard monthly budget cap that stops requests before the model is called. About USD 0.10 per conversation.
- Engineering7 min read
Running a Local LLM in a SwiftUI Mac App
The last part: load the fine-tuned Qwen 3 model into a SwiftUI macOS app with MLX Swift, running fully offline on Apple silicon. Two packages, three lines to load a local model, and two setup errors that stop every MLX build. Then the same diff through both models, side by side.
- Engineering14 min read
Running LLMs Locally with Apple MLX
How to run a large language model fully offline on a Mac with Apple MLX. I download Qwen 3 4B from Hugging Face, load it on Apple silicon, and stream answers in the terminal. Why the 4-bit build, and what it costs to run. (Nothing.)
- Engineering8 min read
Fine-Tuning Qwen 3 with LoRA on Apple MLX
How to fine-tune a local LLM on a MacBook: one mlx_lm lora command, 45 minutes, and a 29 MB adapter. The tuned Qwen 3 scores better with a 20 token prompt than the base model did with 800 tokens and three examples. Then fusing the adapter back into the model.
- Engineering16 min read
Creating a Training Dataset for LoRA Fine-Tuning
How to build a fine-tuning dataset from nothing: 400 git diffs paired with commit messages, in the JSONL chat format mlx-lm reads. Where the messages come from, the terminal tool I built to review them, and why the checking script matters more than the training command.
- Engineering21 min read
Building a Conventional Commit Generator with a Local LLM
I give the local Qwen 3 model one real job: read my staged git diff and write the Conventional Commit message. No training yet, just prompt engineering, three worked examples, and 14 fixed diffs to score against. The score goes 9 out of 14, then 11, then stops.
- Engineering18 min read
The Traditional Workhorse: Core ML
Not every AI feature needs a language model. I taught a phone to recognise my things — live, with no training and no server — using Core ML the classic way. Here is how it works, and when this proven workhorse still wins.
- Engineering15 min read
The Invisible Intelligence: App Intents & Foundation Models
Most iOS features hide behind the app icon. The best 2026 ones answer from Siri, Spotlight, and Shortcuts without opening the app. Here is how I built one with App Intents and Apple's on-device model.
- Engineering14 min read
Apple's 2026 AI Stack: Which Layer, When
The iOS AI landscape changed completely this year. Here's the architectural guide I wish I'd had for deciding between Foundation Models, Core AI, and Core ML — a map of which layer to reach for, and when.
- Leadership8 min read
The Translation Layer: Bridging Executive Vision, Client Demand, and Engineering Reality
The highest-leverage skill in technical leadership is translation — turning ambiguous client and executive vision into buildable scope, engineering reality into board-ready decisions, and engineering effort into commercial outcomes. A playbook for the leader who has to hit the requirement, protect the revenue, and keep quality high — in fewer hours.
- Engineering8 min read
An Enterprise-Ready Combine Networking Layer in SwiftUI
A modular, event-driven networking architecture for SwiftUI — typed responses, environment switching, structured errors, logging, and testable services — built with async/await evolution in mind.
- Engineering3 min read
Crafting App Store-Style Card Animations with SwiftUI
Recreate the App Store Today tab's signature card-to-fullscreen transition using matchedGeometryEffect, Namespace, and clean view composition.
- Engineering3 min read
SwiftUI Property Wrappers, with Real-World Examples
A practical tour of SwiftUI's core property wrappers — @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject, @AppStorage, and @Environment — and exactly when to reach for each.
- Engineering6 min read
Mastering SwiftUI Navigation: A Centralized Coordinator for Complete App Flows
A single NavigationCoordinator that owns your stack, sheets, and auth/onboarding state — so SwiftUI navigation stays predictable as the app grows.