Shipping

Placeholder Content Will Ship Unless You Stop It

Placeholders are supposed to be temporary. In AI-built projects they're practically permanent residents, because both parties are trained to ignore them: the model generates [YOUR_NAME_HERE] as a helpful blank, and your eyes — after fifty viewings — stop seeing it entirely. Then a stranger opens the site and sees it instantly.

Why AI projects accumulate so many

Models are taught to avoid inventing your specifics, so they emit placeholders wherever a real value should go: product names, prices, domains, contact emails, social links. Each generation adds a few more. Nothing ever removes them — that part is on you, and it's nobody's explicit job.

The sweep: search, don't read

Reading pages to find placeholders doesn't work; familiarity blinds you. Search the project instead. The standard suspects:

  • lorem — filler prose in any form
  • [ and ] — bracketed tokens like [PRODUCT_NAME], [PRICE]
  • placeholder, TODO, FIXME, changeme
  • example.com, test@, your-domain, localhost
  • href="#" — links that go nowhere
  • 123-4567, 555- — fake phone numbers
  • console.log — debug output left running

Five minutes with project-wide search finds what five hours of rereading won't.

The sneaky ones: split placeholders and metadata

Two places plain search misses. First, placeholders broken across markup for styling — [PRODUCT_NAME] won't match a search for the full token; search for fragments too. Second, metadata humans never look at: page titles, meta descriptions, canonical URLs, and social-share tags routinely carry placeholder domains straight into search results — where they're maximally embarrassing.

Dead links deserve their own pass

Every href="#" is a promise the page doesn't keep. For each one: point it somewhere real, or remove the link styling so it doesn't invite a click. A button that does nothing reads as "broken," not "coming soon."

Where Vibe Coder Playground fits: some placeholders only exist at runtime — injected by JavaScript, rendered from a data file, or visible only in a specific state. Because the Playground shows the rendered DOM of the running app (not just the source), a sweep there catches what file search can't, and hot-reload lets you fix each one as you find it.

Make it the last gate

Do the sweep twice: once when you think you're done, and once more right before deploying — after the final regeneration, which loves to reintroduce a placeholder or two. It's the highest-value five minutes in shipping.

Next: The 15-minute pre-launch review →