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.
Unlock the repository-wide audit — $39 once
Checking the file you have open is free, against all 16 rules, and always will be.
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 Hubext 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
This page is the working piece. The full pack has everything below.
16 BEM naming rules read the HTML file you have open and 22 markup and SCSS skeletons write the stylesheet shell, so the class names get fixed before the pull request comes back for them.
$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· ReadyStack
Real numbers from this tool, line by line.

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.
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.
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.
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.
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.
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.
One question, answered by the person who built it. Your email only if you want the answer sent.