Free · Open source · Linux and macOS
Every open-source OSINT tool. One command.
otlite installs and runs Sherlock, Maigret, Holehe, SpiderFoot, theHarvester, and dozens more by name. Each tool gets its own virtualenv, every run is saved, and nothing needs Docker or an account.
curl -fsSL https://get.otinstaller.com/otlite | sh- Free and Apache-2.0 licensed
- Python 3.10–3.14
- No Docker, no account
otlite install sherlock maigretinstalled sherlock, maigretotlite run --all u:jane_doesherlock done 12 profilesmaigret done 9 profilesotlite results --sort time2 runs saved under results/<tool>/jane_doe/- Tools
- 47
- Version
- 1.2.1
- License
- Apache-2.0
- Runs on
- Linux · macOS
otinstaller is now otlite
Same tools, same commands, a new name: type otlite where you typed ot or otinstaller. pip install -U otinstaller installs otlite and keeps the old command working with a note. Your keys and settings move from ~/.otinstaller to ~/.otlite on the first run; reinstall your tools once, because virtualenvs cannot be moved.
Why otlite
Every tool installs and runs a little differently. Not anymore.
One interface to install, run, update, and remove open-source OSINT tools, with every result kept and ready for scripts.
Install by name
otlite install sherlock creates a private virtualenv for the tool, at the version otlite pinned and tested. Nothing touches your system Python, and removing a tool removes all of it.
otlite install sherlockOne input syntax for every tool
u:, e:, d:, ip: and friends become each tool's own flags, so you stop looking up options. Every original flag still works after --.
otlite run holehe -- e:jane@example.comRun every matching tool
--all runs each installed tool that takes the input, in parallel. auto works out the input type for you, and playbooks repeat a set of tools.
otlite auto jane@example.comResults you can use
Every run is saved by tool, target, and time. results sorts and filters them, extract pulls out emails, domains, IPs, and URLs, and diff shows what changed since the last run.
otlite results --since 7d --sort durationBuilt for scripts and AI agents
Every run also writes an envelope in one JSON shape for every tool, with the entities it found. Every command takes --json, nothing prompts with --yes, and exit codes are stable.
otlite results --status failed --jsonAll API keys in one place
keys set asks for the value without showing it and stores it in ~/.otlite/.env, readable only by you. Each tool receives only the keys it declares; values never reach logs or results.
otlite keys set SHODAN_API_KEYCurated and tested
A tool is listed only after it installs cleanly and passes a smoke test, and the catalog is checked every night. Attack and harassment tools are left out by policy.
otlite listUpdate and recover cleanly
One command updates one tool or all of them, check-updates shows what is behind, and resume picks up installs and runs that were interrupted.
otlite update --allFixes, not just errors
doctor checks Python, git, venv, and pipx, and prints the exact command that fixes each problem on Debian, Ubuntu, Kali, Arch, Fedora, or macOS.
otlite doctor
Typed inputs
Stop memorizing flags.
Tell otlite what the target is. It maps the input to each tool's own syntax, so one line runs Sherlock, Maigret, and every other username tool you have installed.
u:
Username
e:
Email
p:
Phone
d:
Domain
url:
URL
ip:
IP address
q:
Search text
tg:
Telegram
lat: lng:
Coordinates
$ otlite run --all u:jane_doe
sherlock done
maigret done
blackbird done
nexfil done
saved to results/<tool>/jane_doe/ (+ .meta.json and .envelope.json per run)--all and auto take u:, e:, p:, d:, url: and ip:. They skip interactive and long-running tools, and tools that need API keys unless you pass --include-credentialed. otlite playbook domain-recon example.com runs a saved set.
Install
Installed in under a minute.
Pick your setup. otlite doctor checks the machine and prints the command that fixes anything missing.
1. Install otlite
One line (recommended)
curl -fsSL https://get.otinstaller.com/otlite | sh
otlite doctor
otlite initFinds Python 3.10 or newer, installs pipx through brew, apt, dnf, or pacman if it is missing, then installs otlite. No root needed for otlite itself.
2. Run your first tool
First run
otlite install sherlock
otlite run sherlock -- u:jane_doe
otlite results
# results/sherlock/jane_doe/<timestamp>_sherlock_jane_doe_<id>.txtLinux or macOS
Tested on Ubuntu 22.04 and 24.04, Debian 12, Arch, Kali rolling, and macOS 14 on Apple silicon. On Windows, run it inside Ubuntu on WSL2, or use ot from the OTInstaller Registry.
Python 3.10–3.14, git, venv
On Debian, Ubuntu, and Kali: sudo apt install python3-venv git. A few tools have narrower Python limits, which otlite info shows. otlite doctor prints the fix for anything missing.
Catalog
All 47 tools, in detail
Every tool otlite installs: what it does, what it takes, the keys it can use, what to know before you run it, and the two lines that install and run it. Live from the otlite catalog, refreshed about once an hour; each tool is pinned to the version otlite tested.
- Username
- 24
- Domain
- 19
- 14
- URL
- 11
- IP address
- 7
- Name
- 5
- Phone
- 4
47 / 47 tools
Username
Find where a handle exists across sites.
Sherlock
sherlock
★ 93kMITSherlock checks a username against several hundred sites and reports where a profile with that exact handle exists. It returns a list of profile URLs, nothing about who owns them.
- Works on
- Username
- Typed inputs
- u: Username
- API keys
- None
Good for
- A first pass on a handle before deeper work.
- Spotting which platforms a brand or project name is already taken on.
- Feeding profile URLs into socid-extractor or Maigret for details.
Before you run it
- Sites change their responses often, so expect a few false positives; open each hit.
- Rate limits on popular sites can mark a profile as missing when it exists. Re-run with --timeout raised.
Install and run sherlock
otlite install sherlock otlite run sherlock -- u:jane_doePairs with Maigret, socialscan and Nexfil.
Maigret
maigret
★ 38kMITMaigret searches a username across thousands of sites and, where it finds a profile, extracts the public fields on it: display name, bio, location, linked accounts. It can write an HTML or PDF report.
- Works on
- Username
- Typed inputs
- u: Username
- API keys
- None
Good for
- A fuller dossier than Sherlock on one handle.
- Finding the same person under a slightly different name through the extracted links.
- Reports you can hand to someone who does not read terminals (--html, --pdf).
Before you run it
- The full site list is slow. Use --top-sites for a quick pass.
- Some sites need cookies to return profile fields; Maigret still reports the match without them.
Install and run maigret
otlite install maigret otlite run maigret -- u:jane_doePairs with Sherlock, socid-extractor and Linkook.
Blackbird
blackbird
★ 9.2kOtherBlackbird checks a username or email address on hundreds of sites and reports where an account exists. Username checks use the community WhatsMyName site list, and hits come back as profile URLs you can export to CSV or PDF.
- Works on
- Username, Email
- Typed inputs
- u: Usernamee: Email
- API keys
- None
Good for
- A second username sweep next to Sherlock, from a different site list.
- Checking which services an email address has an account on.
- CSV or PDF exports (--csv, --pdf) to attach to a case.
Before you run it
- Sites change their responses, so treat each hit as a lead and open it before relying on it.
- The optional --ai profile sends the names of matched sites to Blackbird's own service and needs a free key from --setup-ai. Leave it off if that is a problem for your case.
- The project moved from p1ngul1n0/blackbird to antoniaci/blackbird and ships no licence file, so the registry lists its licence as Other.
Install and run blackbird
otlite install blackbird otlite run blackbird -- u:jane_doeuser-scanner
user-scanner
★ 5kMITuser-scanner takes a username or email and checks platforms that reveal whether an account exists. It groups results by category and ships an MCP server, so agents can call it too.
- Works on
- Username, Email
- Typed inputs
- u: Usernamee: Email
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
Good for
- One run for both a handle and the email behind it.
- Agent workflows: the same checks over MCP.
- A second source next to Sherlock and Holehe.
Before you run it
- otlite never runs it with --allow-loud, which would notify the target.
Install and run user-scanner
otlite install user-scanner otlite run user-scanner -- u:jane_doePairs with Sherlock, Holehe and socialscan.
Aliens Eye
aliens-eye
★ 4.1kMITAliens Eye searches a username across several hundred social sites and reports the matches. Its site list overlaps Sherlock's, so it mostly serves as a cross-check.
- Works on
- Username
- Typed inputs
- u: Username
- API keys
- None
Good for
- A cross-check on Sherlock and Nexfil output.
- Handles on smaller regional sites.
Before you run it
- Treat results as leads; the detection rules are community maintained.
Install and run aliens-eye
otlite install aliens-eye otlite run aliens-eye -- u:jane_doeNexfil
nexfil
★ 2.6kMITNexfil checks a username against a few hundred sites and prints the profile URLs that exist. It is quick and has a small dependency set, which makes it a good extra opinion.
- Works on
- Username
- Typed inputs
- u: Username
- API keys
- None
Good for
- Another username pass next to Sherlock and Maigret.
- Fast checks in scripts with the original -u flag.
Before you run it
- Detection rules are updated less often than Sherlock's; verify hits by hand.
Install and run nexfil
otlite install nexfil otlite run nexfil -- u:jane_doePairs with Sherlock, Maigret and Aliens Eye.
Linkook
linkook
★ 1kMITLinkook starts from a username, finds profiles, then follows the links those profiles publish to discover further accounts and emails. It draws the connections rather than listing flat hits.
- Works on
- Username, Email
- Typed inputs
- u: Username
- API keys
- None
Good for
- Turning one handle into the set of accounts that link to each other.
- Finding an email published on a profile page.
- Exporting the link graph for a case.
Before you run it
- Crawling linked profiles takes longer than a plain username check.
Install and run linkook
otlite install linkook otlite run linkook -- u:jane_doePairs with Maigret, socid-extractor and Sherlock.
The Big Brother
thebigbrother
★ 772MITThe Big Brother's command-line scanner checks a username on hundreds of sites and lists where it exists. It is built on Sherlock's site data and detection rules, and writes the hits as profile URLs to text, CSV, or XLSX.
- Works on
- Username
- Typed inputs
- u: Username
- API keys
- None
Good for
- A Sherlock-style sweep when you want spreadsheet output (--csv, --xlsx).
- Trying spelling variants in one run with the {?} placeholder, which swaps in _, - and .
Before you run it
- The README describes a much larger web console and a commercial reporting service. otlite installs the project but runs only its username scanner.
- It fetches Sherlock's current site list at run time and shares Sherlock's false positives. Add --local to use the bundled copy instead.
Install and run thebigbrother
otlite install thebigbrother otlite run thebigbrother -- u:jane_doeZen
zen
★ 603Apache-2.0Zen pulls author email addresses out of public commits for a GitHub user, repository, or organisation. It returns username and email pairs, and many of them are GitHub noreply addresses rather than real inboxes.
- Works on
- Username, URL
- Typed inputs
- u: Usernameurl: URL
- API keys
- None
Good for
- Finding the commit email behind a developer's GitHub handle.
- Listing contributor addresses for a repository (url:https://github.com/owner/repo).
- Organisation-wide sweeps with the original --org flag.
Before you run it
- Unauthenticated GitHub API calls are capped at 60 an hour, which a large organisation or busy repository uses up quickly.
- Upstream has not changed since 2019. It only reads GitHub's public API, so nothing reaches the person or their own sites.
Install and run zen
otlite install zen otlite run zen -- u:jane_doe
See which services an address is registered on.
GHunt
ghunt
★ 20kOtherGHunt looks up a Google account by its Gmail address and returns the public parts of it: profile name and photo, Google ID, reviews, and sometimes a calendar or Maps contributions. It works through Google's own endpoints.
- Works on
- Typed inputs
- e: Email
- API keys
- None
- Needs your own login or session
- Asks questions in the terminal
- Skipped by run --all and auto
Good for
- Confirming a Gmail address belongs to a live account.
- Finding the display name and photo behind an address.
- Pivoting from an address to public Maps reviews.
Before you run it
- Needs a one-time login (ghunt login) with your own Google cookies. Use a dedicated research account.
- Google changes endpoints often; if a module fails, update with otlite update ghunt.
Install and run ghunt
otlite install ghunt otlite run ghunt -- e:jane@example.comPairs with Holehe, MailAccess and socialscan.
Holehe
holehe
★ 15kGPL-3.0Holehe asks about 120 services whether an email address is registered, using their password-reset and sign-up checks without sending anything to the address. It reports used, not used, or rate limited per site.
- Works on
- Typed inputs
- e: Email
- API keys
- None
Good for
- Confirming an address is real and active before spending credits on it.
- Seeing which platforms to look at next for a given email.
- Bulk checks from a file with the original --only-used flag.
Before you run it
- Several services rate limit quickly; a rate-limited row is unknown, not absent.
- otlite runs Holehe with its password-recovery modules switched off by default.
Install and run holehe
otlite install holehe otlite run holehe -- e:jane@example.comPairs with MailAccess, h8mail and socialscan.
h8mail
h8mail
★ 5.3kOtherh8mail checks an email address against breach sources and, with API keys, pulls the matching records. Without keys it still queries the free sources and local breach dumps you point it at.
- Works on
- Typed inputs
- e: Email
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
Good for
- A quick breach check on an address.
- Searching your own local dump files with -lb.
- Chaining into reverse lookups on discovered passwords with the original flags.
Before you run it
- The useful sources need API keys. Add them with otlite keys set NAME; otlite keys check verifies them.
- Breach data is sensitive. Store results under a case and restrict the folder.
Install and run h8mail
otlite install h8mail otlite run h8mail -- e:jane@example.comPairs with Holehe, MailAccess and GHunt.
MailAccess
mailaccess
★ 1.4kMITMailAccess checks an email address against a large set of platforms for registration, groups the hits into likely identities, and flags addresses seen in breach data. It is a newer alternative to Holehe with broader coverage.
- Works on
- Email, Domain
- Typed inputs
- e: Emaild: Domain
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
Good for
- Broad registration checks on one address.
- A second opinion next to Holehe.
Before you run it
- Newer project; verify surprising hits by hand.
Install and run mailaccess
otlite install mailaccess otlite run mailaccess -- e:jane@example.comNeutrOSINT
neutrosint
★ 42MITNeutrOSINT asks Proton's own API whether an address exists on Proton Mail, without emailing it. For a valid address it also returns the date of the account's PGP key, and it flags custom domains that route mail through Proton.
- Works on
- Email, Username
- Typed inputs
- e: Email
- API keys
- None
Good for
- Confirming a Proton address is live before spending time on it.
- Testing one username across proton.me, protonmail.com, pm.me and the other Proton domains.
- Spotting business domains hosted on Proton.
Before you run it
- The keyless light mode allows roughly 100 lookups an hour. After that, answers are unreliable until the limit resets.
- The date belongs to the account's current PGP key, which changes if the owner regenerates keys, so it is not always the sign-up date.
- The heavier mode signs in to a Proton account of your own through Chrome. otlite's e: input uses the light mode.
Install and run neutrosint
otlite install neutrosint otlite run neutrosint -- e:jane@example.comPairs with Holehe, h8mail and MailAccess.
Phone
Check a number against messaging and social apps.
Ignorant
ignorant
★ 2.1kGPL-3.0Ignorant checks whether a phone number is registered on a handful of apps such as Snapchat and Instagram, using the same sign-up checks Holehe uses for email. Nothing is sent to the number.
- Works on
- Phone
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
Good for
- Confirming a number is in use on messaging apps.
- Pairing with Holehe when you have both an email and a number.
Before you run it
- Covers only a few services. Use the international format with the country code.
Install and run ignorant
otlite install ignorant otlite run ignorant -- --helpPairs with Toutatis, whatsapp-osint and Holehe.
Telegram Phone Number Checker
telegram-phone-number-checker
★ 1.8kMITThis Bellingcat tool checks, through your own Telegram login, whether a number or username has an account. For a match it returns the Telegram user ID, username, and display name, and can save the profile photo.
- Works on
- Phone, Username
- Typed inputs
- p: Phoneu: Username
- API keys
- API_ID, API_HASH, PHONE_NUMBEROptional. Store each with otlite keys set NAME.
- Dual-use: asks you to accept a notice before it installs
- Needs your own login or session
- Asks questions in the terminal
- Skipped by run --all and auto
Good for
- Checking whether a phone number from a case is registered on Telegram.
- Getting the stable numeric ID for a Telegram username.
- Batch checks with comma-separated numbers in one run.
Before you run it
- Needs your own Telegram API ID and hash from my.telegram.org plus your account's phone number (otlite keys set API_ID, API_HASH, PHONE_NUMBER) and a login code on first run. It is interactive, so otlite run --all and otlite auto skip it.
- Use a dedicated account, not your personal one. Telegram can restrict accounts that look up many numbers, and residential connections fare better than VPNs.
- No response means either no account or a user who hides their number from lookups. It is not proof the number is unused.
Install and run telegram-phone-number-checker
otlite install telegram-phone-number-checker otlite run telegram-phone-number-checker -- p:+15551234567Pairs with Ignorant, whatsapp-osint and Telepathy.
whatsapp-osint
whatsapp-osint
★ 1.5kMITwhatsapp-osint logs when a WhatsApp contact goes online and offline, through WhatsApp Web in a browser session you control. It produces a timeline, not message content.
- Works on
- Phone, Name
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
- Needs your own login or session
- Keeps running until you stop it
- Skipped by run --all and auto
Good for
- Activity timelines for a number you are authorised to monitor.
Before you run it
- Needs a logged-in WhatsApp Web session and a browser driver. It runs until stopped.
- This is monitoring of a person. Confirm your legal basis before you start it.
Install and run whatsapp-osint
otlite install whatsapp-osint otlite run whatsapp-osint -- --help
Social media
Pull profiles, posts, and metadata from one platform.
Instaloader
instaloader
★ 13kMITInstaloader downloads the public posts, stories, captions, and metadata of an Instagram profile into a folder. It keeps JSON sidecars per post, so timestamps and locations survive the download.
- Works on
- Username, URL
- Typed inputs
- u: Username
- API keys
- None
Good for
- Preserving a public profile before it changes or disappears.
- Pulling captions and geotags into a case file.
- Downloading by hashtag or location with the original flags.
Before you run it
- Instagram throttles anonymous downloads hard. Log in with a dedicated account for anything beyond a profile or two.
- Private profiles need a logged-in account that follows them.
Install and run instaloader
otlite install instaloader otlite run instaloader -- u:jane_doePairs with Toutatis, Instagram Monitor and socid-extractor.
Toutatis
toutatis
★ 4.3kGPL-3.0Toutatis pulls the public and semi-public fields of an Instagram account: user ID, bio, follower counts, and the obfuscated email or phone Instagram shows on password reset. It needs your own session ID.
- Works on
- Phone, Username
- Typed inputs
- u: Username
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
- Needs your own login or session
Good for
- The numeric Instagram ID for a handle.
- The masked recovery email or phone hint for a profile.
Before you run it
- Requires a sessionid cookie from a logged-in Instagram account, passed with the original -s flag. Use a dedicated account.
Install and run toutatis
otlite install toutatis otlite run toutatis -- u:jane_doePairs with Instaloader, Ignorant and Instagram Monitor.
Yark
yark
★ 2.2kMITYark archives a YouTube channel: videos, titles, descriptions, thumbnails, and comments, and keeps a history so you can see what changed or was deleted between refreshes. It serves the archive as a local site.
- Works on
- URL, Username, Name
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
Good for
- Preserving a channel before it is taken down.
- Tracking title and description edits over time.
Before you run it
- Large channels take hours and disk space. Archive one channel per folder.
Install and run yark
otlite install yark otlite run yark -- --helpPairs with Instaloader and Instagram Monitor.
Instagram Monitor
instagram-monitor
★ 1.5kGPL-3.0Instagram Monitor watches a public profile and records changes over time: new posts, follower count moves, bio edits, with optional notifications. It runs until you stop it.
- Works on
- Username
- Typed inputs
- u: Username
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
- Keeps running until you stop it
- Skipped by run --all and auto
Good for
- Documenting changes to a profile during an investigation.
- Alerts when a watched account posts.
Before you run it
- It never exits on its own, so --all and auto skip it. Run it in tmux or as a service.
- Instagram throttles unauthenticated polling. Configure a dedicated account as the project documents.
Install and run instagram-monitor
otlite install instagram-monitor otlite run instagram-monitor -- u:jane_doePairs with Instaloader, Toutatis and Yark.
Telepathy
telepathy
★ 1.3kMITTelepathy reads public Telegram chats through your own account and saves chat details and member lists. A comprehensive scan (-c) adds the message history, reactions, and forwards, written as CSV files for each chat.
- Works on
- Username
- Typed inputs
- tg: Telegram channel
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
- Needs your own login or session
- Asks questions in the terminal
- Skipped by run --all and auto
Good for
- Archiving a public channel's messages before they are deleted.
- Mapping which channels forward into a chat (-f writes an edge list for Gephi).
- Collecting member usernames to check with Maigret or Sherlock.
Before you run it
- Needs your own Telegram API ID and hash from my.telegram.org and a login code on first run, so otlite run --all and otlite auto skip it. Use a dedicated account.
- Requires Python below 3.13. The project has not been maintained since mid-2024; otlite installs the last PyPI release, 2.3.4.
- Comprehensive scans with media (-c -m) download everything the chat posted and can run for hours. Check what you are storing.
Install and run telepathy
otlite install telepathy otlite run telepathy -- tg:channelnamePairs with Telegram Phone Number Checker, Maigret and Sherlock.
socid-extractor
socid-extractor
★ 1.1kMITsocid-extractor takes a profile URL and returns the structured fields on the page: user ID, display name, bio, follower counts, linked accounts. It is the extraction engine Maigret uses, exposed on its own.
- Works on
- URL, Username
- Typed inputs
- url: URL
- API keys
- None
Good for
- Getting the numeric user ID behind a profile, which survives username changes.
- Structured fields from one URL without a full Maigret run.
- JSON output for scripts.
Before you run it
- Some sites only return fields with cookies; pass them with the original --cookies flag.
Install and run socid-extractor
otlite install socid-extractor otlite run socid-extractor -- url:https://example.comPairs with Maigret, Linkook and Instaloader.
Instagram Location Search
instagram-location-search
★ 731MITInstagram Location Search lists the Instagram location tags near a latitude and longitude. Each comes with its ID, name, and coordinates, saved as CSV, JSON, GeoJSON, a plain ID list, or a simple Leaflet map.
- Works on
- URL
- Typed inputs
- lat: Coordinates (with lng:)
- API keys
- INSTAGRAM_SESSION_IDOptional. Store each with otlite keys set NAME.
- Needs your own login or session
Good for
- Finding the location pages people tag around an event or building.
- Feeding location IDs (--ids) to a scraper that pulls posts from those places.
- A quick map (--map) of tagged places around a point.
Before you run it
- Needs a logged-in Instagram session: store the sessionid cookie with otlite keys set INSTAGRAM_SESSION_ID. Without it the tool tries to open a Chrome window for you to log in.
- Treat the session ID like a password and use a dedicated account. Instagram can invalidate sessions that are used from several places.
- It relies on an undocumented Instagram endpoint, which can change without notice.
Install and run instagram-location-search
otlite install instagram-location-search otlite run instagram-location-search -- lat:51.5074 lng:-0.1278Pairs with Instaloader, Toutatis and Instagram Monitor.
Domain and DNS
Map subdomains, lookalikes, and infrastructure.
theHarvester
theharvester
★ 18kGPL-2.0theHarvester gathers email addresses, subdomains, IPs, and names for a domain from public sources. Search engines, certificate logs, and threat-intelligence services each report separately, and -f writes the combined results to JSON and XML.
- Works on
- Domain
- Typed inputs
- d: Domain
- API keys
- SHODAN_API_KEY, HUNTER_API_KEYOptional. Store each with otlite keys set NAME.
Good for
- Early recon on a domain you are authorised to assess.
- Collecting staff addresses that show a company's email naming pattern.
- Choosing sources with -b to stay passive or to add keyed ones.
Before you run it
- Needs Python 3.12 or later. otlite pins a tested commit; current upstream has moved on to Python 3.14.
- Several sources only answer with an API key. Add the common ones with otlite keys set SHODAN_API_KEY and otlite keys set HUNTER_API_KEY.
- DNS resolution, brute force, and screenshot options contact the target directly. Leave them off for passive work.
Install and run theharvester
otlite install theharvester otlite run theharvester -- d:example.comPairs with Sublist3r, Holehe and SpiderFoot.
Sublist3r
sublist3r
★ 11kGPL-2.0Sublist3r collects a domain's subdomains from search engines, certificate logs, and public lookup sites. It prints one deduplicated hostname list, with optional brute forcing (-b) and port checks (-p) on top.
- Works on
- Domain
- Typed inputs
- d: Domain
- API keys
- None
Good for
- A quick passive subdomain list for a domain you are assessing.
- Cross-checking ctfr or theHarvester output against different sources.
- Saving hostnames to a file (-o) for resolution or screenshots later.
Before you run it
- Upstream changes slowly and some of its sources have shut down or block scripted queries, so expect several engines to return nothing.
- Brute forcing (-b) and port checks (-p) send traffic to the target's DNS servers and hosts. Leave them off for passive work.
Install and run sublist3r
otlite install sublist3r otlite run sublist3r -- d:example.comPairs with ctfr, theHarvester and dnsgen.
BBOT
bbot
★ 11kAGPL-3.0BBOT is a recursive scanner that starts from a domain or IP, discovers subdomains, hosts, and services, and feeds each finding back in as a new target. Presets choose between passive enumeration and active scanning.
- Works on
- Domain, IP
- Typed inputs
- d: Domainip: IP address
- API keys
- None
Good for
- Subdomain enumeration that keeps going as it finds new names.
- Passive recon with the subdomain-enum preset when you must stay quiet.
- Exports to JSON or CSV for a spreadsheet or a case.
Before you run it
- Active presets probe the target. Only run them with written authorisation.
- The first run installs module dependencies, which can take a few minutes.
Install and run bbot
otlite install bbot otlite run bbot -- d:example.comPairs with dnstwist, ctfr and SpiderFoot.
dnstwist
dnstwist
★ 5.7kApache-2.0dnstwist generates lookalike domains for a name you give it, including typos, homoglyphs, and extra TLDs, then checks which ones are registered and what they resolve to. Output includes MX records, so you see which lookalikes can receive mail.
- Works on
- Domain, IP
- Typed inputs
- d: Domain
- API keys
- None
Good for
- Brand and phishing monitoring for your own domain.
- Checking a suspicious domain for the brand it imitates.
- Scheduled diffs with otlite diff to catch newly registered lookalikes.
Before you run it
- Resolution is live DNS traffic from your machine. Use --registered to keep the output short.
Install and run dnstwist
otlite install dnstwist otlite run dnstwist -- d:example.comctfr
ctfr
★ 2.1kGPL-3.0ctfr lists the subdomains of a domain by reading Certificate Transparency logs through crt.sh. Nothing touches the target; it only asks the public log index.
- Works on
- Domain
- Typed inputs
- d: Domain
- API keys
- None
Good for
- Quick passive subdomain lists.
- Seeding BBOT or dnsgen with known names.
Before you run it
- crt.sh is sometimes slow or rate limited; retry later rather than hammering it.
Install and run ctfr
otlite install ctfr otlite run ctfr -- d:example.comFierce
fierce
★ 1.8kGPL-3.0Fierce brute-forces subdomains with a wordlist, tries zone transfers, and scans the IP space around the hosts it finds for more names. It is an old-school DNS recon tool that still works.
- Works on
- Domain, IP
- Typed inputs
- d: Domain
- API keys
- None
Good for
- Finding non-contiguous IP ranges tied to a domain.
- Zone transfer checks on your own name servers.
Before you run it
- Brute force and zone transfer attempts are visible to the target's DNS operators.
Install and run fierce
otlite install fierce otlite run fierce -- d:example.comdnsgen
dnsgen
★ 1.1kMITdnsgen takes a list of known subdomains and generates plausible permutations: numbers, environments, regions, and common words. It prints candidates for a resolver to check; it does no resolution itself.
- Works on
- Domain
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
Good for
- Expanding ctfr or BBOT output into more names to resolve.
- Finding staging and dev hosts that follow a naming pattern.
Before you run it
- Pipe the output into a resolver such as the one in BBOT or secator; dnsgen only generates.
Install and run dnsgen
otlite install dnsgen otlite run dnsgen -- --help
Web and records
Mine URLs, dorks, archives, and public filings.
ParamSpider
paramspider
★ 3.2kMITParamSpider pulls every archived URL for a domain from the Wayback Machine and keeps the ones with query parameters. The result is a list of endpoints and parameter names without touching the live site.
- Works on
- Domain, URL
- Typed inputs
- d: Domain
- API keys
- None
Good for
- Passive endpoint discovery before an authorised test.
- Finding old parameters a site may still accept.
Before you run it
- Installed from the repo's main branch, so otlite update paramspider tracks it.
Install and run paramspider
otlite install paramspider otlite run paramspider -- d:example.comPairs with Sitedorks, FinalRecon and theHarvester.
FinalRecon
finalrecon
★ 3kMITFinalRecon runs a set of web recon checks against a URL in one go: headers, SSL certificate, WHOIS, crawler, DNS, subdomains, directory search, and a port scan. The --full flag runs everything.
- Works on
- Domain, IP, URL
- Typed inputs
- url: URL
- API keys
- None
Good for
- A first look at a site before deeper tools.
- A single report with the basics for a case.
Before you run it
- Directory search and port scan are active. Use the passive modules on targets you do not own.
- Some modules take API keys in its own config.
Install and run finalrecon
otlite install finalrecon otlite run finalrecon -- url:https://example.comPairs with SpiderFoot, BBOT and ctfr.
CrossLinked
crosslinked
★ 1.6kGPL-3.0CrossLinked scrapes search engines for LinkedIn results about a company and turns the names it finds into email addresses in the format you specify. It never touches LinkedIn directly.
- Works on
- Username, Email, Name
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
Good for
- Building a staff list for an authorised assessment.
- Guessing the email format of an organisation.
Before you run it
- Takes a company name and a format string such as {first}.{last}@example.com with the original flags; the typed prefixes only cover the simple cases.
- Search engines rate limit scraping. Keep runs small.
Install and run crosslinked
otlite install crosslinked otlite run crosslinked -- --helpPairs with pywerview, secator and FinalRecon.
Auto Archiver
auto-archiver
★ 1.1kMITAuto Archiver saves a copy of what a URL points to, from social media posts and videos to plain pages. Each saved file gets a hash so you can show later that it has not changed, and runs can be logged to CSV or Google Sheets.
- Works on
- URL
- Typed inputs
- url: URL
- API keys
- GOOGLE_API_KEY, GOOGLE_CREDENTIALS, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEYOptional. Store each with otlite keys set NAME.
- Dual-use: asks you to accept a notice before it installs
Good for
- Preserving posts and videos before they are deleted.
- Building an evidence log with a hash for each archived item.
- Batch archiving from a Google Sheet once credentials are set.
Before you run it
- Requires Python below 3.13. Video downloads also need ffmpeg installed on the system.
- Google Sheets or Drive storage needs GOOGLE_CREDENTIALS (otlite keys set GOOGLE_CREDENTIALS), and S3 storage needs the AWS keys. Local storage works without any key.
- It fetches each URL from your machine, so the site sees your IP address. Some platforms only return full content to a logged-in session, set in its config file.
Install and run auto-archiver
otlite install auto-archiver otlite run auto-archiver -- url:https://example.comPairs with Yark and Instaloader.
Sitedorks
sitedorks
★ 1.1kGPL-3.0Sitedorks builds search-engine queries that look for a term across a curated set of sites, such as paste sites, code hosts, and social networks, and opens them in your browser. It saves typing the dorks by hand.
- Works on
- Domain, URL
- Typed inputs
- q: Search text
- API keys
- None
- Asks questions in the terminal
- Skipped by run --all and auto
Good for
- Checking where a company name or domain appears across paste and code sites.
- Bug bounty scope discovery with the built-in program lists.
Before you run it
- It opens browser tabs rather than scraping, so there is no file output to keep. Use otlite run --case for the command record.
Install and run sitedorks
otlite install sitedorks otlite run sitedorks -- q:acmePairs with ParamSpider, CrossLinked and OnionSearch.
OSINT Brazuca Regex
osint-brazuca-regex
★ 1kMITOSINT Brazuca Regex is a collection of regular expressions for Brazilian identifiers: CPF, CNPJ, phone numbers, licence plates, and more. otlite fetches the collection so you can grep documents and results with it.
- Works on
- Domain, Name
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
Good for
- Extracting Brazilian identifiers from text and search output.
- Validating CPF and CNPJ formats in a case.
Before you run it
- It is a pattern library, not a scanner. Use the patterns with grep, otlite extract, or your own scripts.
Install and run osint-brazuca-regex
otlite install osint-brazuca-regex otlite run osint-brazuca-regex -- --helpPairs with Sitedorks and ParamSpider.
EDGAR Tool
edgar-tool
★ 218MITEDGAR Tool runs the SEC's full-text search over company filings and saves the matches to a file. Each row names the filer, form type, and filing date and links to the document, in CSV, JSON, or JSON Lines.
- Works on
- Name
- Typed inputs
- q: Search text
- API keys
- None
Good for
- Finding every US filing that mentions a person or company name.
- Narrowing by form type, date range, or place of incorporation.
- Pulling recent filings for a list of tickers with edgar rss.
Before you run it
- The q: input runs edgar text-search, and a filing must contain every word you give, so shorter queries return more.
- Searches cover the last five years by default. Add --date-range all or --start-date for older filings; SEC full-text search starts in 2001.
- edgar rss with --every-n-mins keeps polling until you stop it. Run it on its own rather than under otlite run --all.
Install and run edgar-tool
otlite install edgar-tool otlite run edgar-tool -- q:acmePairs with CrossLinked and theHarvester.
Dark web
Crawl and search onion services through Tor.
TorBot
torbot
★ 4.9kOtherTorBot crawls an onion site through Tor, collects the links and emails it finds, and can build a tree of the site. It needs a local Tor service to route through.
- Works on
- URL, Domain
- Typed inputs
- url: URL
- API keys
- None
Good for
- Mapping an onion site's structure.
- Harvesting contact addresses published on it.
Before you run it
- Start Tor first (sudo systemctl start tor on Debian and Ubuntu).
- Crawling is slow over Tor; limit depth.
Install and run torbot
otlite install torbot otlite run torbot -- url:https://example.comPairs with OnionSearch and FinalRecon.
OnionSearch
onionsearch
★ 1.8kGPL-3.0OnionSearch sends a query to a set of dark web search engines over Tor and collects the onion URLs they return into one CSV. It is a search aggregator, not a crawler.
- Works on
- URL
- Typed inputs
- q: Search text
- API keys
- None
Good for
- Finding onion sites that mention a term, name, or brand.
- Seeding TorBot with URLs to crawl.
Before you run it
- Needs Tor running locally. The search term goes in with q:, which becomes the tool's positional argument.
Install and run onionsearch
otlite install onionsearch otlite run onionsearch -- q:acme
Frameworks
Multi-module recon and scanning suites.
SpiderFoot
spiderfoot
★ 22kMITSpiderFoot runs two hundred-odd modules against a domain, IP, email, or username and links what they return into one graph. The CLI mode writes results to the terminal or a file; the web UI is optional.
- Works on
- Domain, IP, Username, Email
- Typed inputs
- d: Domainip: IP address
- API keys
- None
Good for
- Attack-surface mapping of a domain you are authorised to assess.
- Pivoting from one seed into related hosts, emails, and names.
- Passive-only runs (-u passive) when you must not touch the target.
Before you run it
- Installed from git rather than PyPI, so the first install takes longer.
- Many modules need their own API keys; without them SpiderFoot still runs but with fewer sources.
- A full scan can run for hours. Start with a passive scan and a module subset.
Install and run spiderfoot
otlite install spiderfoot otlite run spiderfoot -- d:example.comPairs with BBOT, FinalRecon and secator.
IVRE
ivre
★ 4.2kGPL-3.0IVRE stores and analyses scan results from Nmap, Masscan, Zeek, and passive DNS in a database, then lets you query and view them in a web UI. otlite installs the Python package; the scanners and database are separate.
- Works on
- Domain, IP
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
Good for
- Keeping large scan datasets searchable.
- Passive DNS and flow analysis from your own sensors.
Before you run it
- Needs MongoDB or another supported database and the scanners themselves. Follow the project's setup before the first run.
Install and run ivre
otlite install ivre otlite run ivre -- --helpfsociety
fsociety
★ 1.8kMITfsociety is a menu-driven collection of recon, scanning, and exploitation tools. The OSINT entries wrap other projects in this registry; the rest is penetration-testing tooling.
- Works on
- Domain, Username, Email
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
- Asks questions in the terminal
- Skipped by run --all and auto
Good for
- A menu over tools you already know.
- Teaching environments.
Before you run it
- Interactive by design, so it does not fit --json pipelines. Much of it is offensive tooling: authorisation first.
Install and run fsociety
otlite install fsociety otlite run fsociety -- --helpPairs with secator and SpiderFoot.
OpenOSINT
openosint
★ 1.6kMITOpenOSINT is an agent-style tool: you describe what you want in a REPL and it chooses and runs lookups on usernames, emails, and domains. It also exposes an MCP server so other agents can drive it.
- Works on
- Username, Email, Domain
- Typed inputs
- u: Usernamee: Emaild: Domain
- API keys
- ANTHROPIC_API_KEY, SHODAN_API_KEY, VIRUSTOTAL_API_KEY, CENSYS_API_ID, CENSYS_SECRET, ABUSEIPDB_API_KEY, IP2LOCATION_API_KEY, BRIGHTDATA_API_KEY, BRIGHTDATA_SERP_ZONE, BRIGHTDATA_UNLOCKER_ZONE, OPENAI_API_KEY, OPENOSINT_PROXY_URLOptional. Store each with otlite keys set NAME.
Good for
- Exploratory sessions where you do not know which tool to run first.
- Wiring open-source lookups into an agent over MCP.
Before you run it
- Needs a model provider configured; read the project's setup first.
Install and run openosint
otlite install openosint otlite run openosint -- u:jane_doePairs with user-scanner, SpiderFoot and secator.
secator
secator
★ 1.3kOthersecator wraps dozens of recon and scanning tools behind one command with a shared output format, and runs them as tasks, workflows, or full scans. It installs the underlying tools for you.
- Works on
- Domain, IP, Username, Email
- Typed inputs
- u: Usernamee: Emaild: Domain
- API keys
- None
- Dual-use: asks you to accept a notice before it installs
Good for
- Standardised JSON output across many scanners.
- Repeatable recon workflows for authorised targets.
Before you run it
- Its workflows can be active scans. Check what a workflow does before pointing it at a host.
- Installing the wrapped tools pulls in Go and other runtimes.
Install and run secator
otlite install secator otlite run secator -- u:jane_doePairs with BBOT, SpiderFoot and FinalRecon.
pywerview
pywerview
★ 1.1kGPL-3.0pywerview is a Python port of PowerView for enumerating Active Directory from Linux: users, groups, computers, shares, and sessions, over LDAP and SMB with domain credentials you hold.
- Works on
- Domain, Username
- Typed inputs
- None; pass its own arguments after --
- API keys
- None
- Needs your own login or session
Good for
- AD enumeration during an authorised internal assessment.
- Mapping group membership without a Windows host.
Before you run it
- Needs domain credentials and network access to a domain controller. This is internal network tooling, not open-source intelligence in the public sense.
Install and run pywerview
otlite install pywerview otlite run pywerview -- --helpPairs with CrossLinked and secator.
Command reference
Everything else, one verb each.
Add --json to any command for scripts, and --yes to skip prompts. otlite info <tool> shows a tool's inputs and a command to try.
Find
otlite listBrowse the catalog (--installed for yours)
otlite search <query>Search tools
otlite info <tool>Inputs, keys, and an example command
otlite example <tool>Show sample output
Run
otlite install <tool>Install one or more tools
otlite run <tool> -- <args>Run one or more tools
otlite run --all u:<name>Every matching tool, in parallel
otlite auto <target>Detect the type and run
otlite playbook --listSaved multi-tool runs
Results
otlite resultsList, filter, and sort saved runs
otlite run --case <name>Group runs under a case
otlite extract <tool|path>Pull indicators from results
otlite diff <tool> <target>Compare the last two runs
Keys
otlite keys set <NAME>Store a key without echoing it
otlite keys listNames only, never values
otlite keys rm <NAME>Delete a key
otlite keys checkWhich tools are missing keys
Maintain
otlite update --allUpdate tools
otlite check-updatesSee what is behind
otlite remove <tool>Remove cleanly
otlite resumeFinish interrupted jobs
otlite doctorCheck the machine, print fixes
Results
Every run kept, in a shape scripts can read.
Output lands under ./results/<tool>/<target>/ in the folder you run from, or under results/cases/<case>/ with --case. Set OTLITE_RESULTS_DIR to keep everything in one place.
<timestamp>_<tool>_<target>_<id>.txt
The tool's own output, exactly as it printed it.
.meta.json
The command with secrets masked, timing, exit code, status, size, and SHA-256.
.envelope.json
One JSON shape for every tool: input, case, status, duration, and the entities found (emails, domains, IPs, URLs, accounts).
Exit codes
- 0
- Success
- 1
- Error
- 2
- Invalid input
- 127
- The tool's command is missing
- 130
- Interrupted
{
"envelope": 1,
"tool": "sherlock@0.15.0",
"runtime": "otlite",
"input": "u:jane_doe",
"status": "ok",
"exit_code": 0,
"duration_ms": 41230,
"entities": [
{ "type": "url", "value": "https://github.com/jane_doe" }
],
"output": { "path": "results/sherlock/jane_doe/…txt", "sha256": "…" }
}A single-tool run exits with the tool's own exit code. Results can hold personal data, so store and share them accordingly.
otlite or ot?
Two ways to run the same kind of tool.
otlite is the lightweight edition. ot is the OTInstaller Registry's command line, for when you want every tool signed and sandboxed. Both are free and made by the same people.
otlite
No Docker, no account.
- 47 curated tools, pinned and tested before each release
- Each tool in its own virtualenv, not in a sandbox
- Linux and macOS, Python 3.10–3.14
- Tools that need a terminal or raw arguments work as usual
ot
Signed, scanned, and sandboxed.
- Every package digest-pinned, signature-checked, and security-scanned
- Runs in a locked-down container with no network unless declared
- Linux, macOS, and Windows; needs Docker or Podman
- Publish your own tools and guides to the registry
Use ot when you can run containers; use otlite on a server or VM without them, or when a tool needs a terminal.
What otlite sends
No usage telemetry. otlite talks to GitHub and PyPI to install tools, and to nothing else of ours. Crash reports are off unless you turn them on, cover only otlite's own crashes, and never include targets, arguments, output, keys, or paths. DO_NOT_TRACK=1 always turns them off.
Responsible use
otlite installs and runs third-party tools; it does not create or verify them. Many are dual-use, and those ask you to accept a notice before they install. Use them only on targets you are authorised to investigate, and follow the laws and service terms that apply to you. Phishing, brute-force, bombing, and doxing tools are never listed.
When open-source isn't enough
Breach records, people search, WHOIS history, and face matching come from commercial providers. SearchIn runs them from one search box, priced per lookup with no subscription.
See SearchInWatch it run
Ninety seconds, from install to results.
Recorded when otlite was still called otinstaller. The commands are the same: type otlite where the video types ot or otinstaller.
FAQ
otlite, answered
Is otlite free?
Yes. otlite is free and open source under the Apache-2.0 license. It is never billed to an OSINTverse wallet and does not need an OSINTverse account.
What happened to otinstaller?
It was renamed otlite in October 2026, with the same commands and the same tools. pip install -U otinstaller now installs otlite and keeps the otinstaller command working, with a note pointing to the new name. Settings and keys move from ~/.otinstaller to ~/.otlite on the first run; reinstall your tools once.
Do I need Docker?
No. otlite installs each tool into its own Python virtualenv, so it runs anywhere Python 3.10 or newer does. If you would rather run every tool signed and in a locked-down container, use ot from the OTInstaller Registry, which needs Docker or Podman.
Does it work on macOS or Windows?
macOS, yes: it is tested on macOS 14 on Apple silicon, and the one-line installer sets up pipx with Homebrew. Windows is not supported natively; install Ubuntu through WSL2 and run otlite inside it, or use ot, which runs on Windows.
Does it change my system Python?
No. Every tool installs into its own virtualenv under ~/.otlite/, so tools never conflict with each other or with your system packages. Removing a tool removes its environment.
Where are results saved?
Under ./results/<tool>/<target>/ in the folder you run from, as the tool's output plus a .meta.json sidecar and a .envelope.json with the entities found. Set OTLITE_RESULTS_DIR to keep them in one place, and use otlite results to list and filter them.
How are API keys stored?
In one file, ~/.otlite/.env, with permissions 600. otlite keys set asks for the value without echoing it, each tool receives only the keys it declares, and key values never reach logs or saved results. No tool in the catalog requires a key; some return more with one.
How are tools chosen?
A tool is listed when it installs cleanly with pip or git, passes a smoke test, and a person has reviewed it. Each release pins the versions it was tested with, and a nightly check catches tools that break. Phishing, IP grabbers, bombers, brute force, and doxing tools are excluded by policy.
Does otlite send any data?
No usage data. It contacts GitHub and PyPI to install and update tools. Crash reports are opt-in, cover only otlite's own crashes, and exclude targets, arguments, output, keys, and paths. The tools you run make their own requests, so check each tool's page before you point it at a target.
How is it different from SearchIn?
otlite runs free open-source tools on your own machine. SearchIn runs commercial OSINT data providers (breach, people, domain, and image sources) in the browser, priced per lookup. Many investigators use both.
OSINTverse means OSINT
Everything else on OSINTverse
One account covers search, the case map, the API, and MCP. The free tools, the resources, and the community need no account at all.
- SearchSearchInType one email, username, phone, or domain. See everything connected to it.17 sources behind one search box
- MapGraphInBrowser link analysis your whole team shares, priced per team.$100 once per team, not per seat
- AutomateOSINTOne APIThe same 17 sources in your own tools. One key, one schema.17 sources, one key, one schema
- ConnectOSINTverse MCPLet Claude run the same 17 sources and file results into Cases. You set the daily cap.24 tools for Claude, ChatGPT, and Cursor
- LearnResourcesCourses, books, ebooks, newsletters, and communities, judged before you pay for one.68 resources and 86 comparisons
- CommunityOSINT CollectiveA free monthly room where people who do OSINT teach what they know. OSINTCon recordings stay open.500 seats a month, 10,000+ OSINTCon attendees
Install your first tool in a minute.
One line installs otlite, then otlite init. The docs walk through typed inputs, API keys, results, and resume. Source and llms.txt are on GitHub.
Quick install
curl -fsSL https://get.otinstaller.com/otlite | shApache-2.0 licensed · contributions welcome