oxfmt 0.72.0 (5 Oct 2026) swaps its Prettier-backed Markdown path for the native oxc_formatter_markdown (breaking). ShopperCove formatted 221 Markdown drafts with oxfmt 0.71.0, 0.72.0 and Prettier 3.9.9: byte-identical output, ~2 s vs ~16 ms. Plus opt-in import sorting inside code fences, the documented divergences, ignore-file and LSP fixes. No affiliate links.
5 min read
No affiliate links. This is a frontend tooling note based on the oxfmt v0.72.0 release, PR #27256, the npm registry, and a scratch test on ShopperCove’s own Markdown drafts. Nothing in ShopperCove’s production build was changed for this article.
oxfmt is the Oxc project’s Prettier-compatible formatter, and it is also bundled in Vite+. Up to 0.71.0 it formatted Markdown by handing the file to a bundled Prettier (0.71.0 bumped that to Prettier 3.9.9). Version 0.72.0 shipped on 5 Oct 2026 (npm 11:03 UTC / 16:33 IST; GitHub release 11:04 UTC / 16:34 IST). It has one breaking change:
parser:markdown files are now formatted by oxc_formatter_markdown, Oxc’s own Rust Markdown formatter, instead of Prettier (#27256, merged 05:17 UTC / 10:47 IST).The PR says the output is "basically the same" as Prettier 3.9.9 and already includes some fixes Prettier has not released yet. Differences are recorded in DIVERGENCES.md.
Because code fences are now formatted by oxc_formatter instead of Prettier’s babel/typescript path, sortImports and sortTailwindcss now apply to JS/TS inside Markdown fences. Fence languages are detected with Shiki language names. Block ::: directives work in both VitePress (::: tip) and remark-directive (:::tip) style.
On 5 Oct 2026 we installed oxfmt@0.71.0, oxfmt@0.72.0 and prettier@3.9.9 in separate scratch folders on an 8-thread Linux box with Node 20.19.2. We then formatted copies of 221 ShopperCove body-clean-cms.md drafts (about 2 MB) using default options and an empty .oxfmtrc.json.
| Run | Wall time reported by the tool | Output vs Prettier 3.9.9 |
|---|---|---|
| oxfmt 0.71.0 (Prettier-backed Markdown) | 1,981–2,135 ms (3 runs) | Byte-identical on all 221 |
| oxfmt 0.72.0 (native Markdown) | 16–17 ms (3 runs) | Byte-identical on all 221 |
Both versions rewrote 186 of the 221 drafts (mostly * → _ emphasis, list markers, and table padding). They produced exactly the same bytes as each other and as Prettier 3.9.9. On this corpus the switch was invisible except for speed, roughly 120× faster. Your numbers will differ. Treat this as one site’s smoke test, not a benchmark.
On a small hand-written file:
"experimentalSortImports": {} in .oxfmtrc.json, 0.72.0 reordered a ```js fence (react before zod, then a blank line before the relative ./a import). 0.71.0 and Prettier left the order alone. Without that config, 0.72.0 did not reorder anything. If your docs or MDX snippets are meant to show a specific import order, review the first 0.72 diff.| not | table | and |---|---| lines (a lazy continuation, not a real table) was printed by 0.72.0 as one line: | not | table | |---|---|. 0.71.0 and Prettier kept two lines. This is the documented wrapped-block-starts divergence. Oxc joins the lines on purpose so the delimiter row cannot turn into a table the next time the file is parsed. Real tables separated by a blank line formatted the same in all three tools.Chinese/Japanese line breaks were also preserved under every proseWrap setting (#27331, aligned with the unreleased Prettier 3.10).
From the release notes:
!vendor/keep.ts no longer re-includes a file under an excluded vendor/ directory when formatting explicit paths, stdin, or in the LSP (#27237). This now matches Git and Prettier..prettierignore is reloaded when the file changes. Stdin mode checks global ignores before nested config and renders diagnostics with source.quoteProps: "consistent" now handles patterns and computed keys; comments between a callee and its opener stay on the callee side; embedded template layout is decided from the AST.will_break check on nested interned content was removed, and the Markdown IR buffer is pre-allocated.The same-day oxlint 1.87.0 (rule suggestions and a11y fixes) is covered separately.
oxfmt@0.72.0 on a branch and run oxfmt --check across **/*.md and **/*.mdx. Expect few or no diffs if you were already on 0.71.0 / Prettier 3.9.9.experimentalSortImports or Tailwind class sorting, expect new diffs inside Markdown code fences. Commit them separately from content changes.| … | |---| inside lists (the wrapped-block-starts case) and for leading *** thematic breaks (the leading-thematic-break divergence).!pattern re-includes under an ignored directory, note that explicit-path formatting now skips those files.oxfmt 0.72.0 drops Prettier from its Markdown path. On ShopperCove’s 221 drafts the output stayed byte-identical to Prettier 3.9.9, and formatting took ~16 ms instead of ~2 s. The visible changes are opt-in import/Tailwind sorting inside fences and a short, documented list of intentional divergences. Pin, run --check, and review the first diff.
Lab evidence
Sources read 5 Oct 2026 (Asia/Calcutta): npm registry oxfmt latest 0.72.0 published 2026-10-05T11:03:48Z (16:33 IST); GitHub release oxfmt_v0.72.0 11:04:20Z; PR #27256 merged 05:17:36Z (10:47 IST) — BREAKING parser:markdown via oxc_formatter_markdown, sortImports/sortTailwindcss now apply in fences, Shiki fence langs, ::: directives; 0.71.0 bumped bundled Prettier to 3.9.9; DIVERGENCES.md read (wrapped-block-starts, leading-thematic-break, url-escaping…). Hands-on in /tmp scratch on box (8 threads, Node 20.19.2): installed oxfmt@0.71.0, oxfmt@0.72.0, prettier@3.9.9; formatted copies of 221 ShopperCove body-clean-cms.md drafts (~2 MB) with empty .oxfmtrc.json: 0.71.0 'Finished in' 1981/2123/2135 ms, 0.72.0 16/16/17 ms; diff -rq 0.71 vs 0.72 vs Prettier = 0 files differ; 186/221 drafts rewritten vs source. Small fixture: with experimentalSortImports {} 0.72 reordered a js fence (react before zod, blank line before ./a), 0.71/Prettier did not; without config no reorder. List-item lazy '| not | table |' + '|---|---|' lines joined to one line by 0.72 only (documented wrapped-block-starts); proper table identical in all three. Prettier npm latest still 3.9.9 (23 Sep). No production build changed. No affiliate.
Biome published @biomejs/biome@2.5.15 on 30 September 2026: type-inference and HTML formatter performance, plus nursery rules for React defaults, Svelte runes, logical CSS, and more. ShopperCove upgrade checklist only; no affiliate.
Summary5 Oct 20264 min read
oxlint published v1.87.0 on 5 October 2026: suggestion support for three React/unicorn rules and jsx-a11y/label/mouse/lang hardening plus other fixes. npm latest 1.87.0 confirmed; ShopperCove docs checklist only; no affiliate.
Summary5 Oct 20264 min read
Biome 2.5.15 check vs ESLint 9.39.4 + Prettier 3.8.4 on react-hook-form (317 files): 0.41 s vs 18.7 s sequential stack (ESLint 13.58 s, Prettier check 5.22 s). migrate eslint: 54/476 direct, ~50% covered. Biome 200 errors/427 warnings vs ESLint 0/562; 9 format diffs; 287 noExplicitAny from recommended.
Summary5 Oct 20266 min read