Skip to main content

Stop stressing over not having an agent running. Ralph is always running

Project description

ralphify

PyPI version Python versions License Documentation

A ralph is a directory that defines an autonomous agent loop. It bundles a prompt, commands, and any files your agent needs. Ralphify is the CLI runtime that executes them.

grow-coverage/
├── RALPH.md               # the prompt (only required file)
├── check-coverage.sh      # command that runs each iteration
└── testing-conventions.md  # context for the agent
---
agent: claude -p --dangerously-skip-permissions
commands:
  - name: coverage
    run: ./check-coverage.sh
---

You are an autonomous coding agent working in a loop.
Each iteration, write tests for one untested module, then stop.

Follow the conventions in testing-conventions.md.

## Current coverage

{{ commands.coverage }}
ralph run grow-coverage     # loops until Ctrl+C

That's it. One directory. One command. The agent loops — running commands, building a fresh prompt with the latest output, and piping it to your agent. Every iteration starts with clean context and current data.

Works with any agent CLI. Swap claude -p for Codex, Aider, or your own — just change the agent field.

Why loops

A single agent run can fix a bug or write a function. But the real leverage is sustained, autonomous work — campaigns that run for hours, chipping away at a goal one commit at a time while you do something else.

Ralph loops give you:

  • Incremental progress in small chunks. Each iteration does one thing, tests it, and commits. Small changes are easier to review and safer to ship.
  • Fresh context every iteration. No context window bloat. The agent starts clean each loop and sees the current state of the codebase — including everything it changed last iteration.
  • Continuous work toward a goal. The loop keeps running until you hit Ctrl+C or it reaches the iteration limit. Walk away, come back to a pile of commits.
  • No micromanagement. Define the goal once in the prompt, tune with commands that feed live data back in. The agent figures out what to do next.
  • The prompt is a tuning knob. When the agent does something dumb, add a rule. Like putting up a sign: "SLIDE DOWN, DON'T JUMP."

What people build ralphs for

Ralph What it does
grow-coverage Write tests for untested modules, one per iteration, until coverage hits the target
security-audit Hunt for vulnerabilities — scan, find, fix, verify, repeat
clear-backlog Work through a TODO list or issue tracker, one task per loop
write-docs Generate documentation for undocumented modules, one at a time
improve-codebase Find and fix code smells, refactor patterns, modernize APIs
migrate Incrementally migrate files from one framework or pattern to another
research Deep-dive into a topic — gather sources, synthesize, and build a knowledge base
bug-hunter Run the test suite, find edge cases, write regression tests
perf-sweep Profile, find bottlenecks, optimize, benchmark, repeat

The ralph format is intentionally simple — if you've written a skill file or a GitHub Action, you already know how it works. YAML frontmatter for config, markdown body for the prompt, {{ commands.name }} placeholders for live data.

Install

uv tool install ralphify    # recommended

Or if you don't have uv:

pipx install ralphify       # isolated install via pipx
pip install ralphify         # plain pip (use a virtualenv or --user)

Any of these gives you the ralph command.

Quickstart

Scaffold a ralph and start experimenting:

ralph scaffold my-ralph

Edit my-ralph/RALPH.md, then run it:

ralph run my-ralph           # loops until Ctrl+C
ralph run my-ralph -n 5      # run 5 iterations then stop

What ralph run does

Each iteration:

  1. Runs commands — executes all commands in the ralph, captures output
  2. Builds prompt — reads the RALPH.md body, replaces {{ commands.<name> }} placeholders with fresh output
  3. Pipes to agent — runs the agent command with the assembled prompt on stdin
  4. Repeats — goes back to step 1 with updated data

What it looks like

$ ralph run grow-coverage -n 3

▶ Running: grow-coverage
  1 command · max 3 iterations

── Iteration 1 ──
  Commands: 1 ran
✓ Iteration 1 completed (52.3s)

