DevLogTechnical writing
Tutorials

just: The Command Runner That Makes Project Recipes Worth Writing

November 05, 2026

Every project ends up with a handful of commands you run a hundred times: start the dev server, run migrations, seed the database, deploy to staging. And every project forgets them differently. After a week away, you're back to history | grep and hunting through the README for the exact flags.

just is a command runner that fixes this. It's built by Casey Rodarmor, written in Rust, and it does one thing: it saves named commands — called recipes — in a file called a justfile, then runs them with just <recipe>. That's it. No dependency graph, no implicit rules, no pretending your project is a C compiler pipeline from 1977.

Why not Make?

Make is the tool everyone reaches for first, and it's the wrong shape for this job. Make is a build system: it tracks file timestamps, decides what's out of date, and rebuilds only what changed. That machinery is why you need .PHONY on every recipe that isn't producing a file, why tabs-vs-spaces still bites people, and why a simple "run the tests" task carries so much implicit baggage.

just skips all of it. Recipes are just shell commands with a thin layer of variables and dependencies on top. No .PHONY, no tabs drama. When something breaks, you can read the justfile and immediately see what happened.

A justfile that feels good

Here's a small one for a Node project:

set shell := ["bash", "-uc"]

dev:
    npm run dev

test:
    npm test

db-migrate:
    npx prisma migrate dev

deploy: test
    git push origin main
    ssh prod "./deploy.sh"

Run just with no arguments and it lists every recipe. Run just deploy and it runs test first, then the deploy steps. Recipes fail on the first error, like set -e, so a broken test stops the pipeline instead of limping on.

The details that add up

just quietly handles the things you'd otherwise wire up by hand. It loads .env files, so secrets and config are available in recipes without extra tooling. You can set a default shell per recipe — handy when a project needs bash specifically. Recipes accept command-line arguments and flags, so just test -- --watch passes --watch straight through.

You can even write shebang recipes in any language. A recipe that starts with #!/usr/bin/env python3 runs as Python; the same trick works for Node or anything else on your PATH.

And because just searches upward for a justfile, you can invoke it from any subdirectory, not just the project root.

The feature that changes the workflow

The one that really sticks is just --choose. It pipes all your recipes into a fuzzy finder (fzf by default, or anything in $JUST_CHOOSER) and lets you pick one interactively. Alias it and you've got a menu of every project command:

alias j="just --choose"

Type j, fuzzy-search "migr", hit enter. No more reading the justfile to remember what something was called.

Getting started

just is a single binary, available on Linux, macOS, and Windows with no extra dependencies. Install it through your package manager, cargo install just, or grab a release from GitHub. The project is actively maintained — version 1.59.0 shipped in October 2026, and the repo sits at more than 36,000 stars.

The pitch is simple: if you've ever typed the same five commands into a terminal, just will pay for itself by the end of the week. It's make without the baggage, and it turns "how do I run this again?" into a solved problem.

← More Tutorials