Legend
| Symbol | Meaning |
|---|---|
| β | Full, stable native support |
| π‘ | Experimental or partial (e.g. <script> blocks only) |
| β | In progress per official docs |
| π | Supported via an official or community plugin |
| β | Not supported |
Linting Support
| Language | Biome | Oxlint | ESLint | Stylelint |
|---|---|---|---|---|
| JavaScript | β | β | β | β |
| TypeScript | β | β | π | β |
| JSX | β | β | β | β |
| TSX | β | β | π | β |
| JSON | β | β | π | β |
| JSONC | β | β | π | β |
| CSS | β | β | π | β |
| SCSS | β | β | β | π |
| Sass | β | β | β | π |
| Less | β | β | β | π |
| HTML | β | β | π | π |
| Vue | π‘ | π‘ scripts | π | π |
| Svelte | π‘ | π‘ scripts | π | π |
| Astro | π‘ | π‘ scripts | π | π |
| GraphQL | β | β | π | β |
| Markdown | β | β | π | β |
| MDX | β | β | π | β |
| YAML | β | β | π | β |
Formatting Support
| Language | Biome | Oxfmt | Prettier |
|---|---|---|---|
| JavaScript | β | β | β |
| TypeScript | β | β | β |
| JSX | β | β | β |
| TSX | β | β | β |
| JSON | β | β | β |
| JSONC | β | β | β |
| CSS | β | β | β |
| SCSS | β | β | β |
| Sass | β | β | π |
| Less | β | β | β |
| HTML | β | β | β |
| Vue | π‘ | β | β |
| Svelte | π‘ | π‘ | π |
| Astro | π‘ | π‘ | π |
| GraphQL | β | β | β |
| Markdown | β | β | β |
| MDX | β | β | β |
| YAML | β | β | β |
Notes
Biome
Biome is the only tool here that explicitly tracks parse, format, and lint support per language as separate columns. The official language-support matrix is the source of truth. Vue, Svelte, and Astro are flagged as experimental and subject to change. SCSS, YAML, and Markdown are listed as in-progress for formatting, with linting not yet started.Oxlint
Oxlint is a JavaScript and TypeScript linter β thatβs it. For framework files (.vue, .svelte, .astro) it lints only the <script> block; templates are not parsed. If you need linting for CSS, JSON, YAML, or similar formats, Oxlint is not the right tool and youβll need to pair it with something else.
Oxfmt
Oxfmt targets Prettier-style formatting breadth and is much wider than Oxlint. Its docs list JavaScript, JSX, TypeScript, TSX, JSON, JSONC, JSON5, YAML, TOML, HTML, Angular, Vue, CSS, SCSS, Less, Markdown, MDX, GraphQL, Ember, and Handlebars as supported. Svelte and Astro currently land in the partial/experimental bucket across the Oxc stack.ESLint
Core ESLint only parses JavaScript (and JSX withecmaFeatures.jsx). Everything else β TypeScript, Vue, Svelte, Astro, JSON, YAML, Markdown, HTML, CSS β requires a custom parser or dedicated plugin (@typescript-eslint, eslint-plugin-vue, @eslint/json, @eslint/markdown, @eslint/css, etc.). That plugin ecosystem is by far the largest of any tool on this page, but it comes with more configuration surface area.
Prettier
Prettier ships the widest built-in language coverage of any tool here, including Vue and Angular templates natively. Svelte and Astro are the notable exceptions: both are commonly used but rely on community plugins (prettier-plugin-svelte, prettier-plugin-astro). Indented Sass also requires a plugin.
Stylelint
Stylelint natively handles CSS. Everything else CSS-adjacent β SCSS, Sass, Less, CSS-in-JS,<style> blocks inside HTML or framework files β works through PostCSS custom-syntax plugins (postcss-scss, postcss-less, postcss-html, and so on). It does not lint JavaScript, TypeScript, JSON, or other non-style formats.
Choosing a toolchain
Three quick rules of thumb:- If your project is primarily JavaScript, TypeScript, JSON, CSS, and GraphQL, Biome gives you the tightest, fastest single-binary experience.
- If you need the widest language coverage or rely on language-specific ecosystem rules (e.g. deep Vue, Svelte, or Astro tooling), ESLint + Prettier + Stylelint is still the most complete option.
- If raw lint speed on a large JS/TS codebase matters most, Oxlint + Oxfmt is the fastest of the three. Pair it with Stylelint if you also need CSS linting.