Call Let's talk

Kingsport, TN · 423-967-5584

Field Notes / Web & Technology Kingsport, TN / Tri-Cities

Web & Technology

Why I Rebuilt an Old Website Without Redesigning It

Why I Rebuilt an Old Website Without Redesigning It

A small business brochure site came to me working fine and nearly unusable on a phone. I replaced everything underneath it and changed nothing anyone could see.

Nobody asked for a redesign

When someone calls about a website, the opening line is usually some version of "we need a new site." I have written before that most website problems are not design problems, and I keep repeating it because it keeps being true. This job was the cleanest example of it I have worked on.

It was a small business brochure site. Nine pages. It said what the business did, it had been saying it for a long time, and it still brought in work. The design was not the problem. The design was the only part still doing its job.

Everything under the design had aged out. The pages were laid out in tables with inline font tags. On a phone you got the desktop layout shrunk down past the point of reading, and the page scrolled sideways. The contact form had never delivered a message to anybody. The favicon was a file with nothing in it.

So the work was narrow, which is a nicer way of saying I had to talk myself out of the interesting version of it. Keep the part that works. Replace the part that does not.

What I kept

The look, the colors, the wording, the page order, and every URL. All of it untouched.

That is not a compromise. It is the whole idea. Customers recognize that site, the owner has been handing out that web address for years, and the copy on those pages is what the business actually says about itself rather than what a marketing writer would say on its behalf. Replacing any of that would have introduced risk in exchange for nothing.

There is a practical bonus. When the design does not change, there is no design review. Nobody has to approve a color. I have yet to find the downside.

One site, from the top down Five layers of the same website. The design, layout, wording and every existing URL were kept. The markup and stylesheet, the images, titles and structured data, and the contact form and hosting were replaced. ONE SITE, FROM THE TOP DOWN Design, layout, wording KEPT Every existing URL KEPT Markup and stylesheet REPLACED Images, titles, schema REPLACED Contact form, hosting REPLACED The visitor only ever sees the top two.

The split that defines the job. Everything a visitor can point at stayed. Everything they cannot point at was rebuilt.

What I replaced

The table layout became semantic HTML with a single stylesheet. The font tags went away. Every image got alt text. The whole thing reflows down to a 320 pixel screen with no sideways scrolling, and the tap targets are large enough to hit with a thumb instead of a stylus.

Images were converted to WebP, with a rule I now apply everywhere: measure, never assume. Re-encoding an already lossy image faithfully can easily produce a file larger than the one you started with. If a converted image is not both smaller and visually intact, it does not ship.

Then the parts nobody sees and everybody depends on. A unique title and meta description on every page. Canonical tags. Open Graph. Local business structured data built from the address I confirmed with the owner rather than one I guessed at. A sitemap. A real robots.txt. The name, address and phone number visible in the footer, so the markup and the page agree with each other.

The pages are generated from a build script rather than hand edited. Page copy, titles and descriptions all live in one place, which turns a sitewide change into one command instead of nine files opened in sequence. The script also refuses to build if a title runs past 60 characters or a description past 160. I would rather argue with a script than with a search result.

Hosting moved onto a server I control, behind a tunnel. No shared hosting bill, no cPanel login nobody can find, no FTP client from a decade ago.

There is also a layer that did not exist when this site was built, because nothing like it existed yet. Assistants read the web now, and they read it badly when a site gives them nothing to work with. So the site got an llms.txt, a Link header pointing at it, content negotiation that will hand back markdown to anything that asks for markdown, crawl signals in robots.txt, and a discovery record in DNS. I confirmed all of it with a scanner rather than by looking at it and feeling good.

The contact form had never worked

This is the part I would put at the top of the invoice.

A form that silently fails is worse than no form at all. A site with no form tells a visitor to pick up the phone. A site with a broken form takes their message, thanks them politely, and drops it. They think they contacted the business. The business never knows they existed.

A broken contact form does not just fail to deliver a lead. It convinces the customer they already reached you.

