Platform Support
This page mirrors PLATFORM_SUPPORT.md
at the repository root. That file is the canonical source — it is derived from the build matrices in
.github/workflows/publish.yaml. Update the root file first, then re-sync this page.
Legend: ✅ prebuilt shipped · ❌ not shipped · — not applicable
Desktop / server
Section titled “Desktop / server”| Binding (registry) | Linux x64 (glibc) | Linux arm64 (glibc) | Linux x64 (musl) | Linux arm64 (musl) | macOS arm64 | macOS x64 (Intel) | Windows x64 |
|---|---|---|---|---|---|---|---|
| CLI (standalone + npm proxy) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Java (Maven Central) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| C# (NuGet) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Elixir (Hex) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Node (npm) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ ¹ | ✅ |
| Python (PyPI) | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| Go (module + C FFI) | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| PHP (Composer / PIE) ² | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| Dart (pub.dev) ³ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| C FFI (GitHub release) | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| Zig (Zig package) ⁴ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ |
| Ruby (RubyGems) | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ |
Apple / mobile / portable
Section titled “Apple / mobile / portable”| Binding (registry) | macOS arm64 | iOS arm64 | Android arm64-v8a | Android x86_64 | wasm32 |
|---|---|---|---|---|---|
| Swift (SwiftPM artifactbundle) ⁵ | ✅ | ✅ | — | — | — |
| Kotlin / Android (Maven Central) ⁶ | — | — | ✅ | ✅ | — |
| WASM (npm) | — | — | — | — | ✅ ⁷ |
Known gaps and rationale
Section titled “Known gaps and rationale”- Node - macOS x64 (Intel) - dropped (rc.23). pyke ships no static x64-mac ORT, and
Microsoft’s last x86_64-macOS ONNX Runtime dylib is 1.23.2 (the CLI vendors that one), so at the
time CI provisioned ORT via Homebrew, whose bottle dynamically links a ~252-lib abseil closure
at absolute Homebrew paths. The self-containment vendor step
(
scripts/ci/vendor-macos-node-dylibs.sh) correctly rejected the non-portable package, and the Intel-mac node leg was dropped. Intel Mac users run the arm64 binding under Rosetta or use the WASM package. In rc.22 this leg failed (so no node package published at all); the drop lands in rc.23. - PHP builds against 8.3, 8.4, and 8.5 on every listed platform.
- Dart ships the server-mode native; the full pub.dev package has a known size blocker (all-platform natives exceed the 100 MB cap) tracked separately in the release notes.
- Zig consumes the C FFI GitHub-release artifacts, so its platform coverage equals C FFI’s.
- Swift targets Apple platforms only: macOS (Apple Silicon) and iOS (arm64). Intel-mac and iOS-simulator-x86_64 are excluded; there is no Linux or Windows SwiftPM artifact.
- Kotlin/Android ships the two Android ABIs:
arm64-v8a(devices) andx86_64(emulator). The x86_64-emulator native uses the ORT-freeandroid-targetfeature set (no PaddleOCR or embeddings); RT-DETR layout detection, the wired/wireless table classifier, and document-orientation detection now run on the x86_64 emulator too, through the pure-Rusttractengine (see note 8) instead of ORT. arm64 devices get the full ORT-enabled build. - WASM is a single
wasm32artifact, portable across any WASM runtime (browser and Node). It uses thewasm-targetfeature set (ocr-wasm,excel-wasm,layout-tract,auto-rotate-tract,ner-candle-wasm; no native ORT). Tree-sitter code intelligence is excluded: the 306-language grammar pack pushes the.wasmpast the 50 MB per-file limit of public CDNs (jsDelivr), so source files extract as text but are not parsed. Layout detection and document-orientation run through the pure-Rusttractengine (see note 8). Named-entity recognition runs in the browser through the pure-Rust candle GLiNER2 backend (see note 9). - Pure-Rust
tractengine. Where a target cannot link native ONNX Runtime, xberg’s inference seam can compile select ONNX models against the pure-Rusttractengine (tract-onnx, no native library, CPU-only) instead. Document-orientation detection (auto-rotate-tract) and RT-DETR layout detection (plus the wired/wireless table classifier, with thepdffeature) run this way, matching ONNX Runtime within 5e-3 on their outputs. Both are enabled forandroid-target(so the x86_64 Android emulator detects page orientation and layout for the first time) and forwasm-target: the WASM build exposesdetectLayout/detectOrientation, which take the.onnxweights as streamed bytes (the JS host fetches them and hands them to the seam). PaddleOCR, TATR, SLANeXT, and PP-DocLayout-V3 remain ONNX Runtime-only. - In-browser entity detection. The WASM build exposes
NerModel, which runs GLiNER2 named-entity recognition entirely inside the page — no server round-trip and no ONNX Runtime, through the pure-Rust candle backend (ner-candle-wasm, the no-tokio sibling of the nativener-candle). Weights are not embedded in the.wasm; the host fetches the safetensors, tokenizer, and encoder config and passes the bytes toNerModel.load. Unlike the byte-orienteddetectLayout/detectOrientationfunctions, the model stays resident across calls, so the weights are parsed once. Inference is synchronous CPU work on a single-threaded target — run it in a Web Worker if main-thread responsiveness matters.
Cross-cutting gaps
Section titled “Cross-cutting gaps”- musl (Alpine / static Linux): shipped only by CLI, Java, C#, Elixir, and Node. Python, Ruby, Go, PHP, Dart, C FFI, and Zig ship glibc-only Linux; musl consumers must build from source.
- Windows: every desktop binding ships Windows x64 except Ruby (no RubyGems Windows native) and the Apple/mobile/wasm bindings (not applicable).
- Intel Mac (macOS x64): shipped by most bindings; not by Node (see gap 1) or Swift.
- Linux arm64 musl exists only where full musl is listed (CLI, Java, C#, Elixir, Node).