Installation
Install zfb with npm / pnpm or as a standalone binary without Node.
@takazudo/zfb ships as an npm package that pulls a prebuilt platform binary via npm optional-deps — no Rust toolchain required.
Choose one of two installation paths: use npm / pnpm for a Node-based project, or install the standalone binary without Node.
The following prerequisites apply to the npm / pnpm path.
The standalone and npm distributions provide the same CLI and commands; choose how to install it, not a different engine.
Prerequisites
You will need:
Node.js ≥ 22 — required by the npm CLI wrapper and by the
tscsubprocess that powerszfb check. The default TypeScript config loader itself runs inside zfb's embedded V8 runtime, not Node.pnpm ≥ 10 — install via the official installer. This matches the minimum declared in the published
@takazudo/zfbpackage'senginesfield; zfb scaffolds projects that use pnpm and will runpnpm installfor you when it can find pnpm on yourPATH. Contributors building the zfb monorepo itself need a newer pnpm — see From source (contributors) below.
Supported platforms
@takazudo/zfb ships a prebuilt platform binary via npm optional-deps for:
| Platform | Architecture | npm optional dependency |
|---|---|---|
| Linux (glibc) | x64 | @takazudo/zfb-linux-x64-gnu |
| Linux (glibc) | arm64 | @takazudo/zfb-linux-arm64-gnu |
| macOS | x64 | @takazudo/zfb-darwin-x64 |
| macOS | arm64 (Apple Silicon) | @takazudo/zfb-darwin-arm64 |
| Windows | x64 | @takazudo/zfb-win32-x64-msvc |
Linux needs glibc 2.34 or newer
The Linux binaries are linked against glibc 2.34, so they run on Amazon Linux 2023 (the default AWS Amplify Hosting and CodeBuild image), RHEL / Rocky / AlmaLinux 9, Ubuntu 22.04 or newer, and Debian 12 or newer. Older distros (Ubuntu 20.04, Debian 11) fail at startup with version `GLIBC_2.34' not found. Releases up to and including 3.1.0 required glibc 2.35, which excluded Amazon Linux 2023 — seeTroubleshooting if you are pinned to one of those versions.
musl/Alpine Linux is not supported yet
No @takazudo/zfb-linux-*-musl package exists. On Alpine (or another musl-based distro), the zfb wrapper detects the musl runtime at startup and exits with a friendly error — musl/ — instead of the confusing dynamic-loader failure the glibc binary would otherwise produce. Use a glibc-based Linux image (e.g. Debian/Ubuntu) instead.
Install the CLI
Install @takazudo/zfb as a dev dependency in your project:
pnpm add -D @takazudo/zfbnpm install -D @takazudo/zfbVerify the install
For a standalone installation, run zfb --version and zfb --help. For npm / pnpm, use the following command.
npx zfb --helpYou should see seven subcommands:
zfb new— scaffold a new projectzfb dev— start the dev server with watcher and live-reloadzfb build— produce a static buildzfb css— compile a CSS entrypoint without building the sitezfb wind— explain and audit zudo-wind candidates and generate manifestszfb preview— serve the build outputzfb check— typecheck the project and validate content collections against their schemas
If npx zfb --help prints all seven, you're ready to move on to Your first site.
From source (contributors)
If you are contributing to zfb itself and need to build the CLI from source, see BUILDING.md for full instructions including the Rust toolchain prerequisites.
The short path:
git clone https://github.com/Takazudo/zudo-front-builder.git
cd zudo-front-builder
pnpm install --frozen-lockfile
cargo install --path crates/zfbcrates/ embeds Hono from the workspace pnpm store, so install the workspace's JavaScript dependencies first; without them the build stops and asks for pnpm install --frozen-lockfile. The first build compiles V8 and takes 15 to 30 minutes.
Install without Node
zfb ships as a self-contained Rust binary. Node.js is not required to install or run it. Rolldown, the default bundler for pages and islands, and zudo-wind are compiled into the zfb binary and run in process. esbuild is embedded in the zfb executable's vendor snapshot, extracted at runtime, and invoked as a subprocess to compile zfb.config.ts and plugins (and to bundle pages and islands when ZFB_BUNDLER=esbuild is set). None of them is shipped as a separate release-tarball binary next to zfb. You only need Node as an opt-in escape hatch for specific features (see When Node is still needed below).
The Node-free path supports the full feature set for content sites: Markdown, MDX, HTML pages, and islands — Rolldown and zudo-wind are part of the binary itself, and esbuild runs as a standalone native binary extracted by zfb. Client-side hydration and CSS processing therefore work with zero Node involvement. See Styling for the CSS engine and authored-stylesheet contract.
Standalone supported platforms
| Platform | Architecture | Target triple |
|---|---|---|
| Linux (glibc) | x64 | x86_64-unknown-linux-gnu |
| Linux (glibc) | arm64 | aarch64-unknown-linux-gnu |
| macOS | x64 | x86_64-apple-darwin |
| macOS | arm64 (Apple Silicon) | aarch64-apple-darwin |
| Windows | x64 | x86_64-pc-windows-msvc |
Linux needs glibc 2.34 or newer
The two Linux binaries are linked against glibc 2.34: Amazon Linux 2023, RHEL / Rocky / AlmaLinux 9, Ubuntu 22.04+, and Debian 12+ all work. On an older glibc the binary fails at startup with version `GLIBC_2.34' not found. Releases up to and including 3.1.0 required glibc 2.35 instead — seeTroubleshooting.
musl/Alpine Linux is not supported
There is no musl-linked binary. install.sh detects OS and CPU architecture only — it cannot tell glibc from musl — so on Alpine (or another musl-based distro) it downloads the glibc x86_64-unknown-linux-gnu binary, which then fails to execute with a raw dynamic-loader error rather than a clear message. Use a glibc-based Linux image (e.g. Debian/Ubuntu) instead. (The npm install path detects musl and fails with a friendlier message — seeInstallation.)
Install paths
Linux / macOS — curl
curl -fsSL https://raw.githubusercontent.com/Takazudo/zudo-front-builder/main/install.sh | shInstalls zfb to $HOME/. Add that directory to your PATH if it isn't already:
export PATH="$HOME/.local/bin:$PATH"Environment variables:
| Variable | Default | Purpose |
|---|---|---|
ZFB_INSTALL | $HOME/.local | Install prefix. Binary lands at $ZFB_. |
ZFB_VERSION | (latest stable) | Pin a release. Use v1.0.0 for a specific tag, or latest-prerelease to opt into pre-releases. |
macOS — Homebrew
brew install Takazudo/tap/zfbThe tap is hosted at Takazudo/homebrew-tap. The formula is updated on each stable release by scripts/.
Homebrew tracks the stable channel
Like the npm latest tag, the Homebrew formula follows stable releases only — it has no per-version pin or prerelease opt-in. To install a specific version or a prerelease, use the curl installer with ZFB_VERSION (e.g.ZFB_VERSION=latest-prerelease) instead.
To update to a newer version later:
brew upgrade zfbWindows — PowerShell
irm https://raw.githubusercontent.com/Takazudo/zudo-front-builder/main/install.ps1 | iexInstalls zfb.exe to %LOCALAPPDATA%\.
Environment variables:
| Variable | Default | Purpose |
|---|---|---|
ZFB_INSTALL | %LOCALAPPDATA%\zfb | Install root. Binary lands at $ZFB_. |
ZFB_VERSION | (latest stable) | Pin a release tag (e.g. v1.0.0) or latest-prerelease. |
Add the binary to your PATH for the current session:
$env:PATH = "$env:LOCALAPPDATA\zfb\bin;$env:PATH"Or permanently (open a new terminal after running):
[System.Environment]::SetEnvironmentVariable(
'PATH',
"$env:LOCALAPPDATA\zfb\bin;" + [System.Environment]::GetEnvironmentVariable('PATH', 'User'),
'User'
)Windows — Scoop
Not yet available
A Scoop bucket (Takazudo/scoop-bucket) is planned but the bucket repository has not been created yet. Use the PowerShell script above in the meantime.
Verify the standalone install
zfb --versionConfig file: zfb.config.json vs zfb.config.ts
Both config formats work without Node. zfb.config.ts is evaluated in-process via the embedded V8 isolate that ships with the default zfb binary — there is no runtime Node dependency.
zfb.config.ts is a data config — node:* imports, process.env, and other Node-only APIs are not available inside the evaluator. Use zfb.config.ts when you want TypeScript types, comments, and computed values. Use zfb.config.json for a plain JSON alternative.
// zfb.config.json — also Node-free compatible
{
"outDir": "dist",
"collections": [
{
"name": "blog",
"path": "content/blog",
"schema": { "type": "object", "properties": { "title": { "type": "string" } } }
}
]
}If both zfb.config.ts and zfb.config.json are present, the .ts file wins.
When Node is still needed
The following features require Node in PATH:
| Feature | Why |
|---|---|
zfb check without --skip-tsc | TypeScript type-checking delegates to tsc, which is a Node package. Pass --skip-tsc to run the non-TS checks only. |
Cloudflare adapter (@takazudo/zfb-adapter-cloudflare) | The adapter depends on Wrangler, which is a Node CLI. SSR deployments to Cloudflare Workers always need Node in the deploy environment. |
Everything else — building, dev server, islands, zudo-wind, MDX, content collections, and zfb.config.ts evaluation — runs Node-free.
Upgrading zfb
There is no zfb upgrade subcommand. To update, re-run the same install command you used initially — it overwrites the existing binary with the latest version.