Expanded username testing: 35 controls across eight platforms
We tested 35 platform-specific controls across eight platforms with the MyRecon web engine, Sherlock and Maigret on 1 November 2026. Each tool has 35 recorded outcomes, including exclusions and unresolved checks. MyRecon and Maigret each returned six source-supported matches; Sherlock returned four. No definitive false positives were observed on the scored controls. Eleven reference checks remained unresolved, and Sherlock also excluded nine controls under its current upstream policy. These limits matter when reading the results.
Publisher disclosure: MyRecon ran and publishes this study of its own engine and competing tools. The sample uses published upstream testing fixtures and generated candidates. We do not claim to own those fixture accounts. Personal social-media handles and customer search history are excluded. A fixture handle used on several platforms does not imply the accounts share an owner.
Observation window: to (UTC). This is a dated snapshot. Download the complete evidence ZIP, 105-row CSV, JSON observations and SHA-256 checksums.
Supported matches, false positives and unresolved checks
| Tool | Supported matches (TP) | False positives (FP) | False negatives (FN) | Supported absences (TN) | Unresolved / unscored | Scored / total | Coverage | FP / scored negatives |
|---|---|---|---|---|---|---|---|---|
| MyRecon | 6 | 0 | 0 | 18 | 11 | 24 / 35 | 68.57% | 0 / 18 |
| Sherlock | 4 | 0 | 0 | 11 | 20 | 15 / 35 | 42.86% | 0 / 11 |
| Maigret | 6 | 0 | 0 | 18 | 11 | 24 / 35 | 68.57% | 0 / 18 |
Supported match: a normalized positive agrees with current, account-specific reference evidence. False positive: a normalized positive contradicts explicit reference absence. False negative: a normalized negative contradicts a verified existing account. Unresolved / unscored: the reference or prediction is unknown, counted once per control. This includes upstream exclusions. Excluded entries were recorded without making a tool request. Zero observed false positives here is not a guarantee of zero errors elsewhere.
Coverage is (TP + TN + FP + FN) / all 35 controls. The false-positive denominator is FP + TN; unknown predictions on reference negatives are excluded from that denominator and retained in the evidence. No whole-catalogue accuracy or speed ranking follows from this developer/community sample.
Native claims and quarantined outcomes
| Tool | Reported claims | Source supported | Source contradicted | Reference unresolved | Unknown predictions |
|---|---|---|---|---|---|
| MyRecon | 6 | 6 | 0 | 0 | 10 |
| Sherlock | 4 | 4 | 0 | 0 | 14 |
| Maigret | 8 | 6 | 0 | 2 | 5 |
Maigret reported two additional npm claims whose references returned HTTP 401. Both remain unverified. Sherlock returned native AVAILABLE on five denied npm requests; their HTTP 403 responses are normalized to unknown, preserving the native statuses. Blocks and unavailable sources are not evidence of account absence. All tool-specific outcomes appear below and in the CSV.
How the controls were selected and verified
The predeclared manifest contains 11 upstream claimed fixtures, eight upstream unclaimed fixtures and 16 generated negative candidates. They span GitHub, GitLab, Hacker News, Docker Hub, Dev.to, npm, Keybase, PyPI. Each fixture is tested only on the platform that published it as a control; this is not a cross-platform identity search. Case variants in case-insensitive namespaces are deduplicated. The 35 pairs contain 23 literal handle spellings (22 case-folded strings); repeated handles do not represent independent people.
The selection manifest records the upstream repository revision, source field, selected detection rule and rule hash for each fixture. Two deterministic 14-character alphanumeric candidates per platform are generated from the study ID, platform and index. Random-looking names are not assumed absent. Current source evidence determines their reference labels.
All reference observations were collected before tool predictions. Exact typed official API objects, explicit API absence, or a PyPI profile title naming the exact handle can establish a reference. HTML 200 alone, tool agreement, a login wall and a challenge cannot. We retain only account identifiers needed to verify the reference, response status, timestamps, response length and SHA-256, with profile contents omitted.
Stale fixtures and unresolved observations
- Stale claimed fixture: Sherlock’s Hacker News fixture
bluereturned JSONnullfrom the official API. It is a verified absence in this snapshot, despite its historical claimed label. Thepgfixture was confirmed separately. - GitHub namespace: the official API identifies
blueas an organization. This supports the tested public account namespace; it does not verify an individual person. - npm: all five independent reference requests returned HTTP 401. Their account truth remains unknown, including the three negative candidates.
- PyPI: all five reference pages showed a Client Challenge. Sherlock’s negative outputs cannot be scored against those challenges. Maigret’s PyPI rule is disabled/protected and stayed unknown.
- Keybase: the published long unclaimed fixture did not satisfy the reference’s typed absence rule. Its negative predictions are unscored; the two shorter generated candidates were verified absent.
- Sherlock exclusions: the captured upstream exclusion list contains HackerNews and DEV Community. Their nine controls stay unknown. The study honors those exclusions even though the engine and bundled rules are pinned.
Every control and tool outcome
| Control / provenance | Independent reference | MyRecon | Sherlock | Maigret |
|---|---|---|---|---|
C01 · GitHubblueClaimed fixture | Verified account typed_official_api; HTTP 200 | Supported match api_user; HTTP 200 | Supported match CLAIMED; HTTP 200 | Supported match CLAIMED; HTTP 200 |
C02 · GitHubnoonewouldeverusethis7Unclaimed fixture | Verified absence typed_official_api; HTTP 404 | Supported absence api_absent; HTTP 404 | Supported absence AVAILABLE; HTTP 404 | Supported absence AVAILABLE; HTTP 404 |
C03 · GitHubmr2631dca0640cGenerated candidate | Verified absence typed_official_api; HTTP 404 | Supported absence api_absent; HTTP 404 | Supported absence AVAILABLE; HTTP 404 | Supported absence AVAILABLE; HTTP 404 |
C04 · GitHubmr266fca2f9c9bGenerated candidate | Verified absence typed_official_api; HTTP 404 | Supported absence api_absent; HTTP 404 | Supported absence AVAILABLE; HTTP 404 | Supported absence AVAILABLE; HTTP 404 |
C05 · GitLabblueClaimed fixture | Verified account typed_official_api; HTTP 200 | Supported match api_user; HTTP 200 | Supported match CLAIMED; HTTP 200 | Supported match CLAIMED; HTTP 200 |
C06 · GitLabnoonewouldeverusethis7Unclaimed fixture | Verified absence typed_official_api; HTTP 200 | Supported absence api_absent; HTTP 200 | Supported absence AVAILABLE; HTTP 200 | Supported absence AVAILABLE; HTTP 200 |
C07 · GitLabmr26ffdf1cdcf0Generated candidate | Verified absence typed_official_api; HTTP 200 | Supported absence api_absent; HTTP 200 | Supported absence AVAILABLE; HTTP 200 | Supported absence AVAILABLE; HTTP 200 |
C08 · GitLabmr262594155896Generated candidate | Verified absence typed_official_api; HTTP 200 | Supported absence api_absent; HTTP 200 | Supported absence AVAILABLE; HTTP 200 | Supported absence AVAILABLE; HTTP 200 |
C09 · Hacker NewsblueClaimed fixture | Verified absence typed_official_api; HTTP 200 | Supported absence api_absent; HTTP 200 | Unresolved prediction upstream_excluded; HTTP — | Supported absence AVAILABLE; HTTP 200 |
C10 · Hacker NewspgClaimed fixture | Verified account typed_official_api; HTTP 200 | Supported match api_user; HTTP 200 | Unresolved prediction upstream_excluded; HTTP — | Supported match CLAIMED; HTTP 200 |
C11 · Hacker Newsnoonewouldeverusethis7Unclaimed fixture | Verified absence typed_official_api; HTTP 200 | Supported absence api_absent; HTTP 200 | Unresolved prediction upstream_excluded; HTTP — | Supported absence AVAILABLE; HTTP 200 |
C12 · Hacker Newsmr26a5262ed92aGenerated candidate | Verified absence typed_official_api; HTTP 200 | Supported absence api_absent; HTTP 200 | Unresolved prediction upstream_excluded; HTTP — | Supported absence AVAILABLE; HTTP 200 |
C13 · Hacker Newsmr26addcf71f1bGenerated candidate | Verified absence typed_official_api; HTTP 200 | Supported absence api_absent; HTTP 200 | Unresolved prediction upstream_excluded; HTTP — | Supported absence AVAILABLE; HTTP 200 |
C14 · Docker HubblueClaimed fixture | Verified account typed_official_api; HTTP 200 | Supported match api_user; HTTP 200 | Supported match CLAIMED; HTTP 200 | Supported match CLAIMED; HTTP 200 |
C15 · Docker Hubnoonewouldeverusethis7Unclaimed fixture | Verified absence explicit_api_absence; HTTP 404 | Supported absence api_absent; HTTP 404 | Supported absence AVAILABLE; HTTP 404 | Supported absence AVAILABLE; HTTP 404 |
C16 · Docker Hubmr2601a3dfd80eGenerated candidate | Verified absence explicit_api_absence; HTTP 404 | Supported absence api_absent; HTTP 404 | Supported absence AVAILABLE; HTTP 404 | Supported absence AVAILABLE; HTTP 404 |
C17 · Docker Hubmr26c93fc4743bGenerated candidate | Verified absence explicit_api_absence; HTTP 404 | Supported absence api_absent; HTTP 404 | Supported absence AVAILABLE; HTTP 404 | Supported absence AVAILABLE; HTTP 404 |
C18 · Dev.toblueClaimed fixture | Verified account typed_official_api; HTTP 200 | Supported match api_user; HTTP 200 | Unresolved prediction upstream_excluded; HTTP — | Supported match CLAIMED; HTTP 200 |
C19 · Dev.tonoonewouldeverusethis7Unclaimed fixture | Verified absence explicit_api_absence; HTTP 404 | Supported absence api_absent; HTTP 404 | Unresolved prediction upstream_excluded; HTTP — | Supported absence AVAILABLE; HTTP 404 |
C20 · Dev.tomr26534c469177Generated candidate | Verified absence explicit_api_absence; HTTP 404 | Supported absence api_absent; HTTP 404 | Unresolved prediction upstream_excluded; HTTP — | Supported absence AVAILABLE; HTTP 404 |
C21 · Dev.tomr2608fdaeabffGenerated candidate | Verified absence explicit_api_absence; HTTP 404 | Supported absence api_absent; HTTP 404 | Unresolved prediction upstream_excluded; HTTP — | Supported absence AVAILABLE; HTTP 404 |
C22 · npmkennethsweezyClaimed fixture | Unresolved reference_unresolved; HTTP 401 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference CLAIMED; HTTP 200 |
C23 · npmsindresorhusClaimed fixture | Unresolved reference_unresolved; HTTP 401 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference CLAIMED; HTTP 200 |
C24 · npmnoonewouldeverusethis7Unclaimed fixture | Unresolved reference_unresolved; HTTP 401 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference AVAILABLE; HTTP 200 |
C25 · npmmr266aca0fe160Generated candidate | Unresolved reference_unresolved; HTTP 401 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference AVAILABLE; HTTP 200 |
C26 · npmmr266911d1a5a3Generated candidate | Unresolved reference_unresolved; HTTP 401 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference http_denial_or_error; HTTP 403 | Unscored reference AVAILABLE; HTTP 200 |
C27 · KeybaseblueClaimed fixture | Verified account typed_official_api; HTTP 200 | Supported match differential; HTTP 200 | Supported match CLAIMED; HTTP 200 | Supported match CLAIMED; HTTP 200 |
C28 · Keybasenoonewouldeverusethis7Unclaimed fixture | Unresolved reference_unresolved; HTTP 200 | Unscored reference status_absent; HTTP 404 | Unscored reference AVAILABLE; HTTP 404 | Unscored reference AVAILABLE; HTTP 200 |
C29 · Keybasemr2610af8a707dGenerated candidate | Verified absence typed_api_absence; HTTP 200 | Supported absence api_absent; HTTP 200 | Supported absence AVAILABLE; HTTP 404 | Supported absence AVAILABLE; HTTP 200 |
C30 · Keybasemr263360af2165Generated candidate | Verified absence typed_api_absence; HTTP 200 | Supported absence api_absent; HTTP 200 | Supported absence AVAILABLE; HTTP 404 | Supported absence AVAILABLE; HTTP 200 |
C31 · PyPIBlueClaimed fixture | Unresolved reference_unresolved; HTTP 200 | Unscored reference echo_only; HTTP 200 | Unscored reference AVAILABLE; HTTP 404 | Unscored reference unsupported_disabled_or_protected; HTTP — |
C32 · PyPIadamClaimed fixture | Unresolved reference_unresolved; HTTP 200 | Unscored reference echo_only; HTTP 200 | Unscored reference AVAILABLE; HTTP 404 | Unscored reference unsupported_disabled_or_protected; HTTP — |
C33 · PyPInoonewouldeverusethis7Unclaimed fixture | Unresolved reference_unresolved; HTTP 200 | Unscored reference echo_only; HTTP 200 | Unscored reference AVAILABLE; HTTP 404 | Unscored reference unsupported_disabled_or_protected; HTTP — |
C34 · PyPImr264407671dfdGenerated candidate | Unresolved reference_unresolved; HTTP 200 | Unscored reference echo_only; HTTP 200 | Unscored reference AVAILABLE; HTTP 404 | Unscored reference unsupported_disabled_or_protected; HTTP — |
C35 · PyPImr266f2a56ce0eGenerated candidate | Unresolved reference_unresolved; HTTP 200 | Unscored reference echo_only; HTTP 200 | Unscored reference AVAILABLE; HTTP 404 | Unscored reference unsupported_disabled_or_protected; HTTP — |
Tool versions, rules and execution settings
| Tool / version | Source revision | Configuration / rule hash | Started / finished (UTC) |
|---|---|---|---|
| MyRecon 9491be66 | 9491be6683cfd329a33e6c38682a7bc83a81032f | One connection; 45-second deadline; 6-second connect / 8-second read timeout.1c58ba2291268402aa1ac2801d9ce31aeea7fba492a90742343eedf2949f06b6 | 2026-11-01T16:39:58Z 2026-11-01T16:40:32Z |
| Sherlock 0.16.2 | e40a45ec2a074b90703b3b4b842c8a3adbd6ada3 | One connection; 8-second timeout; no enrichment, parsing, recursion or retries.fcc608f68c2c017993e5612056686509554f779b3c499cca9407c5d5d5b6b244 | 2026-11-01T16:40:32Z 2026-11-01T16:41:02Z |
| Maigret 0.6.6 | b6642744988e7e6c2d21f75db60ec3093019ba25 | One connection; 8-second timeout; no enrichment, parsing, recursion or retries.e12b50a3a08894710e2f98264ad48ab8fcfdfbe0e46bc35c2a3846b2c74de364 | 2026-11-01T16:41:02Z 2026-11-01T16:41:33Z |
Python 3.12.14, Requests 2.34.2; one Windows workstation and network. References ran first, followed by MyRecon, Sherlock and Maigret in sequence, with one platform per request group and fixed pacing. Application caches were bypassed; provider caches were not controlled. Engine source files and the harness have separate SHA-256 hashes in the JSON. The MyRecon source revision describes the local web engine, not a hosted UI or Android device test.
Third-party code and bundled rules are pinned to the versions shown, without claiming they are the newest releases. Sherlock’s mutable exclusion list was fetched once and captured with its timestamp and SHA-256. No supplied credentials, proxies or block bypass were used. Upstream libraries may handle cookies returned by the sites. HTTP denials/errors (including 419), redirects that remain unresolved, unsupported checks and native failures normalize to unknown while retaining native output.
Download and reproduce the evidence
- Evidence ZIP: measured JSON, 105-row CSV, fixed manifest, reproduction scripts and upstream license notices.
- Measured JSON: references, all tool outcomes, source hashes, selected rules, exclusions, versions and timestamps.
- CSV: one row for every tool/control pair, including unknown and excluded outcomes.
- Predeclared control manifest, reproduction instructions and SHA-256 checksums.
Extract the ZIP and follow its README. Check out the recorded MyRecon revision, install the pinned third-party requirements in an isolated Python 3.12 environment, copy the included study harness, and run it with the provided manifest. A fresh run makes fresh network observations; it will not necessarily reproduce these historical outcomes. The ZIP contains retained, privacy-minimized observations and source-response hashes, rather than complete profile bodies.
python backend/tools/expanded_username_study.py --manifest controls.json --output output/new-study.json
Limitations and what this study supports
This expands the earlier single-handle case to eight selected platforms and a fixed set of platform-specific fixtures and controls. It supports the dated account-existence observations and per-tool outcomes shown here. The sample favors developer/community services, contains repeated fixtures and a GitHub organization, and includes no newly created owner-controlled positive accounts. Public fixtures are upstream test inputs; we make no claim about their ownership or consent to an identity investigation. Broader consumer social networks, authenticated profiles, the Android app and whole catalogues were not measured.
The reference and MyRecon share some official API sources, so this is a publisher-run regression study rather than an independent audit. Thirty-five controls and one network window cannot estimate population error rates. Eighteen reference negatives and six positives were decisive; eleven references remained unknown. Exclusions reduce effective scope, which is why both the common planned scope and scored denominators are published. No production detection rules were changed in response to this study. Known fixtures are not a held-out evaluation, and a matching handle does not prove identity, common ownership or registration availability.
See the earlier case study and separate daily regression snapshot, the workflow comparison, and the false-positive review guide. Corrections can be reported through the contact page; replacement observations should retain their own dates.
Primary sources
- Sherlock upstream project and its pinned site-rule links in the manifest.
- Maigret upstream project and its pinned fixture fields in the manifest.
- GitHub user endpoint, GitLab Users API, Hacker News Users API and Forem user API.
- The account-specific reference URLs and captured evidence for every platform appear in the matrix and downloadable JSON.
Use these checks for your own accounts or work you are authorised to do. MyRecon reports public-source results; a matching handle is not proof that two accounts belong to the same person. See our terms and privacy policy.