Office Hours Recap - January
Tab navigation, audio playback, Liquid Glass modal fixes, and more…
Hey friends, this month’s office hours session was packed! We had a great mix of technical deep dives, real-world app stories, and some good discussion around PurchaseKit.
Who showed up
A successful founder shared something wild: They shipped 80+ iOS apps and 90+ Android apps, all powered by a single Rails backend. The apps are for different organizations using their platform, each with their own branding. A great example of Hotwire Native’s power for white-label solutions.
A Rails developer demoed their social app and asked about some UI quirks after upgrading to Liquid Glass.
Someone building a note-taking app was looking for advice on icon creation and asset management.
A developer using Claude to generate Rails code for their Hotwire Native app sparked a discussion about where AI shines (CRUD, boilerplate) and where it still needs human oversight (Hotwire Native integrations).
What we covered
Here’s what we covered in the hour-long, private Zoom session.
Flashing screens during navigation
One question was about a flash occurring when navigating between pages. The app has a web-based toolbar shown on every screen and when it disappears then reappears, it is jarring.
Unfortunately, this is a limitation of how view controllers and fragments work on iOS and Android. When Hotwire Native navigates, it covers the whole web view and shows a spinner while loading.
I offered two ways to solve this:
Move your toolbar to native so it stays persistent during navigation
Use Turbo Frames to update parts of the page without triggering full Hotwire Native routing (essentially creating a single-page app experience for that section)
Switching tabs from a link
Another developer wanted links to automatically switch the tab bar. For example, clicking “See all Posts” from the Home tab should switch to the Posts tab.
You need to build this yourself using path configuration. Add a property like tab_identifier to your path configuration rules. Then in your NavigatorDelegate handle’s function, check for that property, find the matching tab, and switch to it before accepting the route.
if let tabIdentifier = properties[”tab_identifier”] as? String {
// Find and switch to the correct tab
tabBarController.selectedIndex = tabIndex(for: tabIdentifier)
}Stopping audio when leaving a page
We also discussed stopping audio playback when navigating away from a page.
A few options here:
Subclass the Hotwire Native view controller and override
viewWillDisappearUse a Stimulus controller that listens for disconnect and pauses the audio
Use a native audio player instead (bonus: you get background playback and lock screen controls)
The native player approach is often the best solution if you are playing more than simple sound effects. But the Stimulus controller offers the least native code, it should be deployable with only changes to the Rails codebase.
Icon creation and app assets
A developer asked what I use for icons. Here’s my go-to stack:
SF Symbols for iOS-only apps (almost 7,000 symbols to choose from)
Material Symbols for Android or cross-platform (download SVGs)
Bootstrap Icons or Heroicons for web-focused icon sets
The Noun Project for app icons (~$5 per icon, varying quality)
The Noun Project is my sleeper pick and is perfect for something slightly unique without breaking the bank by hiring a designer for a fully custom design.
Modal buttons with Liquid Glass
Someone noticed users were tapping the checkmark in the top-right corner of modals instead of his custom Post button. This started happening after the Liquid Glass update.
This is occurring because Hotwire.config.showDoneButtonsOnModals = true will automatically add the “done” button to the upper right of every modal. But on iOS 26+, this becomes a check mark!
The best solution here is to implement a FormComponent that adds a native button that disables while the form is submitting.
PurchaseKit questions
Someone asked about PurchaseKit, which I launched earlier this month.
The short version: iOS and Android packages plus a Ruby gem that handle in-app purchases. You write your paywall in ERB, the native packages handle StoreKit and Play Billing, and webhooks keep your Rails database in sync.
It is free for up to 10 paying subscribers, then $99/month. If you are interested, check it out! Oh, and if you create an account in January, I’ll personally onboard you.
What’s next?
Next month’s office hours is on Thursday, February 5. Paid subscribers get access to the live call and can ask questions in real time.
If you have a topic you would like me to cover, leave a comment or reply to this email!


