Bad Research
michael jackson bad
A keyless deep-research agent that runs as a Claude Code skill — a
fork-and-enhance of hyperresearch.
It searches wide, filters garbage, grounds every claim to a source, and needs
zero API keys: the Claude Code host model supplies all inference, exactly like
hyperresearch. Optional local CLIs and a [local] neural extra are enhancements,
never requirements.
Install
Bad Research is a small CLI that registers itself as a Claude Code skill. No API keys. Requires Python 3.11–3.13.
# Install the CLI (pipx or uv — either works)
pipx install bad-research
uv tool install bad-research
# Register the /bad-research skill into ~/.claude
bad install
# Verify
bad doctor
bad install writes the entry skill to ~/.claude/skills/bad-research/; the per-step
skills install lazily on first use. For a project-local install instead of global, run
bad install --project inside the project. bad doctor shows what's wired (host model,
keyless search/browse, the optional external CLIs it can drive, the [local] neural stack).
Use it in Claude Code
After bad install, open Claude Code in any project and either:
- Invoke it directly — type the slash command with your question:
/bad-research Is open-source AI more dangerous than closed-source for national security? - Let Claude trigger it — just ask a research-shaped question ("write me a cited report comparing vector databases", "literature review on GLP-1 drugs") and Claude loads the skill automatically.
It scales to the question: a simple lookup gets a fast cited answer in minutes; a broad or
contested one runs the full adversarially-reviewed pipeline (~1.5–2.5 h). The final report
and every fetched source land in a vault under ./research/ that compounds across sessions.
Pick the depth (it auto-scales, or force it)
By default the skill auto-routes — a simple, bounded question takes the fast route (a quick cited answer, minutes); a broad or contested one takes the full adversarially-reviewed pipeline (~1.5–2.5 h). You can steer it:
- Want a thorough report without the multi-hour wait? The fast route is the sweet
spot — its breadth branch fans out K parallel researchers over a wide multi-source browse,
then writes a sectioned, fully-cited answer in minutes. Force it with
bad route --apply --fastif the auto-router pickedfulland you want the quicker take. If you're just trying Bad Research out, start here. - Dial the effort with
--effort minimal|low|medium|highto nudge the route and per-step fan-out (minimal/lowbias toward fast;medium/hightoward full).
On an interactive run the skill announces the chosen route and its rough ETA before it
commits to a long job (and for full it shows the editable plan first), so you're never
surprised by a 2-hour job you didn't want. The route is decided from the step-1
decomposition and shown by that up-front in-skill route announcement — so you see which
route a query takes before any long work starts.
Want the latest unreleased build? Install from source:
pipx install git+https://github.com/LeventySeven/badresearch.git
Updating
Already installed? Upgrade the CLI and re-register the skill so both are current:
# From PyPI (pipx or uv — whichever you installed with)
pipx upgrade bad-research # or: uv tool upgrade bad-research
bad install # refresh the /bad-research skill + agents in ~/.claude
# ...or track the latest source
pipx install --force git+https://github.com/LeventySeven/badresearch.git
bad install
bad install is idempotent — re-run it any time after upgrading the CLI to pull the newest
entry skill + agents (the per-step skills refresh lazily on the next /bad-research run).
Confirm with bad --version.
What it does
A tier-adaptive pipeline turns a question into an audited, fully-cited report, and every fetched source lands in a persistent, searchable vault that compounds across sessions. Keyless by design:
- Search — the host
WebSearchtool + DuckDuckGo + 7 scholarly APIs, fused and reranked by the host model. - Content — a native fetch-and-clean pipeline (readability → markdown → optional LLM clean), SSRF-guarded.
- Browse — an agentic observe → act → extract loop driven by a local, keyless headless browser.
- Retrieve — SQLite FTS5/BM25 by default (no model required), with an optional local neural lane.
- Ground — every factual sentence must carry a source citation, and a deterministic ship-gate blocks any uncited claim. Fabricated quotes are caught for free by a byte-identity check; the harder paraphrase-faithfulness cases are judged by the host model (an optional
[local]cross-encoder upgrades this to NLI).
How it works & where the patterns came from
Bad Research takes hyperresearch as its base and enhances each stage with patterns drawn from the best deep-research systems — Perplexity, Gemini, Firecrawl, Stagehand, AgentQL, and others — reimplemented to run keyless on the host model. The full write-up, stage by stage with provenance, is in docs/HOW_IT_WORKS.md.
MIT licensed.
Release files for bad-research 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| bad_research-0.3.0.tar.gz | 1.4 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| bad_research-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.9 MB
Release files / bad_research-0.3.0.tar.gz
| Download URL | bad_research-0.3.0.tar.gz |
|---|---|
| Size | 1.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
41af16b431f7923f7cbb469d435d50e9d0ca8e4b1498dd95dd2844b25a629c33
|
|
BLAKE2b-256 checksum How to use checksums |
62fae763b0b2275c8c748fad2b4eab964be0260d904e929135afcfb8886bb59a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / bad_research-0.3.0-py3-none-any.whl
| Download URL | bad_research-0.3.0-py3-none-any.whl |
|---|---|
| Size | 529.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0ffc7c68da7cb13772cfc0d029dd50a72fd6796ae4e9043f4cf61b4fb5df95f2
|
|
BLAKE2b-256 checksum How to use checksums |
1418c5bdb423f231df077f3cc1efa8caf140364de27cba43bcb6b8f95b1bc19a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|