From Legacy Rails to the Dashboard That Runs It All
A family-run environmental company ran its entire operation through a Rails app built fifteen years ago. We rebuilt it for how the business works now: a modern operations dashboard, field-ready mobile apps, and a customer portal, delivered in about six months by AI coding agents.
- A modern operations dashboard running scheduling, dispatch, fleet, inspections, billing, and reporting
- Field-ready iOS and Android apps, so compliance data follows the crew instead of waiting at a desk
- Delivered in about six months and roughly 200 hours of hands-on work, with no data migration and no downtime
The Situation
NorthStar Environmental has kept stormwater systems in compliance since 1991. What began as a regional operation now runs nationwide, with crews, customers, and monitoring reports spread across the country. The software never caught up.
Nearly everything ran through one Ruby on Rails app built fifteen years ago: the dashboard the office used to schedule crews, dispatch trucks, track inspections, bill customers, and produce compliance reports, plus the portal where customers logged in. It was the operational heart of the business, built when the company was smaller and the work happened at a desk. Since then the job moved into the field. Crews need inspection and compliance data while they're standing over a stormwater drain, not back at the office. Customers expect to pull reports and pay bills from a phone. Regulators and clients keep asking for more reporting, more often. The old system was built for none of that, and bolting each new demand onto it got harder every year.
It was a quiet liability too. I built the original Rails app, so I knew where the bodies were buried. The framework was years past end of life, and every dependency upgrade risked breaking logic the business had come to depend on. It still worked, which is exactly what made leaving it alone feel safe.
What I Did
I rebuilt the platform around how NorthStar works today, using technology that didn't exist the last time it was built.
The center of it is the operations dashboard, the desktop tool the office lives in all day. We rebuilt it on a modern web stack, and it still carries the whole operation, from dispatching a truck in the morning to billing the job and producing the compliance report that closes it. This is the system that decides which crew goes where and proves a site is meeting its permits, so getting it right mattered more than anything else in the project.
Out in the field, the headline is mobile. We built apps in Expo, a single codebase that ships to both iOS and Android, which is what made mobile affordable for a company this size in the first place. A technician can pull up a site's history and log an inspection while standing over the drain, instead of carrying notes back to a desk and retyping them later. Customers got the same reach. They can check whether a property is in compliance, open a monitoring report, and pay a bill from their phone. The data finally lives where the work happens.
All of it, the dashboard and the customer portal alike, runs on Next.js. It loads quickly and it's easy to extend, which matters because the reporting never stops changing. Every new regulator requirement or customer request used to mean wrestling the old Rails views. Now adding a report or a screen is routine, and the platform can carry more customers and crews as the business keeps growing.
Why a Dark Factory, Not a Rewrite
The reason a project like this usually doesn't happen is cost. A hand-coded rewrite of a fifteen-year-old app gets quoted in years and quietly never starts, so the business limps along on aging software because the alternative looks worse.
A dark factory changes that arithmetic. AI coding agents working inside an automated migration pipeline did the repetitive, expensive part: reading the old Rails models, translating the logic into the new stack, and checking the result against how the old app actually behaved. That freed me to spend my time where judgment matters, deciding what to keep, what to quietly retire, and where "the old app did it this way" was a bug rather than a spec. The machine handled volume. I handled the decisions. The whole thing took about six months and roughly 200 hours of my time, a fraction of what a traditional rewrite would have cost.
This is also why nursing the Rails app forward one version at a time wasn't the answer. It would have burned similar effort and still left NorthStar on a framework past its end of life, with no path to mobile.
The dark factory didn't pack up when the new platform shipped. It changed how the work keeps going. Instead of gathering requirements, planning a sprint, and waiting out a development cycle, NorthStar and I get on a call once a week and make changes live. They watch a tweak happen in a dev environment in real time, react to it, and we adjust on the spot. The gap between "can it do this" and "yes, look" is now minutes instead of weeks.
Bugs run on the same short path. Someone reports one by email, an in-house resource at NorthStar triages and confirms it, then files a clean report. AI picks that up and writes the fix, and it comes to me to verify before it ships. The overhead that normally sits between noticing a problem and having it solved is mostly gone.
Keeping the Live Data Safe
The one thing NorthStar could not afford to lose was its data: years of inspections, reports, and customer records the business runs on every day.
So we didn't move it. The new stack layers directly on the existing MySQL database, and the old Rails app and the new application read the same tables. That let them run side by side through the whole transition. There was no cutover night and no window where the data sat half-migrated. If something in the new dashboard hadn't matched, the old one was right there, reading the same source of truth. The records that run the business never moved an inch.
The Outcome
NorthStar now runs on software that fits the business instead of holding it back. The office works out of a dashboard that keeps pace with the day, crews and customers have the data where they actually need it, and the whole platform can grow with a national operation and rising compliance demands, all on a modern stack their team can maintain. The dark factory delivered it in about six months of calendar time and roughly 200 hours of my hands-on work, far less than a traditional rewrite would have taken, and without ever putting the live data at risk.
The bigger win is what stops being hard. On the old app, every idea ran into the same wall: it would mean touching code nobody wanted to touch, so it didn't get built. That wall is gone. A new compliance report, a self-service view for customers, automated reminders when an inspection is due, a tighter loop between the field app and the dashboard, even pulling in the AI tooling that's reshaping this kind of work, are all now features to schedule rather than rewrites to survive. The mobile codebase ships to both app stores at once, so reaching customers on their phones is no longer a separate project each time.
NorthStar didn't just replace old software. They traded a system that capped what the business could do for one that gets out of its way, which is the real return on a modernization like this.