Platform Support
oxc-tsrx publishes eight native packages, one per platform, and your install
downloads exactly the one that matches your machine. Publishing a platform is a
weaker promise than testing it, so this page says which is which, for all eight.
The tier names are not invented here. They come from Rust's platform support (opens in new tab), by way of uv (opens in new tab), which keeps the same three tiers and prints them as plain lists:
- Tier 1 is guaranteed to work. It is built and exercised on every pull request.
- Tier 2 is guaranteed to build. It is built and packaged for every release, and the tests are not run on it continuously.
- Tier 3 would be built and published and nothing else. It is empty here.
"Exercised" on this page means one thing: this project spawned the binary it just built on that platform and read what it printed. A successful compile is not an exercise, and neither is a packaging assertion.
Tier 1#
linux-x64-gnu(x86_64-unknown-linux-gnu)win32-x64-msvc(x86_64-pc-windows-msvc)darwin-arm64(aarch64-apple-darwin)
Every pull request, and every commit that lands on main, builds these three
from source on a runner of that operating system and architecture, and then, on
that same machine, runs:
- a real lint through the native binary, including a mixed batch of
.tsrxand ordinary TypeScript; - a real format, including the stdin path the
oxfmtcommand uses; - two live
--lspstdio sessions, one foroxlintand one foroxfmt; - a load of the
parser.nodeaddon built on that machine, followed by the parser API suite; - the pre-publish gate, which packs that platform's own npm package, installs it into a project outside this repository, and then lints and parses through the installed copy.
That is the install-arbitration job in .github/workflows/ci.yml, on
ubuntu-24.04, windows-latest, and macos-latest. linux-x64-gnu also
carries the full product suite, the one place the editor server, the type-aware
lane, and the JavaScript plugin lane run. So Tier 1 is not a claim that every
feature has been driven on every Tier 1 platform. See
Limitations for the named gaps.
Tier 2#
darwin-x64(x86_64-apple-darwin)linux-arm64-gnu(aarch64-unknown-linux-gnu)win32-arm64-msvc(aarch64-pc-windows-msvc)
Nothing runs on these three when a commit lands or a pull request opens. They are built and packaged for every release, and they are smoked when a release candidate is built.
That smoke is real work, not a compile check. release-candidate.yml gives each
target a runner of its own architecture and operating system (macos-15-intel,
ubuntu-22.04-arm, windows-11-arm), which runs the same lint, format, and
--lsp sessions as Tier 1 and loads that target's parser.node.
What they lack is a run tied to the change that would break them. The release
candidate starts by hand, so a regression on linux-arm64-gnu stays invisible
until someone cuts a release.
musl is Tier 2, with a carve-out#
linux-x64-musl(x86_64-unknown-linux-musl)linux-arm64-musl(aarch64-unknown-linux-musl)
These two get their own sentence, because the Tier 2 line above would flatter them. Neither has ever been executed on a musl system. There is no Alpine container and no musl runner in any workflow here: both are cross-compiled on a glibc runner, and the release candidate's smoke runs there too, which proves the binary carries its own libc and nothing at all about Alpine.
Their parser.node addon is built, checksummed, and packaged without ever being
loaded anywhere, because a musl-linked .node cannot be dlopen'd by a glibc
Node at all. That needs a musl Node on a musl system, a runner this project does
not have yet.
If you run oxc-tsrx on Alpine and something breaks, please
file it (opens in new tab). That report is what
would buy the Alpine lane.
Tier 3#
Empty. All eight targets are built and published on every release, so no platform sits in the "shipped with nothing behind it" tier.
Platforms with no package at all#
There is no JavaScript or WebAssembly fallback. If your platform is outside the eight above, npm installs no binary for it, and the commands stop with a message naming your platform:
OXC for TSRX has no native package for linux-riscv64That is deliberate. The alternative is a slow or subtly different fallback path that nobody tested either. Your route is building from source, which needs a stable Rust toolchain and no other setup.
How this page stays true#
The eight targets above are the ones packages/toolchain/dist/native-targets.js
declares, which is what the packaging scripts read.
tests/site/platform-support-matrix.test.mjs compares this page against that
file on every documentation run, so adding or dropping a target fails until this
page is updated. Which tier a target sits in stays a judgment call; that it
appears here at all is checked.