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.83+ Provided by nix develop (pinned in flake.nix) or rustup.rs
Node.js 24+ Provided by nix develop or managed via .node-version
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 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 dev shell (Node.js, workspace bootstrap, Rust, Vite+ wrapper)
├── .node-version           # Node.js version for CI / setup-node compatibility
├── 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
│   ├── 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

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 version in .node-version.

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.

Getting Help