I almost quit three weeks in.

Seriously. I was sitting there, staring at a blank terminal and a local host that looked exactly like it did on day one. No users. No traffic. Just me, a pot of coffee that had turned into battery acid, and a validation tool screaming about nesting errors.

Most people launch fast. They throw together a React wrapper, slap some Tailwind classes on a pile of divs, and push to production. “Move fast and break things,” right? That’s the mantra. Get the users, then fix the tech debt.

I did the opposite.

I spent an entire month building infrastructure before I even thought about distribution. I’m talking about the boring, invisible stuff that gives indie hackers zero dopamine hits. Schema markup. Semantic structure. Accessibility trees. The kind of work that feels like digging a ditch while your friends are out racing cars.

But here’s the thing: now that I’ve launched, Google actually knows what my site is. My organic traffic is compounding while the “move fast” crowd is spending a fortune on ads to get eyeballs on a site that search engines can’t read.

The “Div Soup” Epidemic

Look, I love modern frameworks. I use them every day. But they’ve made us lazy. We’ve forgotten that HTML isn’t just a container for CSS; it’s a language.

I audited a site last week for a friend. It was a disaster. The entire homepage was just a nested nightmare of <div> tags. The navigation? Divs. The buttons? Divs with onClick handlers. The main article? You guessed it. A div.

To a browser (and more importantly, to a Google bot), that page is just a blob of meaningless noise. There’s no hierarchy. No signposts.

When I built my foundation, I forced myself to use semantic tags. If it’s a navigation bar, it gets a <nav>. If it’s independent content, it’s an <article>. Sidebar stuff? <aside>. It sounds trivial, but this is how you talk to the robots. You are literally telling the crawler, “Hey, this part here? This is the meat of the page. Ignore the sidebar ads.”

The result? My SEO scores hit 100 right out of the gate. Not because I’m an SEO wizard, but because I wrote HTML the way it was designed in the 90s.

HTML code on computer screen - HTML | Definition & Facts | Britannica
HTML code on computer screen – HTML | Definition & Facts | Britannica

Structured Data is the Cheat Code

If semantic HTML is the foundation, JSON-LD schema is the cheat code. I spent three days just writing structured data. Three days. For a site with no traffic.

It felt ridiculous at the time. Why am I hand-coding a recipe schema or an organization schema when nobody is here to see it?

Because search engines are dumb. Well, not dumb, but busy. They don’t want to guess what your content is. They want you to hand them a business card that says exactly who you are, what you do, and where your logo is.

I injected JSON-LD scripts into the <head> of every template. Now, when my pages show up in SERPs, they have the rich snippets. The stars. The pricing. The images. It takes up more screen real estate, which leads to a higher click-through rate, which signals to Google that the page is good, which ranks it higher.

It’s a flywheel. And you can’t bolt this on later—well, you can, but it’s painful. Baking it into the infrastructure from day one means every new page automatically inherits that power.

The Heading Hierarchy Trap

Here is a mistake I made early on: using heading tags for sizing.

“I want this text big, so I’ll make it an <h2>.”

Wrong. Stop doing that. I had to go back and refactor my entire component library because of this bad habit. Headings are the outline of your document. That’s it. They aren’t for style. CSS is for style.

Your <h1> is the title of the book. Your <h2>s are the chapters. Your <h3>s are the sections within chapters. If you skip from h2 to h4 because you “like the font size better,” you just broke the outline. Screen readers get confused. Search bots get confused.

I treat my HTML structure like a legal document now. If I strip away all the CSS, does the document still make sense? Is it readable? If the answer is no, I broke something.

Performance is HTML, Too

SEO performance dashboard - Seo performance dashboard Images - Free Download on Freepik
SEO performance dashboard – Seo performance dashboard Images – Free Download on Freepik

We obsess over JavaScript bundle sizes (rightfully so), but we ignore the DOM size. I’ve seen pages with 5,000 DOM nodes because of excessive wrapping.

Every extra wrapper is a tax on the browser’s main thread. During my “boring month” of infrastructure building, I ruthlessly cut nodes. Do I really need a container div inside a wrapper div inside a section? Usually, no. CSS Grid and Flexbox allow us to layout elements without needing a million helper divs.

By keeping the HTML flat and clean, my First Contentful Paint (FCP) dropped significantly. The browser parses the HTML faster, builds the CSSOM faster, and paints faster. It’s physics.

Accessibility isn’t a “Nice to Have”

I used to treat accessibility (a11y) as a checklist item to handle right before launch. “Oh, let me go add some aria-labels.”

That’s the wrong approach. It’s backwards.

When I focused on semantic HTML first, I realized something cool: I didn’t need many ARIA labels. A <button> is already accessible. It has keyboard focus. It announces itself as a button. A <div onClick> needs a role, a tab-index, and a keydown handler just to match what the button does for free.

SEO performance dashboard - SEO Client Dashboard How to Create One in 5 Easy Steps ...
SEO performance dashboard – SEO Client Dashboard How to Create One in 5 Easy Steps …

Native HTML elements are accessible by default. By using the right tag for the job, I got 90% of the way there without doing any extra work. The “infrastructure first” mindset meant accessibility wasn’t a feature I added; it was a property of the code I wrote.

The Payoff

So, was it worth it? Spending a month in the dark, tweaking meta tags and validating HTML while my competitors were shipping features?

Absolutely.

My first organic clicks came through yesterday. I didn’t pay for them. I didn’t beg for them on social media. Someone searched for a problem, and Google said, “Hey, this site is structured perfectly, loads instantly, and clearly answers the question. Go here.”

The traffic is small right now. But it’s high quality. And because the foundation is solid, I know that as I add more content, the site won’t buckle under its own technical debt.

Infrastructure before distribution. Always. It’s boring work. It’s lonely work. But when the traffic starts compounding, you’ll be glad you laid the bricks properly instead of just pitching a tent in the mud.

Your email address will not be published. Required fields are marked *

Zeen Social Icons