Modern browsers render almost any HTML, no matter how loose, so broken markup often looks fine and ships. This tool flags every deviation from the HTML Living Standard: obsolete elements, unquoted attributes, self-closed non-void tags, missing alt text, duplicate IDs. Shares the audit cache with the other SEO tools.
https://tarotai.chat/
53 violations across 3 rules  ·  Full SEO audit →
0
Strict errors
1
Obsolete / deprecated
2
Style / non-minimal
53
Total occurrences
ERROR Strict errors: the W3C Nu validator would reject these. Missing required attributes, duplicate IDs, self-closed non-void elements, unsupported DOCTYPEs.
OBSOLETE Deprecated per HTML Living Standard §15. Browsers still render them but conforming validators flag them.
STYLE Valid but non-minimal: uppercase tags, XHTML-style <br />, redundant type="text/javascript". Legal HTML5, but not what the spec writes.
Accessibility
OBSOLETE

Form control without associated label

1 × on this page
Listed as obsolete / deprecated in the HTML Living Standard. · Rule: A11Y_INPUT_LABEL

Every form control needs a programmatic label (either a wrapping <label>, a <label for="id"> pointing at its id, or aria-label). Without one, screen-reader users hit an unlabelled field.

Fix: Wrap the control in a <label>, or use <label for="…"> matching the control's id.
✗ Example from this page
<textarea id="question-input" maxlength="200" placeholder="e.g.: How is my career development direction?" class="hero-textarea"></textarea>
✓ Correct form
<label for="email">Email</label>
<input id="email" type="email" name="email">
HTML Living Standard §4.10.4 — The label element →
Syntax
STYLE

Uppercase or mixed-case attribute name

26 × on this page
Valid HTML5, but inconsistent with the spec's recommended minimal form. · Rule: SYN_UPPERCASE_ATTR

HTML is case-insensitive for attributes but the spec, browsers' own DOM serialisation, and every popular linter normalise to lowercase.

Fix: Write attribute names in lowercase.
✗ Example from this page
<meta … charSet="…">
✓ Correct form
charset="…"
All 26 occurrences
L1 <meta … charSet="…">
L1 <link … fetchPriority="…">
L1 <link … hrefLang="…">
L1 <link … hrefLang="…">
L1 <link … hrefLang="…">
L1 <link … hrefLang="…">
L1 <link … hrefLang="…">
L111 <svg … viewBox="…">
L111 <svg … viewBox="…">
L111 <textarea … maxLength="…">
L111 <svg … viewBox="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <img … srcSet="…">
L111 <svg … viewBox="…">
L111 <svg … viewBox="…">
… (additional occurrences omitted)
HTML Living Standard §12.1.2.3 — Attributes →
STYLE

XHTML-style trailing slash on void element

26 × on this page
Valid HTML5, but inconsistent with the spec's recommended minimal form. · Rule: SYN_VOID_TRAILING_SLASH

<br/> and <img … /> are legal HTML5, but the / is completely ignored by the parser. It's a leftover from XHTML and the HTML spec explicitly notes it has no effect. Drop it for minimal, idiomatic HTML5.

Fix: Write the void element without the trailing slash: <meta>.
✗ Example from this page
<meta charSet="utf-8"/>
✓ Correct form
<meta>
All 26 occurrences
L1 <meta charSet="utf-8"/>
L1 <meta name="viewport" content="width=device-width, initial-scale=1"/>
L1 <link rel="preload" as="image" href="/icons/logomark.png"/>
L1 <link rel="preload" as="image" href="/images/responsive/home-seo/reader-selene-128.webp"/>
L1 <link rel="preload" as="image" href="/images/responsive/spread-avatars/time-flow-128.webp"/>
L1 <link rel="stylesheet" href="/assets/index-D-carxe-.css" data-rsc-css-href="/assets/index-D-carxe-.css" data-precedence="vite-rsc/importer-resources"/>
L1 <link rel="stylesheet" href="/assets/chatarot-landing-B4XWYAhh.css" data-precedence="vite-rsc/client-reference"/>
L1 <link rel="stylesheet" href="/assets/credits-purchase-BsaBMS_X.css" data-precedence="vite-rsc/client-reference"/>
L1 <link rel="stylesheet" href="/assets/footer-ask-ai-BiDk3-tz.css" data-precedence="vite-rsc/client-reference"/>
L1 <link rel="stylesheet" href="/assets/auth-copy-ss992XpR.css" data-precedence="vite-rsc/client-reference"/>
L1 <link rel="stylesheet" href="/assets/reading-markdown-CHhYNqBY.css" data-precedence="vite-rsc/client-reference"/>
L1 <link rel="stylesheet" href="/assets/reading-panel-D5WNxHtC.css" data-precedence="vite-rsc/client-reference"/>
L1 <link rel="modulepreload" fetchPriority="low" href="/assets/index-B5Ke6xtB.js"/>
L1 <link rel="modulepreload" href="/assets/global-error-CVl8f3Cz.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/framework-DJH1pfSr.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/rolldown-runtime-QTnfLwEv.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/url-utils-BQKFb685.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/error-DcKcIZ9f.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/navigation-BQCsymnQ.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/react-DlbkFqaW.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/BaseLink-DTXkRZde.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/locale-CIUEaCla.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/react-client-CAjdHkmk.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/layout-segment-context-DuEyTlkf.js" crossorigin=""/>
L1 <link rel="modulepreload" href="/assets/dist-BqFYcBMN.js" crossorigin=""/>
… (additional occurrences omitted)
HTML Living Standard §12.1.2 — Elements (void elements) →