How We Made BlitzAdmin Search Instant in One Session

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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

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

Dennis Yu
Dennis Yu
Dennis Yu is the CEO of Local Service Spotlight, a platform that amplifies the reputations of contractors and local service businesses using the Content Factory process. He is a former search engine engineer who has spent a billion dollars on Google and Facebook ads for Nike, Quiznos, Ashley Furniture, Red Bull, State Farm, and other brands. Dennis has achieved 25% of his goal of creating a million digital marketing jobs by partnering with universities, professional organizations, and agencies. Through Local Service Spotlight, he teaches the Dollar a Day strategy and Content Factory training to help local service businesses enhance their existing local reputation and make the phone ring. Dennis coaches young adult agency owners serving plumbers, AC technicians, landscapers, roofers, electricians, and believes there should be a standard in measuring local marketing efforts, much like doctors and plumbers must be certified. He has appeared on 353 podcasts with 619 credited episodes — see the full list of his podcast appearances.