One command to run them all

As a developer who jumps between projects in Python, JavaScript, and Swift, I live with a constant, low-level friction: remembering the right command to get things done. For example to run the development server it might be uv run ./manage.py runserver, pnpm dev, or swift run watch, depending on the project.

For a long time, I just dealt with it. I’d seen people praise the just command runner, but I never really got the point. It seemed like a solution in search of a problem.

That changed when I started two Django projects that use django-tailwind-cli. To run the dev server and the Tailwind watcher, I had to use a specific, combined command: uv run ./manage.py tailwind runserver. The number of times I defaulted to the standard runserver command out of muscle memory, then spent ten minutes pulling my hair out when my style changes didn’t appear, was embarrassing. That was my tipping point.

I finally understood the value of just. It’s not just (heh) about running complex commands; it’s about creating a simple, unified interface for all your projects. Now, every project of mine has a justfile that defines a core set of recipes.

For example, for a Django project:

run:
    uv run ./manage.py tailwind runserver

test:
    uv run ./manage.py test

format:
    uv run ruff format .

check:
    uv run ruff check .
    uv run djlint --check . 
    uv run mypy . --check-untyped-defs

And for a SvelteKit project it might look like this:

run:
    pnpm vite dev --port 3000

test:
    pnpm vitest --run

format:
    pnpm prettier --write .

check:
    pnpm svelte-kit sync && pnpm svelte-check --tsconfig ./tsconfig.json

The magic is that the invocation is always the same. I no longer need to remember the specifics. I just cd into a directory and run:

Each project implements these recipes differently, but the interface for me, the developer, is stable. The cognitive load is gone.

Look, I know I’m late to the party on this one, but if you’ve been on the fence about command runners, I highly recommend giving just a try. It’s a wonderfully simple tool that solves a real, everyday annoyance. Better late than never.

Written by

Kevin Renskers

Related articles

› See all articles