BEM Class Auditor and SCSS Skeleton Extractor for HTML

16 BEM naming rules read the HTML file you have open, and 22 markup and SCSS skeletons write the stylesheet shell — the class names get fixed before the pull request comes back for them.

Install free

Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.

VS Code MarketplacenpmMCP server (npx)Docker Hub
ext install ReadyStack.bem-class-extractor-html
npx @readystack/bem-class-extractor-html <file>
npx @readystack/bem-class-extractor-html --mcp

Team? One key for every ReadyStack linter, 5 seats, $149 once

Get the full rule table as a PDF
All 16 rules BEM Class Auditor for HTML and SCSS checks, each with its source and date, on printable pages you can hand to your team or auditor. We email it now, and once more only if a rule changes. No newsletter.

Get the full version $39

Runs the same 16 rules across every HTML file in the repository instead of only the one on screen, and writes the findings out as a CSV, JSON or HTML file you can attach to the pull request.

One payment, one licence key for this tool. The key is shown right after payment.

$73 an hour, the 2026 average freelance front-end developer rate (arc.dev, contractrates.fyi); a naming pass over a themed repo is at least one of those hours, and US mid-level contract rates run $89-$140.

Buy the full version — $39
ENDEJAESPT

Find a tool

· ReadyStack

Worked example

Real numbers from this tool, line by line.

Nothing in your toolchain is watching your class names

card.html
  1: camelCase class name. BEM names are lower kebab-case: cardTitle becomes card-title.
  2: The element separator is exactly two underscores: card_title becomes card__title.
  3: BEM has no element of an element. card__body__title becomes card__body-title, or a block of its own.
  4: The modifier comes last. card--wide__title becomes card__title with card__title--wide.
  5: The element separator is exactly two underscores: card_title becomes card__title.
  5: Scripting hook written with an underscore. Use a hyphen: js_toggle becomes js-toggle.
  6: Placeholder class name still in the markup. It will land in the stylesheet as a real selector.
  7: Five or more words in one BEM name. Split the block; the name is carrying the whole page path.
—— 8 ——

That is the output panel, one command after opening the file: eight findings on seven lines, each with its line number and the rule it broke. Line 5 is listed twice because that one class breaks two rules at once. Here is the entire file it read, nine lines of it:

<section class="cardList">
  <article class="card_item">
    <h3 class="card__body__title">Wireless keyboard</h3>
    <p class="card--wide__text">Low-profile keys.</p>
    <a class="js_open" href="/products/keyboard">See details</a>
    <span class="tmp-badge">New</span>
    <div class="site-header-card-list-item__meta">In stock</div>
  </article>
</section>

Nothing in there is exotic. It is one component, written quickly, by someone who knows the convention perfectly well. That is the point: BEM drift is not caused by ignorance, it is caused by nothing watching.

Because nothing is. Stylelint reads your stylesheet. Prettier reads your formatting. ESLint does not open HTML at all. None of them ever look at the class attribute in your markup, which is exactly where a BEM name is born. The name is wrong for the whole life of the branch, and the first thing that notices is a human being, in review, late.

That is the expensive part. Naming comments are the cheapest thing a reviewer can find and the most costly round to repeat, because the author has to go back, rename in the markup, rename again in the stylesheet, and push. And it gets worse with time: once those class names have been extracted into SCSS, the rename is no longer one file, it is two, and every partial that referenced the old block.

The BEM Class Auditor moves that round earlier, into the editor. It holds 16 naming rules and runs them over the HTML file you have open. Among them: camelCase names, single-underscore elements, an element of an element, a modifier written before the element it modifies, a modifier standing without its base class, presentational names like --red that describe paint instead of role, placeholder names like tmp and foo that survived into the commit, class names built by a template expression the extractor cannot resolve, eight or more utilities crowding out the block interface, and inline styles that will never reach the extracted stylesheet at all.

It also ships 22 skeletons: 11 markup blocks and the 11 matching SCSS shells for card, nav, modal, form, table, tabs, accordion, alert, breadcrumb, pagination and hero. Insert one at the cursor and the new block starts out correctly named, which is always cheaper than correcting it afterwards.

Auditing the file you have open is free, against all 16 rules, with no key and nothing held back. So is auditing just the lines you selected, and so is inserting all 22 skeletons. What a licence adds is scope and a take-away: the same 16 rules across every HTML file in the repository rather than the one on screen, and a findings file in CSV, JSON or HTML that you attach to the pull request instead of pasting a list into a comment. A freelance front-end developer averaged $73 an hour in 2026, and the naming pass is the round that repeats. The licence is $39 once.

15 seconds — what it actually does

Questions people ask

What does the BEM Class Auditor actually do?

It reads the class attributes in your HTML and checks them against 16 BEM naming rules, then lists each problem in the output panel with a line number and the corrected name. It also ships 22 skeletons, 11 markup blocks and their 11 matching SCSS shells, that you insert at the cursor so a new block starts out correctly named.

Who is this for?

Front-end contractors and agency developers who hand a server-rendered theme to a client's in-house team, and anyone on a codebase whose style guide says BEM. It suits WordPress, Shopify, Django and Rails templates, where the markup is HTML rather than JSX and no framework enforces the naming for you.

Why can't I just use Stylelint or a chatbot?

Stylelint reads your stylesheet, not the class attribute inside your HTML, so a name that never reaches CSS is never checked. A chatbot will rewrite one snippet you paste, but it cannot walk four hundred template files, and it cannot give you line numbers inside your own repository. This runs offline, on the files you have open.

What is free and what needs a licence?

Auditing the file you have open is free, against all 16 rules, with no key and nothing held back, as is inserting all 22 skeletons. A licence adds scope and a take-away: the same 16 rules across every HTML file in the repository, and a findings file in CSV, JSON or HTML that you can attach to the pull request.

What would this cost me otherwise?

A freelance front-end developer averaged $73 an hour in 2026, and US mid-level contract rates run $89 to $140. A naming pass over a themed repository is at least one of those hours, and it is the review round that gets repeated. The licence is $39 once, not per month.

Ask about this tool

One question, answered by the person who built it. Your email only if you want the answer sent.

Embed this tool on your site (free)

Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.

 All embeddable tools

For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →