Development Setup

Guide for setting up and running Rustume locally for development.

This guide covers native development for the Rustume monorepo. For Docker-only usage, see Docker deployment.

Prerequisites

ToolInstall
Rustrustup
wasm32-unknown-unknown targetrustup target add wasm32-unknown-unknown
wasm-packcargo install wasm-pack
bunbun.sh
Python 3.11+For lintro
uvcurl -LsSf https://astral.sh/uv/install.sh | sh

Optional: cargo-watch for auto-reload (cargo install cargo-watch).

Initial setup

git clone https://github.com/lgtm-hq/Rustume.git
cd Rustume
make setup

make setup runs:

  1. check-deps — verifies cargo, bun, wasm-pack, wasm32-unknown-unknown target
  2. installcargo fetch + bun install in apps/web
  3. wasm — builds WASM bindings to apps/web/wasm

Development servers

make dev

Starts two processes:

ServiceURL
Rust API serverhttp://localhost:3000
Vite dev serverhttp://localhost:5173

Use port 5173 for development — Vite proxies API calls to the Rust server. Swagger UI: http://localhost:3000/swagger-ui/ — see API overview.

Auto-reload

make dev-watch   # requires cargo-watch

Restarts the Rust server on file changes. Vite HMR handles web hot reload automatically.

Build targets

make build         # WASM + server + web production bundle
make wasm          # WASM only
make server-build  # release server binary
make web-build     # production web bundle
make preview       # serve production build locally

Running tests

make test                              # all workspace tests
cargo test -p rustume-schema           # single crate
cargo test -p rustume-server           # server integration tests
cd apps/web && bun run test            # Vitest for web app

See Architecture overview for the full test matrix.

Typst template overrides

Native CLI and server builds embed Typst templates at compile time. To iterate on a template without rebuilding Rust, copy crates/render/src/typst_engine/templates/*.typ into a directory and set RUSTUME_TEMPLATES_DIR to that path. Files present in the override directory replace the embedded copy on each render; missing names fall back to the embedded defaults. The WASM build always uses embedded templates only.

mkdir -p ~/rustume-templates
cp crates/render/src/typst_engine/templates/*.typ ~/rustume-templates/
export RUSTUME_TEMPLATES_DIR=~/rustume-templates
# edit templates, then re-run preview/PDF without cargo build

See Templates and Environment variables for more detail.

Cloud development

To develop Rustume Cloud features locally:

cp .env.example .env
# Set RUSTUME_CLOUD=true, DATABASE_URL, WORKOS_*, SESSION_SECRET
docker compose --profile cloud up    # starts Postgres + server on :3000
make web                             # Vite frontend only (avoid port clash with Docker API)

WorkOS development credentials required for auth flows — see Environment variables and Authentication.

Project layout

Rustume/
├── crates/          Rust workspace (cli, parser, render, schema, schema-macros, server, storage, utils)
├── apps/web/        SolidJS resume builder
├── apps/site/       Astro documentation site
├── bindings/wasm/   wasm-pack output for the web app (not under crates/)
├── docker/          Dockerfile
├── docs/            Legacy markdown docs
└── scripts/         CI and utility scripts

Troubleshooting

Swagger UI download fails at build time — set SWAGGER_UI_DOWNLOAD_URL to a local zip. See CONTRIBUTING.md.

wasm32-unknown-unknown target missing — run rustup target add wasm32-unknown-unknown.

Port 3000 in use — set PORT=3001 and update Vite proxy config.

Next steps