Ruby on Rails to App Store, No Swift Required

Ruby on Rails to App Store, No Swift Required
Photo by Jakub Żerdzicki / Unsplash

I always liked tracking my income and expenses. There was an app called Spendee that I used a lot. I liked it. But it felt too complicated for me, so like every self-respecting developer, I switched to Excel. Excel was fine, but it wasn't enough. Doing anything useful required too much effort. So I thought, why not build it myself? There's AI now, anyway.

Let me build something nice with Ruby on Rails.

The project was up and running very quickly. Tests were written. Deployment was done. Everything worked well. I started using the app in real life. It was doing exactly what I needed, and I could track my finances cleanly.

When I build a web project, I usually try to make it responsive and mobile-friendly. This is called mobile first. The reason I do this is purely personal because I mostly use my phone. And for an app like this, where you're adding expenses on the go, responsive design makes more sense. Tailwind CSS helped a lot here, and I put together a responsive web app pretty quickly.

But responsive alone wasn't enough. I wanted more. I started looking into PWA (Progressive Web App) and actually designed the app as a PWA from the beginning. That way I could use it like a mobile app on my phone, and it worked well enough.

Now it was time to give the app a name. I hadn't thought much about it at the start, so the project was just called "finance tracker" on my computer and GitHub. But the product needed a real name. I asked my wife. I just said, "I'm building this thing, if it were an animal, what would it be?" She said fox right away. Then I asked an AI what would come out of combining "finance" and "fox." It suggested Foxance. I liked it. My wife liked it too. For the logo, I thought maybe a fox emoji could work, but I wanted something more like a real logo. I found some visuals and shaped them a bit in Canva. After some back and forth with my wife, we had a name and a logo. She is basically the mother of the product's name. Sending her love here.

So Foxance was running on web and as a PWA on mobile. That was good enough for a while. The features were there: income and expense tracking, categories, reports (this was the important part for me), export and import. It was a cute little thing with emojis and all.

But at some point I thought, what if this had a real mobile app? I had been wanting to try Hotwire Native for a while, so I rolled up my sleeves and opened Xcode again. Since the backend was running on localhost:3000, getting the app running locally was easy. But the screen was just showing the web view, nothing native.

Getting a native look isn't that hard in Rails when you know what to do. But I had very little experience and struggled a lot. I thought this approach wasn't working and started looking for alternatives. That's when I found Joe Masilotti's docs and posts. I cloned his Hotwire demo app and tried to build Foxance on top of it. It looked nice, but some demo code was still in there and I didn't feel good about it. Too much cleanup needed. I was getting tired.

I also couldn't put a lot of time into this project. I work on it when I can. 14-20 minutes with an AI, then back to life.

After a while I was still using Foxance daily, but I wasn't satisfied. I wanted a real mobile app. I wanted something on the App Store. While thinking about how to do that, I remembered something called RubyNative that I had seen before. It was also Joe's project. I had tried it once on a small project but it felt buggy. The documentation wasn't great at the time, so I dropped it. I decided to give it another shot for Foxance.

This time I went through the docs step by step, slowly. And honestly, a native-looking app came together locally really fast. I didn't open Xcode once. I didn't write a single line of Swift. Just some YAML files and a bit of HTML/CSS. You could even say I barely wrote any Ruby either. I was surprised. Is it really this quick?

I went deeper. I had a mobile design already, so I tried to match it. At one point I got stuck. I sent Joe a detailed email with screenshots explaining the problem. He helped me move forward.

After getting a solid native look, it was time for the App Store submission. RubyNative helped here too, with screenshots and the upload process. A small issue came up, I emailed Joe, he found a fix quickly. I handled the other App Store details with AI help, and the app was in the store within two days. You can check it out here.

That's the story. And it's still going. I enjoy it. I use it every day and it helps me. I have things I want to add. We'll see how many I actually do.


Let me go through the pros and cons of each approach I tried.

Responsive Design (web)

Pros: Zero extra infrastructure, no deployment headaches, single codebase.

Cons: Mobile experience never feels truly "native." Safari limitations like push notifications and background fetch are annoying.

PWA

Pros: You can get a native-like feel quickly on top of an existing web app. It can be added to iOS home screen and behave like a mobile app.

Cons: Limited ecosystem support. Some features don't work properly. Still can't fully replicate the native app feel.

Hotwire Native

Pros: A Rails developer can build a native app quickly with very little Swift knowledge. Single codebase. No need to write separate code for different environments.

Cons: The codebase fills up with if/else conditions. CSS classes become messy. You still need to understand at least a bit of Xcode and Swift.

Native Swift + JSON API

Pros: A real native app. Being part of the Apple ecosystem. More flexibility in the code. No feature limitations.

Cons: Learning a new language and environment. Managing a backend API on top. Working across two separate codebases.

RubyNative

Pros: No need for Swift or Xcode. Can run anywhere. You can ship a native app with just Ruby knowledge.

Cons: Publishing to the App Store costs money. Doesn't fully deliver the native feel. Still maturing as a tool.

Summary of the comparison

Conclusion

First of all, I'm happy because I solved my own problem. There are dozens of personal finance apps out there and I know that. I didn't invent anything new. I just solved my own problem with tools I know, and I built something where the data stays with me. I can change anything I want. It's mine from top to bottom.

On top of that, I'm no longer a zero when it comes to native development. I learned a lot. RubyNative got me to the finish line quickly and I'm happy about that. The app isn't 100% native and I know it. Some people pointed out the design on social media. They're right. But this is where I am for now. I'm not doing much QA either, and some simple cases slipped through. Friends noticed and let me know. That's how these things grow, I guess. This isn't my professional work anyway, it's more of a side project.

One last thing: do you have an idea? Do you have a problem you want to solve? Everything is here. I tried to show you what's possible in the Ruby ecosystem as someone who's still learning. I mentioned the people who helped me. The pros and cons are all laid out. Try things yourself. Ask questions. Research. Break stuff. The important thing is to say "let's see what happens" and actually go for it. I'm curious what you think. If you have questions, I'm here to answer them.