10 findings, three shapes: Six were the same pattern: `const xRef = useRef(x); xRef.current = x` written directly in the render body, to keep a ref in sync with the latest value for callbacks/subscriptions that need to read it without re-subscribing (graph-main.tsx's ForceGraph2D click handler, use-link-creation.ts, template-editor.tsx, use-confirm-dialog.tsx, use-paste-listener.ts). Mutating a ref during render is unsafe — if render runs without committing (Strict Mode, concurrent features), you still perform the mutation. Moved each into useLayoutEffect (not useEffect — this needs to happen before paint, so any interaction right after commit sees the latest ref). use-confirm-dialog.tsx's ref held a freshly-allocated closure every render too; wrapped that in useCallback([]) first since it only closes over stable setState setters, so the effect syncing it to the ref only needs to run once. graph/index.tsx was the same shape but inside a useMemo, using the ref mutation as a side-channel version counter for cache invalidation (useMemo isn't supposed to have side effects, and the existing eslint-disable-next-line on it suggests this was already known to be irregular). Replaced with what it was actually trying to be: real state, bumped in a useLayoutEffect keyed on the same deps — same "one new value per deps change" behavior, done through React's actual update path instead of a ref side-channel. image-view-block.tsx read getComputedStyle(containerRef.current) directly in the render body — null on first render (before mount), and reading DOM layout during render generally isn't safe. Moved to useState + useLayoutEffect, measuring after commit instead. details-panel.tsx: kept as a documented eslint-disable, not fixed. handlePropertyBlur reads a ref but only ever runs from a real onCheckedChange handler, never during render — the lint rule's static analysis treats any function that touches a ref as unsafe wherever it's referenced, not just where it executes, and can't prove otherwise from this callback shape. Restructuring around a rule limitation isn't worth it; disabled with the reasoning inline. Verified: eslint clean, tsc 88 (unchanged), vitest 15/15, yarn build clean.
Flowsint
Flowsint is an open-source OSINT graph exploration tool designed for ethical investigation, transparency, and verification.
Ethics: Please read ETHICS.md for responsible use guidelines.
https://github.com/user-attachments/assets/eaabfa81-d7b3-414d-8cf7-f69b4e37bab6
https://github.com/user-attachments/assets/7457d94a-cf1d-4a97-949f-f9b1d8d92644
https://github.com/user-attachments/assets/65c3f26e-7132-4853-be45-21b8933688bd
Contributing
Flowsint is still in early development and definetly needs the help of the community! Feel free to raise issues, propose features, etc.
Get started
Don't want to read ? Got it. Here's your install instructions:
Linux / macOS
1. Install pre-requisites
- Docker
- Make
2. Run install command
git clone https://github.com/reconurge/flowsint.git
cd flowsint
make prod
Windows
No Make needed. Works in both Command Prompt (cmd) and PowerShell.
1. Install pre-requisites
- Docker Desktop (make sure it is running before the next step)
- Git
2. Clone and set up environment files
git clone https://github.com/reconurge/flowsint.git
cd flowsint
copy .env.example .env
copy .env.example flowsint-api\.env
copy .env.example flowsint-core\.env
copy .env.example flowsint-app\.env
3. Start
docker compose -f docker-compose.prod.yml up -d
This pulls the pre-built images from GitHub Container Registry — no local build needed.
First login
Then go to http://localhost:5173/register and create an account. There are no credentials or account by default.
✅ OSINT investigations need a high level of privacy. Everything is stored on your machine.
Deploy on a network (team / server)
The same setup works out of the box on a server: the frontend serves the UI and proxies all API calls internally, so no extra configuration is needed for clients.
git clone https://github.com/reconurge/flowsint.git
cd flowsint
cp .env.example .env
# Edit .env — see "Before exposing to a network" below
docker compose -f docker-compose.prod.yml up -d
Anyone on the network can then access Flowsint at http://<server-ip>:5173.
Before exposing to a network, change the default secrets in .env:
AUTH_SECRET— signs authentication tokens. Generate one:openssl rand -hex 32MASTER_VAULT_KEY_V1— encrypts stored API keys. Generate one:python3 -c "import os, base64; print('base64:' + base64.b64encode(os.urandom(32)).decode())"NEO4J_PASSWORD— Neo4j database password.
Also add your server hostname/IP to the Host-header allowlist in flowsint-app/nginx.conf (look for map $http_host $is_flowsint_host). The default allowlist accepts only localhost / 127.0.0.1 / [::1], which defends single-user installs against DNS rebinding; LAN and public deploys must opt-in their own hostname. Two commented-out template lines in the same map block show the format.
Only port 5173 is exposed to the network. PostgreSQL, Redis, Neo4j and the API are bound to 127.0.0.1 on the server and reachable only through the frontend proxy.
To pin a specific version instead of latest, set FLOWSINT_VERSION in .env (e.g. FLOWSINT_VERSION=1.2.10).
HTTPS (recommended beyond a trusted LAN): put any reverse proxy in front of port 5173. Example with Caddy:
flowsint.example.com {
reverse_proxy 127.0.0.1:5173
}
When fronting with a reverse proxy, also bind the app port to localhost in docker-compose.prod.yml ("127.0.0.1:5173:8080") so clients can only go through HTTPS.
What is it?
Flowsint is a graph-based investigation tool focused on reconnaissance and OSINT (Open Source Intelligence). It allows you to explore relationships between entities through a visual graph interface and automated enrichers.
Available Enrichers
Domain Enrichers
- Reverse DNS Resolution - Find domains pointing to an IP
- DNS Resolution - Resolve domain to IP addresses
- Subdomain Discovery - Enumerate subdomains
- WHOIS Lookup - Get domain registration information
- Domain to Website - Convert domain to website entity
- Domain to Root Domain - Extract root domain
- Domain to ASN - Find ASN associated with domain
- Domain History - Retrieve historical domain data
IP Enrichers
- IP Information - Get geolocation and network details
- IP to ASN - Find ASN for IP address
ASN Enrichers
- ASN to CIDRs - Get IP ranges for an ASN
CIDR Enrichers
- CIDR to IPs - Enumerate IPs in a range
Social Media Enrichers
- Maigret - Username search across social platforms
Organization Enrichers
- Organization to ASN - Find ASNs owned by organization
- Organization Information - Get company details
- Organization to Domains - Find domains owned by organization
Cryptocurrency Enrichers
- Wallet to Transactions - Get transaction history
- Wallet to NFTs - Find NFTs owned by wallet
Website Enrichers
- Website Crawler - Crawl and map website structure
- Website to Links - Extract all links
- Website to Domain - Extract domain from URL
- Website to Webtrackers - Identify tracking scripts
- Website to Text - Extract text content
Email Enrichers
- Email to Gravatar - Find Gravatar profile
- Email to Breaches - Check data breach databases
- Email to Domains - Find associated domains
Phone Enrichers
- Phone to Breaches - Check phone number in breaches
Individual Enrichers
- Individual to Organization - Find organizational affiliations
- Individual to Domains - Find domains associated with person
Integration Enrichers
- N8n Connector - Connect to N8n workflows
Project structure
The project is organized into autonomous modules:
Core modules
- flowsint-core: Core utilities, orchestrator, vault, celery tasks, and base classes
- flowsint-types: Pydantic models and type definitions
- flowsint-enrichers: Enricher modules, scanning logic, and tools
- flowsint-api: FastAPI server, API routes, and schemas only
- flowsint-app: Frontend application
Module dependencies
flowsint-app (frontend)
↓
flowsint-api (API server)
↓
flowsint-core (orchestrator, tasks, vault)
↓
flowsint-enrichers (enrichers & tools)
↓
flowsint-types (types)
Development setup
Prerequisites
- Docker
Run
Linux / macOS (requires Make):
make dev
Windows (cmd or PowerShell, no Make — create the .env files first, see Get started):
docker compose -f docker-compose.dev.yml up -d --build
docker compose -f docker-compose.dev.yml logs -f
Development
The app is accessible at http://localhost:5173.
Module details
flowsint-core
Core utilities and base classes used by all other modules:
- Database connections (PostgreSQL, Neo4j)
- Authentication and authorization
- Logging and event handling
- Configuration management
- Base classes for enrichers and tools
- Utility functions
flowsint-types
Pydantic models for all data types:
- Domain, IP, ASN, CIDR
- Individual, Organization, Email, Phone
- Website, Social profiles, Credentials
- Crypto wallets, Transactions, NFTs
- And many more...
flowsint-enrichers
Enricher modules that process data:
- Domain enrichers (subdomains, WHOIS, resolution)
- IP enrichers (geolocation, ASN lookup)
- Social media enrichers (Maigret, Sherlock)
- Email enrichers (breaches, Gravatar)
- Crypto enrichers (transactions, NFTs)
- And many more...
flowsint-api
FastAPI server providing:
- REST API endpoints
- Authentication and user management
- Graph database integration
- Real-time event streaming
flowsint-app
Frontend application.
- Modern and UI friendly interface
- Built for performance (no lag even on thousands of nodes)
Development workflow
- Adding new types: Add to
flowsint-typesmodule - Adding new enrichers: Add to
flowsint-enrichersmodule - Adding new API endpoints: Add to
flowsint-apimodule - Adding new utilities: Add to
flowsint-coremodule
Testing
Each module has its own (incomplete) test suite:
# Test core module
cd flowsint-core
uv run pytest
# Test types module
cd ../flowsint-types
uv run pytest
# Test enrichers module
cd ../flowsint-enrichers
uv run pytest
# Test API module
cd ../flowsint-api
uv run pytest
Contributing
- Follow the modular structure
- Use Poetry for dependency management
- Write tests for new functionality
- Update documentation as needed
⚖️ Legal & Ethical Use
Ethics: Please read ETHICS.md for responsible use guidelines.
Flowsint is designed strictly for lawful, ethical investigation and research purposes.
It was created to assist:
- Cybersecurity researchers and analysts
- Journalists and OSINT investigators
- Law enforcement or fraud investigation teams
- Organizations conducting internal threat intelligence or digital risk analysis
Flowsint must not be used for:
- Unauthorized intrusion, surveillance, or data collection
- Harassment, doxxing, or targeting of individuals
- Political manipulation, misinformation, or violation of privacy laws
Any misuse of this software is strictly prohibited and goes against the ethical principles defined in ETHICS.md.