Sixteen onion search engines feed one investigation
Robin's source defines 16 onion search endpoints, including Ahmia, OnionLand, and Torgle. A query is rewritten to 5 words or fewer, sent to those engines through a Tor SOCKS proxy, and deduplicated by link. The Streamlit interface then presents selected findings, generates a report, saves an investigation, and supports follow-up questions grounded in that saved data. This is useful consolidation for an analyst who would otherwise repeat the same search across several unreliable sites.
The project is small enough to read before trusting it. Our commit 575d105 checkout had 24 files, roughly 2,076 source lines, and 17.5 MB. Search, scraping, model configuration, health checks, and UI code are split into plain Python modules. Two GitHub workflow files and a Dockerfile cover releases and packaging. The small codebase makes local changes realistic, although it also means important policy choices sit directly in application code instead of a larger investigation platform.
The LLM selects at most 20 result titles
Robin asks the chosen model to pick up to 20 indices from a list of titles and links. If the response cannot be parsed into valid indices, the code falls back to the first 20 results. That behavior keeps an investigation moving, but it can quietly replace relevance ranking with search-engine order. Analysts should review the unfiltered link set and record the model used, since a different provider can refine the original query or rank the same titles differently.
Scraping has deliberate size limits. Robin reads at most 1,000,000 bytes from a page, extracts up to 50,000 text characters, and returns no more than 2,000 characters per URL to the next stage. Our installed environment added 127 packages and occupied 542 MB, yet the evidence supplied to the summary is still a short excerpt. A page can place the decisive context after that cutoff, and non-text content types are ignored. Open the source page before accepting a claim.
What happened when we ran it
Our sandbox installed 127 Python packages in 42 seconds and used 542 MB on disk. The build succeeded in 4 seconds. Pip-audit found 0 known vulnerabilities in the installed dependency set for commit 575d105. The checkout included a Dockerfile and 2 CI workflow files, so packaging is more explicit than the repository's 24-file size might suggest. The lab run did not include Tor access, an LLM credential, or a live onion investigation.
Tests were skipped because the repository had no test script or target. There was also no tests directory. The passing 4-second build proves that the package step completed in our Python 3.12 Debian container; it does not verify search parsing, Tor routing, LLM selection, report grounding, saved-investigation recovery, or the Streamlit UI. Those are the behaviors that determine whether Robin helps an analyst, so a known-query acceptance check should accompany every image or model update.
Docker starts Tor and exposes port 8501
The recommended image installs Tor, waits up to 60 seconds for 127.0.0.1:9050, and then starts Streamlit on 0.0.0.0:8501. The README maps that port to the host and tells users to open localhost. It does not describe login, TLS, role separation, or a reverse-proxy policy. Keep the binding private, or place Robin behind an authenticated service before more than one trusted analyst can reach it. Search terms and stored reports can themselves be sensitive.
A disposable container also needs a volume if investigations must survive. The README mounts a host directory at /app/investigations for that purpose, while API secrets come from a mounted .env file. The 542 MB Python environment does not include an external hosted-model bill or a local Ollama model. Operators should set file permissions on both mounts, rotate provider keys, and decide when saved investigations expire. A report archive without ownership and deletion rules becomes a second intelligence leak.
Empty results can mean a dead engine
Search requests use retries and a 40-second timeout, but the fetch function returns an empty list after an exception or a non-200 response. Scraping failures can fall back to the page title. That makes an empty or thin investigation ambiguous: the topic may have no indexed results, several onion engines may be offline, or pages may have rejected the request. Robin includes health checks, yet analysts still need to record which engines answered during each collection.
Open issue 134 says some listed links have become invalid, and issue 138 documents difficulty getting search engines through a bridged Tor setup. Those reports fit the operating environment more than they indict one release. Onion services move and Tor policy differs by network. The 16 configured engines increase discovery breadth, but they do not provide a stable corpus. Re-run important searches, preserve original URLs and timestamps, and capture pages through an approved evidence process.
Local models keep the investigation text nearby
Robin supports OpenAI, Anthropic, Gemini, OpenRouter, Ollama, llama.cpp, and other OpenAI-compatible endpoints. Hosted providers need their respective keys. Local providers reduce external disclosure of the rewritten query and scraped excerpts, provided the model server and Robin remain on controlled hosts. The README specifically warns users to review third-party terms before sending sensitive investigative material. That warning should be part of onboarding, since a harmless company name can reveal an active case when paired with a breach term.
Version 2.8 was published on July 15, 2026 with session-scoped follow-up chat, one-click pivots, stricter grounding instructions, and a fix for blank findings from reasoning models. GitHub recorded the last push on August 25, while open issue activity continued on August 18. The repository showed 6,900 stars and 15 combined issues and pull requests when fetched. Robin is maintained and easy to try. Its output remains an analyst lead that needs source verification and lawful handling.

