Skip to content
Sun Tile Corporation logo
Infrastructure Rescue · Migration · CI/CDLive in production

Sun Tile Corporation

Rescuing an ERP from a hostile developer, then rebuilding the storefront

www.suntile.com

Sun Tile has installed flooring across Central Texas since 1984, with more than 75,000 installations behind it. Every job, builder, installer, work order and invoice ran through a custom Laravel ERP — and that system, along with the infrastructure it lived on, was under the control of a developer the relationship had broken down with. That is an existential risk dressed up as a technical problem. The first job was getting the company's own software back under the company's own control.

51
ERP database tables recovered
71
Controllers across 26 modules
126
Legacy WordPress items migrated
55
Pages generated from typed data

The problem

When a single outside developer holds your source control, your servers, your DNS and your deploy keys, you do not have a vendor — you have a dependency you cannot survive. Sun Tile's ERP is the system of record for the whole operation: builders, communities, tract plans, jobs, work orders, invoices, installer payments and stock ordering. If it went dark, the company could not bill.

The relationship with that developer had deteriorated. So the problem was not primarily a code problem, it was a custody problem with a hard sequencing constraint: recover the code and the data, stand the system up somewhere the client actually owns, and do it without an outage in a business that invoices daily.

Underneath the custody issue sat real technical debt. The application runs on Laravel 5.3 and an AngularJS single-page front end — both long past end of life — with no continuous integration, no automated checks, and deploys that happened by hand on someone else's machine.

And separately, the public website was a WordPress and Divi build where every new service area meant another page hand-assembled in a visual editor.

What we built

Recover custody first

Before any improvement work, the priority was getting the codebase, the database and the operational configuration into the client's own possession — so that whatever happened next, Sun Tile owned the thing their business depends on. Everything after this step was only possible because this step came first.

Migrate into the client's own AWS account

The ERP was moved onto infrastructure Sun Tile controls, with their own account, their own credentials and their own billing relationship. The system of record for a company that has been trading since 1984 now sits where its owners can see it, audit it, and hand it to anyone they choose.

Build the CI pipeline it never had

The application had no automated pipeline at all — changes went out by hand. We added continuous integration and a release workflow, so a change is built and checked before it ships and a deploy is a repeatable process rather than an act of trust in one person's laptop.

Improve the ERP in place, rather than rewrite it

A 51-table, 71-controller system that correctly models a decade of real operational nuance — tract-plan replication across communities, stock-order consolidation into supplier POs, an installer debt and payment ledger for 1099 subcontractors — is not a rewrite candidate. It is an asset. We improved it where it hurt and left the parts that work alone, so the team never had to relearn their own tools.

Then replace the storefront

With the back office stable and owned, the public site was rebuilt off WordPress and Divi onto a typed Next.js build: 126 legacy items migrated, 15 city pages and 40 material pages generated from data modules, and every old WordPress URL pattern explicitly redirected so four decades of accumulated search equity survived the cutover.

Engineering highlights

The parts that were genuinely hard — and how they were solved.

The real deliverable was leverage, not code

The measurable outcome of the rescue is not a feature. It is that Sun Tile can now change vendors, including changing away from us, without asking permission from anyone. Any engagement that leaves a client unable to fire you has been structured badly.

Migrating a live system that invoices daily

The constraint that shaped the migration was that the business bills out of this application. A cutover window is not a technical preference when work orders and installer payments are moving through the system continuously — sequencing and rehearsal mattered more than speed.

Deliberately not modernising the stack

Laravel 5.3 and AngularJS are both end of life, and the tempting move is a rewrite on something current. That would have meant reimplementing years of encoded operational knowledge — how a tract plan replicates into a new community, how installer debt nets against payments — for no gain the business would feel. Stabilise, own, automate; modernise only where it pays.

Content as typed modules on the new site

The materials catalogue, service-area list and blog live in TypeScript data modules totalling roughly 2,300 lines. Adding a city or a material is a typed object the compiler validates. No CMS to log into, no plugin surface to patch, no database to keep alive.

A complete legacy-URL redirect map

Every WordPress pattern is mapped — wp-admin, wp-content, xmlrpc, RSS feeds, and the category, tag and author archives — as permanent redirects. The full 126-item WordPress export stays in the repository as a migration audit trail rather than being deleted after cutover, so 'did that paragraph make it across?' is answered with a diff.

Growth run as an operated loop

A running SEO log tracks position and impression drift page by page and explicitly separates genuine regressions from head-term dilution and ordinary SERP noise — which stops the team from 'fixing' pages that were never broken.

Where it stands

  • The ERP and its data are in Sun Tile's own AWS account, under Sun Tile's own credentials — recovered from a developer relationship that had turned hostile.
  • Continuous integration and a repeatable release workflow now stand between a code change and production, where previously there was a manual deploy from one person's machine.
  • The Laravel back office continues to run the operation — builders, jobs, work orders, invoices, installer payments and stock ordering — improved in place rather than rewritten.
  • suntile.com is live on a canonical www host, off WordPress and Divi, with 55 pages generated from typed data and legacy URLs redirecting rather than 404ing.

The stack

ERP
Laravel 5.3PHP 7MySQLAngularJSRedis
ERP Infra
AWSCI/CD pipelineRelease workflowAWS SES + SNS
ERP Real-time
PusherLaravel EchoRedis broadcasting
Website
Next.js 14React 18TypeScript 5Tailwind CSS 4
Site Content
Typed data modulesNo CMSNo database
Migration
WordPress WXR exportfast-xml-parser301 redirect map
Security
Strict CSPHSTSCloudflare Turnstile
Third-party services wired in
AWS SESAWS SNSPusherCloudflare TurnstileGoogle Analytics 4Google Places API