{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/dev-37signals-com/2025-04-23-announcing-hotwire-native-1-2/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "We’ve just launched Hotwire Native `v1.2` and it’s the biggest update [since the initial launch](https://dev.37signals.com/announcing-hotwire-native/) last year. The update has several key improvements, bug fixes, and more API consistency between platforms. And we’ve created all new iOS and Android demo apps to show it off!\n\n* * *\n\n## Improvements\n\nThere are a few significant changes in `v1.2` that are worth specifically highlighting.\n\n### Route decision handlers\n\nHotwire Native apps route internal urls to screens in your app, and route external urls to the device’s browser. Historically, though, it wasn’t straightforward to customize the default behavior for unique app needs.\n\nIn `v1.2`, we’ve introduced the `RouteDecisionHandler` concept to iOS (formerly only on Android). Route decisions handlers offer a flexible way to decide how to route urls in your app. Out-of-the-box, Hotwire Native registers these route decision handlers to control how urls are routed:\n\n- `AppNavigationRouteDecisionHandler`: Routes all internal urls on your app’s domain through your app.\n- `SafariViewControllerRouteDecisionHandler`: (iOS Only) Routes all external `http`/`https` urls to a [SFSafariViewController](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller) in your app.\n- `BrowserTabRouteDecisionHandler`: (Android Only) Routes all external `http`/`https` urls to a [Custom Tab](https://developer.chrome.com/docs/android/custom-tabs) in your app.\n- `SystemNavigationRouteDecisionHandler`: Routes all remaining external urls (such as `sms:` or `mailto:`) through device’s system navigation.\n\nIf you’d like to customize this behavior you can register your own `RouteDecisionHandler` implementations in your app. [See the documentation](https://native.hotwired.dev/reference/navigation#route-decision-handlers) for details.\n\n### Server-driven historical location urls\n\nIf you’re using Ruby on Rails, the [turbo-rails](https://github.com/hotwired/turbo-rails) gem provides the following historical location routes. You can use these to manipulate the navigation stack in Hotwire Native apps.\n\n- `recede_or_redirect_to(url, **options)` — Pops the visible screen off of the navigation stack.\n- `refresh_or_redirect_to(url, **options)` — Refreshes the visible screen on the navigation stack.\n- `resume_or_redirect_to(url, **options)` — Resumes the visible screen on the navigation stack with no further action.\n\nIn `v1.2` there is now built-in support to handle these “command” urls with no additional path configuration setup necessary. We’ve also made improvements so they handle dismissing `modal` screens automatically. [See the documentation](https://native.hotwired.dev/reference/navigation#server-driven-routing-in-rails) for details.\n\n### Bottom tabs\n\nWhen starting with Hotwire Native, one of the most common questions developers ask is how to support native bottom tab navigation in their apps. We finally have an official answer! We’ve introduced a `HotwireTabBarController` for iOS and a `HotwireBottomNavigationController` for Android. And we’ve updated the demo apps for both platforms to show you exactly how to set them up.\n\n* * *\n\n## New demo apps\n\nTo better show off all the features in Hotwire Native, we’ve created new demo apps for iOS and Android. And there’s a [brand new Rails web app](https://hotwire-native-demo.dev/) for the native apps to leverage.\n\nClone the GitHub repos to build and run the demo apps to try them out:\n\n- [iOS repo](https://github.com/hotwired/hotwire-native-ios)\n- [Android repo](https://github.com/hotwired/hotwire-native-android)\n- [Rails app](https://github.com/hotwired/hotwire-native-demo)\n\nHuge thanks to [Joe Masilotti](https://masilotti.com/) for all the demo app improvements. If you’re looking for more resources, Joe even wrote a [Hotwire Native for Rails Developers](https://pragprog.com/titles/jmnative/hotwire-native-for-rails-developers/) book!\n\n* * *\n\n## Release notes\n\n`v1.2` contains dozens of other improvements and bug fixes across both platforms. See the full release notes to learn about all the additional changes:\n\n- [iOS release notes](https://github.com/hotwired/hotwire-native-ios/releases/tag/1.2.0)\n- [Android release notes](https://github.com/hotwired/hotwire-native-android/releases/tag/1.2.0)\n\n* * *\n\n## Take a look\n\nIf you’ve been curious about using Hotwire Native for your mobile apps, now is a great time to take a look. We have documentation and guides available on [native.hotwired.dev](https://native.hotwired.dev/) and we’ve created really great demo apps for iOS and Android to help you get started.\n\nSign up to get posts via email,\\\n or [grab the RSS feed](https://dev.37signals.com/feed/posts.xml).\n",
  "authors": [
    "Jay Ohms"
  ],
  "captured_at": "2026-09-19T21:30:23.395188495+00:00",
  "category": "programming",
  "content_html": "<p>We’ve just launched Hotwire Native <code>v1.2</code> and it’s the biggest update <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://dev.37signals.com/announcing-hotwire-native/\">since the initial launch</a> last year. The update has several key improvements, bug fixes, and more API consistency between platforms. And we’ve created all new iOS and Android demo apps to show it off!</p>\n<hr />\n<h2>Improvements</h2>\n<p>There are a few significant changes in <code>v1.2</code> that are worth specifically highlighting.</p>\n<h3>Route decision handlers</h3>\n<p>Hotwire Native apps route internal urls to screens in your app, and route external urls to the device’s browser. Historically, though, it wasn’t straightforward to customize the default behavior for unique app needs.</p>\n<p>In <code>v1.2</code>, we’ve introduced the <code>RouteDecisionHandler</code> concept to iOS (formerly only on Android). Route decisions handlers offer a flexible way to decide how to route urls in your app. Out-of-the-box, Hotwire Native registers these route decision handlers to control how urls are routed:</p>\n<ul>\n<li><code>AppNavigationRouteDecisionHandler</code>: Routes all internal urls on your app’s domain through your app.</li>\n<li><code>SafariViewControllerRouteDecisionHandler</code>: (iOS Only) Routes all external <code>http</code>/<code>https</code> urls to a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller\">SFSafariViewController</a> in your app.</li>\n<li><code>BrowserTabRouteDecisionHandler</code>: (Android Only) Routes all external <code>http</code>/<code>https</code> urls to a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://developer.chrome.com/docs/android/custom-tabs\">Custom Tab</a> in your app.</li>\n<li><code>SystemNavigationRouteDecisionHandler</code>: Routes all remaining external urls (such as <code>sms:</code> or <code>mailto:</code>) through device’s system navigation.</li>\n</ul>\n<p>If you’d like to customize this behavior you can register your own <code>RouteDecisionHandler</code> implementations in your app. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://native.hotwired.dev/reference/navigation#route-decision-handlers\">See the documentation</a> for details.</p>\n<h3>Server-driven historical location urls</h3>\n<p>If you’re using Ruby on Rails, the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/hotwired/turbo-rails\">turbo-rails</a> gem provides the following historical location routes. You can use these to manipulate the navigation stack in Hotwire Native apps.</p>\n<ul>\n<li><code>recede_or_redirect_to(url, **options)</code> — Pops the visible screen off of the navigation stack.</li>\n<li><code>refresh_or_redirect_to(url, **options)</code> — Refreshes the visible screen on the navigation stack.</li>\n<li><code>resume_or_redirect_to(url, **options)</code> — Resumes the visible screen on the navigation stack with no further action.</li>\n</ul>\n<p>In <code>v1.2</code> there is now built-in support to handle these “command” urls with no additional path configuration setup necessary. We’ve also made improvements so they handle dismissing <code>modal</code> screens automatically. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://native.hotwired.dev/reference/navigation#server-driven-routing-in-rails\">See the documentation</a> for details.</p>\n<h3>Bottom tabs</h3>\n<p>When starting with Hotwire Native, one of the most common questions developers ask is how to support native bottom tab navigation in their apps. We finally have an official answer! We’ve introduced a <code>HotwireTabBarController</code> for iOS and a <code>HotwireBottomNavigationController</code> for Android. And we’ve updated the demo apps for both platforms to show you exactly how to set them up.</p>\n<hr />\n<h2>New demo apps</h2>\n<p>To better show off all the features in Hotwire Native, we’ve created new demo apps for iOS and Android. And there’s a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://hotwire-native-demo.dev/\">brand new Rails web app</a> for the native apps to leverage.</p>\n<p>Clone the GitHub repos to build and run the demo apps to try them out:</p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/hotwired/hotwire-native-ios\">iOS repo</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/hotwired/hotwire-native-android\">Android repo</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/hotwired/hotwire-native-demo\">Rails app</a></li>\n</ul>\n<p>Huge thanks to <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://masilotti.com/\">Joe Masilotti</a> for all the demo app improvements. If you’re looking for more resources, Joe even wrote a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://pragprog.com/titles/jmnative/hotwire-native-for-rails-developers/\">Hotwire Native for Rails Developers</a> book!</p>\n<hr />\n<h2>Release notes</h2>\n<p><code>v1.2</code> contains dozens of other improvements and bug fixes across both platforms. See the full release notes to learn about all the additional changes:</p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/hotwired/hotwire-native-ios/releases/tag/1.2.0\">iOS release notes</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/hotwired/hotwire-native-android/releases/tag/1.2.0\">Android release notes</a></li>\n</ul>\n<hr />\n<h2>Take a look</h2>\n<p>If you’ve been curious about using Hotwire Native for your mobile apps, now is a great time to take a look. We have documentation and guides available on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://native.hotwired.dev/\">native.hotwired.dev</a> and we’ve created really great demo apps for iOS and Android to help you get started.</p>\n<p>Sign up to get posts via email,<br />\nor <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://dev.37signals.com/feed/posts.xml\">grab the RSS feed</a>.</p>\n",
  "content_markdown": "We’ve just launched Hotwire Native `v1.2` and it’s the biggest update [since the initial launch](https://dev.37signals.com/announcing-hotwire-native/) last year. The update has several key improvements, bug fixes, and more API consistency between platforms. And we’ve created all new iOS and Android demo apps to show it off!\n\n* * *\n\n## Improvements\n\nThere are a few significant changes in `v1.2` that are worth specifically highlighting.\n\n### Route decision handlers\n\nHotwire Native apps route internal urls to screens in your app, and route external urls to the device’s browser. Historically, though, it wasn’t straightforward to customize the default behavior for unique app needs.\n\nIn `v1.2`, we’ve introduced the `RouteDecisionHandler` concept to iOS (formerly only on Android). Route decisions handlers offer a flexible way to decide how to route urls in your app. Out-of-the-box, Hotwire Native registers these route decision handlers to control how urls are routed:\n\n- `AppNavigationRouteDecisionHandler`: Routes all internal urls on your app’s domain through your app.\n- `SafariViewControllerRouteDecisionHandler`: (iOS Only) Routes all external `http`/`https` urls to a [SFSafariViewController](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller) in your app.\n- `BrowserTabRouteDecisionHandler`: (Android Only) Routes all external `http`/`https` urls to a [Custom Tab](https://developer.chrome.com/docs/android/custom-tabs) in your app.\n- `SystemNavigationRouteDecisionHandler`: Routes all remaining external urls (such as `sms:` or `mailto:`) through device’s system navigation.\n\nIf you’d like to customize this behavior you can register your own `RouteDecisionHandler` implementations in your app. [See the documentation](https://native.hotwired.dev/reference/navigation#route-decision-handlers) for details.\n\n### Server-driven historical location urls\n\nIf you’re using Ruby on Rails, the [turbo-rails](https://github.com/hotwired/turbo-rails) gem provides the following historical location routes. You can use these to manipulate the navigation stack in Hotwire Native apps.\n\n- `recede_or_redirect_to(url, **options)` — Pops the visible screen off of the navigation stack.\n- `refresh_or_redirect_to(url, **options)` — Refreshes the visible screen on the navigation stack.\n- `resume_or_redirect_to(url, **options)` — Resumes the visible screen on the navigation stack with no further action.\n\nIn `v1.2` there is now built-in support to handle these “command” urls with no additional path configuration setup necessary. We’ve also made improvements so they handle dismissing `modal` screens automatically. [See the documentation](https://native.hotwired.dev/reference/navigation#server-driven-routing-in-rails) for details.\n\n### Bottom tabs\n\nWhen starting with Hotwire Native, one of the most common questions developers ask is how to support native bottom tab navigation in their apps. We finally have an official answer! We’ve introduced a `HotwireTabBarController` for iOS and a `HotwireBottomNavigationController` for Android. And we’ve updated the demo apps for both platforms to show you exactly how to set them up.\n\n* * *\n\n## New demo apps\n\nTo better show off all the features in Hotwire Native, we’ve created new demo apps for iOS and Android. And there’s a [brand new Rails web app](https://hotwire-native-demo.dev/) for the native apps to leverage.\n\nClone the GitHub repos to build and run the demo apps to try them out:\n\n- [iOS repo](https://github.com/hotwired/hotwire-native-ios)\n- [Android repo](https://github.com/hotwired/hotwire-native-android)\n- [Rails app](https://github.com/hotwired/hotwire-native-demo)\n\nHuge thanks to [Joe Masilotti](https://masilotti.com/) for all the demo app improvements. If you’re looking for more resources, Joe even wrote a [Hotwire Native for Rails Developers](https://pragprog.com/titles/jmnative/hotwire-native-for-rails-developers/) book!\n\n* * *\n\n## Release notes\n\n`v1.2` contains dozens of other improvements and bug fixes across both platforms. See the full release notes to learn about all the additional changes:\n\n- [iOS release notes](https://github.com/hotwired/hotwire-native-ios/releases/tag/1.2.0)\n- [Android release notes](https://github.com/hotwired/hotwire-native-android/releases/tag/1.2.0)\n\n* * *\n\n## Take a look\n\nIf you’ve been curious about using Hotwire Native for your mobile apps, now is a great time to take a look. We have documentation and guides available on [native.hotwired.dev](https://native.hotwired.dev/) and we’ve created really great demo apps for iOS and Android to help you get started.\n\nSign up to get posts via email,\\\n or [grab the RSS feed](https://dev.37signals.com/feed/posts.xml).\n",
  "dateCreated": "2026-09-19T21:30:23.395188495+00:00",
  "date_created": "2025-04-23T17:00:00+00:00",
  "date_modified": "2025-04-23T17:00:00+00:00",
  "date_published": "2025-04-23T17:00:00+00:00",
  "description": "A big update to Hotwire Native for iOS and Android.",
  "external_url": "https://dev.37signals.com/announcing-hotwire-native-v1-2/",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/dev-37signals-com/2025/04/2025-04-23-announcing-hotwire-native-1-2.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/dev-37signals-com/2025/04/2025-04-23-announcing-hotwire-native-1-2.md"
  },
  "id": "urn:aggr:item:2876d011cda64cd4689502667f6bd1e2c010a27f",
  "isBasedOn": {
    "@id": "https://dev.37signals.com/announcing-hotwire-native-v1-2/"
  },
  "mainEntity": {
    "@id": "https://dev.37signals.com/announcing-hotwire-native-v1-2/",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/dev-37signals-com/2025-04-23-announcing-hotwire-native-1-2/#webpage"
    },
    "author": [
      {
        "@type": "Person",
        "name": "Jay Ohms"
      }
    ],
    "dateModified": "2025-04-23T17:00:00+00:00",
    "datePublished": "2025-04-23T17:00:00+00:00",
    "headline": "Announcing Hotwire Native 1.2",
    "timeRequired": "PT3M",
    "url": "https://dev.37signals.com/announcing-hotwire-native-v1-2/",
    "wordCount": 566
  },
  "name": "Archived snapshot: Announcing Hotwire Native 1.2",
  "preview": null,
  "reading_minutes": 3,
  "replicated_at": null,
  "source": "dev-37signals-com",
  "source_name": "37signals Dev",
  "summary": "A big update to Hotwire Native for iOS and Android.",
  "tags": [],
  "temporalCoverage": "2026-09-19T21:30:23.395188495+00:00",
  "title": "Announcing Hotwire Native 1.2",
  "url": "https://aggr.aymericbeaumet.com/items/dev-37signals-com/2025-04-23-announcing-hotwire-native-1-2/",
  "word_count": 566
}