Ralph is a minimal, file‑based agent loop for autonomous coding. Each iteration starts fresh, reads the same on‑disk state, and commits work for one story at a time.
Ralph treats files and git as memory, not the model context:
- PRD defines what’s required
- Plan breaks it into concrete tasks
- Loop executes one story per iteration
- State persists in
.ralph/
Install and run Ralph from anywhere:
npm i -g @iannuttall/ralph
ralph prd # launches an interactive prompt
ralph plan
ralph build 1 # one Ralph runRalph will look for templates in this order:
.agents/ralph/in the current project (if present)- Bundled defaults shipped with this repo
State and logs always go to .ralph/ in the project.
ralph installThis creates .agents/ralph/ in the current repo so you can customize prompts and loop behavior. During install, you’ll be asked if you want to add the required skills.
ralph install --skillsYou’ll be prompted for agent (codex/claude/droid) and local vs global install. Skills installed: commit, dev-browser, prd.
If you skipped skills during ralph install, you can run ralph install --skills anytime.
- Write your PRD (default path) or generate one:
ralph prd
Requires the prd skill (install via ralph install --skills).
Example prompt text:
A lightweight uptime monitor (Hono app), deployed on Cloudflare, with email alerts via AWS SES
Default output:
.agents/tasks/prd.md
- Generate a plan (PRD → plan):
ralph plan
- Run one build iteration:
ralph build 1 # one Ralph run
No‑commit dry run:
ralph build 1 --no-commit # one Ralph run
Override PRD output for ralph prd:
ralph prd --out docs/prd-api.md
- PRD: requirements and acceptance criteria.
- Plan: concrete, ordered tasks derived from the PRD. The loop executes one story at a time.
You can point Ralph at a different PRD or plan file via CLI flags:
ralph plan --prd docs/prd-api.md --plan .ralph/api-plan.md
ralph build 1 --prd docs/prd-api.md --plan .ralph/api-plan.md # one Ralph runOptional progress override:
ralph build 1 --progress .ralph/progress-api.md # one Ralph runOptional config file (if you installed templates):
.agents/ralph/config.sh
Set AGENT_CMD in .agents/ralph/config.sh to switch agents:
AGENT_CMD="codex exec --yolo -"
AGENT_CMD="claude -p --dangerously-skip-permissions \"$(cat {prompt})\""
AGENT_CMD="droid exec --skip-permissions-unsafe -f {prompt}"
Or override per run:
ralph prd --agent=codex
ralph build 1 --agent=codex # one Ralph run
ralph build 1 --agent=claude # one Ralph run
ralph build 1 --agent=droid # one Ralph run
If the CLI isn’t installed, Ralph prints install hints:
codex -> npm i -g @openai/codex
claude -> curl -fsSL https://claude.ai/install.sh | bash
droid -> curl -fsSL https://app.factory.ai/cli | sh
IMPLEMENTATION_PLAN.md— task plan grouped by storyprogress.md— append‑only progress logguardrails.md— “Signs” (lessons learned)activity.log— activity + timing logerrors.log— repeated failures and notesruns/— raw run logs + summaries
.agents/ralphis portable and can be copied between repos..ralphis per‑project state.- Use
{prompt}inAGENT_CMDwhen the agent needs a file path instead of stdin. - Examples: see
examples/commands.md.
Dry-run smoke tests (no agent required):
npm testFast agent health check (real agent call, minimal output):
npm run test:pingOptional integration test (requires agents installed):
RALPH_INTEGRATION=1 npm testFull real-agent loop test:
npm run test:real