A self-contained, offline-first toolkit for engineering work environments.
- Old Linux distros
- Limited or no internet access
- No
sudo/ no root - Built from 30+ years of engineering workflow experience
- All built on AlmaLinux 8.10 (RHEL 8 clone), glibc 2.28
- Compatible with RHEL 9.x and beyond
Drop the release tarball onto a locked-down workstation, run two commands,
and you have modern Linux tooling and sane configurations under your $HOME
-- no installer, no admin, no internet.
Download the .tar.gz release archive from the
latest release,
then extract and run -- nothing is built or compiled, the archive ships every
binary, library, font, and config file ready to install:
tar xzf engineering-loadout-v*.tar.gz
cd engineering-loadout-v*/
./tools/fetch-stash # Neovim plugins -- see below
./loadout install @shared-all # bundled tools, fonts, runtimes
./loadout install @envs-all # per-user shell/editor configsThe first install puts the shared tree -- command-line tools, editors,
runtimes, and data -- under $XDG_DATA_HOME/loadout
(~/.local/share/loadout); the second writes the per-user shell and editor
configuration under $HOME/.config. Reload your shell with exec bash when
the second finishes. See Installation for the layout,
PATH rules, and how to move an existing install.
A default install keeps two trees separate. The shared payload (binaries,
libraries, runtimes, data) lands under the install root --
$XDG_DATA_HOME/loadout, i.e. ~/.local/share/loadout -- while per-user
configuration, caches, and Neovim state always stay under the real $HOME
(~/.config, ~/.cache, ~/.local/share/nvim). Configuration never moves
into the install root, even for a split or --dest-dir deployment.
The root is chosen in this order: an explicit --dest-dir DIR on the command
line, then dest_dir in ~/.config/engineering-loadout/config.toml, then the
XDG default. Setting dest_dir = "~" restores the legacy $HOME/.local
layout. A root that is not $HOME is used verbatim as a prefix (<root>/bin,
<root>/share); only a $HOME root keeps the dotted .local level.
On PATH, the shared bin is appended so the distribution's own copies
keep priority, and <prefix>/prefer is prepended: the installer writes a
small exec shim there for each explicitly preferred tool. env-tmux prefers
the bundled tmux; add prefer = ["firefox"] or prefer_off = ["tmux"] to
config.toml to change that. See
Installation if you are
moving from an older ~/.local install.
The plugin stash is a separate release asset, not part of the tarball --
it is ~328 MB of bz2'd git packfiles, so committing it would grow every clone
permanently. ./tools/fetch-stash downloads and verifies it against the release.
If this machine cannot reach GitHub, download nvim-plugin-stash.tar.bz2 and
sha256sums.txt from the release on any machine that has GitHub access, copy
both over, and pair them by hand:
./tools/fetch-stash --from-file /path/to/nvim-plugin-stash.tar.bz2 \
--sums /path/to/sha256sums.txt \
--tag <release tag>--sums and --tag are required: the release's signed tag carries the sha256
of its sha256sums.txt, and fetch-stash checks the sums file against it
(git verify-tag, so this needs a clone holding the tag and the release
signer in gpg.ssh.allowedSignersFile). Releases before 2026-10-27 do not bind
their sums file; for those, or from a tarball with no .git, add
--allow-unverified-sums, which trusts GitHub-over-HTTPS only. A stash that
fails its hash is refused and never installed. Do not copy
the asset into place manually -- .content-manifest is a strict allowlist, so
a hand-placed stash is refused, not silently trusted.
Skipping it is safe only for a core/editor-only Neovim: Neovim still installs,
but the installer cannot run the offline headless Lazy sync that makes the first
interactive launch warning-free. For a normal env-nvim install, fetch and
install the stash so Lazy.nvim and the active plugins are cloned from local
mirrors before the user ever starts Neovim.
Re-run the same command against a newer release tarball to update. Unchanged files are skipped, so re-runs are quick.
Deploying to a compute farm or an air-gapped site? The steps above are the single-machine case. For a shared read-only tree, per-user config, the Neovim plugin stash, and getting everything across a network whose policy changes --- see the Deployment Runbook. Full install details are in Installation.
Name packages or groups the same way dnf or apt works:
./loadout install @shared-all # all bundled tools (shared tree)
./loadout install @envs-all # all per-user config bundles
./loadout install octave # one package
./loadout install parity-plot # parity-plot CLI + local designer
./loadout install @gui-suite # a group
./loadout install @shared-all --skip @fonts-all # all tools minus fonts
./loadout list # browse packages
./loadout list vim helix # name matches either filter
./loadout list --tag editor # filter by tag
./loadout search vim # substring search (shows @groups)
./loadout info gvim # details for one package
./loadout install octave --dry-run # preview only
./loadout reinstall octave # redo every step, even if currentinstall over an up-to-date tree is fast: each step that placed files left an
install stamp (<prefix>/.loadout-stamps/), and a step whose source bytes are
unchanged and whose files are untouched (same size, mtime, inode and mode) is
skipped. A no-op install @shared takes about 14 s instead of 3.5 minutes. An
edited, deleted, chmod'ed or replaced file, a new payload or a new installer
version redoes the step. reinstall ignores the stamps.
| Component | Description |
|---|---|
| Bash | Layered shell config, 100+ aliases, fzf / zoxide / eza / bat integration |
| Neovim | LSP, 326 offline Tree-sitter parsers, curated plugin set |
| Vim | Vim 9.2 with NERDTree, SimpylFold, and vim-liberty bundled |
| Tmux | Sessions that survive reboot (tmux-persist), Ctrl-\ prefix |
| Helix | Ready to run offline |
| Starship | Cross-shell prompt, one shared config for bash, zsh and tcsh |
| WezTerm | Terminal emulator config |
| EditorConfig | Consistent formatting across all editors |
| Command-line tools | 100+ modern CLI utilities, ready offline -- see table below |
| Nerd Fonts | 12 font families |
Offline-first. Plugins, parsers, fonts, and binaries are bundled. Nothing is fetched at install time. Ship it to an air-gapped workstation and it just works.
No root. Everything lands in a user-owned tree -- by default
~/.local/share/loadout for the shared payload plus $HOME/.config for
configuration, or a --dest-dir prefix. No package manager, no sudo, no IT
ticket.
Shared-tree installs stay relocatable: bundled runtime/data assets live under
the install root (<prefix>/share, or the staged prefix) and shell init
exports the paths needed for discovery, including TERMINFO_DIRS for bundled
st terminfo.
Multi-platform Linux. RedHat 7 / 8 / 9, Suse, x86_64 / ARM / PowerPC. Windows and macOS are not supported (the platform vocabulary was retired 2026-08-31); Linux-only is the whole surface.
Layered configuration. Shell settings flow from lowest to highest precedence:
Global -> Corp -> Site -> Team -> Project -> User
Each layer overrides the previous without touching the upstream files.
Personal tweaks, team conventions, and corporate defaults all coexist
without forking anything. Pull a loadout update and your overrides still
work. Neovim and tmux use the smaller Global -> User chain: loadout updates
the global defaults while personal configuration remains untouched.
Opinionated but escapable. Sensible defaults out of the box. Every
preference is a LOADOUT_CFG_* variable you can override in your user layer:
# envs/bash/user/config.sh
export LOADOUT_CFG_PREFERRED_VI=vim # use vim instead of nvim
export LOADOUT_CFG_ENABLE_STARSHIP=0 # use the built-in prompt
export LOADOUT_CFG_ATTACH_TO_TMUX=1 # auto-attach tmux on login
export LOADOUT_CFG_ENABLE_WEZTERM_SHELL_INTEGRATION=0 # disable wezterm OSC integrationThe whole suite has one entry point:
tests/run-all # Tier 1 fast checks + Tier 2 integration installs
tests/run-all --fast # Tier 1 only
tests/run-all --container # adds the Tier 3 clean-container smoke (Docker)Stock AlmaLinux 8 is the verification baseline for install behavior -- a developer machine accumulates packages that mask missing-dependency bugs.
For maximum Linux binary coverage, run the AlmaLinux 8.10 container smoke. It
uses a clean base image, copies this checkout inside the container, installs
@shared into a temp --dest-dir, and probes every installed executable with
only the staged <dest>/bin plus a basic system PATH. The container does not
install Python for the harness; it uses ./loadout to bootstrap the bundled
Python 3.15 first. The smoke reports deliberate host contracts as skips: cloc
needs host Perl, meld needs EL8 /usr/bin/python3.6, and OpenGL GUI apps need
host GLVND dispatchers such as libGL.so.1.
KLayout ships one EL8-compatible build for all supported Linux distributions.
Its launchers prefer host Fontconfig and avoid exporting bundled Mesa paths when
host GL is available. With DISPLAY present, Qt defaults to xcb (X11/XWayland);
an explicitly set QT_QPA_PLATFORM always wins. Native Wayland visibility is not
verified. The shared LOADOUT_GUI_HOST_GL and LOADOUT_GUI_HOST_FONTCONFIG
overrides also apply to KLayout; no system configuration changes are needed.
tests/prebuilt-binaries-almalinux8 # binary probe only
tests/prebuilt-binaries-almalinux8 --full # + doctor, resolvers, unit tests,
# and both integration installsFor the shared-tree deployment model, run the split install smoke. It installs
@shared into a temp non-home tree, installs @envs into a separate temp
HOME with LOADOUT_CFG_SHARED_PREFIX=<shared>, then checks Bash startup,
shared PATH, terminfo, WezTerm completions, and core tool startup. @envs
installs the Bash and tcsh configuration; install other config bundles
explicitly or use @envs-all when every shell and editor config is
intentional. Env installs copy config files into ~/.config; old symlinked
config subdirectories that point back into the repo are replaced with real
directories so installs cannot mutate the checkout.
tests/install-split-shared-envsEach row is a package you can install by name with
./loadout install <name>. Groups (@shared-all, @envs-all, @gui-suite,
@core-cli, ...) bundle related packages so you can install many at once. The
older curated mega-group is retired; a resolver error points at @shared-all
plus @envs-all if you type it.
Run ./loadout list to see every package and every group, or
./loadout list --groups to see just the groups.
Add one or more positional filters to match package or group names
case-insensitively; any matching filter includes a row. Descriptions are not
searched, for example: ./loadout list vim helix or
./loadout list --groups editor cli.
The optional openssh package provides modern ssh-keygen for SSH commit/tag
signing on EL8 and an explicit ssh10 client. It does not install bare
ssh/scp/sftp, so normal SSH stays the host-integrated system client.
FIDO security keys (-t ed25519-sk) and PKCS#11 tokens are not supported by
the bundled binaries (their libexec helpers are not shipped) -- use the system
OpenSSH for those.
| Package | Kind | Version | Description |
|---|---|---|---|
| amux | bin | 0.0.20 | TUI for orchestrating parallel coding agents via git worktrees + tmux |
| bash | bin | 5.3.20 | Portable GNU Bash ahead of EL8 system version |
| bash-docs | runtime | 5.3.9 | GNU Bash man page (bash.1) and info pages; extracted from bash 5.3 source |
| bat | bin | 0.26.1 | cat clone with syntax highlighting and line numbers |
| biome | bin | 2.6.3 | Fast Rust JSON/JS/TS/CSS formatter, linter, and LSP (static-pie musl build, no glibc dep) |
| broot | bin | 1.61.0 | Interactive tree navigator with fuzzy search |
| gtkwave | bin | 3.3.116 | GTKWave — VCD/FST/LXT2/VZT waveform viewer (GTK3) plus the headless format-converter suite (fst2vcd, vcd2fst, vcd2vzt, ...); Tcl scripting not compiled in |
| ipython | python-tool | 9.17.1 | Enhanced interactive Python REPL (tab completion, magics, history, introspection) |
| klayout | bin | 0.30.12 | KLayout — GDSII/OASIS/DXF/CIF/LEF-DEF mask layout viewer and editor with scriptable DRC/LVS (Qt5); embeds the loadout Ruby 3.3 and portable Python 3.15 |
| verilator | bin | 5.052 | Verilator — Verilog/SystemVerilog to C++ simulator (lint, coverage, cycle-accurate regression models); needs host perl and the user’s own g++ |
| yazi | bin | 26.9.1 | Blazing-fast terminal file manager (static-pie musl build, no glibc dep); ships the ya CLI companion |
| btm | bin | 0.14.9 | Cross-platform system resource monitor (TUI) |
| btop | bin | 1.4.7 | Resource monitor with graphs and mouse support, plus the bundled theme set and btop-theme-tour |
| liberty-filter | bin | 1.0.1 | liberty-filter — strip unneeded data from Liberty (.lib) timing files; Rust CLI, system-libs only |
| lefdef-tools | python-tool | v2026.9.0 | lefdef-tools — fast LEF/DEF parsing and query tools (Rust backend) |
| open-eda-file-tools | python-tool | v2026.10.1-5-gebdd925 | open-eda-file-tools — home for open EDA data-file tooling; ships liberty-tools (Rust-backed Liberty parser/query library) with liberty-format and liberty-view CLIs |
| librelane | python-tool | 3.0.16 | librelane — LibreLane ASIC implementation-flow infrastructure, Python layer only (Classic/Chip flows; EDA tools and PDKs NOT bundled). Ships librelane + librelane.config/env_info/help/state/steps (or python -m librelane); klayout 0.30.12 Python API bundled as an offline wheel. Member of @eda |
| vcd-toggle-profiler | runtime | 891a391 | VCD toggle profiler — C++17 VCD signal toggle analysis with offline self-contained HTML reports |
| pdftotext | bin | 26.04.0 | pdftotext (poppler-utils) — extract plain text from PDF files; static libpoppler, bundles liblcms2+libopenjp2 and poppler-data (CJK CMaps) with a relocatable wrapper |
| p7zip | bin | 16.02 | p7zip — Unix port of 7-Zip; 7za standalone binary (LZMA2, zip, gzip, bzip2, tar, cab, etc.) |
| bzip2 | bin | 1.0.8 | Block-sorting file compressor |
| choose | bin | 1.3.7 | awk/cut alternative for column field selection |
| clang | bin | 23.0git | LLVM/Clang 23 compiler toolchain (clang, lld, clangd, clang-format, clang-tidy, llvm-ar/nm/objcopy/objdump/symbolizer/cov/profdata/link) |
| cloc | bin | 2.10 | Count Lines of Code by language (blank/comment/code). Self-contained Perl script; requires host perl |
| scc | bin | 4.1.0 | Sloc, Cloc and Code — fast code counter with complexity estimates (GitHub's counter). Go static binary, no deps |
| tokei | bin | 15.0.0 | Fast code counter by language. Rust; EL8 source build (v14 ships no prebuilt), links system libs only, glibc 2.28 |
| dasel | bin | 3.11.2 | Query and modify YAML/JSON/TOML/XML/CSV data |
| delta | bin | 0.20.1 | Git diff pager with syntax highlighting |
| duf | bin | 0.9.1 | df replacement with colored usage table |
| dust | bin | 1.2.6 | du replacement with visual bar chart |
| expect | bin | 5.45.4 | Tcl-based tool for automating interactive CLI programs |
| eza | bin | 0.23.5 | ls replacement with icons, colors, git status |
| fd | bin | 10.5.0 | Fast and user-friendly find alternative |
| fio | bin | 3.43 | Flexible I/O tester — storage and filesystem performance benchmark |
| fzf | bin | 0.74.4 | General-purpose command-line fuzzy finder |
| gnuplot | bin | 6.0.5 | Command-line graphing and plotting utility |
| glow | bin | 3.0.0 | Terminal markdown renderer/pager with styles |
| gocheat | bin | 0.1.1 | Interactive terminal cheatsheet browser (EL8 source build, CGO_ENABLED=0 static) |
| keyb | bin | 0.8.0 | Customizable TUI cheatsheet for keybindings/aliases; fuzzy filter, fzf/rofi export |
| gping | bin | 1.21.0 | Ping with live graph visualization |
| htop | bin | 3.5.3 | Interactive process viewer and manager |
| hx | bin | 25.07-984-g079a789e | Modern modal text editor with tree-sitter and LSP |
| hyperfine | bin | 2.0.0 | Command-line benchmarking tool |
| ncdu | bin | 2.9.2 | NCurses disk usage — interactive disk space analyzer (Zig v2) |
| nethogs | bin | 0.9.0 | Per-process network bandwidth monitor (a top for network traffic). Ships its own libpcap.so.1 — built from source with rdma/bluetooth/dbus disabled so it needs nothing but libc (the EL8 rpm hard-links libibverbs). Needs root or cap_net_admin/cap_net_raw/cap_dac_read_search/cap_sys_ptrace to capture. |
| openssh | bin | 10.4p1 | OpenSSH 10.4p1 signer tools plus explicit ssh10 client (ssh10/ssh10.bin/ssh-keygen/ssh-add/ssh-agent/ssh-keyscan), EL8 source build linking system libcrypto/zlib; provides ssh-keygen -Y sign for git commit/tag signing that stock EL8 8.0p1 lacks. Optional — opt in with ./loadout install openssh; does not install bare ssh/scp/sftp, so normal ssh stays host-integrated. |
| jq | bin | 1.8.2 | Lightweight JSON processor and formatter |
| just | bin | 1.58.0 | Command runner, ergonomic Makefile alternative |
| lazygit | bin | 0.66.0 | TUI git client for staging, committing, rebasing |
| less | bin | 710 | less pager — the standard terminal file viewer; EL8 ships less 530 from 2017, so this bundles the current upstream release (POSIX regex backend, no gui_libs coupling) |
| linelight | bin | 2026.10.31 | Output colorizer: filter, command runner and shell adapters with embedded profiles; replaces GRC |
| llvm-bolt | bin | 23.0git | LLVM BOLT binary optimizer + perf2bolt profile converter + merge-fdata |
| micro | bin | 2.0.15 | Beginner-friendly terminal text editor |
| miller | bin | 6.22.0 | CSV/TSV/JSON/NDJSON data processor (mlr) |
| mermaid-ascii | bin | 1.6.1 | Terminal mermaid-to-ASCII renderer — flowcharts as text diagrams |
| marktext | bin | 0.20.0 | MarkText — simple and elegant markdown editor (Electron/Chromium GUI). Ships the official Linux release bundle with two native addons rebuilt against EL8 (ced.node upstream needs GLIBCXX_3.4.29 and native-keymap.node needs GLIBC_2.34 — both above the EL8 floor, and both loaded by top-level require() at startup); an NSS/NSPR + libsecret + libxkbfile + cups/avahi closure is co-located in lib64. Member of @editor-gui |
| ninja | bin | 1.13.2 | Fast build system used by CMake and LLVM |
| numr | bin | 0.8.0 | Text calculator for natural-language expressions with a vim-style TUI (units, currency, variables) |
| fresh | bin | 0.5.4 | Fresh text editor (Rust, tree-sitter, TypeScript/JavaScript config) |
| nvim | bin | 0.12.6 | Hyperextensible Vim-based text editor |
| patchelf | bin | 0.12 | Modify ELF RPATH and interpreter in-place |
| pigz | bin | 2.8 | Parallel implementation of gzip |
| procs | bin | 0.14.12 | ps replacement with colors and process tree |
| prettier | bin | 3.8.1 | Opinionated JavaScript/TypeScript/JSON/YAML/CSS formatter — upstream npm package on loadout's bundled Node.js (no npm install); drives conform.nvim for the javascript filetype in envs/nvim |
| pv | bin | 1.6.6 | Monitor and show progress of data through a pipe |
| rg | bin | 15.2.0 | Extremely fast grep alternative (ripgrep) |
| restic | bin | 0.19.1 | Fast, secure, user-space backup to a local repo -- content-defined deduplication, zstd compression, incremental snapshots, authenticated encryption. Single static binary, no root. |
| rsync | bin | 3.5.1 | Efficient file sync with delta-transfer algorithm |
| ruby | bin | 3.3.10 | Ruby 3.3 interpreter from the AlmaLinux 8 ruby:3.3 module stream — stdlib, default gems and rubygems, relocated via a RUBYLIB-deriving launcher |
| ruff | bin | 0.17.2 | Extremely fast Python linter and formatter |
| sd | bin | 1.1.0 | sed alternative with simpler regex syntax |
| shfmt | bin | 3.14.1 | Shell script formatter and parser |
| shellcheck | bin | 0.11.0 | Static analysis linter for shell scripts |
| sqlite | bin | 3.53.4 | SQLite database CLI and library — EL8 ships 3.26 from 2018; current upstream with readline line-editing and FTS4/5 + RTREE + session extensions |
| starship | bin | 1.27.0 | Cross-shell customizable minimal prompt |
| strace | bin | 7.2 | System call tracer — EL8 ships 5.18 (2022) with stale syscall tables; current upstream (built without libunwind/libselinux: EPEL-only / absent on newer distros, both unused by strace-ui) |
| strace-ui | bin | b48e51a | Interactive TUI for strace output (Jane Street OxCaml/Bonsai_term) — syscall browser with FD provenance tracking. Opt-in: install with ./loadout install strace-ui |
| stylua | bin | 2.5.2 | Opinionated Lua code formatter |
| tkdiff | bin | 6.0 | Tcl/Tk visual diff and merge tool |
| valgrind | bin | 3.27.1 | Valgrind memory debugging + profiling (memcheck, cachegrind, callgrind, helgrind, massif) — EL8 ships 3.22 from 2022; current upstream with AVX-512 support and six releases of fixes |
| tmux | bin | 3.8 | Terminal multiplexer with session management |
| tree-sitter | bin | 0.27.1 | Incremental parser generator and query tool |
| ty | bin | 0.0.91 | Fast Python type checker (Astral) |
| gnu-coreutils | bin | 9.7 | GNU coreutils — individual binaries (ls, cp, mv, etc.) built from source on EL8 |
| uv | bin | 0.13.5 | Extremely fast Python package and project manager |
| vim | bin | 9.2.1228 | Vi IMproved text editor |
| gvim | bin | 9.2.1228 | GTK3 GUI Vim with clipboard and font rendering |
| surfer | bin | 0.7.0 | Surfer — waveform viewer (VCD/FST/GHW) for digital hardware debugging; egui/OpenGL GUI. Opt-in: install with ./loadout install surfer |
| mesa3d_libs | runtime | 23.1.4 | Mesa 3D userspace runtime — Mesa EGL vendor library, GBM, libglapi, DRI drivers, and LLVM runtime (no GLVND dispatcher libs) |
| gui_libs | lib-bundle | Qt5/GTK3/X11/Wayland shared library bundle (for headless compute farm GUI forwarding) | |
| xsel | bin | 1.2.1 | X11 clipboard command-line access tool |
| xclip | bin | 0.13 | X11 clipboard command-line access tool — pipe stdin to a selection, stdout from it; member of @gui-suite (NEEDs the gui_libs Xmu/X11 stack) |
| xterm | bin | 412 | X11 terminal emulator with Unicode and color |
| urxvt | bin | 9.31 | rxvt-unicode — X11 terminal with Unicode, Xft, and daemon mode (perl extensions disabled) |
| wezterm | bin | 20260618_095146_c10636f3 | WezTerm terminal emulator — shanghai bundle from system install; sample app for bundled Mesa 3D runtime |
| st | bin | 0.9.3 | suckless st — minimal X11 terminal with undercurl patch (UNDERCURL_CURLY) |
| xephyr | bin | 1.20.11-28.el8_10.3 | Xephyr — nested X server: run another window manager or desktop session in a window inside the session you already have (no root, no display-manager change, no listening port) |
| yank | bin | 1.4.0 | Select terminal output and copy to clipboard |
| yq | bin | 4.54.1 | YAML/JSON/XML/CSV processor (jq for YAML) |
| yamlfmt | bin | 0.21.0 | YAML formatter and fixer (google/yamlfmt) — static Go binary, no glibc dep; drives conform.nvim for the yaml filetype in envs/nvim |
| zellij | bin | 0.45.1 | Terminal workspace multiplexer (no-web build; WASM plugins disabled) |
| zoxide | bin | 0.10.0 | Smarter cd with frecency ranking (z/zi) |
| octave | bin | 11.3.0 | GNU scientific computing language (MATLAB-compatible) |
| ngspice | bin | 46 | ngspice — open-source mixed-level SPICE circuit simulator (XSPICE + CIDER enabled, no-X11 headless build); relocatable wrapper loads spinit + codemodels from the install prefix |
| spice-subckt-rc-reduce | bin | 0.1.1 | Reduce parasitic RC networks in SPICE .subckt models (TICER / merge), preserving port behavior to cut simulation time |
| spice-netlist-ls | bin | 2026.8.0 | spice-netlist-ls — gofmt for SPICE netlists: formatter, linter, and LSP server for the classic SPICE circuit-simulation netlist format (HSPICE, NGSPICE, Spectre-SPICE, LTspice dialects). Ships spicefmt (CLI) + spice-netlist-ls (LSP); .scs files get per-section dialect routing. Member of @eda |
| xschem | bin | 3.4.7 | xschem — schematic capture and SPICE/VHDL/Verilog netlister for VLSI and analog design; the front end for the ngspice simulator and the .lib models already here. Ships its own private Tcl/Tk 8.6, so it needs no host Tcl. Member of @eda |
| visidata | python-tool | 3.4 | TUI spreadsheet for CSV/TSV/JSON data |
| meld | bin | 3.20.4 | GTK3 visual diff and merge tool (shanghai bundle — system py3.6 + bundled PyGObject/GtkSource) |
| mate-terminal | bin | 1.26.1 | MATE Terminal — GTK3 tabbed VTE terminal (shanghai bundle from EL8 EPEL; GSettings keyfile backend, no dconf-service needed) |
| xfce4-terminal | bin | 1.0.4 | Xfce Terminal — GTK3 tabbed VTE terminal (shanghai bundle from EL8 EPEL; starts and runs without a session bus or xfconfd, preference persistence needs the host's xfconf) |
| firefox | bin | 140.14.0 | Mozilla Firefox ESR (shanghai bundle from EL8 BaseOS; thin POSIX-sh launcher exec's bundled firefox-bin). Ships a decode-only FFmpeg, so H.264/AAC sites (Facebook Reels, AVC YouTube) play on hosts with no system FFmpeg |
| zsh | bin | 5.9 | Z shell — powerful interactive shell with advanced tab completion; dynamically-loaded modules (regex, pcre, mathfunc, stat, mapfile, parameter, complist, zprof, zpty, socket, tcp, zftp, system, cap, clone, datetime, langinfo, terminfo, zutil, files, watch, attr, nearcolor, zselect) shipped via runtime archive |
| fish | bin | 4.9.3 | Fish shell — friendly interactive shell with autosuggestions and syntax highlighting |
| tcl | bin | 9.0.3 | Tcl scripting language — tclsh interpreter and runtime library |
| tclint | python-tool | 0.9.0 | tclint — modern dev tools for Tcl: tclint linter, tclfmt formatter, and tclsp language server (LSP for nvim/helix). Pure-Python wheel; zero-ver project (0ver.org). Covers .tcl and EDA constraint dialects (.sdc/.xdc/.upf). Drives envs/nvim/lsp/tclsp.lua and envs/helix/languages.toml |
| mdformat | python-tool | 1.0.0 | mdformat — opinionated CommonMark Markdown formatter (pure-Python). Drives conform.nvim for the markdown filetype in envs/nvim; --wrap keep is passed so hand-wrapped prose is never reflowed and code blocks are left untouched. |
| tk | bin | 9.0.3 | Tk GUI toolkit — wish interpreter and embedded Tk runtime |
| nodejs | bin | 26.12.1 | Node.js LTS JavaScript runtime with npm/npx (for LSP servers, JS tooling) |
| jupyterlab | python-tool | 4.6.4 | Web-based interactive development environment for notebooks, code, and data |
| time-plot | python-tool | v2026.9.15 | Plot arbitrary data vs. zero-based time with plugins for custom data file parsers |
| text-serdes | python-tool | 361bbf0 | text-serdes — short-lived encrypted text transport for copy/paste workflows (enc/dec) |
| cicwave | python-tool | 0.7.2 | cicwave — PyQtGraph waveform viewer (ngspice/Xyce/VCD/CSV). loadout PyQt6 fork of the upstream PySide6 app (PySide6 has no EL8 glibc-2.28 + Python 3.15 wheel). Opt-in: ./loadout install cicwave |
| parity-plot | python-tool | v0.7.0 | 45-degree Plotly parity plots with an offline NiceGUI designer; generated HTML embeds Plotly for air-gapped viewing |
| pygwalker | python-tool | 0.5.0.1 | Turn pandas DataFrames into an interactive Tableau-style data explorer (Jupyter or pygwalker serve) |
| portable-python | python-base | 3.15.0 | BOLT-optimized portable CPython build with bundled install.sh |
| python-loaded | python-suite | 2026.10.23 | Curated EL8 Python 3.15 import environment (50 tops, hashed private wheelhouse, own bin; not on PATH, explicit install only) |
| gobject-typelibs | typelib | GObject introspection typelibs (GLib/Gtk3/GtkSource3/Pango/Atk/cairo) | |
| treesitter-parsers | data | Pre-built tree-sitter parsers (.so), queries, parser-info, registry, and build-info for 300+ languages | |
| git-nvim | runtime | 2.43.7 | PRIVATE git for nvim/lazy only -- installed to lib/loadout-git/, never on the user's PATH (a loadout git would shadow the corp git and break its subcommands/credential helpers, cf. openssh/ssh10). Optional: @shared-all or by name. nvim uses it only when the system has no git. |
| nvim-plugin-stash | data | Offline git stash for nvim plugins -- 78 bare mirrors covering the active set plus catalog, read-only, shared. lazy clones from it into the user's lazy/ and :Lazy update/sync fetches from it, so plugin updates work with no network. The installer runs headless Lazy! sync from this stash whenever a loadout nvim binary and env-nvim config are both present. Needs git (system, or the optional git-nvim package). |
|
| models | bin | 0.14.1 | TUI/CLI to browse AI models + benchmarks from models.dev (needs network for live data) |
| modules | runtime | 5.6.1 | Environment Modules — module load/unload for shell environment management (HPC-style) |
| rust | runtime | 1.96.0 | Rust toolchain — rustc + cargo + std libraries (offline source build target) |
| espresso | bin | 1.1.1 | Berkeley espresso two-level logic minimizer -- reduce a boolean function (PLA truth table) to a minimal sum-of-products |
| rust-analyzer | bin | 410 | Rust language server (LSP) — diagnostics, go-to-def, completions |
| gopls | bin | 0.23.0 | Go language server (LSP) — diagnostics, go-to-def, completions |
| yosys | bin | 0.70 | Yosys — open-source RTL synthesis (Verilog/SystemVerilog → netlist; write_json/write_verilog/write_blif, ABC mapping bundled as yosys-abc). Complements the bundled simulators: iverilog simulates, verilator lints and generates C++ models, yosys synthesises |
| sby | bin | b1a1e98 | SymbiYosys — front-end for Yosys-based formal hardware verification (bmc/prove/cover via yosys-smtbmc + Z3). Pure Python; commit-pinned (upstream has no releases). Member of @eda |
| z3 | bin | 5.1.0.0 | Z3 — SMT solver from Microsoft Research, bundled as sby's prove/bmc engine (also usable standalone). From the official manylinux wheel; runs on stock EL8. Member of @eda |
| bitwuzla | bin | 0.9.1 | Bitwuzla — SMT solver for bit-vectors, floating-point arithmetic, arrays and uninterpreted functions (SMT2/BTOR2 input, model generation, unsat cores). EL8 source build (static GMP 6.3 + MPFR 4.2.2); sby accepts it as an smtbmc bitwuzla engine. Member of @eda |
| netlistsvg | bin | 1.0.2 | netlistsvg — Yosys-netlist-to-SVG schematic renderer (netlistsvg + netlistsvg-dumplayout); upstream npm package plus vendored production deps on loadout's bundled Node.js, fully offline. Member of @eda |
| iverilog | bin | 13.0 | Icarus Verilog — Verilog/SystemVerilog event simulator (iverilog compiler driver, vvp runtime, iverilog-vpi VPI module builder). Compiles to a .vvp file that runs directly; writes VCD for gtkwave/surfer. Unlike verilator this simulates rather than generating a C++ model, so it needs no host g++ to run a design |
| openroad | bin | 26Q3 | OpenROAD — RTL-to-GDS place & route: floorplanning, placement, clock-tree synthesis, global/detailed routing and parasitic extraction, driven from Tcl or Python. Ships sta (standalone OpenSTA timing) alongside. Completes the open flow already here: yosys synthesises → openroad places & routes → klayout views the layout |
| openvaf | bin | 23.5.0 | OpenVAF — Verilog-A compiler: compiles Verilog-A compact model files to OSDI shared objects for circuit simulators (ngspice, Melange). GPL-3.0, Rust + statically-linked LLVM (no runtime LLVM dep). Member of @eda |
| lua-language-server | bin | 3.19.2 | Lua language server (LSP) — useful for nvim config and Lua tooling |
| markdown-oxide | bin | 0.25.12 | PKM markdown language server — wikilinks, backlinks, daily notes and unresolved-link creation over a plain directory of markdown. Obsidian-vault compatible (reads a .obsidian root), so it indexes a vault a user maintains with Obsidian installed separately; Obsidian itself is not redistributable and is not bundled. Drives envs/nvim/lsp/markdown_oxide.lua. |
| pyright | bin | 1.1.411 | Python language server (LSP) — type-checking, go-to-def, completions; upstream npm package on loadout's bundled Node.js (no PyPI wrapper, no runtime downloads) |
| typescript-language-server | bin | 6.0.2 | TypeScript/JavaScript language server (LSP) — upstream npm package plus bundled TypeScript 6.x on loadout's bundled Node.js; drives envs/nvim/lsp/ts_ls.lua with no npm install or runtime downloads |
| taplo | bin | 0.10.0 | TOML toolkit — linter, formatter and language server in one binary. Ships an offline JSON Schema catalog (49 SchemaStore schemas: Cargo.toml, pyproject.toml, ruff, uv, rustfmt, starship …) so taplo lint validates keys on an air-gapped node instead of silently degrading to grammar-only. Drives envs/nvim/lsp/taplo.lua and envs/helix/languages.toml |
| tmux-path-store | python-tool | 2026.10.4 | Tmux window-name-keyed directory/file path store — shell aliases for per-window path bookmarks |
| watchglass | python-tool | 2026.11.3 | Poll conditions and run actions from login onward — watches, observers, verified relay recipes, JSONL logs and a live TUI |
Portable Python's standard-library sqlite3 uses its own bundled SQLite,
separate from the sqlite3 CLI, with FTS5 built into that private library.
To apply the fix on another machine, obtain the updated
checkout/archive, run ./loadout reinstall portable-python -y, and restart
Python processes, including notebook kernels; already-running processes retain
the old mapped library. Verify with:
<prefix>/bin/python3.15 -c 'import sqlite3; c = sqlite3.connect(":memory:"); c.execute("CREATE VIRTUAL TABLE probe USING fts5(body)"); print("FTS5 OK")'(<prefix> is the install root: ~/.local/share/loadout by default, or
~/.local in legacy dest_dir = "~" mode.)
./loadout install parity-plot installs the CLI and its local designer, with no
Python packages fetched at install time. parity-plot plot measurements.csv --no-open-browser --output parity.html creates a self-contained HTML report:
the Plotly runtime is embedded so it renders on an air-gapped machine. PNG, SVG,
and PDF export still need a compatible Chrome/Chromium already on the host for
Kaleido; loadout deliberately does not download or bundle a browser.
If your machine doesn't already have GTK3 / Qt5 / X11 / Wayland libraries
installed (common on remote compute nodes), install gui_libs alongside
any GUI application:
./loadout install gvim gui_libs
# Or use the group, which pulls gui_libs for you:
./loadout install @gui-suiteGPU-accelerated apps such as WezTerm also pull mesa3d_libs, which installs
Mesa's EGL vendor library, GBM, DRI drivers, and LLVM runtime without bundling
host display-driver dispatchers like libGL.so.1. The WezTerm bundle keeps
wezterm, wezterm-gui, and wezterm-mux-server as sibling real binaries
under <prefix>/lib/wezterm/, with PATH wrappers in <prefix>/bin (<prefix>
defaults to ~/.local/share/loadout; ~/.local in legacy dest_dir = "~"
mode). Its zsh
completion is installed by env-zsh; bash completion can be generated with
wezterm shell-completion --shell bash. WezTerm shell integration (semantic
zones / OSC 7 cwd / user vars -- distinct from completion) is vendored at
envs/bash/global/wezterm/wezterm.sh and sourced by the bash config from
user-writable space (never /etc), so wezterm users get it with or without tmux;
toggle with LOADOUT_CFG_ENABLE_WEZTERM_SHELL_INTEGRATION. Outside a real
WezTerm session, bash still sources the vendored script for its bash-preexec
driver but disables all WezTerm OSC hooks, so other terminals do not print raw
escape sequences or stall in wezterm set-working-directory.
Python 3.15.0 -- a portable Python build that
installs under the install root (<prefix>/bin/python3.15, default
~/.local/share/loadout/bin). Use python3.15 and pip3.15 to pin this build.
The full nvim-treesitter parser registry is bundled and installs offline
into the shared tree at <prefix>/share/nvim/tree-sitter-parsers/; Neovim
resolves it through paths.lua, which prefers a per-user copy under
~/.local/share/nvim/ when one exists. All 326 languages work out of the box,
no internet required. Default LSP integrations are command-guarded,
so installing only env-nvim does not produce errors for optional tools you did
not install.
Twelve font families bundled and installed to ~/.local/share/fonts:
| Font | Notes |
|---|---|
| Cascadia Code | Microsoft coding font |
| DejaVu Sans Mono | Broad Unicode coverage |
| Envy Code R | Clean, distinctive coding font |
| Fira Code | Ligature-rich monospace |
| Hack | Designed for source code |
| Inconsolata | Humanist monospace |
| Iosevka Term | Ultra-narrow, highly legible |
| JetBrains Mono | Designed for long coding sessions |
| Meslo LG | Powerlevel10k default family |
| Roboto Mono | Google monospace family |
| Source Code Pro | Adobe's open-source workhorse |
| Ubuntu Mono | Ubuntu monospace family |
Use ./loadout install ... --skip @fonts-all to skip every font, or
--skip font-firacode to skip a single family. An existing
~/.local/share/fonts directory is used in place: the installer replaces only
the bundled font files (by an atomic rename, so running applications keep the
old file) and leaves every other file there, including your own fonts. It never
moves the directory aside, with or without --no-backup. Font extraction uses
the same progress bar style as other bulk install phases.
Installs before 2026-10-27 did move it aside, to fonts.bak / fonts.bak.N
(about 2 GB each, with your own fonts inside). ./loadout doctor lists any that
are left; ./loadout clean --font-backups deletes the bundle's copies from them
and keeps, and lists, every other file.
On a shared tree -- any install root outside $HOME, typically a
--dest-dir deployment -- the fonts install once into
<prefix>/share/fonts (the twelve families are ~2 GB installed, so this is one
copy instead of one per user). The installer also writes
<prefix>/etc/fonts/loadout-fonts.conf, and the shell layer exports
FONTCONFIG_FILE for it once the per-user config bakes the shared prefix, so
every user of the tree sees the fonts with no per-user copy. An existing
~/.local/share/fonts symlink is left in place rather than replaced --
pointing it at that shared directory is a supported way to share one font set.
@envs installs both majority-shell configs: bash leads, and tcsh mirrors the
bash architecture/capability set where tcsh can support it. Both use the same
six-layer override chain (global -> corp -> site -> team -> project -> user),
LOADOUT_CFG_* knobs, shared-prefix install model, and curated alias surface:
b/bb/bbb... --cd ..up 1, 2, 3 levelscdd/cddd... --cdto the N-th most recently modified directoryg-- ripgrep with sensible defaults (smart case, hidden, no-ignore)f--fdwith sensible defaults, falls back tofindgs/gc/gp/gd/ga-- git status / commit / push / diff / addvi/vim-- your preferred editor (nvimby default)catp--bat(paged, syntax-highlighted reader;catitself is untouched)ll/la/lh--lsvariants (sizes, all files, human-readable)delete [-f] PATH...--rm -rfthat gets through read-only directories; on NFS, when a process still has a file open (NFS keeps it as.nfs*and the directory cannot go), it names the processes holding it and offers to kill them, then retries
tcsh uses aliases plus POSIX-sh helpers for bash features that need functions,
and keeps home-local override layers active even when TCSH_CONFIG_ROOT_DIR
points at a shared tcsh config root.
Prefix Ctrl-\. Shift-arrows for pane navigation, Ctrl-arrows for windows,
Prefix+1-5 for layout presets, Prefix+6 to reapply the custom 3-column
layout, Prefix+7 for the 3-column layout with the previously-active pane
pinned left, Prefix+o to open a new seven-pane 3-column work window, and
Prefix+v to capture the pane buffer into nvim. tmux-persist bundled (the
maintained fork of the abandoned tmux-resurrect) -- it auto-saves pane contents
and layout per session on detach/exit, so your sessions come back after a
reboot.
tmux reads the dispatcher natively from ~/.config/tmux/tmux.conf (tmux >=
3.1; no ~/.tmux.conf symlink). That dispatcher loads the managed settings (tmux-settings-global.conf),
then your settings (tmux-settings-user.conf, which wins), then the managed
tmux-global.conf, then the persistent tmux-user.conf, and finally
initializes TPM. Plugins live at ~/.config/tmux/plugins/, and tmux-persist
snapshots live under ~/.local/share/tmux/ (XDG data). The settings layers hold user-facing knobs -- the
@theme choice (defaulting to loadout2, the fully pinned theme that does not
depend on the terminal background) and focus-follows-mouse (on by default;
set it off in your settings layer to opt out) -- and the global layer loads
themes/tmux-theme-#{@theme}.conf plus the generated word-separators.conf.
Put personal settings and plugin declarations in
~/.config/tmux/tmux-user.conf; reinstalling env-tmux never overwrites the
user layers. When an older ~/.tmux.local.conf is found, an interactive
install offers to move it to the new user-layer path. The legacy file is no
longer loaded, so declined or unattended migrations need a manual move.