Amber DunnEngineering Manager · Product & Platform
← Demo Lab
Interactive production migrationVerified project reconstruction

Interactive systems demo · 03

Migration Control Room

Change the foundation without disrupting the business.

I led and personally implemented most of a live Create React App and Heroku migration toward Next.js and Vercel while leading a small product team. This exhibit reconstructs the engineering judgment behind the rollout: understand the system, prepare the escape route, rehearse, validate, gate production traffic, observe reality, and roll back when evidence says no.

What this makes visible

The migration was not a deploy button. It was a sequence of reversible decisions.

01

Build ≠ ready

A successful artifact does not earn production traffic. Environment, dependencies, rehearsal, health, critical flows, and rollback readiness are separate evidence.

02

Failure is a designed path

Break a health check, API contract, environment variable, rollback plan, or user flow. The system should contain risk rather than reward optimism.

03

Rollback can be success

If production evidence deteriorates, restoring the known-good system protects users and buys the team time to investigate without production pressure.

Guided migration walkthrough

See the decisions behind the migration while it runs.

Goal: move production from the legacy stack to the new one without dropping users — and stop the cutover if the evidence says it is not ready.

  1. 01ValidateProve it off the live path
  2. 02MigrateMove traffic on purpose
  3. 03VerifySee what production says
  4. 04ResolveStop before it gets worse
  5. 05CompleteStable on the new stack
Legacy traffic100%Known-good platform
Candidate traffic0%New platform exposure
Release readiness0 / 9Gates passed
Still blocking9Must be 0 before cutover

What is happening now

Map it before touching production.

Every user is still on the legacy path. Before anything moves, the frontend, services, infrastructure, integrations, and deployment dependencies need to be understood.

Why this matters

Customers do not become the test plan.

Migration simulation

Change the foundation without taking production down.

DISCOVERYPROD · HEALTHY
Choose a guided run or operate the migration manually.

Verified project moments

Jump into conditions and decisions that were part of the real migration

Historical context · generalized where needed
TRAFFIC / DNS100% legacy · 0% new
KNOWN-GOODCRA · Heroku100% production traffic
CANDIDATENext.js · Vercel0% production traffic
PRESERVED CONTRACTSDjango services · AWS components · external integrations

Illustrative traffic ratios · rollout mechanics generalized · verified outcomes labeled separately.

What is happening

Start by understanding what production actually depends on.

Engineering decision

Production stays on the known-good system until evidence supports a change.

Manual controls
Engineering inspector · serialized simulation state

The UI is driven from reducer state. Actions are explicit; DOM state is not the source of truth.

{
  "phase": "discovery",
  "trafficLegacy": 100,
  "trafficNew": 0,
  "gates": {
    "systemMap": "unknown",
    "dependencies": "unknown",
    "backup": "unknown",
    "rollback": "unknown",
    "build": "unknown",
    "environment": "unknown",
    "rehearsal": "unknown",
    "health": "unknown",
    "userFlow": "unknown"
  },
  "signals": {
    "api": "unknown",
    "auth": "unknown",
    "criticalFlow": "unknown",
    "errorRate": "unknown",
    "customerSuccess": "unknown"
  },
  "fault": null,
  "brenda": false,
  "decision": "Production stays on the known-good system until evidence supports a change.",
  "story": "Start by understanding what production actually depends on.",
  "eventSeq": 1,
  "events": [
    {
      "id": 1,
      "kind": "info",
      "message": "Migration control initialized. Production remains on the legacy environment."
    }
  ]
}

Why this demo exists

Launch day should be verification, not discovery.

The original migration involved an unfamiliar live rewards platform, a fixed deployment-path deadline, thousands of daily users, and preserved Django, AWS, and external-system dependencies. I reduced risk by mapping the system before changing it, creating staging and test environments, preparing backups and rollback procedures, and validating the candidate platform through a temporary subdomain under production-like conditions.

Once the candidate behaved consistently, I used product analytics to choose a lower-traffic launch window. The final cutover was intentionally narrow: controlled DNS and environment changes followed by immediate API-log monitoring and Customer Success validation. That combination matters because dashboards can look healthy while a real customer is still telling you something important.

This reconstruction generalizes private infrastructure and operational details. The architecture and controls are here to expose the decision model, not to pretend the original production environment was a neat diagram.

Architecture direction

The control room is also our first reusable simulation engine.

Underneath the UI is a small Redux-style store contract: serializable state, explicit actions, a deterministic reducer, release gates, signals, faults, events, and outcomes.

StateActionsTransitionsGatesSignalsFaultsEventsOutcomes

Go deeper

Want the real migration story behind the simulation?

The case study covers the production context, dependency mapping, rollout planning, cross-functional coordination, launch strategy, and verified results.

Read the full case study