We Run a Monolith and We're Not Sorry
Microservices are a scaling solution for organizations, not technology. Here's why a Rails monolith serves Miru perfectly.
Miru is a Rails monolith. One app. One repo. One deploy process. One log file. We serve thousands of companies, process invoices, track time, manage expenses, handle webhooks from Stripe, send emails through Postmark, and run background jobs — all from a single Rails 8 application.
When I tell other engineers this, they look at me like I just told them I still use a flip phone. Surely you’ll need to break it apart soon? Surely it doesn’t scale? Surely you’re hitting the limits?
No. No. And no.
The Microservices Sales Pitch
The pitch for microservices goes like this: break your application into small, independently deployable services. Each service owns its domain. Teams can deploy independently. You can scale individual services based on load. It’s cleaner. It’s modern. It’s what Netflix does.
Here’s what they don’t mention in the conference talk:
You now have 12 services that need to communicate over the network. Network calls fail. So you need retry logic, circuit breakers, and timeout handling. You need distributed tracing because a single user request now touches six services and debugging means correlating logs across all of them. You need a service mesh or API gateway. You need 15 YAML files per service for Kubernetes. You need a team just to manage the infrastructure.
A bug that would have been a 10-minute fix in a monolith — follow the stack trace, find the method, fix it — becomes a two-hour investigation across three repos with different deployment schedules.
That’s not simplicity. That’s distributed complexity wearing a clean architecture t-shirt.
What Actually Scales
DHH wrote about this years ago in “The Majestic Monolith.” His argument was simple: microservices are a scaling solution for organizations, not for technology. When you have 500 engineers who can’t all work in the same codebase without stepping on each other, microservices make sense. It’s a people problem, not a technical one.
Miru has a team of 15. We all work in the same codebase. We know every corner of it. When something breaks at 2 AM, anyone on the team can debug it because there’s one application to understand, not twelve.
Our deploy takes 90 seconds. Push to main, CI runs, green means ship. No coordinating releases across services. No checking if the invoicing service is compatible with the new version of the users service. No service dependency graphs.
Our database is PostgreSQL. One database. Joins work. Transactions work. Foreign keys work. We don’t need eventual consistency because we have actual consistency. Rails 8 gives us Solid Queue for background jobs and Solid Cache for caching. No Redis cluster. No RabbitMQ. No Kafka.
When Microservices Make Sense
I’m not anti-microservices as a concept. They make sense when:
- You have hundreds of engineers and genuine team coordination problems
- You have components with radically different scaling profiles (like a real-time chat system next to a batch processing pipeline)
- You’re Netflix, and you literally invented the tooling
If you’re a team of 5-50 building a SaaS product, a monolith will serve you for years. Probably forever. Basecamp runs on a monolith. Shopify ran on a monolith until they had thousands of engineers. Hey.com is a monolith.
The Boring Advantage
The best technology decisions are the boring ones. A Rails monolith with PostgreSQL is boring. It’s been boring for twenty years. And in those twenty years, it’s powered millions of successful applications while the microservices crowd spent their time debugging network partitions and writing Kubernetes manifests.
We chose boring because boring lets us focus on the product instead of the infrastructure. Our customers don’t care how many services we run. They care that their invoices go out on time and their time entries are accurate.
Miru is a monolith. It deploys in 90 seconds. It’s debugged with one log file. And we’re not sorry.
Vipul A M
Co-founder at Saeloun. Building Miru. Rails contributor. Shipping from Pune, India.
Read next
Why We Don't Use TypeScript on the Backend
TypeScript is great for React components. It's overkill for a Rails API. Here's our take on where types help and where they just add noise.
How We Track Time with AI Agents and the Miru CLI
A practical guide to automated time tracking for teams using Claude Code, Codex, and other AI coding tools. Real workflows, real scripts, zero browser tabs.
Why Your Time Tracking Tool Should Be Open Source
Vendor lock-in, surprise pricing, and disappearing features. Here's why open source time tracking isn't just nice to have — it's the only sane choice.
The article is the theory. Miru is the workflow.
If this post is about better billing, cleaner tracking, or fewer tools, Miru is the product version of that argument.