My writing on Turbo Native, Ruby on Rails, and being a solopreneur.

Get started with my latest article and some of my favorites.

Strada officially launched! New

A first look at Strada, the last missing piece of Hotwire. Let's explore how it unlocks native components driven by the web in Turbo Native apps.

Hybrid iOS apps with Turbo Favorite

How to build hybrid iOS apps with Turbo and Ruby on Rails. An ongoing series covering authentication, the JavaScript bridge, architecture, and more.

Get my weekly newsletter

A weekly newsletter on Turbo Native, Ruby on Rails, and being a solopreneur. Unlock exclusive subscriber content and first access to my upcoming book.

And everything I've ever published, in reverse chronological order.

Strada officially launched!

A first look at Strada, the last missing piece of Hotwire. Let's explore how it unlocks native components driven by the web in Turbo Native apps.

Solopreneur on vacation

How I recognize when I need a break as a solopreneur and the benefits of taking time off.

Turbo Native tabs

Learn how to add a native tab bar to a Turbo Native app. And some hints for fixing common gotchas.

JavaScript alerts in Turbo Native

Learn how to handle data-turbo-confirm in your iOS app so you can render native Swift alerts directly from your Rails code.

Swift for Ruby developers crash course

If you're a Ruby or Rails developer looking to dive into iOS development, this crash course on Swift is exactly what you need! Ideal for anyone interested in Turbo Native development.

I'm leaving Twitter for a bit

And I’m not returning until I know that opening the app will make me feel better, not worse. Here's how to keep in touch until then.

Being more intentional in 2023

Too many days last year ended with me feeling like "I didn’t get anything done." Here's how I'm hoping to fix that in 2023.

Free Ruby on Rails communities

I use online communities to ask for help, offer advice, and keep up to date with the latest trends. Here are 10+ of my favorites.

My favorite podcasts

The podcasts I listen to every week – mostly about Ruby on Rails and bootstrapping.

Zero to App Store in 7 weeks

New record! I ported a client’s Ruby on Rails app to iOS and went live in the App Store in 7 weeks.

Custom Rails configuration

TIL about ActiveSupport::OrderedOptions and config_for. Here's how I'm using them to configure my Rails app.

RailsConf 2022 slides

Slides from talks and presentations at RailsConf 2022.

My sane approach to test fixtures in Rails

My approach on how I keep my test fixtures manageable, sane, and obvious. Not hard and fast rules, but guidelines to help you implement the same in your app.

RailsDevs has a gender diversity problem

It is not OK that RailsDevs represents 180+ developers but fewer than 10 identify as women. This is how I'm learning to create a more inclusive platform.

How I took my SaaS from idea to sold in 14 months

I built an MVP in one month and grew the product for a year. But now it’s time to pass the torch. It’s official, I sold Mugshot Bot! Here’s how it all went down.

Hybrid iOS apps with Turbo

How to build hybrid iOS apps with Turbo and Ruby on Rails. An ongoing series covering authentication, the JavaScript bridge, architecture, and more.

Dynamically verified Swift mocks

How to verify which messages a Swift mock receives with less boilerplate and no third-party code.

Swift mocks without protocols

How to reduce boilerplate by abusing inheritance to create mocks in Swift.

Idea to paying customer in one month

A month ago I ran into a problem. One week later I solved it. And three weeks after that I turned it into a (tiny) business.

Better unit testing with Swift

Ideas and best practices for real world Swift testing, including protocols, dependency injection, and Equatable.

Great two-player board games

Deck-builders, card games, tile placement, and more. Some of my favorite board games to play with only two players.

How to Test UIAlertController

Learn how to test UIAlertController with protocols, mocks, and dependency injection. No swizzling required.

BeerMenus & Turbolinks

How our small team supports 600k+ monthly users on four platforms with Turbolinks.

Where has Joe been?

What has Joe been up to since his last post?

Waiting in XCTest

Waiting is hard, and waiting in Xcode is no exception. Learn a new approach with classes introduced in Xcode.

XCTest documentation

Apple has officially sent me a cease and desist letter to take down my host of the XCTest Documentation.

SwiftCoders podcast

Earlier this month week I spoke on the SwiftCoders podcast. The host and I talked about getting started in Swift, and, obviously, testing.

Flattening Asynchronous Tests

Shave time off your test suite by flattening asynchronous tests. Learn how to mock more of URLSession to test response data, network errors, and status codes.

Joe's favorite things

All the stuff I'm enjoying right now: iOS apps and games, Mac productivity apps, card games, and programming books.

Mocking classes you don't own in Swift

Not owning a class doesn't mean you can't mock it! Learn how to unit test URLSession with Swift and protocol-oriented programming.

Concepts in Code podcast: Testing

Last week I spoke on the Concepts in Code podcast. The cohosts and I chatted about testing in Swift, TDD, and pair programming.

Custom helpers in XCTest

How to extract XCTest helper methods and keep sane failure messages.

UI Testing cheat sheet and examples

Answers to common "How do I test this with UI Testing?" questions. A quick reference for everything from tapping buttons to reordering table cells.

NSDate Manipulation in iOS

Create and modify dates by taking advantage of iOS 8's NSCalendar APIs.

Building NSURLs with NSURLQueryItems

Build and manipulate complex URLs with NSURLQueryItems. No more ugly string concatenation to append query items to URLs.

How to test PDFs with Capybara

Use familiar HTML testing tools to test drive PDF generation by combining wicked_pdf with some asset pipeline knowledge.