jordan-gibbs/hyperresearch
Convert Claude Code or Codex into the most intelligent Deep Research Agent. Collect, search, and synthesize web research into a persistent, searchable wiki that builds on itself.
About jordan-gibbs/hyperresearch
jordan-gibbs/hyperresearch is an open-source project on GitHub, mainly written in Python. Convert Claude Code or Codex into the most intelligent Deep Research Agent. Collect, search, and synthesize web research into a persistent It currently holds 4,364 stars and 446 forks with 20 open issues, and was last pushed on 2026-11-01 (repository created 2026-04-09).
Project Overview
AI Homed tracks it on the Today's Trending board, currently at rank #46 with 27 new stars today.
GitHub Repository Details
README
The Most Powerful Deep Research Harness: a deep research skill for Claude Code and OpenAI Codex
---
Hyperresearch turns Claude Code into a deep research agent, and it's #1 on the DRACO deep research benchmark, ahead of Claude Research, ChatGPT, Gemini and Perplexity. It runs in OpenAI Codex too. A tier-adaptive 16-step pipeline takes one prompt and produces an adversarially-audited report with full source provenance. Every source it reads lands in a persistent, searchable vault, so each session starts smarter than the last.
Don't want to run it locally? Hyperresearch is the hosted version: the same pipeline, with no Claude Code or Codex install needed.
[!NOTE]
New: hyperresearch runs on OpenAI Codex. One command installs the full pipeline for Codex: entry skill, step procedures, the subagent roster as Codex custom agents, and a Stop hook that keeps Codex from skipping steps. Same vault, same ship gate as on Claude Code.
>> pip install hyperresearch && hyperresearch install . --target codex
codex --sandbox workspace-write -c sandbox_workspace_write.network_access=true # then: $hyperresearch
> Codex support ships in the next PyPI release; until then install from GitHub with pip install git+https://github.com/jordan-gibbs/hyperresearch. Details and what differs on Codex: Codex.
See a sample report
Read a full report before you install anything. These are unedited Deep runs from the hosted version, and you don't need to log in:
- Toast vs Square vs Clover: a restaurant POS competitor analysis, built mostly from SEC filings (241 sources)
- Buying a $2M HVAC business: multiples, SBA loans and diligence (213 sources)
- Who is winning AI coding agents, October 2026 (259 sources)
Why it wins
- 250+ sources in a single run. The
premierscale profile targets 100–130 in the width sweep alone; citation chasing and gap-fill fetches more than double what actually lands in the corpus. - Every citation is verified before the report ships. A skeptical cite-checker audits whether each cited source actually supports its sentence. Hallucinated quotes and unacknowledged retractions are hard blocks at the gate.
- Syndication doesn't count as consensus. An independence audit clusters derivative copies, so five reprints of one press release argue with the weight of one source.
- Adversarial by construction. Four critics attack every draft in parallel, and a tool-locked patcher can only apply surgical edits. It physically cannot rewrite the report.
- Eight scholarly sources, one query.
hpr scholar searchhits OpenAlex, Crossref, CORE, DOAB, ClinicalTrials.gov, SEC EDGAR and FRED through one client layer and returns a single list deduplicated by DOI and title. Books, trials and filings come back alongside papers, each tagged so the pipeline knows which is which. The humanities and social sciences are covered on purpose, not as an afterthought. - Paywalled papers get read, not skimmed. A closed paper normally enters a vault as a 1,500-character abstract that the report then cites as though it had been read. Hyperresearch asks Unpaywall, Europe PMC and CORE for a legal open-access copy and stores the full text instead, even when the publisher blocks the fetch outright. Every substitution is disclosed in the note, the frontmatter, and the CLI output.
- Nothing is thrown away. Every source lands in a searchable markdown-plus-SQLite vault that your next session reuses before it fetches anything new.
- Crashed runs resume. Each run keeps a manifest;
run resumepicks up at the exact step where it died. - Scales from 30 minutes to a dissertation. Bounded queries auto-route to a 5-step fast path. Opt-in dissertation runs (experimental) write 25K–80K words across chapters, from 300–450 sources.
Install
Works in Claude Code and OpenAI Codex: same pipeline, same vault.
cd your-project
pip install hyperresearch
hyperresearch install # Claude Code, then: /hyperresearch
hyperresearch install . --target codex # OpenAI Codex, then: $hyperresearch
--target all installs both side by side. Codex sessions need write access and network, see below.
Prefer a plugin or a single skill? Each route below installs one bootstrap skill, deep-research, that sets the pipeline up in the current project on first use. It still needs pip install hyperresearch.
| | Claude Code | OpenAI Codex |
|---|---|---|
| Plugin | /plugin marketplace add jordan-gibbs/hyperresearch/plugin install hyperresearch@hyperresearch | codex plugin marketplace add jordan-gibbs/hyperresearchcodex plugin add hyperresearch@hyperresearch |
| Skill (skills.sh) | npx skills add jordan-gibbs/hyperresearch -a claude-code | npx skills add jordan-gibbs/hyperresearch -a codex |
| Invoke | /hyperresearch:deep-research (plugin)/deep-research (skill) | $hyperresearch:deep-research (plugin)$deep-research (skill) |
Or just ask for deep research in plain words; the skill triggers on its description.
Python 3.11–3.14.
> Power users:hyperresearch install --globalmakes/hyperresearchreachable from every Claude Code session anywhere, at the cost of ~15 lines in every session's system reminder. Per-project install (above) keeps unrelated CC sessions clean.
The bootstrap skill
The repo is a Claude Code plugin marketplace, a Codex plugin marketplace, and a skills.sh source, and all three ship the same skill, deep-research. It checks for the hyperresearch CLI, runs hyperresearch install for the agent it is running in (--target codex under Codex), and hands off to the pipeline. The pipeline itself still comes from the Python package.
If Claude Code does not pick up the newly installed skills and subagents, restart it in the same directory and run /hyperresearch . Codex discovers skills at session start, so on first use the bootstrap reads the freshly installed entry skill directly; later sessions can start with $hyperresearch .
Codex
The same pipeline runs on the OpenAI Codex CLI.
cd your-project
pip install hyperresearch && hyperresearch install . --target codex
This installs the entry skill at .agents/skills/hyperresearch/, the step procedures under .hyperresearch/codex/steps/, the subagents as custom agents in .codex/agents/, a Stop hook in .codex/hooks.json, and a short block in AGENTS.md. --target all installs the Claude Code and Codex versions side by side. --global --target codex puts the entry skill in ~/.agents/skills/ and the agents in ~/.codex/agents/.
Research needs to write files and reach the network, and Codex allows neither by default. Start the session with both enabled, then invoke the skill:
codex --sandbox workspace-write -c sandbox_workspace_write.network_access=true
then, in the session:
$hyperresearch
non-interactive:
codex exec --sandbox workspace-write -c sandbox_workspace_write.network_access=true \
--dangerously-bypass-hook-trust "\$hyperresearch "
You pass these as flags; hyperresearch never edits your Codex config. codex exec cannot ask you to trust the project's hooks, so without --dangerously-bypass-hook-trust the Stop hook below does not run. Only pass it for hooks you have read (.codex/hooks.json).
Subagents inherit the session's model. To pin a model per role, add a codex_models override to a profile in .hyperresearch/config.toml and re-run hyperresearch install . --target codex:
[profile.full]
codex_models = { fetcher = "gpt-5.4-mini", critics = "gpt-5.5" }
What is different on Codex:
- No browser lane. Codex has no Claude-in-Chrome equivalent, so fetches blocked by a login wall or bot wall stay in the escalation queue, and the final message lists them for you.
- Tool locks are instructions, not enforcement. Codex custom agents have no per-agent tool allowlist. The patcher and polish auditor are told to make surgical edits only, but nothing stops them from doing more.
- A Stop hook guards the pipeline.
hyperresearch run stop-gateblocks the session from ending while the newest run is mid-pipeline, so Codex cannot quietly answer inline and stop. Codex runs a project's hooks only after you trust them.
The 16-step research pipeline
The entry skill is a thin router. It pins down the canonical research query, then invokes one step skill per phase via Claude Code's Skill tool (on Codex, it reads one step file per phase from .hyperresearch/codex/steps/). Each step's procedure loads into context only when that step actually runs. That's what stops a long pipeline from quietly dropping steps as its context rots.
| # | Step | What it does | Tiers | |---|---|---|---| | 1 | Decompose | Canonical query → atomic items + coverage matrix + tier classification | all | | 1.5 | Chapter partition | Group atomic items into 4–10 chapters; steps 2–10 then loop per chapter | dissertation | | 2 | Width sweep | Multi-perspective search plan + parallel fetcher waves | all | | 3 | Contradiction graph | Pair contradictions across the corpus into ranked clusters | full | | 4 | Loci analysis | Two parallel loci-analysts → scored loci with source budgets | full | | 5 | Depth investigation | K parallel depth-investigators → interim notes with committed positions | full | | 6 | Cross-locus reconcile | Reconcile committed positions → comparisons.md | full | | 7 | Source tensions | Extract expert disagreements → source-tensions.json | full | | 8 | Corpus critic | "What source would overturn this?" + targeted gap-fill fetch | full | | 9 | Evidence digest | Top claims + verbatim quotes → evidence-digest.md | full | | 10 | Triple draft | Per-angle source curation + 3 parallel draft sub-orchestrators (light: single draft) | all | | 11 | Synthesize | Plan + outline + spawn synthesizer subagent → final_report.md | full | | 12 | Critics | 4 adversarial critics in parallel → findings JSONs | full | | 13 | Gap-fetch | Targeted fetch wave for critic-identified vault gaps | full | | 14 | Patcher | Surgical Edit hunks applied to draft (tool-locked Read+Edit) | full | | 14.5 | Cite-check | Verify citation-sentence bindings; skeptical LLM spot-check; second surgical patch pass | full | | 15 | Polish | Hygiene + filler pass (tool-locked Read+Edit subagent) | all | | 16 | Readability audit | Recommender writes JSON suggestions; orchestrator selectively applies | all |
Tiers and gears: the two scale levers
Tiers route per query. Step 1 auto-classifies light vs full. dissertation is opt-in only; ask for it in your prompt. It is experimental: its length, read-budget and citation targets are configured but not yet wired in (#103).
| Tier | What runs | Typical time |
|---|---|---|
| light | bounded factual queries, surveys, comparisons: 1 → 2 → 10 → 15 → 16 | ~30–40 min |
| full (default) | deep argumentative analysis with adversarial review: all 16 steps + cite-check | ~1.5–2.5 h at full gear |
| dissertation (experimental) | chaptered mega-runs: 300–450 sources across 4–10 chapters, 25K–80K words | ~4–8 hours |
Gears set the scale of the standard pipeline: the source targets, depth budgets, and word targets rendered into the step skills.
hyperresearch profile list # all profiles + descriptions + current gear
hyperresearch profile use premier # 100–130 sources, doubled depth budget (~3–5 h)
hyperresearch profile use full # back to the 55–80-source baseline
The gear persists per project and survives reinstalls. Custom gears: define [profile.] in .hyperresearch/config.toml (any knob: source targets, loci caps, draft counts, word targets, per-agent models) and profile use .
Run levers: what voice the report is written in
Tiers and gears set how much work happens. Levers set what kind of report comes out, and step 1 picks them from your prompt's verb shape. An explicit directive in your prompt always wins.
| Lever | Values | What changes |
|---|---|---|
| register | teach / survey / analyze / advocate | "Teach me X" gets a pedagogical explainer; "what's the landscape" gets a map of the field with no verdict; analyze (the default) gets the evaluative argument; advocate defends one named thesis |
| domain_notes | freeform | Sourcing strategy, evidence norms, recency window for the field in question |
| inference_depth | surface / standard / deep | The rabbithole dial. Step 4 can upgrade it after seeing what the corpus actually holds |
The levers render into role-scoped shim files that spawn templates paste verbatim into subagent prompts, so the critics move with the register instead of undoing it. In survey register the dialectic critic flags unfair representation rather than missing commitment, and the polish auditor stops striking hedges. In advocate all of them tighten instead.
The cite-checker and the ship gate receive no shim at all. Verification never softens by mode.
hyperresearch levers set inference_depth=deep --rerender # go deeper mid-run
hyperresearch run status -j # see what step 1 chose
The two load-bearing principles
1. Patch, never regenerate. After step 11 produces the synthesized report (or step 10 for light tier), the only modifications are surgical Edit hunks. The patcher and polish auditor are tool-locked to [Read, Edit] at the Claude Code allowlist level so they physically cannot Write a new draft (on Codex this lock is an instruction, not enforcement). Per-hunk caps make "just rewrite it" mechanically impossible. Critic findings that don't fit a small hunk escalate as structural issues.
2. Canonical research query is gospel. The verbatim user prompt is persisted to research/runs/<vault_tag>/query.md once and re-read by every subsequent step and every spawned subagent. Wrapper requirements (save paths, citation format, terminal sections) are a separate contract.
Subagent roster
Models are profile config, not hardcode. The table shows the shipped defaults, and you can override any of them in .hyperresearch/config.toml: [profile.full] with models = { fetcher = "haiku" } swaps every fetcher to Haiku on the next install or profile use.
| Agent | Default model | Role |
|---|---|---|
| hyperresearch-fetcher | Sonnet | URL fetching via crawl4ai; runs 8–12 in parallel per wave |
| hyperresearch-source-analyst | Sonnet | End-to-end digest of any single long source >5000 words |
| hyperresearch-loci-analyst | Sonnet | Reads the width corpus, returns 1–8 depth loci with rationale |
| hyperresearch-depth-investigator | Sonnet | Investigates one locus, writes one interim note with a committed position |
| hyperresearch-corpus-critic | Sonnet | "What source would overturn the current direction?" pre-draft gap analysis |
| hyperresearch-draft-orchestrator | Opus | One per draft angle; reads its curated source list and writes one draft |
| hyperresearch-synthesizer | Opus | Reads all 3 drafts, writes the final report (two-pass write, Read+Write locked) |
| hyperresearch-dialectic-critic | Opus | Counter-evidence the draft missed |
| hyperresearch-depth-critic | Opus | Shallow spots interim notes could fill |
| hyperresearch-width-critic | Opus | Topical corners the corpus supports but the draft ignores |
| hyperresearch-instruction-critic | Opus | Structural mismatches against the prompt's atomic items |
| hyperresearch-patcher | Opus | Tool-locked [Read, Edit]. Applies critic findings as surgical Edit hunks |
| hyperresearch-cite-checker | Sonnet | Skeptically verifies sampled citation-sentence bindings before ship |
| hyperresearch-polish-auditor | Opus | Tool-locked [Read, Edit]. Cuts filler, strips hygiene leaks |
| hyperresearch-readability-recommender | Opus | Writes JSON suggestions for paragraph rhythm and list/table conversion |
| hyperresearch-browser-fetcher | Sonnet | Drains the escalation queue by driving your real Chrome (Claude-in-Chrome) |
---
The vault: persistent, searchable, compounding
Most deep research harnesses are one-shot: report out, everything else discarded. Hyperresearch keeps what it reads. Every fetched source lands in a SQLite-indexed vault that future sessions search before they fetch.
hyperresearch search "ion-trap gate fidelity" -j # Full-text search
hyperresearch search "quantum" --include-body -j # Full-body search
hyperresearch note show -j # Batch-read notes
hyperresearch graph hubs -j # Most-connected notes
hyperresearch graph backlinks -j # Reverse links
hyperresearch lint -j # Health check (broken links, missing tags)
Markdown is truth, SQLite is cache. Notes live as plain markdown with YAML frontmatter in research/notes/. The SQLite index is fully rebuildable: delete it and hyperresearch sync reconstructs it from the markdown. Open the vault in any editor, version it in git. You don't need the tool installed to read your own research.
PDFs fetch directly. hyperresearch fetch auto-detects PDF URLs (arXiv, NBER, SSRN, direct .pdf links) and extracts full text via pymupdf. Raw PDFs land in research/raw/.pdf and the note's raw_file: frontmatter links back.
Provenance breadcrumbs. Every fetched source carries a --suggested-by link back to whatever surfaced it. The chain forms a rooted tree from seed fetches; the provenance lint rule catches disconnected components.
Semantic search, if you want it. hyperresearch embed sync populates embeddings (provider-pluggable: voyage, openai, or the default none, which needs zero API keys) and search --semantic blends vector similarity with full-text ranking.
Curation: notes have a lifecycle
Every session ends with a curation pass, and notes move through draft → review → evergreen, or stale → deprecated → archive as material ages out. That's what keeps a vault from turning into a landfill of half-read pages.
hyperresearch note update --summary "..." --add-tag -j # promote a draft
hyperresearch dedup -j # near-duplicate pairs by content similarity
hyperresearch topic tree -j # the topic hierarchy
hyperresearch index build -j # regenerate index pages
hyperresearch batch set-status stale --tag -j # bulk lifecycle moves
hyperresearch link --note --dry-run -j # wiki-links the linker would add
You are not locked in
The vault is markdown in a directory. Everything below is a convenience on top of that, not a dependency.
hyperresearch export json -o out.json # every note as structured JSON
hyperresearch export vault # a filtered subset to another directory
hyperresearch import # pull an existing markdown collection in
hyperresearch git changed -j # notes with uncommitted changes
hyperresearch git log -j # notes touched by recent commits
hyperresearch watch # auto-sync while you edit in your own editor
---
Use the vault outside Claude Code
An MCP server. pip install hyperresearch[mcp], then hyperresearch mcp speaks stdio, so Claude Desktop, Cursor, or anything else that speaks MCP can work the same vault. Thirteen tools: search_notes, read_note, read_many, list_notes, get_backlinks, get_hubs, vault_status, lint_vault, check_source, list_sources, fetch_url, create_note, update_note.
A local web UI. hyperresearch serve --open starts a stdlib HTTP server on port 8080 with note browsing, tag pages, search, and an interactive link graph. No build step and no JavaScript dependencies.
---
Source ranking: quality is persistent, not vibes
Every source accumulates a composite quality_score built from source-type tier, fetch-time utility, citation authority (from OpenAlex / Semantic Scholar, including retraction flags), and vault PageRank centrality:
hyperresearch sources score -j # Enrich DOI-bearing notes: citations, venue, retractions
hyperresearch graph rank -j # PageRank over the link + provenance graph
hyperresearch search "q" --ranked -j # Quality-weighted full-text search
hyperresearch sources independence -j # Cluster syndicated/derivative copies: 5 copies of one press release = 1 vote
hyperresearch claims search "q" -j # Query extracted claims across all sources
Retracted sources are floored to near-zero quality, and a ship-time retraction sweep re-checks every cited DOI fresh, so a retraction published yesterday is caught today. Even on vault sources reused