By OSINT Cabal
Contact Analyzer collects social profile relationships through a visible Google Chrome or Chromium session that you control. It opens rendered relationship lists, scrolls or paginates them, reads browser generated network responses when useful, and saves canonical profile URLs.
It does not require official social network APIs, developer accounts, API tokens, or copied cookies.
Contact Analyzer is built for authorized OSINT research where an investigator needs repeatable contact collection, clear source relationships, and honest reporting when a platform does not expose a complete list.
- Collects
followers,following, andfriends - Uses your visible and authenticated browser session
- Supports Google Chrome and Chromium
- Deduplicates canonical profile URLs in SQLite
- Preserves relationship sources without duplicating contacts
- Writes Markdown and JSON that work well in Obsidian
- Saves checkpoints and diagnostics for incomplete runs
- Keeps blocked, failed, and review results out of the persistent contact set
- Uses Codex for bounded page analysis and optional diagnostic review
- Requires no official platform API keys
- You create a subject and add known profile URLs.
- Contact Analyzer connects to the dedicated browser at
http://127.0.0.1:9222. - The collector opens relationship lists that are visible to your account.
- It reads rendered rows and browser generated XHR or fetch responses.
- Platform adapters reject posts, media, search pages, groups, repositories, hashtags, and other navigation URLs.
- Accepted profiles are normalized to canonical profile URLs.
- SQLite records unique contacts and their source relationship edges.
- The exporter writes the current contact set, run history, and diagnostics.
If a platform reports a count but exposes fewer unique profiles, the run stays incomplete. Contact Analyzer does not turn a partial list into a complete one.
Contact Analyzer supports current desktop releases of:
- Fedora Linux
- Debian
- Ubuntu
- Linux Mint
- Kali Linux
- macOS
Python 3.10 or newer is required. Linux needs the Python venv module.
Google Chrome is recommended. Chromium is supported as a fallback.
The Linux installer recognizes Fedora, Debian, Ubuntu, Linux Mint, and Kali. It prints the correct package commands when Python or a browser requirement is missing.
See Linux installation for distribution specific commands.
Install and authenticate the OpenAI Codex CLI first:
curl -fsSL https://chatgpt.com/codex/install.sh | sh
codex --version
codex loginYou can also install Codex with npm:
npm install -g @openai/codex
codex loginClone Contact Analyzer and run the installer:
git clone https://github.com/OSINTCabal/Contact-Analyzer.git
cd Contact-Analyzer
./install.sh
hash -rThe installer checks Codex, Python, venv, and pip before copying the
application. It installs Contact Analyzer for the current user and creates:
~/.local/share/contact-analyzer
~/.local/bin/contactanalyzer
~/.local/bin/contactanalyzer-browser
Do not run the installer with sudo.
To print the package requirements without installing anything:
./install.sh --system-requirementsStart the dedicated browser:
contactanalyzer-browserThe launcher finds Google Chrome or Chromium, creates a separate browser
profile, and enables Chrome DevTools only on 127.0.0.1:9222.
Sign in manually to the platforms you plan to collect. Keep this profile separate from your everyday browser profile.
Verify the connection:
contactanalyzer doctorChrome 136 and newer require remote debugging to use a separate user data
directory. The included launcher handles this automatically. Ubuntu Chromium
Snap installations use a profile inside ~/snap/chromium/common/ so the
browser can write to it.
See Browser setup for manual commands and troubleshooting.
Open the interactive subject menu:
contactanalyzerCreate a subject and paste profile URLs:
here's my next subject Example Person
https://www.instagram.com/example
https://x.com/example
https://bsky.app/profile/example.bsky.social
https://github.com/example
DONE
Contact Analyzer identifies the platforms, finds available relationship controls, and collects only canonical profile URLs.
| Command | Purpose |
|---|---|
contactanalyzer |
Open the interactive subject menu |
contactanalyzer subjects |
List saved subjects |
contactanalyzer new |
Create and run a subject from pasted URLs |
contactanalyzer add "Example Person" --run |
Add profile URLs and collect them |
contactanalyzer run "Example Person" |
Run or resume saved profiles |
contactanalyzer platforms |
Show platform coverage |
contactanalyzer discover URL |
Inspect visible relationship controls |
contactanalyzer export "Example Person" |
Refresh JSON and Markdown exports |
contactanalyzer audit "Example Person" |
Check database and export integrity |
contactanalyzer codex "Example Person" |
Review the latest run with Codex |
contactanalyzer doctor |
Check the browser, database, vault, and Codex |
contactanalyzer config --vault PATH |
Change the output vault |
contactanalyzer --version |
Print the installed version |
More examples are available in Usage and configuration.
The default vault is:
~/Documents/Contact-Analyzer/
The output is ordinary Markdown and JSON:
Contact-Analyzer/
├── .contactanalyzer/
│ └── contactanalyzer.sqlite3
└── Subjects/
└── example-person/
├── Summary.md
├── Master Contacts.md
├── master_contacts.json
├── platforms/
└── runs/
└── YYYYMMDD-HHMMSS/
├── Run Summary.md
├── run.json
└── platform/profile-id/
├── followers.json
├── followers.checkpoint.json
└── diagnostics/
A contact is unique by subject, platform, and canonical profile URL. One contact can retain several source relationships while appearing only once in master exports.
Codex is used in two limited ways.
First, generic website pages can be analyzed from rendered browser evidence with a JSON schema and a read only sandbox.
Second, you can ask Codex to review the latest run diagnostics:
contactanalyzer run "Example Person" --with-codex
contactanalyzer run "Example Person" --with-codex-exec
contactanalyzer codex "Example Person"
contactanalyzer codex "Example Person" --execGenerated case bundles are stored under codex_cases/ and ignored by Git.
Review them before sharing.
- Use Contact Analyzer only on accounts and data you are authorized to access.
- Follow applicable law, platform terms, rate limits, and organizational policy.
- A visible relationship does not guarantee that the full list is available.
- Private lists, platform caps, challenges, and rate limits remain explicit in the final status.
- Never publish the dedicated browser profile, vault, database, screenshots, rendered HTML, captured responses, or diagnostic bundles.
- Close the dedicated browser when collection is finished.
The Chrome DevTools endpoint controls everything visible to the dedicated profile. Contact Analyzer binds it to the loopback interface and refuses external addresses.
Read Security policy before reporting a vulnerability.
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
python -m unittest discover -s tests -v
bash -n install.sh contactanalyzer scripts/launch-chrome.shThe test suite uses synthetic fixtures and does not require a live browser.
See Contributing and the publishing checklist.
Contact Analyzer is available under the MIT License.
Built for the OSINT Cabal community.