Updates · v0.20 · November 6, 2026

Which version of your app are people running?

Joe Masilotti

Founder, Ruby Native

You ship an update, it clears review, and it goes live. But how many people are running it? Until now, your app page could tell you how many devices opened your app, not which version they were on.

Ruby Native 0.20 fixes that, and adds a few things people have been asking for: tab badges with letters and dots (not just numbers) and a share sheet you can open from your own HTML buttons.

#A version breakdown on your app page

Each store card on your app page now shows which versions of your app people run, from each device's most recent launch. After you ship an update, you can watch the bar fill in as people pick it up.

The App Store and Google Play cards on the app page, each with a bar showing the share of devices on the latest version and on older builds

Nothing to set up. The launch ping your app already sends now includes its version number, and that's the only change. No user ID, and nothing from your Rails session. If you've turned reporting off with analytics: false, it stays off. See usage reporting for exactly what's sent.

Builds from before 0.20 don't send a version, so those devices show up as "Older" until people update.

#Dots and labels on any tab

Tab badges used to be counts, and only on the one tab marked badge: true. Now a badge can be a dot or a short label, and tabs: badges any tab by its key in config/ruby_native.yml:

<%= native_badge_tag(tab: true) %>
<%= native_badge_tag(tabs: { inbox: @unread_count, whats_new: !current_user.seen_whats_new? }) %>

A tab bar with a count of 9 on the Library tab and a dot on the Features tab

Heads up if your app is already live: builds from before 0.20 ignore tabs:, and a dot or a label clears the badge instead of showing it. To keep a count showing for people who haven't updated yet, keep badge: true in your config and keep passing the count as tab:, with tabs: alongside it:

<%# inbox has badge: true. Newer builds show a dot, older builds show the count. %>
<%= native_badge_tag(tab: @unread_count, tabs: { inbox: true }) %>

When both name the same tab, newer builds use tabs: and older builds use tab:. The badges docs have the details.

#Share from your own buttons

RubyNative.share() opens the native share sheet from any button on your page. Pass a URL, or leave it out to share the current page:

<button onclick="RubyNative.share()">Share</button>

It works in both modes and on Android, where web views don't support navigator.share. See Share from JavaScript.

#Long-press feels like an app

Long-pressing text in your app no longer selects it, and long-pressing a link no longer pops up a preview. That's how native apps behave, and it was one of the last tells that you're looking at a web page.

Form fields still work as you'd expect. For anything people should be able to copy, like a confirmation code or an address, add the native-selectable class:

<p class="native-selectable"><%= @order.confirmation_code %></p>

The rest of this post rounds up everything since the last update. Some of it shipped in 0.19.1 or went live on rubynative.com, so you may already have it.

#Your coding agent sets up more of it

Your coding agent can now create your app on rubynative.com with ruby_native link --new, or as part of the ship prompt, instead of you filling in the form. It also gets the preview ready before handing it to you: it installs cloudflared and checks that your Rails server is running, so all that's left is running ruby_native preview and scanning the code.

#New Easier screenshot uploads

Uploading your own screenshots got friendlier. You can add them a few at a time, reorder them by dragging the cards, and upload JPEGs. Transparent App Store screenshots are flattened on upload instead of refused.

#Fixes

  • pull_to_refresh: false now turns off pull-to-refresh in Advanced Mode on iOS. Pages without a native navbar don't get it either.
  • Publishing a listing with no sign-in clears Apple's Sign-in required box, so App Review no longer asks for an account you don't have.

#Upgrading

There are no breaking changes. A minor version needs one change to your Gemfile, since bundle add pinned you to 0.19:

gem "ruby_native", "~> 0.20.0"

Then update the gem, deploy your site, and build:

bundle update ruby_native
bundle exec ruby_native deploy

The version breakdown, the new badges, share, and the long-press change all need a new build, so they reach people as they update your app.

See your Rails app on your phone

Try the demo app on your phone, then point it at your own Rails app. It takes a few minutes.

Try Ruby Native on your phone

Questions, or want help getting to the app stores? Email me at [email protected].