Maigret: The OSINT Detective That Finds Every Account

8 min read Tiếng Việt
Featured image for soxoj/maigret — Maigret: The OSINT Detective That Finds Every Account

TL;DR

  • What it solves: The brute-force problem of finding where a username lives across thousands of platforms - manually this takes days, Maigret takes minutes
  • Why it matters: Most people reuse handles; one username is often a skeleton key to a full digital identity
  • Best for: OSINT investigators, investigative journalists, security researchers doing reconnaissance, and individuals running a personal privacy audit
  • Main differentiator: Recursive search - when it scrapes a profile and finds a different linked username, it automatically queues a new sweep for that identifier too
  • Best use case: Mapping the full account graph of a pseudonymous actor from a single known forum handle

The terminal sat quiet for three seconds, then started scrolling. GitHub: found. YouTube: found. Reddit: found. Instagram: found. A DeviantArt account, created in 2015, mostly forgotten: found. And then, at the bottom of the pass:

[-] Extracted IDs: {'hoangyell': 'username', 'HoangYell': 'username'}

I hadn’t asked it to extract username variants. Maigret found them on its own, from profile metadata, and flagged them for the next sweep.

That is the difference between a username checker and a search engine.

What Maigret Actually Does

Maigret is a Python CLI that checks over 3,000 websites for a given username. For each site, it fires an async HTTP request, reads whether the profile exists via status codes, body patterns, or JSON field presence, and moves on to the next one.

One sentence: Maigret takes a username, searches 3,000+ platforms concurrently, and returns a structured list of found accounts with extracted profile data - no API keys, no paid tiers.

The name is not accidental. Georges Simenon’s fictional detective Jules Maigret solved cases not by rushing to conclusions but by sitting in cafés, watching, and waiting for the full picture to assemble itself. The tool works the same way. It doesn’t tell you what to think. It just keeps finding things until there is nothing left to find.

The Recursive Part Is the Clever Part

When Maigret fetches a profile page, it doesn’t just mark it “found” and move on. It runs socid-extractor on the page - a companion library that understands 200+ site-specific formats - and pulls structured fields: real name fragments, linked social accounts, email usernames, profile creation dates.

If any field contains a different username or variant, Maigret adds it to the search queue and runs a new pass.

Here’s real output from running it on my own username:

maigret hoangyell

Partial output:

[+] hoangyell on GitHub        https://github.com/hoangyell
       ├─uid: 7069077
       ├─fullname: HoangYell
       ├─location: Da Nang
       └─twitter_username: hoangyell
[+] hoangyell on YouTube       https://www.youtube.com/@hoangyell/about
[+] hoangyell on Reddit        https://www.reddit.com/user/hoangyell
[+] hoangyell on Instagram     https://www.instagram.com/hoangyell/
[+] hoangyell on Facebook      https://www.facebook.com/hoangyell
[+] hoangyell on SoundCloud    https://soundcloud.com/hoangyell
[+] hoangyell on LinkedIn      https://linkedin.com/in/hoangyell
[-] Extracted IDs: {'hoangyell': 'username', 'HoangYell': 'username'}
[*] Extended info from 15 accounts  -  countries: us, vn, cn, pk
...
[*] Found 40 accounts in 44.9s (509 sites checked)

The recursion runs until no new identifiers surface. Disable it with --no-recursion if you want scope control.

Usage / Key Commands

CommandPurpose
maigret usernameCheck top 500 sites by Majestic Million rank
maigret username -aAll 3,000+ sites - slower but exhaustive
maigret username -HPGenerate HTML + PDF report in one run
maigret username --json ndjsonMachine-readable newline-delimited JSON
maigret username --graphInteractive D3 force-directed graph
maigret username --tags us,jpFilter by country tag
maigret username --tags codingFilter by category (photo, dating, finance…)
maigret --parse https://steamcommunity.com/profiles/...Extract identifiers from a URL, then search
maigret --permute hope dreamGenerate 12 username variants and search all
maigret --web 5000Local web UI at http://127.0.0.1:5000

💡 Tip: The --parse flag is underused. Feed it any socid-extractor-supported profile URL - including Google Docs and most social profile pages - and it pulls every identifier on the page before running the search. It turns a URL into a starting point automatically.



Maigret vs Sherlock

Sherlock is the other well-known username-search tool. Both are good. They solve different problems.

FeatureMaigretSherlock
Sites in database3,000+ (default: top 500)~400
Recursive searchYes - auto-follows linked usernamesNo
Profile data extractionYes - name, bio, dates, linked accountsNo
Tags / category filtersYes - country + categoryNo
Web UIYes - local Flask serverNo
Report formatsHTML, PDF, TXT, JSON, CSV, XMind, D3 graphTXT, CSV, XMind
URL parse + searchYes (--parse)No
Username permutationsYes (--permute)No
Tor / I2P supportYesNo
Database auto-updateYes - pulls from GitHub dailyNo
Python async APIYesLimited

