Autonomous continuous development orchestrator for Claude Code
This project has been archived.
The maintainers of this project have marked this project as archived. No new releases are expected.
Project description
radioactive-ralph
Autonomous continuous development orchestrator for Claude Code.
What it is
radioactive-ralph drives Claude Code across a portfolio of git repos — continuously, without human intervention. It ships in two modes:
- As a Claude Code plugin — a family of ten
/ralphvariants you run directly inside a Claude Code session. No separate daemon, no API key setup, no subprocess orchestration. - As a standalone Python daemon —
pip install radioactive-ralphand runralph runto get a persistent loop that survives context resets, spawnsclaude --printsubprocesses, and lives outside any Claude Code session.
The only time you should be engaged is to brainstorm the vision.
Ralph has many forms
radioactive-ralph is not one skill. It's a family of ten, each a genuinely distinct operating mode with its own model tiering, parallelism, tool allowlist, and termination condition. See the variants index for more details.
| Variant | One-liner | Gate |
|---|---|---|
/green-ralph |
The Classic. Unlimited loop, all repos, sensible model tiering. | — |
/grey-ralph |
The First Form. Single repo, haiku only, file hygiene. | — |
/red-ralph |
The Principal. Single cycle, CI failures + PR blockers, structured report. | — |
/blue-ralph |
The Observer. Read-only — Write/Edit structurally excluded. |
— |
/professor-ralph |
The Integrated. Opus plan → sonnet execute → sonnet reflect. | — |
/joe-fixit-ralph |
The Fixer. N cycles, single repo, ROI-scored, prints a bill. | — |
/immortal-ralph |
The One Who Comes Back. Crash-resistant. Obsessive state persistence. | — |
/savage-ralph |
The Mindless. 10 parallel, +1 tier escalation, zero sleep. | --confirm-burn-budget |
/old-man-ralph |
The Maestro. Force-resets branches, resolves conflicts -X ours. |
--confirm-no-mercy |
/world-breaker-ralph |
The World Breaker. Every agent opus. All repos. Zero sleep. | --confirm-burn-everything |
Install as a Claude Code plugin
# Add this repo as a marketplace
claude plugins marketplace add github:jbcom/radioactive-ralph
# Install
claude plugin install radioactive-ralph@radioactive-ralph
# Then, inside Claude Code:
/green-ralph
All ten variants are installed at once. Use whichever you need per-session.
Install as a standalone daemon
# Run instantly — no install required
uvx radioactive-ralph run
# Or install permanently
pip install radioactive-ralph
ralph run
How the daemon mode works
┌─────────────────────────────────────────────────────┐
│ radioactive-ralph │
│ (Python daemon) │
│ │
│ scan PRs → merge ready → review → address feedback │
│ → discover work → spawn agents → loop │
│ │
│ State: ~/.radioactive-ralph/state.json │
└──────────────┬──────────────────────────────────────┘
│ spawns
▼
┌─────────────────────────────────────────────────────┐
│ claude CLI subprocesses │
│ (one per repo, run in parallel) │
│ │
│ Each agent: reads context, does work, opens PR │
└─────────────────────────────────────────────────────┘
Model tiering
| Task | Model |
|---|---|
| Doc sweeps, frontmatter, bulk cleanup | claude-haiku-4-5 |
| Feature work, bug fixes, PR review | claude-sonnet-4-6 (default) |
| Architecture, security, vision | claude-opus-4-6 |
Each variant has its own model tiering policy — see the individual skill READMEs.
Configuration
Create ~/.radioactive-ralph/config.toml:
[orgs]
arcade-cabinet = "~/src/arcade-cabinet"
jbcom = "~/src/jbcom"
bulk_model = "claude-haiku-4-5-20251001"
default_model = "claude-sonnet-4-6"
deep_model = "claude-opus-4-6"
max_parallel_agents = 5
Set ANTHROPIC_API_KEY in your environment (daemon mode only — the plugin mode uses your existing Claude Code session).
Commands (daemon mode)
ralph run # Start the daemon
ralph dashboard # Open the live Rich terminal dashboard (reads state)
ralph status # Show current state
ralph discover # Show discovered work items
ralph pr list # List all open PRs with classification
ralph pr merge # Merge all MERGE_READY PRs
ralph doctor # Run diagnostic health checks on the environment
ralph doctor --json # Same checks, JSON output for CI/scripting
ralph stop # Stop the running daemon
ralph install-skill # Install a skill variant into ~/.claude/skills/
The dashboard command is read-only — it tails ~/.radioactive-ralph/state.json
every second and renders a live multi-panel view (PRs, work queue, active agents,
recent Ralph events, and stats footer). Run it in a second terminal alongside
ralph run. Theme it with any variant: ralph dashboard -v old-man-ralph.
Personality
radioactive-ralph logs in the voice of Ralph Wiggum. Every variant has its own color scheme and quote set. The messages are variant-aware, event-aware, and randomly selected — so Ralph stays surprising while you watch him do 400 cycles. Yes, really.
[green-ralph] I dressed myself! And now I'm running!
[green-ralph] Cycle 1! I'm doing cycle 1! That's where I'm a developer!
[green-ralph] Scanning 12 repos for pull requests. I can see them with my eyes!
[green-ralph] Found 18 open pull requests across 12 repos! I found them!
[green-ralph] Merging PR #142 in radioactive-ralph. Squash! Like the game!
[green-ralph] PR #142 merged! Everybody's hugging!
[green-ralph] Sleeping for 30 seconds. Oh boy, sleep! That's where I'm a Viking!
See src/radioactive_ralph/ralph_says.py for the full personality module.
Requirements
- Python 3.12+
claudeCLI installed and authenticated (claude login)ghCLI installed and authenticated (gh auth login)ANTHROPIC_API_KEYset in environment (daemon mode only)
Contributing
See AGENTS.md for agentic operating protocols, STANDARDS.md for code quality rules, and CONTRIBUTING.md for the contribution workflow.
git clone git@github.com:jbcom/radioactive-ralph.git
cd radioactive-ralph
uv sync --all-extras
uv run pytest
License
MIT. See LICENSE.
Launch notes (maintainers — uploading the social preview + demo assets)
Social preview image
GitHub shows a custom image when someone shares this repo on LinkedIn, HN, Slack, X, etc. The image file lives at assets/social-preview.png (1280x640 PNG). To upload or replace it:
- Generate or update
assets/social-preview.pngper the spec inassets/ASSETS.md - Commit and push the file (so it's versioned and reviewable)
- Upload it to GitHub:
- Go to Settings -> General -> Social preview
- Click Edit -> Upload an image...
- Select the PNG from your local checkout (
assets/social-preview.png) - Save. GitHub caches the new card; force-refresh via opengraph.dev or LinkedIn's Post Inspector if the old one sticks
Demo GIF
The README can embed assets/demo.gif once it's recorded. To record (or re-record) it:
# Install vhs once
brew install vhs # or: go install github.com/charmbracelet/vhs@latest
# Record — the tape file is the source of truth
./scripts/record-demo.sh
Edit scripts/demo.tape to change what the demo shows. The recording is fully deterministic — same tape + same ralph state ≈ same GIF.
Full asset checklist
See docs/LAUNCH.md for the full launch checklist and the LinkedIn / Hacker News draft copy.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file radioactive_ralph-0.5.1.tar.gz.
File metadata
- Download URL: radioactive_ralph-0.5.1.tar.gz
- Upload date:
- Size: 2.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eec120778b7f7662f24d2ce760d2b07e834a9c2a70790a85a5fc384297025415
|
|
| MD5 |
dc8f3fee8408dba7101830f2d1d2a215
|
|
| BLAKE2b-256 |
cc18bdd0308584ce8079a5c57d12ef208c5ecefad52434a1172b63c3d5ee59ac
|
Provenance
The following attestation bundles were made for radioactive_ralph-0.5.1.tar.gz:
Publisher:
release.yml on jbcom/radioactive-ralph
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
radioactive_ralph-0.5.1.tar.gz -
Subject digest:
eec120778b7f7662f24d2ce760d2b07e834a9c2a70790a85a5fc384297025415 - Sigstore transparency entry: 1271724704
- Sigstore integration time:
-
Permalink:
jbcom/radioactive-ralph@c52eb29102b31420f712ec715255f9d544679263 -
Branch / Tag:
refs/tags/v0.5.1 - Owner: https://github.com/jbcom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c52eb29102b31420f712ec715255f9d544679263 -
Trigger Event:
push
-
Statement type:
File details
Details for the file radioactive_ralph-0.5.1-py3-none-any.whl.
File metadata
- Download URL: radioactive_ralph-0.5.1-py3-none-any.whl
- Upload date:
- Size: 40.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48addce6bf34342af50f0cb2726ec5aedbf6df25d87ec08e3da8f9f3b1cced2b
|
|
| MD5 |
55086408b0c8b5e1a40d6542eb8c4674
|
|
| BLAKE2b-256 |
21c7806cfd3c9575c8bb43627bb975c2b2fcb2bb051c6eafc5e43dc6fe2c0f78
|
Provenance
The following attestation bundles were made for radioactive_ralph-0.5.1-py3-none-any.whl:
Publisher:
release.yml on jbcom/radioactive-ralph
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
radioactive_ralph-0.5.1-py3-none-any.whl -
Subject digest:
48addce6bf34342af50f0cb2726ec5aedbf6df25d87ec08e3da8f9f3b1cced2b - Sigstore transparency entry: 1271724725
- Sigstore integration time:
-
Permalink:
jbcom/radioactive-ralph@c52eb29102b31420f712ec715255f9d544679263 -
Branch / Tag:
refs/tags/v0.5.1 - Owner: https://github.com/jbcom
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c52eb29102b31420f712ec715255f9d544679263 -
Trigger Event:
push
-
Statement type: