Build from source
UniSSH builds from source with just as the monorepo task runner over cargo, npm, and wasm-pack. Make sure you have the prerequisites first: Rust 1.94+, a C toolchain, system OpenSSL, Node 20.19+/22.12+, and just.
The just targets
Section titled “The just targets”Run just with no arguments to list everything. The principal targets:
just # list all targets
# Rust workspace (core + server)just build # cargo build --workspacejust build-server # cargo build -p unissh-server --releasejust build-cli # cargo build -p unissh-cli --releasejust test # cargo test --workspace --lib --bins + cargo test -p unissh-serverjust test-pg # Postgres integration test (needs a live PG; single-threaded)just lint # log-redaction guard + cargo fmt --all --check + cargo clippy --workspace --all-targets -- -D warningsjust fmt # cargo fmt --all
# JS front-endsjust install # npm install in client and server-uijust build-wasm # wasm-pack build the server-ui crypto-wasm crate (release)just build-ui # build-wasm + npm run build in server-uijust build-client # npm run build in client (frontend only)just dev-client # npm run tauri devjust dev-ui # npm run dev (vite) in server-uijust tauri-build # npm run tauri build (desktop bundle)
# everything / cleanjust build-all # build (core+server) + build-wasm + build-client + server-ui buildjust clean # cargo clean + remove node_modules / dist / wasm pkgBuilding the core directly
Section titled “Building the core directly”The core builds and tests standalone, offline:
cargo build --workspacecargo test --workspaceThe ssh-transport and ffi integration tests spin up a local sshd, so they require sshd, ssh-keygen, and sftp-server to be installed. The crypto, keychain, storage, and vault crates need no network and no SSH tooling.
Building and running the server
Section titled “Building and running the server”cargo build --releasecp config.example.toml config.toml # then edit./target/release/unissh-server migrate --config config.toml # also auto-applied on serve./target/release/unissh-server --config config.tomlTesting the server:
cargo test # SQLite + the byte-compat oracle vs. rust-core
# Postgres integration (needs a live PG):docker run -d --name pg -e POSTGRES_PASSWORD=test -e POSTGRES_DB=unissh \ -p 55433:5432 postgres:16-alpineUNISSH_TEST_PG=postgres://postgres:test@127.0.0.1:55433/unissh \ cargo test -p unissh-server --test pg_integration -- --test-threads=1The oracle test runs the real core sync engine against a live server over HTTP and asserts identical results to the reference in-memory transport — so a successful cargo test proves wire-format parity with the core. See Server & API surface.
Building the admin panel
Section titled “Building the admin panel”The panel needs the wasm crypto module built first:
rustup target add wasm32-unknown-unknown # oncecargo install wasm-pack # once
npm run build:wasm # → crypto-wasm/pkg/npm installnpm run build # tsc --noEmit && vite build → dist/See Admin panel.
Building the client
Section titled “Building the client”cd clientnpm installnpm run build # typecheck + vite production build (frontend only)npm run tauri build # full desktop bundleA full tauri build (codegen + link) and on-device runs require a machine with a display and adequate disk. iOS has dedicated just targets (just ios-init, just ios-dev, just ios-build); Android builds run through the client’s own npm run tauri android …. See Desktop & mobile client.
For continuous integration and release artifacts, see CI/CD & releases. For deploying the built server, see Docker Compose deployment.