Compatibility
"Shiki-compatible" is checked, not claimed. Ferriki tracks one approved Shiki release at a time, currently Shiki v4.4.3.
How it is checked
- A pinned mirror of Shiki. Shiki's own tests run unchanged against Ferriki's native engine from an immutable mirror in the repository. Every mirrored file is recorded with its SHA-256 digest and verified before and after a test run; Ferriki-specific glue lives outside the mirror.
- A pinned vscode-textmate oracle. The tokenizer is a mechanical port of vscode-textmate v9.3.2, checked against vscode-textmate's own test cases.
- Explicit exclusions. Upstream tests outside Ferriki's scope are listed in a machine-checked manifest, each with its reason and owning issue.
The Node compatibility gate covers the standard catalogs, language aliases, themes, HTML output, lazily embedded grammars, injections, custom registrations, multi-theme HTML, and the supported public exports.
Scope
| Area | Ferriki |
|---|---|
| Highlighting runtime and HTML output APIscodeToHtml and codeToHtmlWithCss, with reusable highlighters. | Yes: Part of Ferriki |
| Transformers and decorationsJavaScript hooks around the native pipeline. | Partial: The @shikijs/transformers package is external. |
| rehype, markdown-it and other adaptersAdapters stay in the Markdown layer and consume rendered HTML. | No: Outside Ferriki. |
| Browser runtime, WASM and engine selectionFerriki runs in Node.js and Rust. | No: Not a goal. |
Platforms
Node.js 22.13.0 or newer, with a native binary per target:
| Native target | Ferriki |
|---|---|
| linux-x64-gnu, linux-arm64-gnuLinux, glibc | Yes: Supported |
| linux-x64-musl, linux-arm64-muslLinux, musl (Alpine) | Yes: Supported |
| darwin-arm64macOS on Apple Silicon | Yes: Supported |
| win32-x64-msvc, win32-arm64-msvcWindows | Yes: Supported |
| darwin-x64macOS on Intel | No: Not supported |
The full policy, including how to report a gap, is docs/compatibility.md.
Native Markdown highlighting acceptance examples
The homepage production build compiles these fences through Ardo's native Markdown path. They are the fixed corpus for reviewing TypeScript, TSX, embedded HTML, unknown-language fallback, themes, and code metadata.
src/add.ts
export function add(left: number, right: number) {
return left + right;
}
src/Button.tsx
type ButtonProps = { label: string };
export function Button({ label }: ButtonProps) {
return <button type="button">{label}</button>;
}
public/widget.html
<style>
.notice {
color: rebeccapurple;
}
</style>
<script>
document.querySelector(".notice")?.classList.add("ready");
</script>
data/example.unknown
<raw value="literal & safe">