Every repo I have ever joined keeps its commands in a README section called "Getting Started", and that section always lies a little. The commands are there, but one is missing a step, or it references a file that got renamed, or the person who wrote it left two years ago. You copy, paste, debug, and eventually get unstuck. Then you do it again next week.
just exists to end that loop. It is a command runner written in Rust by Casey Rodarmor, around since June 2016, with 1.0 landing in February 2022. The project's own README describes it as "a handy way to save and run project-specific commands". Commands live in a file called justfile, written in syntax inspired by make, and they are called recipes.
The important part is what just is not: a build system. No .PHONY, no implicit rules, and spaces work fine as indentation. It is a single binary that runs on Linux, macOS, and Windows with no extra dependencies, it is released under CC0, and it has more than 36,000 stars on GitHub. Version 1.59.0 shipped on October 15, 2026, and the project has promised there will never be a just 2.0; any future breaking change must be opt-in per justfile.
Installing it is unglamorous: brew install just on macOS, apt install just on Ubuntu 24.04 or Debian 13, pacman -S just on Arch, or cargo install just if you already have Rust.
A first justfile
Here is a plausible one:
# Install dependencies and start the dev server
dev:
npm install
npm run dev
# Run the test suite
test:
npm test
# Build, after linting and testing
release: lint test
npm run build
# Deploy to a given environment
deploy env:
@echo "Deploying to {{env}}"
The comment above each recipe is its documentation. Run just --list and you get every command with its one-line description: a help screen for the project, generated for free and reviewed in pull requests like any other code. Run just with no arguments and it executes the first recipe in the file, which is why teams usually make that recipe a menu:
default:
@just --list
Two details in the sample are worth calling out. release: lint test runs lint, then test, then the body: the same dependency idea as make targets, without the machinery. And deploy env shows arguments, where {{env}} interpolates the value into the command.
Features that earn their keep
Then there are the features that sold me:
- just can load
.envfiles, so recipes see the same local configuration as your dev server. - It runs from any subdirectory of the project, and it checks what it can before running: unknown recipes and circular dependencies are reported up front, with source context.
- A recipe body can be a shebang script in any language, Python or Node or anything else with an interpreter.
- Larger projects split justfiles across multiple files using modules and imports.
just --fmtformats the justfile, andjust --fmt --checkgives CI a tidy-file gate.
And if you have fzf installed, just --choose opens an interactive fuzzy picker over your recipes. Pick one, hit enter, done. A justfile becomes a menu for the project.
Real projects, real numbers
The habit has spread. Homebrew logged 430,682 installations of just in the past year, 105,704 of them in the last 90 days. Baserow, the open-source Airtable alternative, runs its whole development workflow on three justfiles, one for the root tree, one for the backend, and one for the frontend. On GitHub Actions, brew and choco are preinstalled on runners, so the same justfile that works on a laptop works in CI.
If your README has a "Getting Started" section, run just --init to generate a sample justfile, then spend ten minutes naming the commands you actually run. Delete the section afterwards. I did, and I have not missed it once. The manual at just.systems is worth a bookmark.
Two details are worth calling out. release: lint test runs lint, then test, then the body: the same dependency idea as make targets, without the machinery. And deploy env shows arguments, where {{env}} interpolates the value into the command.
- A recipe body can be a shebang script in any language, Python, Node, or anything with an interpreter.
- It runs from any subdirectory of the project, and unknown recipes or circular dependencies are reported before anything runs.
And if you have fzf installed, just --choose opens an interactive fuzzy picker over your recipes. Pick one, hit enter, done.
If your README has a "Getting Started" section, run just --init to generate a sample justfile, then spend ten minutes naming your real commands. Delete the section afterwards. I did, and I have not missed it once. The manual at just.systems is worth a bookmark.
excerpt: "just is a Rust command runner that turns copy-paste commands in your README into named, documented recipes, with an fzf menu and none of the Makefile baggage."
If your README has a "Getting Started" section, run just --init to generate a sample justfile, then spend ten minutes naming your real commands. Delete the section afterwards. I did, and I have not missed it once. The constantly updated manual at https://just.systems/man/en/ is worth a bookmark.