The replacement is plain HTML with no JavaScript required to submit it. It has a honeypot field, a rate limit, and it relays through the client's own sending account so the mail comes from their domain rather than mine. A copy goes to us, which means a delivery problem shows up on my side before it shows up as a customer who never got a call back. Every failed send is logged, so a lead that bounces is recoverable instead of gone.

Two other things turned up while I was in there. The favicon was a zero byte file, and the edge had been happily caching that emptiness for a month at a time, which is why shipping a real icon is not finished until you also purge the old nothing. And the domain sent no mail at all, with nothing in its records to stop anyone from sending mail that claimed to be from it. Since it was not being used, I locked it shut.

None of those were on the list when the job started. All three were real, all three were checkable, and all three got fixed. Findings like that make the case for the next phase better than any score ever will.

The URLs were the asset

An old site that still brings in work has been accumulating links for as long as it has existed. Directory listings, a chamber page, a supplier's site, somebody's bookmarks, a printed card. Nobody has an inventory of those. Change the paths and you find out where they all were, one 404 at a time, from people who will not call to tell you.

So the paths stayed exactly as they were. Anything that did have to move got a redirect. The verification standard was simple. Every old URL either returns a 200 or returns a 301 I meant to create. A surprise 404 counts as a failed launch, not a detail to clean up later.

How I checked it before anyone saw it

Screenshots are not verification. A screenshot proves the page looked right on the one machine that took it. The check has to produce numbers.

  • Four widths: 320, 390, 768, and desktop. At each one, the page width measured against the viewport width, so sideways scroll is caught by arithmetic rather than by noticing it. Tap target heights, broken images, and navigation link counts measured the same way.
  • Lighthouse on mobile and desktop, both run locally.
  • Every URL from the old site requested individually, confirming a 200 or an intended 301.
  • Response headers checked directly: content security policy, canonical, the Link header, Vary, and cache rules per file type.
  • The form tested six ways: a valid send, a honeypot trip, a missing field, a malformed address, the rate limit, and one real delivery into a real inbox.
  • Both services confirmed as enabled, so the site comes back on its own after a reboot rather than after a phone call.

Form testing has its own rule, learned the way these things usually get learned. Test sends go to one of our own addresses first, from a scratch copy of the site running on a spare port, so the client's inbox stays clean until the test is one I actually meant to send them.

What fought back

A short list, because the useful part of any job like this is the friction.

Python's built in HTTP server speaks HTTP/1.0 by default and closes the connection after every response, which quietly undoes a chunk of the speed work until you tell it otherwise.

A strict content security policy with no connect-src blocked the audit tool from fetching robots.txt, and the tool reported it as a timeout. The file was fine. The policy was fine. The only thing actually wrong was the error message.

Adding one more item to the navigation wrapped the desktop menu onto two rows. The call to action moved up beside the phone number instead, and I started measuring header height and navigation row count after every change to site chrome, rather than looking at it and deciding it seemed fine.

And one for anyone automating this kind of work: do not kill a process by matching a pattern that also matches the shell you are typing in.

What it took

Three to three and a half hours of hands-on work, four at the outside. The number is small for a reason that has nothing to do with working fast. Every expensive decision on that site had already been made, and preserving those decisions instead of reopening them is most of what this job is. That is also nine pages. A bigger site is a bigger number.

Where this ended up

Enough of this was repeatable that it stopped being one job and became a defined one. It runs through Tri-Cities AI Lab now as Retromod Website Rescue: keep the look, replace the plumbing, preserve the URLs, make the contact path work, verify it before anyone sees it.

It is worth being clear about who it is not for. If you want a new look, this is not that, and pretending otherwise would just be a redesign with a smaller invoice attached. That is a different and larger job, and it should be quoted as one.

The scores at the end of a job like this are easy to show and easy to understand, which is exactly why they are the least interesting part. They are a receipt. The form that finally delivers a message is the thing that pays for itself.

About the author Dustin Lifford

Dustin Lifford is an intelligence analyst, AI consultant, and digital strategist based in Kingsport, Tennessee. He ran the web for the region's newspapers from 2012 to 2025.

Get in Touch

Questions, projects, or research problems, reach out directly.

Send me the messy version.

Describe the problem on the contact form. I read every message myself and tell you where I would start.