Research

Expanded username testing: 35 controls across eight platforms

Updated · MyRecon editorial

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

All 35 controls per tool; excluded, failed and unknown cases remain in the denominator.
ToolSupported matches (TP)False positives (FP)False negatives (FN)Supported absences (TN)Unresolved / unscoredScored / totalCoverageFP / scored negatives
MyRecon600181124 / 3568.57%0 / 18
Sherlock400112015 / 3542.86%0 / 11
Maigret600181124 / 3568.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

Native CLAIMED outcomes are retained even when normalization changes a verdict to unknown.
ToolReported claimsSource supportedSource contradictedReference unresolvedUnknown predictions
MyRecon660010
Sherlock440014
Maigret86025

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 blue returned JSON null from the official API. It is a verified absence in this snapshot, despite its historical claimed label. The pg fixture was confirmed separately.
  • GitHub namespace: the official API identifies blue as 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

Thirty-five platform-specific controls. Source links identify what was checked; dated retained observations are in the downloads.
Control / provenanceIndependent referenceMyReconSherlockMaigret
C01 · GitHub
blue
Claimed 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 · GitHub
noonewouldeverusethis7
Unclaimed 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 · GitHub
mr2631dca0640c
Generated 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 · GitHub
mr266fca2f9c9b
Generated 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 · GitLab
blue
Claimed 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 · GitLab
noonewouldeverusethis7
Unclaimed 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 · GitLab
mr26ffdf1cdcf0
Generated 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 · GitLab
mr262594155896
Generated 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 News
blue
Claimed 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 News
pg
Claimed 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 News
noonewouldeverusethis7
Unclaimed 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 News
mr26a5262ed92a
Generated 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 News
mr26addcf71f1b
Generated 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 Hub
blue
Claimed 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 Hub
noonewouldeverusethis7
Unclaimed 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 Hub
mr2601a3dfd80e
Generated 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 Hub
mr26c93fc4743b
Generated 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.to
blue
Claimed 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.to
noonewouldeverusethis7
Unclaimed 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.to
mr26534c469177
Generated 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.to
mr2608fdaeabff
Generated 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 · npm
kennethsweezy
Claimed 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 · npm
sindresorhus
Claimed 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 · npm
noonewouldeverusethis7
Unclaimed 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 · npm
mr266aca0fe160
Generated 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 · npm
mr266911d1a5a3
Generated 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 · Keybase
blue
Claimed fixture
Verified account
typed_official_api; HTTP 200
Supported match
differential; HTTP 200
Supported match
CLAIMED; HTTP 200
Supported match
CLAIMED; HTTP 200
C28 · Keybase
noonewouldeverusethis7
Unclaimed fixture
Unresolved
reference_unresolved; HTTP 200
Unscored reference
status_absent; HTTP 404
Unscored reference
AVAILABLE; HTTP 404
Unscored reference
AVAILABLE; HTTP 200
C29 · Keybase
mr2610af8a707d
Generated 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 · Keybase
mr263360af2165
Generated 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 · PyPI
Blue
Claimed 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 · PyPI
adam
Claimed 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 · PyPI
noonewouldeverusethis7
Unclaimed 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 · PyPI
mr264407671dfd
Generated 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 · PyPI
mr266f2a56ce0e
Generated 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

Pinned source revisions, selected rule fingerprints and UTC execution windows.
Tool / versionSource revisionConfiguration / rule hashStarted / finished (UTC)
MyRecon 9491be669491be6683cfd329a33e6c38682a7bc83a81032fOne 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.2e40a45ec2a074b90703b3b4b842c8a3adbd6ada3One connection; 8-second timeout; no enrichment, parsing, recursion or retries.
fcc608f68c2c017993e5612056686509554f779b3c499cca9407c5d5d5b6b244
2026-11-01T16:40:32Z
2026-11-01T16:41:02Z
Maigret 0.6.6b6642744988e7e6c2d21f75db60ec3093019ba25One 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

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

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.

More from the MyRecon blog · Browse all guides