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
| Tool | Install |
|---|---|
| Rust | rustup |
wasm32-unknown-unknown target | rustup target add wasm32-unknown-unknown |
| wasm-pack | cargo install wasm-pack |
| bun | bun.sh |
| Python 3.11+ | For lintro |
| uv | curl -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:
check-deps— verifies cargo, bun, wasm-pack,wasm32-unknown-unknowntargetinstall—cargo fetch+bun installinapps/webwasm— builds WASM bindings toapps/web/wasm
Development servers
make dev
Starts two processes:
| Service | URL |
|---|---|
| Rust API server | http://localhost:3000 |
| Vite dev server | http://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
- Linting — code quality checks
- Web app — SolidJS structure
- Architecture — crate map