Skip to main content
ResearchForge

ResearchForge

From papers to proof.

PyPI Python 3.12+ Apache 2.0 CI


▶ Watch the intro

Product introduction

ResearchForge turns a research question — or an "improve my repository" goal — into evidence. It finds relevant papers, helps your AI assistant form testable hypotheses, benchmarks competing implementations against a frozen baseline in isolated local workspaces, and delivers the strongest supported result as a clean branch, an engineering report, or a research package.

Works with Claude Code (slash-command skills) and Cursor (MDC rules) out of the box — install once for your whole machine and every session picks them up automatically.

Inspired by Andrej Karpathy's autoresearch, where an agent autonomously runs training experiments against a fixed benchmark overnight — ResearchForge generalizes that loop to any repository with a measurable benchmark, and grounds it in literature: papers → hypotheses → controlled experiments → a validated, reproducible result.

How it works

Three parties with strict roles:

Who Does what
You set the objective; approve the benchmark contract, each experiment plan, and anything that ships
Your AI (Claude Code or Cursor) reads the papers, writes the research landscape, hypotheses, and experiment patches; explains results
The Python engine everything that must be trustworthy: search, validation, isolated execution, ranking, shipping — no prompt can bypass it

No model API key is required — Claude Code is the model. Every artifact Claude writes is schema-validated before it is stored, every experiment runs in a detached git worktree (your checkout is never touched), and "validated" is only ever earned by repeated benchmark runs.

Get started (two minutes)

Everything runs on your machine — nothing is uploaded anywhere.

# 1. Install ResearchForge (Python 3.12+):
pip install "researchforge[serve]"       # or: pipx install "researchforge[serve]"

# 2. Make ResearchForge available in every AI session — pick your IDE:
researchforge claude install --user      # Claude Code only  → ~/.claude/skills/
researchforge cursor install --user      # Cursor only       → ~/.cursor/rules/
researchforge all install --user         # both at once      (recommended)

(Skip step 2 if you like — the first time you run researchforge in a terminal it offers the Claude install with one keystroke, and never asks again. Run the command manually to add Cursor at any time.)

That's the whole setup. Now open any Claude Code or Cursor session and say what you want:

Claude Code: /researchforge-start — "Can uncertainty-aware routing outperform fixed routing?" — or — "Improve this repo's F1 without hurting latency — work in ~/projects/my-repo."

Cursor: open the AI panel, type @researchforge-start and describe the same goal — the rules give Cursor the same workflow knowledge.

The AI asks where the project should live (any folder — a cloned repo to improve, or an empty directory for pure research), initializes it there, and walks the whole journey: it runs the CLI, shows you what it found, and asks before anything is approved, executed, or shipped. If you ever wonder where things stand, researchforge status names the exact next step — and the hub at http://127.0.0.1:9000 shows every project, where it lives, and what's happening, all the time.

Prefer per-project rules/skills instead of the global install? cd into the folder and run researchforge init --claude (Claude), or researchforge cursor install (Cursor), then open your IDE in that folder (Claude Code: open the folder as the session's project — a home-screen session without a folder can't see project skills).

Everything is directory-scoped: the database, worktrees, artifacts, and dashboard live under the project folder. Run commands from any subfolder (they walk up to the project root like git), point at another project with researchforge -C /path/to/project <command>, and print the full location map with researchforge paths.

Working on the ResearchForge source itself?

git clone https://github.com/forger-labs-hq/researchforge
cd researchforge
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

See it work first

docs/demo.md is a ten-minute, fully offline walkthrough against examples/simple-python — a deterministic benchmark where one variant genuinely improves F1, one is rejected for violating the latency budget, and one fails (all three stay in the record). examples/docker-python is the same demo under Docker isolation.

Watch your experiments (dashboard + live monitor)

Two ways to see how experiments perform against the baseline:

researchforge dashboard --open       # one self-contained HTML snapshot

A single static file (no server, no JS libraries, nothing leaves your machine) with an autoresearch-style progress chart — every experiment as a chronological dot, kept improvements annotated, a running-best step line — plus per-experiment bars vs the baseline, the trade-off scatter with the hard-constraint line, the funnel with drop-offs, and validation spread.

The static dashboard also opens with summary stats (best score and its delta vs baseline, experiments kept · discarded · errored, the Pareto frontier) and the experiment tree — a graph from the baseline through every branch of experiments (see "experiments on experiments" below).

pip install "researchforge[serve]"
researchforge serve --background     # live monitor for THIS project (URL printed)

A local web monitor that follows runs as they happen: overview with the next action, collapsible research sessions with the full recorded detail (directions, evidence, limitations, underexplored aspects), per-run execution timelines with work locations on disk, the experiment tree with click-through drill-down pages for every experiment (lineage, decision, executions, artifacts on disk), the live chart dashboard, and a JSON API (/api/state). Once the extra is installed, experiment run/start auto-start it and print the URL. Manage it with researchforge serve --status / --stop. The server opens the database read-only and binds 127.0.0.1 only by default — watching can never interfere with a run.

The hub — every project, one dashboard

researchforge hub --background       # http://127.0.0.1:9000 — all projects

Projects live in whatever folders you initialize them in, and it is easy to forget which. The hub is one machine-wide page listing every project with its folder location, status, and live activity; click through to any project's full monitor (sessions, runs, experiment tree, drill-downs). Every researchforge init registers the project, so new projects appear automatically — and once the serve extra is installed, any researchforge command quietly ensures the hub is running, so http://127.0.0.1:9000 is simply always there (set RESEARCHFORGE_NO_HUB=1 to opt out). Commands run in a subfolder of a project also walk up to find it (like git) and print Using project at <root> so you always know which project you're in.

Journey A — research an idea

You have a question; ResearchForge grounds it in literature. From Claude Code, /researchforge-start with your question does all of this; the CLI equivalent (where you write the synthesis files against exported schemas) is:

researchforge project create --mode explore_research_idea --objective "..."
researchforge research search        # arXiv: fetch -> dedup -> rank -> store
researchforge research context       # exports context.json with the schemas
# Claude (or you) writes landscape.yaml + hypotheses.yaml — validated on import:
researchforge research landscape --import .researchforge/synthesis/landscape.yaml
researchforge hypotheses import .researchforge/synthesis/hypotheses.yaml
researchforge report build           # citation-backed report
researchforge paper package          # optional: BibTeX, outline, evidence matrix

You end up with: a research landscape (directions + graded evidence: published claim vs interpretation vs speculation), testable hypotheses, a citation-backed Markdown report, and optionally a full research bundle. Details: docs/research-mode.md

▶ Watch the research flow demo

↑ Research journey demo — arXiv search → landscape → hypotheses → report

Journey B — improve a repository

Everything in Journey A, then benchmarked experiments on your code. Every consequential step is your typed approval — Claude cannot approve, run, or ship anything by itself.

1. Define and freeze the evaluation:

researchforge project create --mode improve_repository --objective "..."
researchforge repo scan
researchforge contract generate      # edit researchforge.yaml, then:
researchforge contract approve       # YOUR approval -> immutable contract
researchforge baseline run           # frozen reference measurement

2. Run experiments (Claude writes plan.yaml + one patch per variant after researchforge experiment plan hyp-001; manually you write them against the exported schema):

researchforge experiment start .researchforge/experiments/plan.yaml
# = import + ONE typed approval (shows worst-case wall time) + run

Experiments on experiments (branching): a plan entry can declare parent: exp-001 (or the key of another entry in the same plan) to build on top of a previous experiment instead of the baseline — refine a winner, or rescue a rejected idea by combining it with something else. The engine validates the whole chain at import (a child that doesn't apply on its parent's state is refused), executes it root-first in isolation, and still measures honestly against the frozen baseline. Ship a branched winner and the chain is composed into one clean commit. The dashboard draws the whole tree, like Karpathy's autoresearch UI.

3. Inspect and validate:

researchforge results show run-001   # ranking, trade-offs, rejections
researchforge validate run-001       # repeated runs earn "validated"

4. Accept the result → what ships (and how the PR happens):

researchforge ship branch    # clean LOCAL branch on the frozen baseline —
                             # one commit, nothing pushed, inspect with git
researchforge report build   # engineering report: the full evidence chain
researchforge ship pr        # OPT-IN: push + open a DRAFT PR on YOUR repo

