Justdevops

Why Just

Task runner that replaces Makefiles without the pain

v1.1·7 min read·Kenneth Pernyér
justtask-runnerdevopsautomationdx

The Problem

Every project needs a way to run common tasks: build, test, deploy, lint, format. The options are all flawed:

npm scripts get unwieldy. Complex commands with flags become unreadable. No support for arguments or dependencies between tasks.

Makefiles are powerful but arcane. Tab-vs-space matters. The syntax is from 1976. Half the features exist for C compilation, not task running.

Shell scripts proliferate. Suddenly you have 15 .sh files with inconsistent naming and no discoverability.

We needed a task runner that:

  • Has simple, readable syntax
  • Supports arguments and dependencies
  • Works cross-platform
  • Is fast and standalone (no runtime required)

Current Options

OptionProsCons
npm scriptsBuilt into every Node.js project. Zero setup.
  • Already in package.json
  • No additional tool
  • Familiar to JavaScript developers
  • No argument passing
  • No task dependencies
  • Complex commands become unreadable
  • JSON escaping is painful
MakeThe original task runner. Powerful but dated.
  • Extremely powerful
  • Available everywhere
  • Handles dependencies well
  • Arcane syntax (tabs matter!)
  • Designed for C compilation, not general tasks
  • Error messages are cryptic
  • Cross-platform issues
JustModern task runner. Make-like power, readable syntax.
  • Clean, simple syntax
  • Supports arguments and defaults
  • Task dependencies and aliases
  • Cross-platform, single binary
  • Another tool to install
  • Less ubiquitous than Make
  • Team needs to learn it

Future Outlook

Task runners are converging toward simplicity. The days of Gulp, Grunt, and complex build tools are over. Just represents the modern approach: do one thing well.

The trend is toward explicit, readable automation.

AI-assisted development makes this more important. When AI generates a justfile recipe, it should be immediately understandable. Just's syntax is close to plain English.

The future is polyglot task runners that work across any project type. Just doesn't care if you're running Python, Rust, TypeScript, or shell commands. It just runs them.

Our Decision

Why we chose this

  • Readable syntaxRecipes look like what they do. No Make-style cryptic variables.
  • Argument supportPass arguments to recipes with defaults: `just deploy prod`
  • Cross-platformWorks on macOS, Linux, and Windows without modification
  • Fast startupSingle Rust binary, starts instantly. No runtime overhead.

×Trade-offs we accept

  • Another toolTeam needs to install just. We include it in our setup scripts.
  • Less universalMake is everywhere. Just requires installation.

Motivation

We standardized on Just because it makes project automation discoverable and maintainable.

New developer joins? just --list shows every available task. Need to deploy? just deploy staging. Want to see what deploy does? The justfile reads like documentation.

This is infrastructure for AI-assisted development. When we ask AI to add a new task, it generates readable recipes that we can verify at a glance.

Recommendation

Create a justfile in your project root. Start with common tasks:

  • just dev - Start development server
  • just test - Run tests
  • just build - Production build
  • just deploy <env> - Deploy to environment
  • just lint - Run linters
  • just fmt - Format code

Use just --list as your project's command reference. Keep recipes simple—if a recipe is complex, extract to a script and call that.

Examples

justfilemakefile
# Project task runner

# Default recipe - show available commands
default:
    @just --list

# Development
dev:
    bun run dev

# Testing
test *args:
    bun test {{args}}

test-watch:
    bun test --watch

# Building
build:
    bun run build

typecheck:
    bun run typecheck

lint:
    bun run lint

# Deployment
deploy env='staging':
    @echo "Deploying to {{env}}..."
    ./scripts/deploy.sh {{env}}

# Setup
setup:
    bun install
    cp -n .env.example .env || true
    @echo "Ready! Run 'just dev' to start."

# Cleanup
clean:
    rm -rf dist node_modules .turbo

A complete justfile for a TypeScript project. Recipes are self-documenting. Arguments have defaults. Dependencies chain naturally.

Related Articles

Stockholm, Sweden

Version 1.1

Kenneth Pernyér signature