Built with Ruby Native
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
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
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 |
|
|
|
Swift and Kotlin |
|
|
|
Hotwire Native |
|
|
|
Ruby Native Chosen |
|
|
Convinced? You can start without paying anything.
Start for freeWhat Ruby Native made possible
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.
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
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)
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
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.”
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.”
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.”
Your turn
pingrb went from first commit to App Store in five days, on a Rails app you can read on GitHub.
Joe Masilotti
Ruby Native Founder