pingrb running on iPhone

Built with Ruby Native

Two app stores. Five days, end to end.

pingrb, the push notification app I'd hate to maintain in Swift and Kotlin. Now live on the App Store and Google Play.

“Same Rails app. Two stores. No Kotlin, no Swift, no Xcode, no Android Studio.”
Joe Masilotti

Joe Masilotti

Ruby Native Founder

Ruby Native turns Rails businesses into iOS and Android apps.

pingrb is the app I wanted but couldn't find. I run a handful of side projects, and I wanted my phone to buzz when something mattered on them: a Stripe payment, a Honeybadger error, a Hatchbox deploy failing in the middle of the night, stuff like that.

It went to the App Store five days after my first commit. This week, it shipped to Google Play. Same Rails app, same configuration, no Kotlin written, no Android Studio opened.

That's the whole pitch for Ruby Native, and pingrb is the proof. One codebase, two stores, zero second-language maintenance.

Why Ruby Native

What I would have done otherwise

I've been a mobile developer for over a decade, and I considered building pingrb in Swift and Kotlin. Here's how the alternatives stacked up for an app I plan to maintain for years.

Approach Pros Cons

Existing tools

  • Already exist, nothing to build
  • Free or cheap
  • JSON, no source-specific formatting
  • Not the experience I wanted

Swift and Kotlin

  • Full native feel
  • Total control
  • Three codebases to maintain forever
  • Every bug fix is a store submission

Hotwire Native

  • Real native shell over a Rails app
  • Open source
  • Still Swift and Kotlin to maintain
  • Xcode and Android Studio required

Ruby Native

Chosen

  • One Rails app, iOS and Android in five days
  • Fixes are Rails deploys, not store submissions
  • Cloud builds, no Xcode or Android Studio
  • Doesn't deliver the fully native feel
  • Still maturing as a tool
  • Features I want aren't shipped yet

Convinced? You can start without paying anything.

Start for free

What Ruby Native made possible

The framework features pingrb uses

pingrb is a thin native shell over a Rails app. The whole iOS and Android experience is configured in a few lines of YAML and a handful of view helpers like native_push_tag and native_navbar_tag.

Sources
Sources
Notifications
Notifications
Setup
Setup

Native tab bar, two platforms

pingrb has two tabs: sources and devices. Real UITabBar on iOS, real BottomNavigationView on Android, all configured in a single YAML file.

# config/ruby_native.yml
tabs:
  - title: sources
    path: /sources
    icons:
      ios: list.bullet
      android: format_list_bulleted
  - title: devices
    path: /devices
    icons:
      ios: phone
      android: smartphone

Push notifications

Every notification pingrb sends goes through Ruby Native's push helper. The Rails side calls action_push_native and the native shell handles APNs and FCM. The product is push, and the framework provides it.

# app/controllers/webhooks_controller.rb
ApplicationPushNotification
  .with_data(path: source_path(source), url: notification.url)
  .new(title: notification.title, body: notification.body)
  .deliver_later_to(devices)

In-app App Store review prompting

After ten notifications, pingrb asks for an App Store review using Ruby Native's review signal. This was the one native shell update I shipped after launch, and it wasn't to fix a bug. It was to adopt a new Ruby Native feature.

<%# app/views/layouts/application.html.erb %>
<%= review_prompt_tag %>

Honest tradeoffs

What's still on the list

pingrb is shipped and useful, but it isn't perfect. Some of what's missing is on me, some of it depends on Ruby Native shipping it first.

“pingrb isn't 100% native, and it shows in places. I'm not a designer, and that compounds with a framework that doesn't pretend to be SwiftUI.”
Joe Masilotti

What's next

I'm working on native page transitions next, which closes most of the visual gap. The polish beyond that is on me, not the framework.

“Associated Domains aren't supported in Ruby Native yet, so password autofill doesn't work between pingrb.com and the app.”
Joe Masilotti

What's next

Dogfooding gives me a sharper spec than any feature request. It's on the roadmap.

“pingrb is paid, so adoption is harder than for a free app. Not on Ruby Native, but worth saying out loud.”
Joe Masilotti

Your turn

Ship yours next

pingrb went from first commit to App Store in five days, on a Rails app you can read on GitHub.

Joe Masilotti

Joe Masilotti

Ruby Native Founder