Find forgotten accounts across 30+ social media platforms using three-tier verification.
That account you made in 2014 and completely forgot about? Still out there.
Most username finders just check if a URL returns a 200. Works until it doesn't — false positive rates around 30-40% when platforms serve the same page whether the account exists or not.
This one uses three verification tiers: official APIs first, then browser automation, then HTTP content analysis. Gets false positives down to around 5%. Not perfect — web scraping never is — but meaningfully better than a status code.
- Three verification tiers: official APIs (most reliable), browser automation, and HTTP content analysis — each kicking in when the previous tier isn't available
- Searches 30+ platforms including GitHub, Reddit, Bluesky, Twitter, Instagram, TikTok, LinkedIn, YouTube
- Tries platform-specific username patterns automatically (e.g.
luke.steuber→luke-steuberfor GitHub) - Streams results in real time as platforms respond, prioritizing high-traffic sites first
- Confirms, flags, or removes found accounts; export filtered results as CSV/JSON
- Deep search mode adds 500+ platforms via WhatsMyName database
- Runs 200 concurrent requests with semaphore-based rate protection
git clone https://github.com/lukeslp/antisocial.git
cd antisocial
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
playwright install chromium
python run.pyServer runs at http://localhost:8000. API docs at http://localhost:8000/docs.
Start a search:
curl -X POST http://localhost:8000/api/searches \
-H "Content-Type: application/json" \
-d '{"username": "example", "tiers": [1, 2, 3]}'Check progress:
curl http://localhost:8000/api/searches/1Get results:
curl http://localhost:8000/api/searches/1/resultsDeep search (500+ platforms via WhatsMyName):
curl -X POST http://localhost:8000/api/searches \
-H "Content-Type: application/json" \
-d '{"username": "example", "tiers": [1, 2, 3], "deep_search": true}'| Endpoint | Method | Description |
|---|---|---|
/api/health |
GET | Health check |
/api/stats |
GET | Total searches, accounts, platforms |
/api/searches |
POST | Start a new search |
/api/searches |
GET | List all searches |
/api/searches/{id} |
GET | Search details and progress |
/api/searches/{id}/results |
GET | Found accounts |
/api/searches/{id}/checks |
GET | All platforms checked (add ?found=true to filter) |
/api/platforms |
GET | Supported platforms |
/api/accounts |
GET | All accounts (filter by ?status=confirmed|false_positive) |
/api/accounts/{id} |
PATCH | Update account status |
/api/accounts/bulk-update |
POST | Bulk status update |
/api/accounts/{id}/feedback |
POST | Accuracy feedback (1=correct, -1=incorrect, 0=clear) |
/api/accuracy |
GET | Per-platform accuracy statistics |
Create .env:
DEBUG=false
PORT=8000
DATABASE_URL=sqlite+aiosqlite:///./data/accounts.db
Key settings in backend/config/settings.py:
max_concurrent_requests: 200request_timeout: 5s- Confidence thresholds: API (95%), Browser (85%), HTTP (70%)
backend/
├── api/ # FastAPI REST API
├── config/ # Settings and platform definitions
├── core/ # Search orchestration + username variations
├── db/ # SQLAlchemy models (Search, Account, PlatformCheck)
└── platforms/
├── base.py # BaseVerifier + VerificationResult
└── verifiers/ # api.py, browser.py, http.py, wmn.py
Add a new platform by editing backend/config/platforms.yaml:
newplatform:
name: New Platform
category: social
tier: 3
enabled: true
url_template: "https://example.com/{username}"
verification_method: httpFor platforms that need custom logic, add a _verify_{platform_id}() method to the appropriate verifier file.
- Backend: FastAPI, SQLAlchemy, Playwright, httpx
- Database: SQLite with async support (aiosqlite)
- Frontend: React, Vite, Tailwind CSS, shadcn/ui
- Live: https://dr.eamer.dev/antisocial/
MIT — see LICENSE file.
Luke Steuber · lukesteuber.com · @lukesteuber.com