Ruby Friends is in the App Store!

This is an archive of Joe Masilotti's newsletter. Subscribe for weekly-ish updates on building Hotwire Native apps powered by Ruby on Rails.

12 days after the first commit, Ruby Friends is officially live in the App Store!

What’s Ruby Friends? Dave Thomas sums it up nicely in his latest newsletter:

You create a profile, and it gives you a URL and a QR code. When you chat with people [at a conference or meetup], they can scan your code to see your profile, and if they want to, they can add you as a friend. And that’s it. No posts, no transitive-closures of connections; just you and a list of people who wanted you to remember them.

Think of it like a conference companion that helps turn introductions into friendships. I’ve been building it in public on my YouTube channel.

100 profiles in 48 hours… now 250 and counting

This blew me away.

Within 48 hours of launch, Ruby Friends hit 100 profiles.

Lucky profile #100? Erin - congrats and thanks for being part of this!

Since then, we’ve more than doubled that. As of writing, there are over 250 Ruby Friends using the app. That means more than 250 chances to meet someone new, start a conversation, and reconnect later.

Ruby Friends admin screen
Ruby Friends admin screen

A peek at the app

Here’s a quick look at what’s live in v1.0:

Ruby Friends app
Ruby Friends app

You can create your profile, add other Ruby Friends, and manage your notifications. Super simple - and super early. But it’s already working. Up next? Push notifications, of course!

Building it live

If you missed it, I started building the iOS app live on stream. We covered:

  • Spinning up the iOS app from scratch
  • Adding a native tab bar
  • Wiring up the sign-in flow with Hotwire Native

You can watch the full session here.

At first, I tried configuring the tabs after the user signed in. It worked… kind of. But it felt messy. So I tossed it and found something better: swapping the rootViewController once the user creates a profile.

At a high level, here’s what my SceneDelegate is doing. It renders a single Navigator on every app launch.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    private let navigator = Navigator()
    private let tabBarController = HotwireTabBarController()

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession ...) {
        window?.rootViewController = navigator.rootViewController
        navigator.start()
    }

    private func didSignIn() {
        if window?.rootViewController != tabBarController {
            window?.rootViewController = tabBarController
        }
    }
}

And when the user signs in, a bridge component swaps out the rootViewController to the tab bar controller.

class AuthenticationComponent: BridgeComponent {
    override func onReceive(message: Message) {
        guard let data: MessageData = message.data() else { return }

        if data.profileURL != nil {
            SceneController.didSignIn()
        }
    }
}

I’ll dive into that code in the next stream, tomorrow (Thursday). Come say hi!


That’s it for this week.

If you haven’t already, download Ruby Friends from the App Store, create a profile, and meet a new Ruby Friend. Or two. Or five.

And if you’re enjoying it, forward this to someone you think might like it too. The more the merrier.

P.S. If you’re organizing a Ruby conference, then let me know! Maybe we can get some Ruby Friends QR codes printed on the badges.

This was an archive of Joe Masilotti's newsletter. Subscribe for weekly-ish updates on building Hotwire Native apps powered by Ruby on Rails.