Skip to content

v0.8.0

Choose a tag to compare

@joemasilotti joemasilotti released this 21 Apr 20:12
· 211 commits to main since this release

Added

  • native_fab_tag floating action button signal. Renders a native floating button above the tab bar. Accepts icon: (SF Symbols name, required), href: (URL to visit), and click: (CSS selector to click). Shows/hides per page based on signal presence. Works in both Normal and Advanced Mode. iOS 26+ renders with Liquid Glass styling, older versions use a bordered button.
  • NativeFab component for React and Vue. Same API as the ERB helper: icon, href, and click props.
  • ruby_native deploy --if-needed skips the build when the gem version matches the last successful build. Designed for CI: add it as a post-deploy step and it's a no-op until you bump the gem. Triggers the build and exits immediately without polling.
  • RUBY_NATIVE_TOKEN environment variable for CLI authentication in CI. Takes priority over the stored credentials file. Generate a token with ruby_native login locally, then set it as a CI secret.
  • Build failure email notifications. When a build fails, the account owner receives an email with the error details and a link to the builds page.

Fixed

  • Tab auto-routing with trailing-slash patterns no longer breaks Normal Mode navigation. Routes like /breweries/ now correctly match the bare path /breweries, preventing an infinite routing loop when Turbo.js is present.
  • Tab path matching now groups routes by tab index. _tabPaths is an array of arrays instead of a flat array, so multiple auto-route patterns on the same tab are correctly identified as the same tab.

Breaking

  • Add viewport-fit=cover to your viewport meta tag. The native bridge no longer injects it automatically. Inject-after-the-fact was unreliable when the page already had a viewport meta tag, because WebKit can resolve safe area insets before the JS runs, leaving env(safe-area-inset-*) at 0 and breaking native-inset. Update your layout:

    <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">