Web app Rescued build

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.

ClientRidgeline Engineering
IndustryTelecommunications Infrastructure
TimelineUnder 4 months
The TowerSight sites dashboard showing telecom site locations on an interactive map, scoped to the Ridgeline organization

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 toolTowerSight
Core modelAssets without strong organizationSite-centric hierarchy
TenancySingle-tenant, internally managedMulti-tenant SaaS with per-org isolation
Customer accessNone, all changes routed through RidgelineFull self-serve signup and administration
Access controlLimited5-tier role-based, immutable audit trail
MappingLimited or noneInteractive Leaflet maps
ReportingManualOne-click PDF / Excel exports
DeploymentLegacy hostingDockerized, 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.

< 4 months
Concept to production
Discovery through launch, including full data migration
100%
Legacy data migrated
Moved into production as part of the launch, not a later phase
5 tiers
Role-based access
Super Admin through External, with an immutable audit trail

Built with

Next.js 15React 19TypeScriptPostgreSQLPrismaNextAuth.jsLeafletCloudflare R2DockerRailway

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 TowerSight site detail view showing one location with its coordinates and asset counters for towers, buildings, generators, fuel tanks, documents and photos

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.

The TowerSight add-tower form capturing height, tower type, loading percentage, structural analysis date and last inspection date

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.
- Joel Deis, Owner, Ridgeline Engineering

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 →