Gunnar

nordisk/gunnar

gunnar

gunnar

Fast setup: the guide · PDF — four lists of commands, one picture per setup.

Features: what is new, with status, source path and commit.

Git server in Rust, with two engine variants: znippy-based (Apache Arrow IPC in a znippy archive) or gix-based (traditional filesystem).

Building

Anyone can clone the repository read-only, with no registered SSH key:

git clone ssh://anonymous@git.gunnar.rs:2222/nordisk/gunnar.git
cd gunnar
cargo build --release -p gunnar-cli

A lone clone builds the server by itself, with nothing beside it:

git clone ssh://git.gunnar.rs:2222/nordisk/gunnar && cd gunnar && cargo build --release
./target/release/gunnar        # serves on loopback; http://127.0.0.1:8080/healthz answers ok

cargo build --release at the root builds the default member, gunnar (the server: engine-znippy, SSH and smart HTTP with TLS via --http-tls-*; no mimalloc, no company SSO, no monetize: --features mimalloc,sso adds those). The committed Cargo.lock is the crates.io lock, so cargo build --locked and cargo install --locked --path crates/gunnar-cli --features client work from a lone clone too (cargo xtask lone-clone proves it on every push). The root takes no sibling patch in any checkout. In an estate checkout, with ../edda, ../znippy, ../Skidbladnir, ../tunnr, ../draupnir and ../monetize beside it, the detached estate workspaces (gunnar-front, gunnar-monetize-guest, the benches, installtest) build against those siblings through the [patch.crates-io] in their own manifests, with --manifest-path.

This page documents gunnar 1.5.1 — the version gunnar --version prints.

License: AGPL-3.0-only, © 2026 Vetra Automation AB and Ignalina ApS (Rickard Ernst Björn Lundin). Commercial terms: COMMERCIAL-LICENSING.md.

Install the server with cargo

cargo install gunnar
gunnar

A bare gunnar serves on loopback with no configuration: SSH on 127.0.0.1:2222, smart HTTP on 127.0.0.1:8080, and health at http://127.0.0.1:8080/healthz. The default build compiles no monetize crate; the other variants are opt-in cargo features, listed in crates/gunnar/README.md.

Release provenance (SLSA Build L3)

Releases are built by dwarves, the build server, in its isolated release-build mode and carry signed SLSA v1 provenance: one in-toto statement per release, every artifact by its sha256, signed on the owner's YubiKey. The bundles are in attestations/, the release key in slsa/; how to verify (cosign, dwarves or Holger) and what still keeps us below L3: docs/SLSA.md.

Complexity and measurements

n objects, r refs, e refs in a batch, k batch size, s object size, |W|/|H| want/have closure. Read off the znippy engine's code.

operationznippy
put_packO(bytes), index deferred
put_refsO(r) + O(e·log n)
getO(log n) + O(s)
hasO(log n)
sizeO(log n)
extentsO(k·log n)
refsO(r)
update_refO(log r)
headO(log r)
headerO(log n)
reachableO(1) map lookup + bitmap OR
gcO(n) compact

Measured. Each row names its date. A dash means no measurement exists.

measurementgiteagixznippydate
clone, serve wall, 16384 commits—17.7 s7.23 s2026-09-01
push, receive-pack, 16384 commits—0.80 s1.54 s2026-09-01
RSS floor, 16384 commits—13.6 MB29.2 MB2026-09-01
reachable, 16384 commits—14.9 s5.6 ms2026-09-01
refs——30–50× faster than gix2026-09-01
header—~5× faster than znippy—2026-09-01
durable 8 KiB push, index included—50 573 µs (library writer, no fsync)147.7 µs2026-08-07
provision 100 000 users77 min, projected—6.1 s2026-08-12
ls-remote p50 @ 100 000 users27.0 ms—10.0–10.5 ms2026-08-12
ls-remote p99 @ 100 000 users39–43 ms—102–168 ms2026-08-12
ls-remote throughput1 140 req/s—2 060–2 320 req/s2026-08-12
clone (small), net CPU0.033 s—0.010 s2026-08-13
clone (small), peak RSS113 MB—2 308 MB2026-08-13
push (base), net CPU0.944 s—0.302 s2026-08-13
push (base), server→client bytes2.1 kB—1.4 kB2026-08-13

Conditions: 2026-09-01 rows, the desktop, 5 repetitions plus warm-up, load-1 mean 13.4, both engines in one binary. 2026-08-13 rows, the desktop, 32 cores, 3 interleaved rounds, 8 CPUs and 8192 MB per engine, byte counts taken by a counting relay. 2026-08-12 and 2026-08-07 rows, the desktop.

Thanks

Contributing, security and changes

Sponsors

None so far — we would love to have one. Contact gunnar@gunnar.rs.

AI-generated details: .nornir/detail.md

Files

.cargo/
.cli-out/
.github/
.nornir/
LICENSES/
assets/
attestations/
bench/
bench-stock/
crates/
deploy/
docs/
installtest/
release/
slsa/
vendor/
xtask/
.gitattributes
.gitignore
CHANGELOG.md
CLA.md
COMMERCIAL-LICENSING.md
CONTRIBUTING.md
Cargo.lock
Cargo.toml
LICENSE
NOTICE
README.md
SECURITY.md
THIRD_PARTY_LICENSES.md
TRADEMARKS.md
brokkr.toml
deny.toml
rustfmt.toml

The list is cut short here. Clone the repository for every file.

Newest commits

b68b11765ac0Merge slsa3/dwarves-server-builder into master (lane SLSA3): the release provenance's builder is dwarves, the build server. Docs only: no code, no lock change2026-10-29
576cb0141025SLSA: the builder is dwarves, the build server (lane SLSA3; owner 2026-10-29). docs/SLSA.md and the README name the dwarves server's builder id and the dwarves release-build commands. Docs only2026-10-29
e335a36a3746Merge badge1/version-1.5.1 into master (lane BADGE-1): workspace version 1.5.1, the newest tag v1.5.1; locks and README follow. Gate on the merged tree (ci4, dwarf): version_matches_tag 2/0, lock_current 4/0, readme_version 5/0, one_clone, publishable, publish_order, cargo_install_gunnar green; nornir docs check ok2026-10-29
53b77b518138release: workspace version 1.5.1, the newest tag (BADGE-1)2026-10-29
a8213b56be67Merge badge-docs/2026-10-29 into master (lane BADGE-DOCS): SECURITY.md, CONTRIBUTING.md, CLA.md (draft, pending the owners' legal review), CHANGELOG.md (1.5.1, 1.5.0, Unreleased; from .nornir/CHANGELOG.md), README with the anonymous clone URL and the three links2026-10-29