TowerSight: a legacy tool rebuilt as a self-serve SaaS platform
A single-tenant internal tool that had hit a wall, rebuilt as a multi-tenant SaaS platform with self-serve onboarding, every legacy record migrated, live in under four months.
The problem
Ridgeline's legacy system did the job, but it had run out of room.
- Hard to extend. Every new feature meant fighting the architecture instead of building on it.
- Built for one organization. It could never be handed to customers, which capped what the business could sell.
- No self-service. Every change, every new site, tower, or asset had to route through Ridgeline staff.
- The data model was the real constraint. It tracked assets, but nothing tied them together the way the business actually thinks: around physical sites.
What I built
I rebuilt the platform around the Site as the organizing principle. Every tower, shelter, generator, fuel tank, and document now attaches to a specific location, the same way the team reasons about their infrastructure in the field. On top of that core model I added true multi-tenancy (each organization owns isolated sites, users, and data, with full self-serve onboarding), a five-tier role-based access system with an immutable audit trail, interactive mapping, and one-click PDF and Excel reporting. Migrating the real legacy data was treated as part of the launch, not a separate phase that could slip.
| Legacy tool | TowerSight | |
|---|---|---|
| Core model | Assets without strong organization | Site-centric hierarchy |
| Tenancy | Single-tenant, internally managed | Multi-tenant SaaS with per-org isolation |
| Customer access | None, all changes routed through Ridgeline | Full self-serve signup and administration |
| Access control | Limited | 5-tier role-based, immutable audit trail |
| Mapping | Limited or none | Interactive Leaflet maps |
| Reporting | Manual | One-click PDF / Excel exports |
| Deployment | Legacy hosting | Dockerized, built to scale |
The outcome
Ridgeline went from a tool they couldn't grow and couldn't hand to customers to a modern, self-service product their clients operate themselves, with every record from the old system moved over. The rebuild shipped to production in under four months, end to end, with automated test coverage and a containerized deployment built to scale.
Built with
Reframed around the Site
The single most important decision was making the Site the core entity of the whole system. A Site is a physical property with a precise location, and every other asset is modeled as something that lives on it: towers and their equipment, shelters and cabinets, generators and fuel tanks, grounding and power, plus documents and photos attached straight to the record.
That mirrors how the business actually works: you go to a place, and you manage everything at that place. Structuring the data this way made navigation intuitive, reporting straightforward, and the whole domain easy to extend, because a new asset type simply attaches to the Site.

A Site record in TowerSight: one physical location, its exact coordinates, and every asset that lives on it, rolled up into a single view.
A true multi-tenant SaaS
To move from internal tool to self-serve product, the platform is architected around Organizations as tenants. Each organization owns its own sites, users, and data, fully isolated from every other tenant. New customers onboard themselves, invite their own team, and administer their own accounts with no involvement from Ridgeline. Every record is scoped to an organization, and access is enforced at the data layer, not just the UI.
How it’s built
UI Layer: Next.js 15 / React 19 / Tailwind (tablet-first)
|
API Layer: Next.js API Routes + Zod validation
|
Auth & Access: NextAuth.js + 5-tier RBAC
Business Logic: Multi-tenant scoping, audit logging, reporting
|
Data Layer: Prisma ORM + PostgreSQL
|
Services: Cloudflare R2, Resend, Leaflet, Docker, Railway
Security was part of the architecture, not a phase at the end: role-based authorization across the app, Zod input validation, bcrypt password hashing, session and failed-login monitoring, tenant isolation at the data layer, and an immutable audit trail on sensitive actions such as role changes. An automated test foundation (Jest for units, Playwright for end-to-end) travels with the codebase, so QA is a repeatable safety net rather than a manual afterthought.

Domain depth in practice: adding a tower captures engineering-grade detail, height, type, loading percentage, structural analysis and inspection dates, all tied back to its parent Site.
What carried the result
Get the core entity right and everything downstream gets easier. Choosing the Site as the aggregate root shaped the data model, the navigation, the permissions, and the reports at once. Multi-tenancy was a day-one decision, not a bolt-on, which is what made self-serve possible without a painful rewrite later. And migration was treated as part of “done”: a rebuild that can’t ingest the real data is a demo, so a genuine production cutover, with all of Ridgeline’s data moved over, happened inside the four-month window.
Our old system did the job but it had hit a wall. We couldn't grow it, and we couldn't hand it to customers. Travis took the whole thing on himself, reframed it around how we actually think about our sites, and had a modern, self-service platform live in under four months with all of our data moved over. It's the difference between a tool we maintained and a product our clients can run themselves.
Questions this raises
Why rebuild instead of upgrading the old system?
The legacy app was hard to extend, wasn't built to scale to multiple organizations, couldn't be handed to customers to run themselves, and lacked a data model that matched how the business actually operates. A focused rebuild reached durable ground faster than patching would have.
How was a full rebuild and data migration finished in under four months?
Disciplined scope, end-to-end single-owner delivery, a modern stack (Next.js, TypeScript, Prisma, PostgreSQL), automated testing, and treating the migration as part of the deliverable rather than a separate phase.
What makes TowerSight a true SaaS product rather than just a web app?
Multi-tenancy with isolated organizations that own their own sites, users, and data; self-serve signup and team invitations; and five-tier role-based access with per-tenant isolation. Customers operate it themselves.
How is sensitive infrastructure data kept secure?
Five-tier role-based access control, tenant isolation at the data layer, Zod input validation, hashed passwords, session and failed-login monitoring, and immutable audit trails on sensitive actions.
Have something like this to build?
Tell me what you're working with and where it's stuck. If it's a fit, we'll book a scoping call - no obligation, and I respond personally.
Let's Talk →