Skip to content

About

No description, website, or topics provided.

Resources

Security policy

Stars

5 stars

Watchers

0 watching

Forks

Repository files navigation

Engineering Loadout

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.


Installation

Linux

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 configs

The 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.

Where things go

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 Neovim plugin stash is a second download

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.

Picking what to install

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 current

install 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.


What's Inside

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

Design Goals

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 integration

Smoke Testing

The 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 installs

For 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-envs

Bundled Packages

Each 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.)

Parity plots

./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-suite

GPU-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

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.


Neovim -- 326 Offline Tree-sitter Parsers

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.


Nerd Fonts

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.


Bash and tcsh Configuration

@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 levels
  • cdd / cddd ... -- cd to the N-th most recently modified directory
  • g -- ripgrep with sensible defaults (smart case, hidden, no-ignore)
  • f -- fd with sensible defaults, falls back to find
  • gs / gc / gp / gd / ga -- git status / commit / push / diff / add
  • vi / vim -- your preferred editor (nvim by default)
  • catp -- bat (paged, syntax-highlighted reader; cat itself is untouched)
  • ll / la / lh -- ls variants (sizes, all files, human-readable)
  • delete [-f] PATH... -- rm -rf that 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.


Tmux

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.

About

No description, website, or topics provided.

Resources

Security policy

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages