{"adoption": {"forks": 2085, "observed_at": "2026-08-28T04:11:31.887608+00:00", "stars": 21627}, "canonical_url": "https://ross.abutalabs.com/products/ralph", "card": {"archived": false, "artifact_type": "cli-tool", "description": "Ralph is an autonomous AI agent loop that runs repeatedly until all PRD items are complete. ", "domain": ["developer-tools", "large-language-models"], "enriched": true, "function": ["agent-framework", "workflow-automation", "developer-tools", "cli"], "health_score": 59, "homepage": "https://x.com/ryancarson/status/2008548371712135632", "language": "TypeScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["snarktank/ralph"], "name": "snarktank/ralph", "platform": ["cli"], "pushed_at": "2026-02-02T01:46:21+00:00", "repo": "snarktank/ralph", "stars": 21627, "tags": ["ai-coding-agent", "autonomous-loop", "prd-driven-development", "claude-code", "amp", "bash-script", "agentic-coding", "ai-agents", "automation", "macos", "linux", "nodejs"], "topics": [], "urls": [], "use_cases": ["run an AI coding agent autonomously until my PRD is done", "automate implementing user stories with Claude Code", "loop an AI coding tool with fresh context each iteration", "generate PRDs and convert them to JSON for autonomous execution", "let an AI agent work through a backlog of features unattended", "orchestrate Amp or Claude Code in a repeatable loop"], "what_it_is": "Ralph is an autonomous AI agent loop that repeatedly runs AI coding tools like Amp or Claude Code until all items in a product requirements document (PRD) are complete. Each iteration starts with a fresh context, with memory persisted through git history, progress.txt, and prd.json.", "when_to_avoid": ["you need a general-purpose agent framework with custom tooling and APIs", "you don't use Amp or Claude Code as your coding assistant", "you want fine-grained human review at every step rather than autonomous loops"], "when_to_choose": ["you already use Amp or Claude Code and want autonomous multi-iteration execution", "you work PRD-driven and want tasks tracked in prd.json with git-based memory", "you want a simple shell-based loop rather than a heavy agent framework"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ralph", "repo": "snarktank/ralph", "role": "main", "score": 45}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:11:31.887608+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T16:57:51.288339+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "0d675a6f06402d2123928c9080d2df125204be3b066cf351cc0b0a066f72c3a9", "fetched_at": "2026-08-28T04:11:31.887608+00:00", "kind": "readme", "missing": false, "url": "https://github.com/snarktank/ralph"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 65, "longevity": 17, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 238, "days_push": 213, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 45, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}