Development Setup#
This page is for contributors and for anyone building Ox Content itself from source.
If you just want to use the plugin or APIs, go back to Getting Started.
Prerequisites#
Before you begin, ensure you have the following installed:
| Requirement | Version | Installation |
|---|---|---|
| Rust | 1.95+ | Provided by nix develop (pinned in rust-toolchain.toml) or rustup.rs |
| Node.js | 26+ | Provided by nix develop or managed via devEngines.runtime in package.json |
| Vite+ | Latest | Available as vp inside the dev shell |
| wasm-pack | Latest | Provided by nix develop; needed when you run vp run build:wasm |
Clone and Bootstrap#
# Clone the repository
git clone https://github.com/ubugeeei-prod/ox-content.git
cd ox-content
# Enter the pinned development shell
nix develop
# Install JS dependencies
vp install
# Build all crates and packages
vp run build
# Run tests to verify installation
vp run test
Workspace Tasks#
Enter the pinned shell with nix develop, then run workspace tasks via vp run <task>.
The canonical task graph lives in vite.config.ts.
# Setup
vp install
# Building
vp run build
vp run build:rust
vp run build:rust-release
vp run build:napi
vp run build:npm
vp run build:wasm
# Testing
vp run test
vp run test:rust
vp run test:rust-verbose
vp run test:ts
vp run watch
# Code quality
vp run fmt
vp run fmt:check
vp run clippy
vp run lint
vp run check:panic-constructs
vp run ready
# Documentation
vp run doc:cargo
vp run doc:cargo-open
vp run deploy#docs
# Docs and examples
vp run dev
vp run dev:docs
vp run dev:playground
vp run playground
vp run integ-vue
vp run integ-react
vp run integ-svelte
vp run ssg-vite
# Benchmarks
vp run bench
vp run bench:rust
vp run bench:parse
vp run bench:bundle
Project Structure#
ox-content/
├── Cargo.toml # Workspace configuration
├── flake.nix # Nix flake wiring (inputs, systems, module list)
├── tools/nix/ # Nix modules: dev shell, packages, vp wrapper, Blacksmith CLI
├── package.nix # Nix build of the workspace binaries, via crane
├── rust-toolchain.toml # Rust channel, components, and targets for Nix and rustup alike
├── package.json # npm workspace metadata and devEngines runtime
├── vite.config.ts # Vite+ workspace task graph
├── crates/ # Rust crates
│ ├── ox_content_allocator/ # Arena allocator
│ ├── ox_content_ast/ # AST node definitions
│ ├── ox_content_parser/ # Markdown parser
│ ├── ox_content_renderer/ # HTML renderer
│ ├── ox_content_search/ # Full-text search engine
│ ├── ox_content_napi/ # Node.js N-API bindings
│ ├── ox_content_wasm/ # WebAssembly bindings
│ ├── ox_content_og_image/ # OG image generation
│ └── ox_content_lsp/ # Unified language server
├── npm/ # npm packages
│ ├── vite-plugin-ox-content/ # @ox-content/vite-plugin
│ ├── vite-plugin-ox-content-vue/ # @ox-content/vite-plugin-vue
│ ├── vite-plugin-ox-content-react/ # @ox-content/vite-plugin-react
│ ├── vite-plugin-ox-content-svelte/# @ox-content/vite-plugin-svelte
│ ├── vite-plugin-ox-content-solid/ # @ox-content/vite-plugin-solid
│ ├── unplugin-ox-content/ # @ox-content/unplugin
│ └── vscode-ox-content/ # VS Code extension
├── editors/ # Editor integrations
│ ├── zed/ # Zed extension
│ └── neovim/ # Neovim plugin
├── examples/ # Usage examples
├── docs/ # Documentation site
└── .github/workflows/ # CI/CD
Running Tests#
All Tests#
vp run test
# or
cargo test --workspace
Specific Crates#
cargo test -p ox_content_parser
cargo test -p ox_content_renderer
With Output#
cargo test --workspace -- --nocapture
Running the Docs and Playground#
# Start docs and playground together
vp run dev
# Only the docs site
vp run dev:docs
# Only the playground
vp run playground
Then open http://127.0.0.1:4173 for the docs site and http://127.0.0.1:5173 for the playground.
Deploying the Docs to Void#
Deploy the documentation site to Void with:
vp run deploy#docs
The task builds the Rust workspace and local npm packages before running
void deploy, and it uses a root base path so assets resolve correctly on
https://ox-content.void.app.
See Docs Deployment for environment variables and overrides.
Running Benchmarks#
vp run bench
vp run bench:rust
vp run bench:parse
vp run bench:bundle
Absolute ceilings for fixture bundle gzip, rendered HTML gzip, build time,
initial requests, and runtime floors live in tools/benchmarks/perf-budgets.json.
After a JSON sweep, check them with:
node tools/benchmarks/bundle-size/measure.mjs --json /tmp/bundle.json
node tools/benchmarks/bundle-size/check-budgets.mjs --bundle /tmp/bundle.json
The PR Benchmark job runs that checker on head measurements. Raise a ceiling
in the same PR as the intentional growth, or apply the
benchmark-regression-accepted label. See Performance.
For committed benchmark tables and charts, use the Blacksmith-backed docs refresh workflow instead of a local machine:
gh workflow run benchmark-docs.yml --ref main -f runs=7
That workflow runs on blacksmith-32vcpu-ubuntu-2404 and opens a PR with the
updated README.md, docs/content/performance.md, and benchmark SVGs. To run
the same generator locally, use:
vp run bench:docs
For quick remote checks against the Blacksmith testbox runner:
blacksmith auth login
TESTBOX_ID=$(blacksmith testbox warmup .github/workflows/testbox.yml --job testbox --idle-timeout 60)
blacksmith testbox run --id "$TESTBOX_ID" "vp run bench"
blacksmith testbox stop --id "$TESTBOX_ID"
The latest published benchmark snapshot lives on Performance.
Troubleshooting#
cargo: command not found#
Ensure Rust is installed and in your PATH:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
nix: command not found#
Install Nix with the official installer, restart your shell, then re-enter the repo:
nix develop
Build fails with linking errors#
On Linux, you may need build essentials:
# Ubuntu / Debian
sudo apt-get install build-essential
# Fedora
sudo dnf groupinstall "Development Tools"
On macOS, install Xcode Command Line Tools:
xcode-select --install
N-API build fails#
Ensure you are on the expected Node.js version:
nix develop
node -v
vp run build:napi
If you manage Node.js outside Nix, match the devEngines.runtime version in package.json.
wasm-pack: command not found#
The WASM build task expects wasm-pack to be available:
nix develop
vp run build:wasm
If you are not using Nix, install wasm-pack manually and make sure wasm32-unknown-unknown is available through rustup.