SPEED — zellij (sl0p fork)
Read this BEFORE running anything slow.
The single biggest trap in this repo: cargo build --release takes ~3 minutes for a
one-line change. [profile.release] sets lto = true + codegen-units = 1, so every
rebuild redoes whole-program optimization on one core. That is correct for shipping and
absurd for iteration.
Use the fastdev profile instead. Same opt-level = 3, no LTO, 16 codegen units,
incremental cache kept.
Commands
# cheap gate — ALWAYS before test/build
cargo check -p zellij-server # ~7s incremental
# narrow test — DEFAULT RUNG
cargo test -p zellij-server --lib ui::pane_boundaries_frame # ~5s incremental
cargo test -p zellij-utils --lib gap_and_padding_tests # ~5s incremental
# deployable binary for looking at it in a terminal
cargo build --profile fastdev -p zellij # ~3s incremental -> target/fastdev/zellij
# real release (shipping / benchmarking only)
cargo build --release -p zellij # ~3min <-- BACKGROUND ONLY
# full suite — BACKGROUND ONLY, once, at the gate
bgrun run suite -- cargo test -p zellij-server --lib
bgrun check suite
Measured timings
| command | time | notes |
|---|---|---|
cargo build --profile fastdev -p zellij (incremental) |
2.8s | zellij-server edit + relink |
cargo build --profile fastdev -p zellij (cold) |
2m29s | one-time, per profile |
cargo build --release -p zellij (incremental) |
~3min | LTO + codegen-units=1. Avoid in the loop. |
cargo test -p zellij-server --lib <filter> (incremental) |
4.8s | compile dominates; run is ~0.0s |
cargo test -p zellij-server --lib (full) |
~7s run | after compile; green |
cargo test -p zellij-utils --lib (full) |
~0.3s run | green |
Deploy loop (what we actually do)
cargo build --profile fastdev -p zellij \
&& rm -f ~/bin/zellij \
&& cp target/fastdev/zellij ~/bin/zellij # rm first: "Text file busy" if running
Then start a new session — a running server keeps its old inode. Config-only changes
(gap/padding/title_alignment) hot-reload; renderer changes do not.
TEST BASELINE: GREEN
Both crates pass clean. Any failure you see is yours — this is no longer a tree where failures are background noise.
cargo test -p zellij-server -p zellij-utils --no-fail-fast
# zellij-server: 1475 passed, 0 failed
# zellij-utils: 443 passed, 0 failed
Historical note: this tree used to carry 30 failures in zellij-server and 5 in
zellij-utils, from the first sl0p commit (aa51848d) onward. They were never real
bugs — aa51848d changed the scroll indicator and the frame-title rendering but did
not refresh the insta snapshots. Fixed in 5f2c28ab.
Two traps that hid this for so long, worth remembering:
- cargo stops at the first failing test binary. The 30
zellij-serverfailures meantzellij-utilsnever ran at all, so its 5 failures were invisible. Use--no-fail-fastwhen you want the true picture across crates. - insta aborts a test at its first snapshot mismatch. Tests that assert several
snapshots only reveal the next one once the previous is fixed, so regenerating
takes several passes. Loop until
.snap.newcount reaches 0.
Regenerating snapshots (no cargo-insta installed here):
find . -name '*.snap.new' -delete
INSTA_UPDATE=new cargo test -p zellij-server --lib
# REVIEW the .snap.new diffs before accepting -- they are the only thing
# standing between an intended UI change and a silent regression
for f in $(find . -name '*.snap.new'); do mv "$f" "${f%.new}"; done
SLOW TRAPS
cargo build --releasein the inner loop — 60x slower thanfastdevfor no benefit.cargo clean— forfeits the incremental cache; never without evidence of a stale artifact.cargo check --workspace --all-targets— fails on missing debug-profile wasm plugin assets (target/wasm32-wasip1/debug/*.wasm). Not a real error. Use-p <crate> --all-targets.- The gold linker "works" but rustc warns it is deprecated with known Rust bugs.
lldis NOT installed (onlyrust-lldinside the toolchain, which needs nightly flags to use). Not worth it — dropping LTO already removed the dominant cost.
Fork context
Branch sl0p/base. main tracks upstream and is left clean.
Custom options live in ui { pane_frames { title_alignment, gap, padding } }.