Sherlock is faster and simpler for a quick answer. Use Maigret when the quick answer turned up something worth following.

Real-World Uses

Investigative journalism. A reporter receives a tip about a pseudonymous actor. One forum handle goes in. Twenty minutes later: accounts on gaming platforms, photo communities, regional forums, a personal blog. The extracted created_at fields from multiple sites corroborate or contradict claimed identities and timelines.

Security reconnaissance. During a penetration test, leaked credentials include a username. That username maps to a GitHub profile with a linked Twitter, a Stack Overflow account with a home city, and a photography site with full face photos. The attack surface expanded significantly from one string.

Incident response. After a breach, you need to know the scope of an exposed account’s online footprint. Secondary accounts, password-reuse vectors, reputational exposure - all of it starts with one search.

Personal privacy audit. You’re doing a legal name change, account consolidation, or just want to know what’s still out there from 2011. Here’s what the author’s own username returned:

maigret hoangyell -a -HP --graph
[*] Searching hoangyell on 3000+ sites...
[+] Found 40 accounts (15 with extended info)
[*] Countries: us, vn, cn, pk
[*] Interests: coding, social, photo, gaming, video, business, messaging, discussion
[*] Reports saved: report_hoangyell_plain.html, report_hoangyell.pdf
[-] Graph report on all usernames saved in report_hoangyell_graph.html

Roblox, Wowhead, Tripline - accounts registered a decade ago, completely forgotten. The report surfaces them. Then you decide which ones to remove.

The --graph flag generates an interactive HTML D3 node graph that helps visualize the connections, looking roughly like this:

       [GitHub] --- (hoangyell) --- [Reddit]
          |              |              |
     (Da Nang)     (HoangYell)    [DeviantART]
          |              |
      [Twitter]      [SoundCloud]

And the -HP flags give you a clean, shareable PDF dossier and an HTML report. You can hand these straight to a client or keep them for your own records, without needing to decipher terminal output.

Crypto and financial investigation. Tags like finance narrow the search to crypto exchanges, trading communities, and financial forums. Combined with recursive search, a single exchange username can surface a connected Reddit alias or forum profile with more identifying details - useful for both compliance work and fraud investigation.

The Honest Part

False positives exist. A small Belarusian forum probably has a different “john” than GitHub. The -a flag across all 3,000+ sites will produce noise. Maigret documents this. The --self-check --auto-disable workflow helps:

maigret -a --self-check --auto-disable

This validates every site’s test pair against live responses and disables failing sites in your local database. Fewer false positives on the next run.

Default covers only 500 of 3,000+ sites. The cap exists for speed and noise reduction. For serious investigations, always use -a and expect several minutes instead of under one.

Blocking is real. High-traffic platforms detect scrapers. Without a proxy, many requests will fail silently or hit CAPTCHAs. Maigret surfaces a warning when error rates exceed 3% of responses. That is useful, but it doesn’t get past the block.

⚠️ Warning: GDPR, CCPA, and their equivalents govern what you can collect and store about individuals. Using Maigret against a real person without lawful basis may be illegal in your jurisdiction. The authors disclaim responsibility for misuse. That disclaimer is not boilerplate.

Installation

pip3 install maigret
maigret username

For PDF output, install system dependencies first:

# Debian / Ubuntu / Kali
sudo apt install -y libfreetype6-dev libjpeg-dev libffi-dev

# macOS
brew install freetype

Other options:

MethodCommand
Docker CLIdocker run -v /mydir:/app/reports soxoj/maigret:latest username --html
Docker Web UIdocker run -p 5000:5000 soxoj/maigret:web
Telegram botMessage @maigret_search_bot - zero install
Windows EXEDownload from GitHub Releases
Google ColabNotebook link in README

Python 3.10 minimum. 3.11 recommended.

If you have no interest in installing anything right now, the Telegram bot is a surprisingly complete interface. No Python, works from a phone.

Maigret is also importable as an async library if you want to wire it into a larger pipeline:

import asyncio
import maigret

async def main():
    session = await maigret.get_maigret_session()
    results = await maigret.search(
        username="machine42",
        sites_db=session.db,
    )
    return results

asyncio.run(main())

Commissaire Jules Maigret never rushed. He built the picture slowly, from whatever was available, until the subject had nowhere left to hide. The open-source tool named after him does the same - it just moves considerably faster, and doesn’t require a café.

soxoj/maigret

Hoang Yell

Hoang Yell

A software developer and technical storyteller. I spend my time exploring the most interesting open-source repositories on GitHub and presenting them as accessible stories for everyone.