Tools I build with
The actual stack — what's open in my dock right now, not what looks good on a résumé. Click any card to see how I use it.
Apple stack
🛠Xcode 16
The IDE for everything. iOS, macOS, watchOS, visionOS.
›
Xcode 16
The IDE for everything. iOS, macOS, watchOS, visionOS.
I drive Xcode mostly through xcodebuild on the CLI for archives + uploads, but the IDE is where the actual writing happens. Live previews on for SwiftUI work. Instruments for performance dives.
🦅Swift + SwiftUI
Native Apple, no compromises. SwiftUI for UI, Swift everywhere else.
›
Swift + SwiftUI
Native Apple, no compromises. SwiftUI for UI, Swift everywhere else.
~380K lines of Swift across the portfolio. SwiftUI is the default; UIKit only when SwiftUI hits a wall (custom collection-view diffing, complex gesture interactions). Swift Concurrency for everything async — async/await, actors, AsyncStream.
🗄SwiftData + CloudKit
Local persistence + private iCloud sync. No backend.
›
SwiftData + CloudKit
Local persistence + private iCloud sync. No backend.
SwiftData for the local store — DupeOut's cluster cache, Closet's wardrobe, EatWisely's meal log. CloudKit private database for cross-device sync. The "no backend" architecture means I never run a server, never pay for hosting, and Apple controls the data plane.
🧠Apple MLX
On-device LLM inference. Replaced the dead llama.cpp Swift fork.
›
Apple MLX
On-device LLM inference. Replaced the dead llama.cpp Swift fork.
CHSharedKit 2.5 swapped MLX in as the on-device LLM backend after eastriverlee/LLM.swift went 404. Qwen 2.5, Phi-3.5, and Llama 3.2 all run cleanly on Apple Silicon. The unified backend powers AI features in LiftCoach, EatWisely, Closet, and TrainInsight without any of them touching the network.
👁Vision + PhotoKit
Image analysis, perceptual hashing, feature embeddings — all on-device.
›
Vision + PhotoKit
Image analysis, perceptual hashing, feature embeddings — all on-device.
DupeOut's whole engine is built on Vision: VNFeaturePrintObservation for similarity, Laplacian variance for sharpness, luminance histograms for the Bad Photos detector. PhotoKit handles the actual library access + iCloud Photos download orchestration. None of it touches the network.
⚡App Intents
Siri Shortcuts integration. Cheap power-user surface.
›
App Intents
Siri Shortcuts integration. Cheap power-user surface.
DupeOut Build 62 added 4 intents: Scan, Show Duplicate Count, Open Trash, Scan With Preset. The "Show Count" intent answers Siri without launching the app — it just reads from UserDefaults (the foreground app writes after every successful scan). Tiny code surface, real value.
Workflow
🤖Claude Code
Where most of the keystrokes happen now.
›
Claude Code
Where most of the keystrokes happen now.
I drive the architecture, the design decisions, the cadence. Claude Code executes the boring keystrokes — implement-this-helper, refactor-this-API, write-the-docstring, run-the-tests, archive-and-upload. Iteration cycle dropped from days to minutes for routine work. The savings get redirected into more careful design + more thorough testing.
📝Cursor
Secondary editor for solo deep-focus passes.
›
Cursor
Secondary editor for solo deep-focus passes.
For visual work where I need to see + manipulate the file directly. Tab-complete is excellent for SwiftUI view scaffolding. Pairs with Claude Code for the larger refactors — Cursor for inline iteration, Claude Code for orchestration.
✅Things 3
Personal todos. Long-running queue management.
›
Things 3
Personal todos. Long-running queue management.
Today / Upcoming / Areas. The thing I love is that it stays out of my way — no notifications, no streak counters, no AI suggestions. Just a place where I can drop something and trust it'll resurface when I asked it to.
🎨Figma
Mockups, icon work, marketing visuals.
›
Figma
Mockups, icon work, marketing visuals.
Light usage — most UI design happens in SwiftUI directly because the iteration loop is faster (Xcode preview is instant, Figma → Xcode is a translation step). Figma earns its keep for: marketing visuals, app icons, App Store screenshots, anything that needs to live outside the running app.
🚀App Store Connect API
Automated archive + upload + TestFlight notes.
›
App Store Connect API
Automated archive + upload + TestFlight notes.
Each app has a scripts/build-and-upload.sh that runs xcodebuild archive, exportArchive, altool upload, then PATCHes TestFlight What-to-Test notes via the JSON API. End-to-end ship is one command. ASC API key + issuer ID live in a gitignored .env per app.
🐙GitHub Pages
This site. Every per-app marketing site. Free, fast, no build step.
›
GitHub Pages
This site. Every per-app marketing site. Free, fast, no build step.
Plain HTML + Tailwind CDN + Inter font. No Hugo build step on the recent pages. Each per-app site lives at /apps/<name>/ with its own index.html, privacy.html, support.html, style.css. Push to master, Pages deploys in 30 seconds.
Hardware
MacBook Pro M3 Max
Primary machine. Xcode flies. MLX inference is fast enough that the dev loop never blocks on the model.
iPhone 16 Pro
Daily driver + primary test device. Most TestFlight feedback comes from real-world use here.
Apple Watch Ultra 2
TrainInsight + LiftCoach test target. Crown-driven UI is genuinely fun to build for.
iPad Pro 11"
Reading + iPad-layout testing. Every app gets at least one explicit iPad pass.
Want to see this in motion? /now tracks what I'm working on this week. Home has the apps grid + recent commits.