Analyze an HTML Heading Outline

Paste markup and get its H1-H6 outline, skipped-level and duplicate-heading warnings, plus literal element/tag counts.

Try:
Outline report

About this tool

html-outline-analyzer reads pasted HTML and reports two things that are useful for SEO, accessibility reviews, documentation cleanups, and migrations: the H1-H6 heading outline, and the element tags used in the source.

The outline keeps document order and records each heading's level, text, id, line/column, and hidden state. It also flags common structural problems: missing H1, multiple H1s, skipped heading levels, empty headings, duplicate heading text, and headings hidden with markup such as hidden, aria-hidden="true", or inline display:none.

Worked example

Input:

<h1>Getting started</h1>
<h2 id="install">Install</h2>
<p>Text</p>
<h3>macOS</h3>
<h3>Windows</h3>
<h2>Configure</h2>
<h4>Advanced flags</h4>

Default output includes:

HTML OUTLINE — 6 heading(s)
Levels: h1:1  h2:2  h3:2  h4:1

OUTLINE (6 headings)
    1  h1  Getting started
    2    h2  Install  #install
    4      h3  macOS
    5      h3  Windows
    6    h2  Configure
    7        h4  Advanced flags

The skipped h2h4 jump is listed in the issues section, and the tag-count section shows how many h1, h2, p, and other element tags were written.

Options and limits

FAQ

Is this the same as a browser DOM outline?

No. It scans the literal HTML you paste. That means tag counts reflect the source, not the DOM after a browser inserts implied elements or JavaScript mutates the page. This is useful for audits of generated markup and templates.

Does it use the old HTML5 outline algorithm?

No. The old sectioning algorithm is not implemented by browsers or assistive technology in a way authors can rely on. This tool reports the practical H1-H6 heading sequence and flags skipped levels.

Why is a hidden heading reported?

Hidden headings can affect audits and screen-reader behavior depending on how they are hidden. The analyzer marks headings with hidden, aria-hidden="true", or inline styles such as display:none and visibility:hidden so you can review them explicitly.

Can it analyze a live URL?

No. Paste the HTML source. Keeping the tool paste-only avoids network fetching, login/session problems, and server-side rendering differences. Use your browser's “View Source” or a crawler to collect markup first.

Is my HTML uploaded?

No. The Rust scanner runs locally in the WebAssembly page and in the CLI. Your markup is processed in your browser or terminal.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool html-outline-analyzer '<!doctype html>
<html>
<body>
<h1>Guide</h1>
<h2 id="install">Install</h2>
<p>Steps...</p>
<h3>macOS</h3>
<h2>Configure</h2>
</body>
</html>'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/html-outline-analyzer/?html=%3C%21doctype%20html%3E%0A%3Chtml%3E%0A%3Cbody%3E%0A%3Ch1%3EGuide%3C%2Fh1%3E%0A%3Ch2%20id%3D%22install%22%3EInstall%3C%2Fh2%3E%0A%3Cp%3ESteps...%3C%2Fp%3E%0A%3Ch3%3EmacOS%3C%2Fh3%3E%0A%3Ch2%3EConfigure%3C%2Fh2%3E%0A%3C%2Fbody%3E%0A%3C%2Fhtml%3E&format=tree&min_level=1&max_level=6&include_issues=true&include_counts=true&top_tags=20

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.