← back
This div is inside a paragraph. That's illegal.

This Page Is Wrong

An ode to browser forgiveness. Every rule broken, nothing burned.

Validation Errors: 23 | Warnings: 47

Press Ctrl+U (or Cmd+Option+U) to view source.
The horror is in the details.

Crime #1: Invalid DOCTYPE HIGH
<!DOCTYPE html PUBLIC "THIS IS NOT A REAL DOCTYPE">
Spec says: DOCTYPE must be "html" or a valid public identifier.
Browser does: Shrugs. Enters quirks mode. Continues rendering.

Browsers have seen worse. Much worse. They learned to cope.

Crime #2: Forbidden Nesting HIGH
<p><div>Block inside inline</div></p>
Spec says: Paragraphs cannot contain block-level elements.
Browser does: Silently closes the <p> before the <div>, opens a new one after.

This paragraph contains

a div that shouldn't be here
but the browser handles it.

Crime #3: Unclosed Tags MEDIUM
<div><span><strong>Never closed... </div>
Spec says: All elements must be properly closed.
Browser does: Infers the missing end tags. Carries on.
These tags are never closed but the text still renders correctly.
Crime #4: Malformed Attributes LOW
<html class> <!-- empty class attribute --> <div data-crime data-number=""> <!-- valueless and empty -->
Spec says: Boolean attributes are fine, but empty strings are questionable.
Browser does: Accepts them all. Attributes are present, values are empty strings.
Crime #5: Deprecated Elements MEDIUM
<center><font color="red"><marquee>1999 called</marquee></font></center>
Spec says: These elements are obsolete. Do not use.
Browser does: Renders them anyway. Nostalgia mode engaged.
The web never forgets. It just pretends to.
Crime #6: Invalid Characters in Attributes LOW
<div xmlns:made-up="http://not.real"> <span 🔥>Fire emoji as attribute</span>
Spec says: Attribute names must be ASCII. Namespaces must be declared.
Browser does: Ignores the made-up namespace. The emoji? Depends on the browser.
Crime #7: Script in Wrong Place MEDIUM
<table> <script>console.log("I'm in a table!");</script> <tr><td>Data</td></tr> </table>
Spec says: Script elements have specific placement rules.
Browser does: Hoists the script, executes it, renders the table.
id="crime8">
Crime #8: Comment Inside Tag HIGH
<div <!-- this shouldn't be here --> id="crime8">
Spec says: Comments cannot appear inside tags.
Browser does: Parser recovery kicks in. Results vary wildly between browsers.
Crime #9: Overlapping Tags HIGH
<b><i>Bold and italic</b> just italic?</i>
Spec says: Tags must nest properly. No overlapping.
Browser does: Reconstructs the formatting elements. Magic.
Bold and italic just italic?

Why Does Any of This Work?

"Be conservative in what you send, be liberal in what you accept."
— Postel's Law (The Robustness Principle)

Browsers implement one of the most forgiving parsers ever written. They have to. The early web was chaos—hand-written HTML with every possible mistake. If browsers crashed on invalid markup, the web wouldn't exist.

The HTML5 spec doesn't just define valid HTML. It defines exactly how to handle invalid HTML. Every edge case. Every malformed tag. Every forgotten close bracket.

This page is a tribute to that resilience. Every crime here is committed in the source. Yet you're reading this just fine.

The web works despite itself.

This page passes zero validators.
It renders perfectly in every browser tested.

Hidden table data