I strive to build things that compound. New platforms taking shape, architecture that opens markets, teams that punch above their weight — making the technical bet make sense to the business. I started when the iPhone was new and built a career on what came next. AI is poised to change how we build software more than anything since. It's big, it's undefined, and it's going to be messy, but turning chaos into clarity is where I do my best work.

20 Nov 2013

Blocks: A Retain Ménage à Trois

NSNotificationCenter’s block API isn’t harmful — you just need to understand how self gets captured. A response to the ‘considered harmful’ crowd, with practical advice on block retain cycles and memory management.

15 Nov 2013

UICollectionView’s backgroundView property is horribly broken

Setting backgroundView more than once? It just stacks them. Forever. A Reveal-assisted deep dive into why the old view never gets removed, plus the simple workaround to fix it.

UICollectionView’s backgroundView property is horribly broken

11 Nov 2013

Custom View Controller Transitions in Landscape

iOS 7’s custom transitions are great — until you rotate the device. A breakdown of the landscape bugs, the hacky workarounds that don’t quite hold up, and why we went back to view controller containment.

Custom View Controller Transitions in Landscape

8 Oct 2013

Bookshelf View Controller Transition For iOS 7

An open-source iBooks-style 3D bookshelf transition, built on iOS 7’s new VC transition API. Includes easy setup, customizable options for depth and perspective, and a link to the GitHub repo.

Bookshelf View Controller Transition For iOS 7

19 Sep 2013

3D Printing

From a $200 impulse buy to a Prusa kit build — learning to design, print, and fix things (including the printer itself).

3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing 3D Printing

13 Sep 2013

Compares

Announcing Compares, our side-by-side photo sharing app. Built from scratch with a custom backend, onion-skinning camera, and a social layer for sharing before-and-after shots.

Compares

12 Sep 2013

How To Support Old iOS SDK’s in Xcode 5

Xcode 5 dropped the iOS 6 SDK, but you can just copy it back in. Here’s where the SDKs live and how to grab them if you already nuked your old Xcode.

2 Jul 2013

SMSquashView

Bringing cartoon-style squash and stretch to iOS views, automatically. The layer tracks its own velocity and distorts along the direction of travel — no configuration needed, volume stays constant.

21 Apr 2013

Cooking

A sous vide convert, a quarantine bread baker, and the ongoing quest for the perfect Thanksgiving turkey — told entirely through tweets.

Cooking Cooking Cooking Cooking Cooking Cooking Cooking Cooking Cooking Cooking Cooking Cooking Cooking

4 Mar 2013

Spatter and Spark

Shipping a kids’ storybook app with rich animation and a custom framework under the hood. Built on top of our Goodnight Safari codebase, with artist-driven XML animation specs and a parent-facing progress dashboard.

Spatter and Spark

30 Jan 2013

SMPageControl, Meet UIAccessibility

Adding VoiceOver support to our UIPageControl replacement — and naming pages too. With per-page names and full accessibility parity, SMPageControl finally earns its 1.0 and lands on CocoaPods.

SMPageControl, Meet UIAccessibility

11 Dec 2012

Hardware Tinkering

Falling down the Arduino rabbit hole, discovering ESP8266, the smart home journey from SmartThings to Home Assistant, and never looking back.

Hardware Tinkering Hardware Tinkering Hardware Tinkering Hardware Tinkering

5 Nov 2012

Mistakes Were Made: Audio and ARC

ARC silently kills your AVAudioPlayer mid-playback. Here’s why and how to fix it. Spoiler: make it an ivar, and maybe file a radar while you’re at it.

15 Oct 2012

SMPageControl: UIPageControl’s Fancy One-Upping Cousin

A drop-in UIPageControl replacement with custom dots, images, and per-page indicators. Swap class names, tweak diameters and margins, or go full Dribbble with per-page custom indicator images.

SMPageControl: UIPageControl’s Fancy One-Upping Cousin

27 Aug 2012

Premature Completion: An Embarrassing Problem

Core Animation runs your completion block early if it doesn’t find any animations. Rude. Includes a sample project to poke at the behavior yourself and avoid hours of confused debugging.

7 Jul 2012

The Finger Incident

What started as a ridiculous-looking finger injury ended with surgery, exposed bone, and a surprisingly gnarly recovery.

The Finger Incident The Finger Incident The Finger Incident The Finger Incident

16 Mar 2012

SMShadowedLayer

A CALayer subclass that fakes realistic lighting and shadows during Core Animation. Uses Lambert illumination math and a custom animatable property to keep shading correct mid-transform, specular highlights included.

11 Jan 2012

Goodnight Safari

We shipped a kids’ interactive storybook and learned a ton doing it. Custom animation frameworks, texture atlases, audio — the whole nine yards of getting out of our comfort zone.

Goodnight Safari

9 Jan 2012

Sim Deploy

A drag-and-drop tool for getting simulator builds to non-developers. It even supports a custom URL scheme so distributing a new build is as simple as sending someone a link.

Sim Deploy

12 Dec 2011

Cancel dispatch_after

A simple wrapper to cancel delayed blocks, because GCD won’t let you. Includes the open-source code on GitHub and a look under the hood at the block-juggling trick that makes it work.