iOS App Store distribution with Turbo Native (turbo-ios) #108
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Type
Feature
Lineage
Standalone — scoped during multi-user planning session (2026-06-04).
Depends on #107 (auth) landing first.
Repo
ldraney/landscaping-assistant(Rails backend)New repo:
ldraney/landscaping-ios(Swift/Xcode project)User Story
As a crew member
I want to download the app from the App Store on my iPhone
So that I can access the landscaping tool like any other app
Context
The app is a Rails 8.1 Hotwire app (Turbo + Stimulus). Turbo Native (turbo-ios) is the Rails-ecosystem answer to App Store distribution — it's the Swift library that 37signals built and uses to ship HEY and Basecamp to the App Store.
turbo-ios wraps your existing Turbo-powered web views in a native iOS navigation shell. The Rails server does all the heavy lifting — the Swift project is a thin client that handles native navigation chrome (back buttons, transitions, tab bar) and can optionally add native screens for things like camera access or push notifications.
Why Turbo Native over Capacitor: This is a Hotwire app. Turbo Native is purpose-built for Hotwire apps. It understands Turbo Drive navigation, Turbo Frame rendering, and provides native-feeling page transitions automatically. Capacitor is a generic WebView wrapper that doesn't integrate with Turbo at all.
Backend: The Rails app runs on k3s behind Tailscale. Users must have Tailscale installed on their phone. The iOS app points at
landscaping-assistant.tail5b443a.ts.net.Key turbo-ios concepts:
Session— manages a WKWebView and handles Turbo navigation eventsVisitable— a view controller that loads a Turbo-powered pagePathConfiguration— a JSON file (served by Rails) that maps URL paths to native behavior (e.g.,/logincould be a native screen, everything else is a web view)turbo/native/path_configuration.jsonendpoint to control navigation behavior from the server sideFile Targets
New repo
landscaping-ios:SceneDelegate.swift— configure Turbo Session pointing at Tailscale URLPathConfiguration.json— URL-to-behavior mappingRails backend (this repo):
app/controllers/turbo/native/path_configurations_controller.rb— serve path config JSONconfig/routes.rb— add path configuration endpointrequest.user_agentincludes "Turbo Native") for any native-specific behaviorAcceptance Criteria
landscaping-iosXcode project builds and runs in SimulatorTest Expectations
xcodebuild test -scheme LandscapingAssistant -destination 'platform=iOS Simulator,name=iPhone 16'Constraints
https://github.com/hotwired/turbo-iosChecklist
landscaping-iosrepo createdRelated
landscaping-assistant— project#107— Keycloak auth (must land first)sop-keycloak-client-creation— Keycloak client for the appScope update (2026-06-05): App will use a public URL, not Tailscale-only. The app serves both web users (browser) and App Store users (turbo-ios). Tailscale is no longer a prerequisite for end users.
This means:
Pipeline: dev (docker-compose + MacBook Xcode) → CI (Woodpecker) → dev URL (pal-e-deployments) → public prod URL → TestFlight → App Store.
ldraney referenced this issue2026-06-05 11:25:04 +00:00