ship pr is how the pull request gets created, and it only works when all three gates open: shipping.allow_draft_pr: true in the approved contract, the gh CLI authenticated to your remote, and a typed push confirmation from you. It pushes exactly one branch and opens a draft PR for human review — nothing is ever pushed without those gates. Prefer full control? Stop after ship branch and push/PR yourself with plain git. Details: docs/experiment-mode.md

Open-source repositories (no push access): cloned someone else's repo? ship pr detects that you can't push to origin and switches to the fork workflow — behind a typed fork confirmation that spells out exactly what happens: a public fork is created (or reused) under your GitHub account, one branch is pushed to the fork, and a draft PR is opened on the upstream repository. One caveat to review first: if you committed a benchmark locally to establish the baseline, that commit is part of your branch's history and will appear in the PR — check git log (the CLI warns you when the branch carries extra commits). And read the project's CONTRIBUTING.md before opening PRs on repos you don't maintain — a draft PR with a reproducible, validated improvement is a good contribution; ten of them are spam.

▶ Watch the improve-repository demo

↑ Improve-repository demo — baseline → experiments → validation → ship branch + PR

Managing experiment runs

I want to… Command
start a batch (one command) researchforge experiment start plan.yaml
watch it live researchforge serve --background (URL is printed)
see ALL projects + their folders researchforge hub --background → http://127.0.0.1:9000
stop a running batch Ctrl-C — always safe (isolated worktrees)
continue an interrupted run researchforge experiment resume run-001
discard an interrupted run researchforge experiment abandon run-001
run another batch researchforge experiment plan hyp-002 → start again
build on a previous experiment parent: exp-001 in the next plan entry
see what's next, always researchforge status
see where everything lives researchforge paths
reset the whole project rm -rf .researchforge researchforge.yaml

Everything is local; nothing outside your repository is ever created. To redefine just the objective on existing data: researchforge project create --force-update. docs/claude-mode.md explains exactly what the Claude skills do and cannot do.

Supported repositories (beta)

The improve-repository journey currently expects:

  • a git repository with user-owned or trusted code (isolation is local, not a hostile-code sandbox — docs/security.md);
  • a Python 3.11+ single project or single target service;
  • an existing Dockerfile or simple Python dependency metadata (requirements.txt / pyproject.toml);
  • a machine-readable benchmark (a command that writes JSON metrics) with bounded runtime;
  • no production infrastructure required.

The explore-research-idea journey works anywhere. Repositories outside this matrix are reported honestly by researchforge repo scan rather than half-supported.

Beta feedback

This is a narrow-but-complete beta — reports shape what gets built next. Use the issue templates (bug, setup failure, beta feedback). Optionally, researchforge analytics enable records local-only coarse events — nothing is transmitted — and researchforge analytics show computes the beta metrics you can choose to include in a report.

More documentation

IDE integration quick-reference

Command What it does
researchforge claude install --user Install Claude Code skills → ~/.claude/skills/
researchforge cursor install --user Install Cursor rules → ~/.cursor/rules/
researchforge all install --user Install both at once
researchforge claude install Project-local Claude skills → .claude/skills/
researchforge cursor install Project-local Cursor rules → .cursor/rules/
researchforge all status Check install state for both IDEs
researchforge all install --user --force Overwrite any locally-edited files

License

Apache-2.0 — see LICENSE.

Release files for researchforge 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for researchforge 0.2.0
File Size Uploaded
researchforge-0.2.0.tar.gz 27.0 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for researchforge 0.2.0
File Interpreter ABI Platform
researchforge-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 27.2 MB

Release files / researchforge-0.2.0.tar.gz

Download URL researchforge-0.2.0.tar.gz
Size 27.0 MB
Tags Source
SHA-256 checksum
How to use checksums
f2bcd327495adf52bf7ecc55f35e1aa00b8e2dfd42b77fb800e8d198f4e737d9
BLAKE2b-256 checksum
How to use checksums
a707263385a0a5e938021cecf79f2012d7f21cda13762b6c38d7bbbddfc3ef87
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

Release files / researchforge-0.2.0-py3-none-any.whl

Download URL researchforge-0.2.0-py3-none-any.whl
Size 245.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
36044017f6aef7207489611449e8bd931325cba260d5b5b4f0568ea586dcf835
BLAKE2b-256 checksum
How to use checksums
aaa0d9a396d31dd27c6a96531553ac235d4b3fd3e9b8f78a4d923182e4e6e61a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page