Every project eventually grows its own mythology. “How do you run the tests?” becomes a question answered with a message, a README with outdated instructions, or — if you’re truly cursed — a tribal elder who just left the company.

just ends this. It’s a command runner that stores your project’s commands in a justfile, right next to your code, where they belong.

The Problem It Solves Link to heading

You know the moment. New repo, zero context. You type npm start and get a cryptic error. You try npm run dev. Nothing. You dig through package.json scripts and find someone has written a command called go:brrrr. You close the laptop and reconsider your career choices.

A justfile is a social contract. Here are the commands. Here is what they do. Run them without ceremony.

Honestly, is it a generational enhancement ontop of make files? Yes. Does it make your life better? Also yes. My first job in the stone age was maintaining a Makefile more complex than the human genome. I still have nightmares. Justfiles help.

Install It Link to heading

brew install just  # macOS
choco install just # Windows
cargo install just # Linux

That’s it. It just works, which feels on-brand.

Your First Justfile Link to heading

# Show available commands (great as a default)
default:
    just --list

# Start the dev server
dev:
    npm run dev

# Run tests
test:
    vitest run

# Build for production
build:
    npm run build

Save as justfile in your project root, then:

just dev
just test
just build

Someone joins your team and immediately knows how to use the project. You’ve prevented at least three messages and a passive-aggressive comment in a PR.

It Handles Arguments Link to heading

# Deploy to a specific environment: just deploy prod
deploy env:
    echo "Deploying to {{env}}..."
    fly deploy --env {{env}}
just deploy staging
just deploy prod

No more wrapping bash -c 'ENV=staging ./deploy.sh' in a shell alias you’ll forget exists.

It Loads Your .env Link to heading

set dotenv-load

db-connect:
    psql $DATABASE_URL

Pop DATABASE_URL in your .env file and just db-connect picks it up automatically. No source .env && prefix required. You’re welcome.

Recipes Can Depend on Each Other Link to heading

build:
    npm run build

test: build
    vitest run

ci: test
    echo "Ship it."

just ci runs test, which first runs build. It’s dependency management for your workflow, and unlike most dependency management, it doesn’t make you want to cry.

Why Not Makefile? Link to heading

The Makefile is a venerable tool, deeply respected, and in 2026 they feel historic. It was designed for building C programs in the 1970s. Using it as a command runner requires declaring .PHONY targets, fighting with tabs-vs-spaces in ways that will genuinely drive you mad, and deciphering arcane implicit rules you never asked for.

The Real Win Link to heading

I like just because of the quality of life features and because of the convention. When every project has a justfile, you stop thinking about how to run things and start thinking about what to build. New repo? just --list. Done. You’re productive in 30 seconds.

Your justfile is a living document of how your project works. Treat it that way. Keep it updated. Add a comment when something’s non-obvious. Future-you will be grateful.

# Note: This takes 4 minutes because Jenkins hates us
deploy-prod:
    ./scripts/deploy.sh production

Honestly the most useful documentation any project has ever had.

Question Link to heading

Should your pre-commit hooks reference your jsutfile, or be written out separately? I don’t have a strong opinion, but I lean towards referencing the justfile to avoid duplication. Thoughts?