← Home

iOS @ Traeger Grills

14/04/2026

This is a working page about the experiences & features I’ve built at Traeger Grills, where I joined in mid 2023. It was the first time I’ve been a part of something bigger than a company. Bigger than a company you ask? Yeah, almost like a neighborhood where everyone has a smokin’ grill on their porch. A neighborhood called the Traegerhood.


Having inherited legacy projects in the past, one of the most daunting realizations is that everything will be rebuilt at some point in some capacity. In 2025, that moment arrived for Recipe Search.

The existing search had some real friction points:

With those pain points in mind, here’s how we designed a better experience.

A large focus of mine during the rebuild was integrating small pops of feeling throughout the experience; making the mundane a little more saucy. A haptic here, an animation there. I particularly like the back arrow animation that shifts in and out of view as the search context changes.


Probe Swiping

Grill culture has an unwritten rule: don’t tell someone else how to smoke their meat. The same goes for how they want to read a cook—there’s no single right layout for everyone’s grate.

Connected cooks average about 1.1 probes per session, but the app has to handle up to four without turning the cook screen into a wall of numbers. Showing every probe at once is noisy; hiding them behind tabs just trades clutter for extra taps.

The cook widget borrows from iOS Smart Stack: one probe card in focus, vertical swipe to bring the next forward—the same idea as cycling through Weather, Photos, and Clock in a single widget slot, but for temps and doneness.


Grill Care & Maintenance

Built a dead simple way to access all of the information related to your grill. Guides, videos, how-tos, tips, etc. Clean and easy to use!


Cook Setup

We needed to build a flow that allowed the user to be able to associate different meats with their probes. This also gives us the chance to educate users on optimal Traeger Recommended internal temperatures regarding doneness.

Firstly, the user picks the protein they’ll be cooking; obviously we allow them to bypass this if they choose & go straight to picking a goal temperature.

Secondly, the user is presented with a list of cuts (if applicable); for example if the protein is beef, then we give the user a list of cuts like steak, brisket, burger, tri-tip, etc. Depending on the selected cut, we give a list of temperatures including what we Traeger recommends.

Finally, the user can begin their cook, where we show them a quick animation on how to insert a probe into your meat.

Zooming in: Custom Scrolling Picker

The cook-setup flow leans on a temperature picker—and the small stuff adds up: tick marks, scroll speed, snap behavior, and motion were tuned until landing on a degree felt intentional, not accidental.

> The Technical Details

Under the hood it’s a UICollectionView inside a UIViewRepresentable—the best of both worlds: smooth, efficient, precise, flawless scrolling & snapping only offered by UICollectionView & UIScrollView, plus the satisfying .contentTransition modifier SwiftUI gives you for the temperature readout.

For doneness, we tightened deceleration rate so even a hard flick only moves you about 30–40°F. The arrows on either side of the ticks nudge the selection one degree at a time.

If the SwiftUI scroll-performance debate comes up, Jacob’s write-up on hitting 120fps is the piece I send people.

> Multi-functional

What started as a cook-setup picker became shared infrastructure: the same control now handles grill temperature, the app’s other main temp-setting surface.

Steak doneness is a narrow window; grill temp is not. When the scale jumps from ~30º to hundreds of degrees, we reach back into deceleration rate—a flick that nudges doneness by 30–40º can swing grill temp by ~300º. Context-aware scroll speed is what keeps both modes feeling right.

The preset temperatures are also nice for this one.