Complete project infrastructure tooling and automation.
Stand up a complete project, install its system dependencies, fetch and run its tools, build it into a wheel — all from small primitives that don't own your project. Declare what you need in TOML; the tooling pulls the rest on demand.
| Name | Role | Get it |
|---|---|---|
just-runit (jb) |
Fast ephemeral script runner | . <(curl -sSL https://just-buildit.github.io/get-jb.sh) |
| just-bashit | Proven bash scripts & tools | jbx just-bashit:logging log "hello" |
just-makeit (jm) |
Python C extensions out-of-the-box | jbx get-just-makeit |
| just-buildit | Zero-dep PEP 517 build backend for C extensions | jbx get-just-buildit |
Each tool stands alone. They also compose.
Greenfield Python+C extension — just-makeit new stands up a
complete project: C source, headers, CMakeLists, Python bindings, type
stubs, tests, benchmarks, and CI — all green on the first make test.
The build backend is just-buildit; the system-dep and tool manifests
(jb-deps.toml, jb.toml) are dropped in pre-populated so the next
contributor lands running. You write the algorithm; nothing else.
Any project, anywhere — drop a jb-deps.toml at the repo root and
run jbx install-deps. System packages for apt/pacman/brew/dnf/zypper/msys2
are detected and installed. No Python, no Docker, no setup.
One-off scripts — jbx <name> fetches, runs, and discards. Detects
bash or Python from shebang/extension; Python scripts pick up PEP 723
inline dependencies through uv run. Cache TTL, checksum verification,
function dispatch, sandboxed env — all there.
Namespaces — jbx [NAMESPACE:]NAME. A namespace resolves to a base
URL. The default is just-buildit, served from the org-pages root with
a curated aliases.toml. jbx install-deps just works; jbx gh:user/repo/tool hits GitHub raw directly.
# Get the universal entrypoint (installs jb + jbx) — only curl line you need
. <(curl -sSL https://just-buildit.github.io/get-jb.sh)
# Stand up a Python+C extension (drops jb-deps.toml + jb.toml with sane defaults)
jbx get-just-makeit
just-makeit new my_project --object engine --state gain:double:1.0
cd my_project
# Install those build deps for your platform (apt/pacman/brew/dnf/...)
jbx install-deps
# Build and test — green on first run
make && make testMIT across all repos.
Below the fold: planning notes for contributors. External readers can stop here.
jb-deps.toml— declarative system-package list grouped by purpose (runtime,dev) and package manager (apt,pacman,brew,dnf,zypper,msys2). Lives at repo root; auto-discovered byjbx install-deps.jb.toml— explicit list ofjb/jbxtools a project depends on, analogous to[project.dependencies]. Lives at repo root in every project type (Python, C, bare).pyproject.tomlkeeps its packaging job,jb.tomlkeeps its tool job.- Namespaced invocation —
jbx [NS:]NAME. A namespace resolves to a single base URL. Default namespace =just-buildit. Built-in prefixes:just-bashit:,gh:,https://. aliases.toml— manifest at the org-pages root mapping short names to URLs.jbx some-toolconsults the alias table when there is no script at${NS_URL}/some-tool[.sh|.py].install-deps.sh— thin per-project shim that delegates tojbx install-deps. Optional —jbx install-depsworks directly whenjb-deps.tomlis present.
[runtime.apt] packages = ["libzmq3-dev", "libfftw3-dev"]
[runtime.pacman] packages = ["zeromq", "fftw"]
[dev.apt] packages = ["build-essential", "cmake", "python3-dev"]
[dev.pacman] packages = ["base-devel", "cmake", "python"][project]
name = "my_project"
version = "0.1.0"
[tools.install-deps]
source = "just-bashit:install-deps"
deps_file = "jb-deps.toml"
groups = ["runtime", "dev"]
[tools.just-makeit]
source = "just-bashit:just-makeit"
config = "just-makeit.toml"[aliases]
install-deps = "https://raw.githubusercontent.com/just-buildit/just-bashit/main/src/install-deps.sh"
get-just-runit = "https://raw.githubusercontent.com/just-buildit/just-bashit/main/src/get-jb.sh"
# Third-party tools welcomed via PR.- Explicit
NS:prefix —jbx gh:user/repo/x,jbx https://...: skip everything below, resolve directly. [tools.NAME]injb.toml(walking up from CWD) — use declared source.- Default namespace
aliases.toml— fetch (cached), look upNAME. - Default namespace direct hit — HEAD
${NS_URL}/NAME.sh, then.py. - Error — name not found.
-
jb/jbx/just-builditnaming; conflict detection forjb; stalejr/jxcleanup on reinstall -
jbtop-level subcommand dispatch (jb run→ runner; extensible forjb installetc.) - Namespace model: bare NAME → default NS via
aliases.tomlthen HEAD probe;just-bashit:NAMEco-fetch - Arg parsing: flags not captured as FUNC; FUNC validated via
declare -F; verbose shadowing diagnostic - Version-aware installer: fresh/upgrade/already-current;
JB_REINSTALL=1escape hatch - Org-pages site: themed,
aliases.toml, mirror CI,get-jb.shshort URL -
jb.tomlformat defined; doppler carries one -
jbs-deps.tomlauto-discovery in CWD
- Rename
jbs-deps.toml→jb-deps.tomlacross just-bashit source, docs, doppler -
jb install— readsjb.toml, walks up from CWD, pre-fetches every declared tool into cache -
just-makeit newemitsjb.tomlwith dev deps pre-populated;jbx install-deps -g devworks immediately - User namespace config —
~/.config/just-runit/namespaces.tomlfor custom NS registration
- Parity
get-just-*.shscripts — addget-just-makeit.sh,get-just-bashit.sh,get-just-buildit.sh -
just-buildit init [--pep517|--bare|--c]— unified scaffold entry point -
jb-deps.toml/jb.tomlschemas — JSON Schema for editor completion - CHANGELOG hygiene across repos is uneven
jb-deps.tomlbeats stdin when both are present. TTY detection ([ -t 0 ]) doesn't survivebash -cor CI — file-first is the only reliable ordering.- Filename prefix is
jb-, notjbs-— the deps file is an org-level convention, not a just-bashit-specific one. jbmay conflict (e.g. Jenkins X usedjx;jbcould be taken too). Installer detects this and falls back tojust-buildit, which is always installed and unique.jbxis the runner shorthand —jb runfor the subcommand form,jbxfor fast one-liners. Both always installed.jb.tomlis standalone, not a[tool.jb]table inpyproject.toml. Uniform across project types; Python packaging metadata stays uncoupled from cross-org tooling.--pep517delegates instead of re-implementing scaffolding.just-makeitalready does this well.- Templates as files, not Python heredocs. Diffs against real generated projects stay readable.