── Iteration 2 ──
  Commands: 1 ran
✗ Iteration 2 failed with exit code 1 (23.1s)

── Iteration 3 ──
  Commands: 1 ran
✓ Iteration 3 completed (41.7s)

──────────────────────
Done: 3 iterations — 2 succeeded, 1 failed

The ralph format

A ralph is a directory containing a RALPH.md file. Everything the ralph needs lives in that directory — scripts, reference docs, test data, whatever the agent might need.

my-ralph/
├── RALPH.md              # the prompt (required)
├── check-coverage.sh     # script (optional)
├── style-guide.md        # reference doc (optional)
└── test-data.json        # any supporting file (optional)

RALPH.md has YAML frontmatter for configuration and a markdown body that becomes the prompt:

Frontmatter field Required Description
agent Yes The agent command to run
commands No List of commands (name + run) whose output fills {{ commands.<name> }} placeholders
args No Declared argument names for {{ args.<name> }} placeholders
credit No Append co-author trailer instruction to prompt (default: true)

Commands run before each iteration. Their output replaces {{ commands.<name> }} placeholders in the prompt. Use them for test results, coverage reports, git history, lint output — anything that changes between iterations.

The technique

The Ralph Wiggum technique works because:

  • One thing per loop. The agent picks the most important task, implements it, tests it, and commits. Then the next iteration starts fresh.
  • Fresh context every time. No context window bloat. Each loop starts clean and reads the current state of the codebase.
  • Progress lives in git. Code, commits, and a plan file are the only state that persists between iterations. If something goes wrong, git reset --hard and run more loops.

Read the full writeup: Ralph Wiggum as a "software engineer"

Share ralphs

Use agr to install shared ralphs from GitHub:

agr add owner/repo/grow-coverage   # install a ralph from GitHub
ralph run grow-coverage            # run it by name

Ralphs installed by agr go to .agents/ralphs/ and are automatically discovered by ralph run.

Documentation

Full documentation at ralphify.co/docs — getting started tutorial, format spec, cookbook, CLI reference, and troubleshooting.

Requirements

  • Python 3.11+
  • An agent CLI that accepts piped input (Claude Code, Codex, Aider, or your own)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ralphify-0.4.0b2.tar.gz (667.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ralphify-0.4.0b2-py3-none-any.whl (53.1 kB view details)

Uploaded Python 3

File details

Details for the file ralphify-0.4.0b2.tar.gz.

File metadata

  • Download URL: ralphify-0.4.0b2.tar.gz
  • Upload date:
  • Size: 667.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ralphify-0.4.0b2.tar.gz
Algorithm Hash digest
SHA256 adbe4cc72cde0ac0af4b4167038b4b817b9bd6f250c7ee92272a2b80d6450573
MD5 d78013a27c6d4f6b09152684c1d68e35
BLAKE2b-256 adea79449e56c01bf1545b859e8129deed02b8b723de8d7ff186c095d817da20

See more details on using hashes here.

Provenance

The following attestation bundles were made for ralphify-0.4.0b2.tar.gz:

Publisher: publish.yml on computerlovetech/ralphify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ralphify-0.4.0b2-py3-none-any.whl.

File metadata

  • Download URL: ralphify-0.4.0b2-py3-none-any.whl
  • Upload date:
  • Size: 53.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ralphify-0.4.0b2-py3-none-any.whl
Algorithm Hash digest
SHA256 26e76b9f539d412c13df10c4e7554da3e5733196d5751ce9f951e811bab1a0a0
MD5 687eaadeb7d0c105317b3c1e513753e5
BLAKE2b-256 3147de0be7ca527b68f9fefa97dc8a30881fa1f772edc0b835c5d1e285689613

See more details on using hashes here.

Provenance

The following attestation bundles were made for ralphify-0.4.0b2-py3-none-any.whl:

Publisher: publish.yml on computerlovetech/ralphify

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page