Introduction
just is a pragmatic replacement for make when you don't actually need build-graph semantics — you just need a project-scoped command book. Where make treats every target as a filesystem artifact and punishes you for whitespace mistakes, just treats recipes as named shell commands with arguments, defaults, and interpolation that don't fight you.
What just Does
- Runs recipes defined in a
justfile. - Supports named arguments, defaults, dependencies between recipes.
- Evaluates shell per recipe (bash/zsh/pwsh configurable).
- Exports environment variables per recipe or globally.
- Lists recipes with
just --list.
Architecture Overview
just parses the justfile into an AST of recipes and expressions, resolves the dependency graph (without timestamp semantics), and executes each recipe as a shell subprocess with interpolation applied. Variable assignment is lazy; set shell := ["bash", "-uc"] picks the interpreter.
Self-Hosting & Configuration
- Install via brew, cargo, scoop, winget, apt (snap), dnf.
just --initbootstraps a justfile.- Config block:
set dotenv-load := trueauto-loads.env. set windows-powershell := trueflips to PowerShell on Windows..justfileandjustfileboth recognized.
Key Features
- Clean recipe syntax with real arguments (not
$1hacks). - Cross-platform: single binary for Linux/macOS/Windows.
- Dotenv autoloading.
- Per-recipe shebangs — write a recipe in Python or Node inline.
just --chooseopens fzf picker.
Comparison with Similar Tools
- make — universal; archaic syntax, tab-sensitive, filesystem-focused.
- npm scripts — Node-only; no arguments, no deps.
- task (go-task) — YAML-based; similar niche.
- mage — Go-based; requires Go.
- invoke (Python) — rich but Python-only.
FAQ
Q: Does it replace make for building C projects? A: No — use make for compilation. just is for workflow recipes.
Q: Can I call recipes from other recipes?
A: Yes — recipeA: recipeB as dependency, or just recipeB inline.
Q: How about secrets?
A: set dotenv-load + .env + gitignore.
Q: Windows without WSL?
A: Yes, runs natively. Set set shell := ["pwsh.exe", "-c"].