The Open Source Intelligence Platform is a modular investigation workspace for discovering public profiles, inspecting public X metadata, resolving caller information, searching authorized local datasets, and mapping explicit geospatial evidence. The platform repository brings live and imported sources together behind one nginx endpoint and the whoisit Electron UI.
flowchart LR
UI["whoisit<br/>Electron + React"] -->|HTTP| Proxy["nginx proxy<br/>localhost:80"]
subgraph Platform["platform · Docker Compose"]
Proxy -->|/scan/*| Checker["profile_checker<br/>FastAPI"]
Proxy -->|/focus*| Search["profile_search<br/>FastAPI + X API"]
Proxy -->|/phone_search*| Phone["phone_search<br/>FastAPI + Twilio Lookup v2"]
Proxy -->|/datasets*| Data["dataset_service<br/>FastAPI + SQLite"]
Proxy -->|/map/*| Mapping["social_mapping<br/>FastAPI + GeoJSON"]
Data --> Volume[("dataset_data<br/>persistent volume")]
Mapping --> Data
Mapping --> Cache[("geocoder cache<br/>persistent volume")]
end
Search --> X["X API"]
Mapping --> X
Mapping --> Nominatim["Nominatim<br/>search-origin geocoding"]
Phone --> Twilio["Twilio Lookup API"]
The services remain independently runnable, while the platform repository provides:
- Docker Compose orchestration and a shared bridge network
- nginx routing through port
80 - environment-variable injection for external APIs
- health and readiness endpoints
- persistent normalized profile and phone datasets
- explicit geospatial dataset evidence, radius search, and combined GeoJSON responses
- a durable, rate-limited search-origin geocoder cache
- helper scripts for starting, stopping, rebuilding, and viewing logs
- a unified Electron interface with identity search, native map, dataset import, integration status, and local history workspaces
- Enter a username or phone number in the shared Search workspace. Auto mode routes clearly formatted phone numbers to phone services and other values to profile services; explicit modes handle ambiguous identifiers.
- Choose sources across all connected services, live APIs only, or imported datasets only. Excluded providers are not called.
- Inspect a profile to retrieve public X identity fields, media, verification state, dates, pinned/recent post IDs, entities, and metrics. Public scan evidence remains available when paid X inspection is unavailable.
- Review phone results from Twilio Lookup v2 and exact normalized matches in imported phone datasets.
- Import authorized data from CSV, JSON, JSONL, or NDJSON through one sparse entity pipeline. Each row can contain a profile identifier, a phone identifier, or both; matching either identifier returns the stored association.
- Explore the Map workspace by entering a place, radius, optional keyword, and source selection. Results retain source, accuracy, confidence, timestamps, provenance, and associated identity metadata.
- Manage integrations by reviewing the configured and reachable state of X/Tweepy, Twilio Lookup, local datasets, and Social Mapping, or replacing provider credentials from the desktop UI.
Live providers and imported sources are queried independently. A provider error is shown with that source while successful results from other sources remain available.
| Repository | Role |
|---|---|
platform |
Top-level Docker Compose orchestration, nginx proxy, shared configuration, and service submodules. |
whoisit |
Electron and React workspace for identity search, native mapping, dataset imports, provenance, and local history. |
social_mapping |
FastAPI geospatial aggregator and standalone React/Leaflet client for imported datasets and provider-supplied X locations. |
profile_checker |
FastAPI service that validates configured public profile locations for a username. |
profile_search |
FastAPI and Tweepy service that retrieves public X profile metadata from a discovered profile URL. |
phone_search |
FastAPI service that resolves caller metadata through Twilio Lookup v2. |
All routes are exposed through nginx at http://127.0.0.1:80.
| Method and route | Service | Purpose |
|---|---|---|
GET /scan/{username} |
profile_checker |
Scan configured platforms for a username. |
GET /focus?url={profile_url} |
profile_search |
Inspect an X profile and return public metadata. |
GET /phone_search?phone_number={e164_number} |
phone_search |
Look up phone and caller metadata. |
GET /datasets |
dataset_service |
List imported datasets. |
GET /datasets/schema/entity |
dataset_service |
Describe the unified sparse entity fields. |
POST /datasets/import |
dataset_service |
Import mapped entities with profile identifiers, phone identifiers, or both. |
GET /datasets/search/profiles?query=...&fuzzy=true |
dataset_service |
Search imported profile records. |
GET /datasets/search/phones?phone_number=... |
dataset_service |
Search imported phone records by normalized E.164 number. |
GET /datasets/search/geo?latitude=...&longitude=... |
dataset_service |
Radius-search records that contain an explicit valid coordinate pair. |
GET /map/search?place=...&radius_miles=... |
social_mapping |
Return combined evidence-oriented GeoJSON from selected sources. |
DELETE /datasets/{dataset_id} |
dataset_service |
Delete a dataset and its records. |
GET /scan/healthz |
profile_checker |
Username-scan service liveness. |
GET /focus/readyz |
profile_search |
Profile service readiness, including X credential configuration. |
GET /phone_search/healthz |
phone_search |
Phone service liveness. |
GET /datasets/healthz |
dataset_service |
Dataset service liveness. |
GET /map/healthz |
social_mapping |
Map service liveness. |
GET /map/readyz |
social_mapping |
Map cache and optional-provider readiness. |
Copy the example file before starting the stack:
cp .env.example .envSet these values in .env:
| Variable | Used by | Meaning |
|---|---|---|
TWEEPY_BEARER_TOKEN |
profile_search, social_mapping |
X API app-only bearer token used for public profile and recent geospatial post lookup. |
TWILIO_ACCOUNT_SID |
phone_search |
Identifier for the Twilio account making Lookup API requests. |
TWILIO_AUTH_TOKEN |
phone_search |
Secret used to authenticate Twilio API requests. |
DATASET_DB_PATH |
dataset_service |
SQLite path; Compose sets /data/datasets.db in a persistent named volume. |
NOMINATIM_BASE_URL |
social_mapping |
Server-side geocoder used only for the investigator's entered search origin. |
NOMINATIM_USER_AGENT |
social_mapping |
Identifying User-Agent with a project or contact URL. |
GEOCODER_CACHE_DAYS |
social_mapping |
Durable normalized place-cache refresh interval; default 30 days. |
Never place real credentials in .env.example, source files, logs, issues, or commits. The local .env file is intentionally ignored by Git. The desktop Integrations workspace never displays existing values; replacements are handled by the Electron main process, written atomically with owner-only permissions, and applied by recreating only the affected API services when Docker is accessible.
- Git, including configured access to the service submodules
- Docker Engine
- Docker Compose through the
docker composecommand - Node.js 22 or newer and npm to run the Electron UI
- Optional X API and Twilio credentials for their corresponding live features
git clone https://github.com/osint-services/platform.git
cd platform
git submodule update --init --recursive
cp .env.example .env
# Add your credentials to .env
docker compose up --build -dOr use the provided helper:
./scripts/start.shVerify the routed services:
curl http://127.0.0.1/scan/healthz
curl http://127.0.0.1/focus/readyz
curl http://127.0.0.1/phone_search/healthz
curl http://127.0.0.1/datasets/healthz
curl http://127.0.0.1/map/readyzWith the platform stack running:
cd whoisit
npm install
npm startThe UI checks platform availability, can attempt to start the parent Compose stack, and provides Search, Map, Datasets, Integrations, and History workspaces. The native Map workspace calls the shared /map/search API rather than embedding the standalone client. Credential-free dataset mapping remains available when X is not configured. Imported records preserve their dataset, source, observation time, optional confidence, normalized fields, associations, coordinates when explicitly supplied, and original row for audit.
From the platform repository:
./scripts/start.sh # Build and start the stack
./scripts/stop.sh # Stop the stack
./scripts/build.sh # Rebuild service images
./scripts/logs.sh # Stream service logsUse the platform only for lawful access to public or properly authorized data. Import only data you are permitted to retain and search. A map marker is source evidence, not proof of a person's present location. Free-text profile locations are never converted into claimed post coordinates, and associated phone data never creates or implies a phone or device location. Protect API credentials and dataset volumes, respect provider and dataset license terms, apply appropriate retention controls, and consider the privacy and safety impact of collecting or sharing identifying information. The local API currently has no authentication layer and should not be exposed to an untrusted network without access controls.