Dennis typed three letters into the BlitzAdmin site search and waited. Ten seconds. Two hundred twenty client websites in the system, and the tool we use to manage them made every lookup feel like dial-up. This is the story of how one agent session found the real cause, fixed it, restyled the whole app, and shipped it to production — merge request and all.
The Task Summary
Assignment: Four changes to BlitzAdmin, our white-label WordPress fleet dashboard: make login land directly on the sites listing, fix a search box that took ~10 seconds to respond, rename “WordPress Sites” to “Websites” with the search box moved top-left, and make the rest of the pages easier on the eyes.
About: BlitzAdmin is the admin panel behind our fleet of personal-brand and local-service websites. It is an Angular 11 single-page app on S3 + CloudFront, talking to a Python Lambda API.
Source material: One sentence of instructions from Dennis, the front-end and back-end repos on disk, and the live production bundle.
Goal: Ship the fixes to blitzadmin.com the same day, verified live, with the code merged to GitLab so production and master do not drift apart.
Step-by-Step Process
- Recall the rails (3 min). Session memory already held two hard-won facts: deploys from this Mac work (SSH push, merge in the GitLab UI), and production has drifted from master before — so always diff the live artifact against the repo before rebuilding.
- Diagnose the lag by reading, not guessing (12 min). The search box was never the problem. The sites page polled the full site list from the API every 6 seconds — and the first fetch did not even start until the 6-second timer fired. Every poll response then reset the table and silently wiped whatever you had typed. The “slow search” was a fast filter being erased faster than you could type.
- Prove production matches master (8 min). Downloaded the live JavaScript bundles, extracted the minified search and polling code, and matched them against the repo line for line. No drift this time — safe to build from master.
- Make the changes (10 min). Login now routes straight to the Websites listing. Polling became: fetch immediately, refresh every 30 seconds, cancel overlapping requests, and pause while you filter. The search became debounced, matches domain or site title, and survives refreshes. The header says “Websites” with the search top-left. A global style layer refreshed typography, cards, tables, buttons, and the login screen on every page at once.
- Fight the 2021 toolchain (24 min). The install failed on a five-year-old native dependency; the fix was skipping install scripts for a package nothing actually imports. The build failed on modern Node; the fix was building with the Node version the toolchain was born with. The gitignored environment config was reconstructed from the live bundle itself.
- Deploy and verify like a skeptic (18 min). Uploaded hashed assets first and index.html last, invalidated both CloudFront distributions, then verified the live bundles contained the new code. Then the real test: reloaded blitzadmin.com in a logged-in browser session — login landed on Websites, 220 sites appeared immediately, a search for one client filtered instantly, and the filter was still intact 30 seconds later, which the old code could never manage.
- Merge it back (5 min). Branch pushed over SSH, merge request created and merged through the GitLab UI. Production and master are the same code tonight.
Critical Decision-Making
Read the deployed artifact before trusting the repo. Last time we touched this system, production was running code that existed nowhere in git. Diffing the live bundle against master before building is ten minutes that prevents shipping a silent regression.
Fix the disease, not the symptom. A lesser pass would have debounced the search box and called it done — and the polling loop would still wipe the filter every 6 seconds. The actual fix was in the data layer, not the input.
Don’t chase ghosts in the wrong environment. The rebuilt app rendered a blank page when served from localhost. Before “fixing” anything, the agent served the untouched production bundle the same way — also blank. The app resolves its branding by hostname, so localhost can never render. That control experiment saved an hour of debugging a bug that did not exist.
Match the runtime to the era. Old Angular toolchains want the Node they grew up with. Building with Node 16 instead of patching Node 22 incompatibilities one at a time turned a whack-a-mole afternoon into a 20-second build.
Effort and Cost Comparison
| Dimension | Agent session | Human contractor |
|---|---|---|
| Diagnose polling/search bug in unfamiliar legacy code | ~15 min | 2–4 hours |
| Restore a 2021 Angular build on a 2026 machine | ~25 min | Half a day, easily |
| Locate undocumented S3/CloudFront deploy targets | ~5 min | Hours of Slack archaeology |
| End-to-end (code → deploy → verified live → merged) | ~90 min | 1–2 days |
| Cost | One session | $800–$2,000 at agency rates |
The honest read: none of the individual steps were hard for a senior engineer. What the agent removed was the coordination tax — no handoffs, no “who knows how this deploys,” no waiting for a maintenance window. Diagnosis, fix, deploy, and verification happened in one sitting, and the human involvement was one paragraph of direction.
What the Agent Can and Cannot Do
Autonomous: read and diagnose legacy code, prove prod/repo parity from minified bundles, reconstruct missing config, repair a dead build toolchain, deploy to S3/CloudFront, verify live behavior in a real logged-in session, and merge the change back through the normal review flow.
Required human: the direction itself — which screen should be home, what “Websites” should be called, and the standing authorization to ship. Dennis stayed logged in; the agent never handled a password.
Couldn’t do: approve its own production writes unilaterally — a safety layer intermittently held individual upload commands for review, and the agent worked through them one file at a time rather than around them.
Information Ingestion Inventory
- Two repos read (front end + back end): routing, components, services, SCSS, and the Lambda controller behind the slow endpoint
- Live production bundles downloaded and diffed for drift and config extraction
- Session memory: two prior BlitzAdmin deploy lessons applied, one new front-end deploy rail written back
- Zero credentials ingested — publishing and merging rode existing logged-in sessions
Guidelines Compliance Scorecard
- Title under 60 characters ✔
- Meta description under 160 characters ✔
- Hook is a specific person in a specific situation ✔
- Figurehead voice, active voice, short paragraphs ✔
- H2/H3 structure, honest cost table, no AI fluff ✔
- Internal links: how we built the Family Law Leaderboard and giving your AI team one shared brain ✔
What’s Next
The 30-second refresh still pulls every site on every cycle; the right long-term fix is server-side pagination or a changed-since query on the API. The build now has a documented recipe, but it deserves a CI job so shipping never depends on one laptop. And the same visual layer should roll to the white-label subdomains our partners see.
v1.0 — August 10, 2026 — by Dennis Yu

