We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect
The OSINT Mesh: Multi-Source Intelligence Correlation
How Prismatic correlates intelligence across 157 OSINT adapters using graph analysis, confidence aggregation, and the mesh expansion pattern to discover hidden connections.
Tomas Korcak (korczis)
Prismatic Platform
A single OSINT source tells you a fact. Multiple sources tell you a story. The mesh pattern is Prismatic's approach to correlating intelligence across 157 adapters to discover connections that no single source reveals.
The Mesh Pattern
Traditional OSINT workflows are linear: query a source, read the results, query the next source. The mesh pattern is parallel and iterative:
2. Expand: Query all relevant adapters concurrently
3. Correlate: Match results across sources using entity resolution
4. Discover: Extract new entities from results (directors, domains, addresses)
5. Repeat: Use discovered entities as new seeds, expanding the mesh
Each iteration deepens the intelligence picture. A company name yields directors. Directors yield other companies. Other companies yield domains. Domains yield IP addresses. IP addresses yield hosted services.
Concurrent Expansion
The expansion phase queries multiple sources in parallel:
defmodule PrismaticOsintCore.Mesh.Expander do
def expand(entity, opts \\ []) do
adapters = select_adapters(entity.type, opts)
timeout = Keyword.get(opts, :timeout, 30_000)
tasks = Enum.map(adapters, fn adapter ->
Task.async(fn ->
case adapter.search(entity.query, opts) do
{:ok, results} -> {adapter.metadata().name, results}
{:error, reason} -> {adapter.metadata().name, {:error, reason}}
end
end)
end)
Task.await_many(tasks, timeout)
|> Enum.reject(fn {_name, result} -> match?({:error, _}, result) end)
|> Enum.flat_map(fn {source, results} ->
Enum.map(results, &Map.put(&1, :source, source))
end)
end
end
For a company entity, this might query 20+ adapters simultaneously: ARES, Justice, WHOIS, Shodan, LinkedIn, OpenCorporates, sanctions lists, and more. Results arrive within seconds.
Correlation Strategies
Raw results from different sources use different schemas. Correlation matches them using multiple strategies:
Identifier matching -- the strongest signal. If two records share an ICO, VAT ID, or domain name, they likely refer to the same entity:
def correlate_by_identifier(results) do
results
|> Enum.group_by(fn r ->
r[:identifiers][:ico] || r[:identifiers][:domain] || r[:identifiers][:email]
end)
|> Enum.reject(fn {key, _} -> is_nil(key) end)
|> Enum.map(fn {_key, group} -> merge_group(group) end)
end
Name similarity -- for entities without shared identifiers, fuzzy name matching with Jaro-Winkler distance provides a reasonable match signal.
Graph proximity -- entities that are close in the relationship graph (shared directors, shared addresses, shared IP ranges) are likely related even without direct identifier matches.
Confidence Aggregation
When multiple sources confirm the same fact, confidence increases. Prismatic uses a Bayesian approach:
P(fact | sources) = 1 - product(1 - confidence_i for each source_i)
If three independent sources each report a fact with 0.80 confidence, the aggregated confidence is:
1 - (1-0.80) (1-0.80) (1-0.80) = 1 - 0.008 = 0.992
This is the strength of multi-source intelligence: each additional source reduces uncertainty multiplicatively.
Discovery: New Entities from Results
The mesh grows by extracting new entities from existing results:
|--------------|------------------|------|
Each extracted entity becomes a candidate for the next expansion cycle. To prevent unbounded growth, the mesh enforces depth limits (typically 3 hops) and relevance thresholds (entities must be related to the original target).
Graph Visualization
The mesh naturally maps to a graph structure, stored in KuzuDB:
The graph reveals patterns invisible in tabular data:
Practical Example: Due Diligence Mesh
Starting from a target company "Navigara s.r.o." (ICO 12345678):
Hop 0 (seed): Query all Czech adapters for ICO 12345678
Hop 1 (expand directors): Query each director name
Hop 2 (expand related companies): Query Companies X and Y
Result: A mesh of 8 entities with 12 relationships, revealing that the target company shares infrastructure and directors with a company in insolvency proceedings -- a risk signal that no single source would surface.
Rate Limiting and Resource Management
Expanding a mesh across 157 adapters requires careful resource management:
Conclusion
The OSINT mesh transforms Prismatic from a collection of adapters into an intelligence platform. By expanding, correlating, and discovering across multiple sources in parallel, the mesh reveals the connections that matter for due diligence, security assessments, and compliance investigations.
Try the OSINT mesh at [Interactive Labs](/lab/) or explore all [157 OSINT Adapters](/osint/) for available data sources.