Overview
HTML is the contract between a page and screen readers, crawlers, reader modes, embedders, and LLM agents. This page is the checklist every page should clear; the detail pages cover each area.
Declare the language
Set <html lang="en"> (or the real language). Screen readers pick pronunciation from it, and WCAG 2.2 SC 3.1.1 requires it. Mark passages in another language with lang on the element.
Name regions with elements, not divs
Use <main> (one per page), <nav>, <header>, <footer>, <aside>, <article>, and <section> (with a heading) instead of classed <div>s. See html-semantic-elements.
Keep heading order
Use one <h1> matching the page title and descend without skipping: an <h3> only inside an <h2> section. Style headings with CSS; do not pick a level for its size. Screen readers and reader modes navigate by the heading tree.
Label every control and set autocomplete
Every form control needs a visible <label> bound with for and id, a specific autocomplete token, and the right type. The token supports password managers, autofill, and SC 1.3.5. See forms.
<label for="email">Email</label>
<input id="email" name="email" type="email" autocomplete="email" required />Use ARIA only when no native element fits
Use <button>, <details>, <dialog>, and form elements before ARIA. When a control has no visible text, such as an icon button, add aria-label, and keep the accessible name containing any visible text (SC 2.5.3). Style focus with :focus-visible. See html-aria-patterns.
Keep the head minimal and complete
Every page needs charset, viewport, a unique <title>, a description, and a canonical link. Add Open Graph tags for pages that get shared. Full list and rationale: html-head-tags. For structured data, ship JSON-LD (structured-data).
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Specific page title - Site name</title>
<meta name="description" content="One sentence that describes this page." />
<link rel="canonical" href="https://example.com/this-page" />Give images alt text and dimensions
Every <img> has an alt: descriptive for content, alt="" for decoration, never omitted. Set width and height so the browser reserves space and avoids layout shift. See html-multimedia and image-seo.