Why Just
Task runner that replaces Makefiles without the pain
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
| Option | Pros | Cons |
|---|---|---|
| npm scriptsBuilt into every Node.js project. Zero setup. |
|
|
| MakeThe original task runner. Powerful but dated. |
|
|
| JustModern task runner. Make-like power, readable syntax. |
|
|
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 serverjust test- Run testsjust build- Production buildjust deploy <env>- Deploy to environmentjust lint- Run lintersjust 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
# 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 .turboA complete justfile for a TypeScript project. Recipes are self-documenting. Arguments have defaults. Dependencies chain naturally.