echomap 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- echomap-0.2.0/.gitignore +37 -0
- echomap-0.2.0/LICENSE +21 -0
- echomap-0.2.0/PKG-INFO +394 -0
- echomap-0.2.0/README.md +345 -0
- echomap-0.2.0/assets/echomap-logo.png +0 -0
- echomap-0.2.0/assets/screenshots/command-palette.png +0 -0
- echomap-0.2.0/assets/screenshots/graph.png +0 -0
- echomap-0.2.0/assets/screenshots/overview.png +0 -0
- echomap-0.2.0/assets/screenshots/public-intel.png +0 -0
- echomap-0.2.0/pyproject.toml +65 -0
- echomap-0.2.0/src/echomap/__init__.py +5 -0
- echomap-0.2.0/src/echomap/__main__.py +6 -0
- echomap-0.2.0/src/echomap/api.py +871 -0
- echomap-0.2.0/src/echomap/app.py +27 -0
- echomap-0.2.0/src/echomap/backends.py +523 -0
- echomap-0.2.0/src/echomap/cli.py +651 -0
- echomap-0.2.0/src/echomap/db.py +1386 -0
- echomap-0.2.0/src/echomap/models.py +42 -0
- echomap-0.2.0/src/echomap/services/__init__.py +2 -0
- echomap-0.2.0/src/echomap/services/archaeology.py +179 -0
- echomap-0.2.0/src/echomap/services/comparison.py +109 -0
- echomap-0.2.0/src/echomap/services/discovery.py +329 -0
- echomap-0.2.0/src/echomap/services/fingerprint.py +224 -0
- echomap-0.2.0/src/echomap/services/insights.py +78 -0
- echomap-0.2.0/src/echomap/services/live.py +187 -0
- echomap-0.2.0/src/echomap/services/public_intelligence.py +1701 -0
- echomap-0.2.0/src/echomap/services/relationship.py +188 -0
- echomap-0.2.0/src/echomap/services/reporting.py +311 -0
- echomap-0.2.0/src/echomap/services/reports.py +82 -0
- echomap-0.2.0/src/echomap/services/scanner.py +138 -0
- echomap-0.2.0/src/echomap/ui/__init__.py +2 -0
- echomap-0.2.0/src/echomap/ui/command_palette.py +79 -0
- echomap-0.2.0/src/echomap/ui/graph_view.py +313 -0
- echomap-0.2.0/src/echomap/ui/main_window.py +413 -0
- echomap-0.2.0/src/echomap/ui/panels.py +2820 -0
- echomap-0.2.0/tests/conftest.py +11 -0
- echomap-0.2.0/tests/test_api.py +311 -0
- echomap-0.2.0/tests/test_archaeology.py +15 -0
- echomap-0.2.0/tests/test_backend.py +11 -0
- echomap-0.2.0/tests/test_cli.py +309 -0
- echomap-0.2.0/tests/test_discovery.py +32 -0
- echomap-0.2.0/tests/test_live_events.py +14 -0
- echomap-0.2.0/tests/test_live_sync.py +23 -0
- echomap-0.2.0/tests/test_scanner.py +20 -0
- echomap-0.2.0/tests/test_workspace.py +211 -0
echomap-0.2.0/.gitignore
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.pyd
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
dist/
|
|
9
|
+
*.egg-info/
|
|
10
|
+
.eggs/
|
|
11
|
+
pip-wheel-metadata/
|
|
12
|
+
|
|
13
|
+
# Virtual environments
|
|
14
|
+
.venv/
|
|
15
|
+
venv/
|
|
16
|
+
env/
|
|
17
|
+
ENV/
|
|
18
|
+
|
|
19
|
+
# Test / tooling caches
|
|
20
|
+
.pytest_cache/
|
|
21
|
+
.mypy_cache/
|
|
22
|
+
.ruff_cache/
|
|
23
|
+
.coverage
|
|
24
|
+
htmlcov/
|
|
25
|
+
|
|
26
|
+
# Editor / OS
|
|
27
|
+
.DS_Store
|
|
28
|
+
Thumbs.db
|
|
29
|
+
.idea/
|
|
30
|
+
.vscode/
|
|
31
|
+
|
|
32
|
+
# App data
|
|
33
|
+
*.sqlite3
|
|
34
|
+
*.db
|
|
35
|
+
*.sqlite
|
|
36
|
+
*.log
|
|
37
|
+
|
echomap-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Magnexis
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
echomap-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: echomap
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: EchoMap - internet relationship engine
|
|
5
|
+
Requires-Python: >=3.11
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Dist: PySide6>=6.6
|
|
9
|
+
Requires-Dist: requests>=2.31
|
|
10
|
+
Requires-Dist: fastapi>=0.115 ; extra == "all"
|
|
11
|
+
Requires-Dist: uvicorn[standard]>=0.30 ; extra == "all"
|
|
12
|
+
Requires-Dist: psycopg[binary]>=3.2 ; extra == "all"
|
|
13
|
+
Requires-Dist: neo4j>=5.20 ; extra == "all"
|
|
14
|
+
Requires-Dist: pymupdf>=1.24 ; extra == "all"
|
|
15
|
+
Requires-Dist: pdfplumber>=0.11 ; extra == "all"
|
|
16
|
+
Requires-Dist: spacy>=3.7 ; extra == "all"
|
|
17
|
+
Requires-Dist: pandas>=2.2 ; extra == "all"
|
|
18
|
+
Requires-Dist: geopy>=2.4 ; extra == "all"
|
|
19
|
+
Requires-Dist: folium>=0.17 ; extra == "all"
|
|
20
|
+
Requires-Dist: networkx>=3.3 ; extra == "all"
|
|
21
|
+
Requires-Dist: pyvis>=0.3.2 ; extra == "all"
|
|
22
|
+
Requires-Dist: graphviz>=0.20 ; extra == "all"
|
|
23
|
+
Requires-Dist: shapely>=2.0 ; extra == "all"
|
|
24
|
+
Requires-Dist: geopandas>=1.0 ; extra == "all"
|
|
25
|
+
Requires-Dist: matplotlib>=3.8 ; extra == "all"
|
|
26
|
+
Requires-Dist: fastapi>=0.115 ; extra == "api"
|
|
27
|
+
Requires-Dist: uvicorn[standard]>=0.30 ; extra == "api"
|
|
28
|
+
Requires-Dist: networkx>=3.3 ; extra == "geo"
|
|
29
|
+
Requires-Dist: pyvis>=0.3.2 ; extra == "geo"
|
|
30
|
+
Requires-Dist: graphviz>=0.20 ; extra == "geo"
|
|
31
|
+
Requires-Dist: shapely>=2.0 ; extra == "geo"
|
|
32
|
+
Requires-Dist: geopandas>=1.0 ; extra == "geo"
|
|
33
|
+
Requires-Dist: matplotlib>=3.8 ; extra == "geo"
|
|
34
|
+
Requires-Dist: pymupdf>=1.24 ; extra == "intel"
|
|
35
|
+
Requires-Dist: pdfplumber>=0.11 ; extra == "intel"
|
|
36
|
+
Requires-Dist: spacy>=3.7 ; extra == "intel"
|
|
37
|
+
Requires-Dist: pandas>=2.2 ; extra == "intel"
|
|
38
|
+
Requires-Dist: geopy>=2.4 ; extra == "intel"
|
|
39
|
+
Requires-Dist: folium>=0.17 ; extra == "intel"
|
|
40
|
+
Requires-Dist: neo4j>=5.20 ; extra == "neo4j"
|
|
41
|
+
Requires-Dist: psycopg[binary]>=3.2 ; extra == "postgres"
|
|
42
|
+
Provides-Extra: all
|
|
43
|
+
Provides-Extra: api
|
|
44
|
+
Provides-Extra: geo
|
|
45
|
+
Provides-Extra: intel
|
|
46
|
+
Provides-Extra: neo4j
|
|
47
|
+
Provides-Extra: postgres
|
|
48
|
+
|
|
49
|
+
<p align="center">
|
|
50
|
+
<img src="assets/echomap-logo.png" alt="EchoMap logo" width="900">
|
|
51
|
+
</p>
|
|
52
|
+
|
|
53
|
+
# EchoMap
|
|
54
|
+
|
|
55
|
+
<p align="center">
|
|
56
|
+
<a href="https://www.python.org/"><img alt="Python" src="https://img.shields.io/badge/python-3.11%2B-blue.svg"></a>
|
|
57
|
+
<img alt="Release" src="https://img.shields.io/badge/release-0.2.0-22c55e.svg">
|
|
58
|
+
<img alt="Status" src="https://img.shields.io/badge/status-alpha-f59e0b.svg">
|
|
59
|
+
<a href="./pyproject.toml"><img alt="Build" src="https://img.shields.io/badge/build-pyproject%20%2B%20PySide6-2ea44f.svg"></a>
|
|
60
|
+
<img alt="Desktop" src="https://img.shields.io/badge/app-desktop%20intelligence%20platform-7c3aed.svg">
|
|
61
|
+
<img alt="UI" src="https://img.shields.io/badge/ui-PySide6%20Qt-0ea5e9.svg">
|
|
62
|
+
<img alt="API" src="https://img.shields.io/badge/backend-FastAPI-06b6d4.svg">
|
|
63
|
+
<img alt="CLI" src="https://img.shields.io/badge/cli-headless%20discovery%20%26%20exports-8b5cf6.svg">
|
|
64
|
+
<img alt="Storage" src="https://img.shields.io/badge/storage-SQLite%20%7C%20PostgreSQL%20%7C%20Neo4j-10b981.svg">
|
|
65
|
+
<img alt="Reports" src="https://img.shields.io/badge/exports-JSON%20%7C%20MD%20%7C%20HTML%20%7C%20CSV%20%7C%20PNG-f59e0b.svg">
|
|
66
|
+
<img alt="Workspace" src="https://img.shields.io/badge/workspaces-investigations%20%26%20projects-14b8a6.svg">
|
|
67
|
+
<img alt="Public Intel" src="https://img.shields.io/badge/public%20intel-geocoding%20%7C%20FOIA%20%7C%20archaeology-ef4444.svg">
|
|
68
|
+
<img alt="Graph" src="https://img.shields.io/badge/graph-live%20relationship%20engine-ec4899.svg">
|
|
69
|
+
<img alt="Mode" src="https://img.shields.io/badge/mode-local--first%20intelligence-14b8a6.svg">
|
|
70
|
+
<img alt="Platform" src="https://img.shields.io/badge/platform-desktop%20app-6b7280.svg">
|
|
71
|
+
</p>
|
|
72
|
+
|
|
73
|
+
EchoMap is a local-first desktop platform for discovering, mapping, and explaining relationships between websites, companies, repositories, technologies, and public internet resources.
|
|
74
|
+
|
|
75
|
+
It is designed to feel like a research operating system:
|
|
76
|
+
|
|
77
|
+
- start from one seed entity
|
|
78
|
+
- discover related nodes automatically
|
|
79
|
+
- preserve evidence locally
|
|
80
|
+
- analyze how the ecosystem evolved over time
|
|
81
|
+
|
|
82
|
+
It is built around one core question:
|
|
83
|
+
|
|
84
|
+
> How is this connected?
|
|
85
|
+
|
|
86
|
+
Instead of just identifying things, EchoMap tries to map the ecosystem around them:
|
|
87
|
+
|
|
88
|
+
- what exists
|
|
89
|
+
- who or what owns it
|
|
90
|
+
- what it references
|
|
91
|
+
- what it depends on
|
|
92
|
+
- how it changed over time
|
|
93
|
+
- what technologies power it
|
|
94
|
+
- what hidden relationships can be inferred from public data
|
|
95
|
+
|
|
96
|
+
At a glance, EchoMap combines:
|
|
97
|
+
|
|
98
|
+
- graph exploration and visual investigation
|
|
99
|
+
- background discovery and enrichment
|
|
100
|
+
- civic intelligence and public-record workflows
|
|
101
|
+
- geospatial analysis and exportable map packages
|
|
102
|
+
- CLI, API, and desktop interfaces backed by the same local graph
|
|
103
|
+
|
|
104
|
+
## What It Does
|
|
105
|
+
|
|
106
|
+
- Discovers sites, repos, companies, and technologies
|
|
107
|
+
- Builds a persistent local knowledge graph
|
|
108
|
+
- Expands neighborhoods automatically in the background
|
|
109
|
+
- Surfaces timeline, archaeology, and reporting views
|
|
110
|
+
- Adds an ecosystem overview with anomaly flags and graph scorecards
|
|
111
|
+
- Shows a live technology DNA profile for each discovery
|
|
112
|
+
- Supports saved investigations, bookmarks, and entity comparison mode
|
|
113
|
+
- Supports investigation tags, search, and live-vs-saved graph diffing
|
|
114
|
+
- Adds persistent workspaces so separate investigations stay isolated
|
|
115
|
+
- Supports automatic geocoding, duplicate detection, and tabular imports
|
|
116
|
+
- Adds agency profile pages, confidence scoring, and change detection
|
|
117
|
+
- Exports clean public map bundles in HTML, CSV, GeoJSON, and ZIP form
|
|
118
|
+
- Adds EchoTrail discovery tracing, Agency Radar clue search, and surveillance radius analysis
|
|
119
|
+
- Adds GIS-style overlays for radius analysis and workspace-scoped signature dashboards
|
|
120
|
+
- Lets you save and reload radar presets per workspace
|
|
121
|
+
- Traces shortest relationship paths between any two discovered entities
|
|
122
|
+
- Includes a command palette for quick actions
|
|
123
|
+
- Includes a graph minimap and graph snapshot export for reports
|
|
124
|
+
- Ships with an optional FastAPI backend service for graph access and automation
|
|
125
|
+
- Supports SQLite now, with backend abstraction for PostgreSQL and Neo4j
|
|
126
|
+
|
|
127
|
+
## UI Screenshots
|
|
128
|
+
|
|
129
|
+
<p align="center">
|
|
130
|
+
<img src="assets/screenshots/overview.png" alt="EchoMap overview dashboard" width="49%">
|
|
131
|
+
<img src="assets/screenshots/graph.png" alt="EchoMap graph inspector" width="49%">
|
|
132
|
+
</p>
|
|
133
|
+
|
|
134
|
+
<p align="center">
|
|
135
|
+
<img src="assets/screenshots/public-intel.png" alt="EchoMap public intelligence workspace" width="49%">
|
|
136
|
+
<img src="assets/screenshots/command-palette.png" alt="EchoMap command palette" width="49%">
|
|
137
|
+
</p>
|
|
138
|
+
|
|
139
|
+
These screenshots reflect the current desktop experience: the ecosystem overview, the graph inspector, the public intelligence tools, and the command palette.
|
|
140
|
+
|
|
141
|
+
## Core Model
|
|
142
|
+
|
|
143
|
+
EchoMap treats every discovery as part of a graph-first model:
|
|
144
|
+
|
|
145
|
+
- Nodes represent websites, domains, repositories, people, companies, technologies, and archive artifacts
|
|
146
|
+
- Edges represent relationships such as `uses`, `owned_by`, `references`, `connected_to`, and `built_with`
|
|
147
|
+
- Artifacts preserve historical evidence like Wayback snapshots, DNS records, and certificate transparency data
|
|
148
|
+
- Investigations preserve curated snapshots of the graph for later analysis and comparison
|
|
149
|
+
|
|
150
|
+
This design keeps the workspace focused on evidence, not just search results.
|
|
151
|
+
|
|
152
|
+
## Advanced Views
|
|
153
|
+
|
|
154
|
+
- **Graph**: draggable, zoomable node-link visualization with expand-on-click behavior
|
|
155
|
+
- **Graph Inspector**: dedicated detail drawer with node, edge, chains, and anomaly tabs, plus visible hop counts and depth labels
|
|
156
|
+
- **Overview**: scorecards, anomaly flags, and high-level graph health metrics
|
|
157
|
+
- **Investigations**: saved cases, tags, search, bookmarks, diffing, and export
|
|
158
|
+
- **Timeline**: discovery and archaeology events in chronological order
|
|
159
|
+
- **Archaeology**: historical snapshots and DNS / certificate evidence
|
|
160
|
+
- **Public Intel**: civic layers, FOIA requests, source citations, and playback
|
|
161
|
+
- **Reports**: JSON, Markdown, HTML, CSV, and PNG snapshot export
|
|
162
|
+
- **Settings**: theme toggles, background scanning controls, and backend snapshot visibility
|
|
163
|
+
|
|
164
|
+
## Relationship Intelligence
|
|
165
|
+
|
|
166
|
+
The discovery engine combines multiple signals into a single ecosystem view:
|
|
167
|
+
|
|
168
|
+
- domain normalization and parent-domain discovery
|
|
169
|
+
- GitHub repository and organization enrichment
|
|
170
|
+
- technology fingerprinting from HTML, headers, scripts, and metadata
|
|
171
|
+
- live archive evidence from Wayback, DNS snapshots, and certificate transparency sources
|
|
172
|
+
- public meeting agenda scanning for civic-tech and surveillance leads
|
|
173
|
+
- FOIA / public records request tracking with contract intelligence fields
|
|
174
|
+
- source citations attached to layers, requests, and document-derived entities
|
|
175
|
+
- timeline playback over discoveries, requests, citations, and archaeology events
|
|
176
|
+
- relationship path tracing between any two nodes in the graph
|
|
177
|
+
- similarity and comparison summaries for neighborhoods and full graph snapshots
|
|
178
|
+
- public intelligence workflows for FOIA tracking, agenda scanning, and civic research
|
|
179
|
+
- document-to-map ingestion for CSV, Excel, PDFs, and extracted text sources
|
|
180
|
+
- snapshot-based change detection for public pages, contracts, and agenda items
|
|
181
|
+
- exportable map packages with evidence bundles and geospatial outputs
|
|
182
|
+
- discovery trails that show how a clue flowed from agenda or contract to entity and location
|
|
183
|
+
- agency radar searches that surface likely agencies, vendors, and public clues from a keyword
|
|
184
|
+
- surveillance radius analysis around cameras, public buildings, and mapped infrastructure
|
|
185
|
+
- GIS overlay layers for schools, roads, neighborhoods, government sites, and camera coverage
|
|
186
|
+
- saved radar presets tied to the active workspace so repeat investigations stay fast
|
|
187
|
+
- command palette shortcuts for exporting GIS packages and loading or deleting radar presets
|
|
188
|
+
- command palette shortcuts for the paired Analyze Radius + Export GIS Package workflow
|
|
189
|
+
|
|
190
|
+
The result is a local intelligence workspace that can grow from one seed entity into a much larger map.
|
|
191
|
+
|
|
192
|
+
## Backend Architecture
|
|
193
|
+
|
|
194
|
+
EchoMap uses a split architecture so the desktop experience stays fast while the core graph logic stays portable:
|
|
195
|
+
|
|
196
|
+
- **PySide6 desktop shell** for the primary user experience
|
|
197
|
+
- **SQLite** as the default local persistence layer
|
|
198
|
+
- **FastAPI** as the optional service layer for programmatic access, automation, and future integrations
|
|
199
|
+
- **Backend abstraction** for PostgreSQL and Neo4j so the graph can later move beyond a single-file database without changing the app flow
|
|
200
|
+
- **Public intelligence workspace** stored locally by default so civic research stays private
|
|
201
|
+
|
|
202
|
+
FastAPI is the best fit here because it gives EchoMap:
|
|
203
|
+
|
|
204
|
+
- typed request/response models
|
|
205
|
+
- a clean JSON API for graph, trace, compare, investigation, and discovery workflows
|
|
206
|
+
- easy local deployment for desktop users
|
|
207
|
+
- a natural bridge to remote automation, scripting, or future web companions
|
|
208
|
+
|
|
209
|
+
The API is intentionally practical rather than generic. It exposes the same relationship-first primitives used by the desktop app:
|
|
210
|
+
|
|
211
|
+
- `GET /health`
|
|
212
|
+
- `GET /backend`
|
|
213
|
+
- `GET /stats`
|
|
214
|
+
- `GET /graph`
|
|
215
|
+
- `GET /nodes`
|
|
216
|
+
- `GET /edges`
|
|
217
|
+
- `GET /search/nodes`
|
|
218
|
+
- `GET /trace`
|
|
219
|
+
- `GET /compare/nodes`
|
|
220
|
+
- `GET /compare/graphs`
|
|
221
|
+
- `GET /reports/workspace`
|
|
222
|
+
- `GET /reports/investigations/{investigation_id}`
|
|
223
|
+
- `GET /reports/comparisons/{comparison_id}`
|
|
224
|
+
- `GET /public/layers`
|
|
225
|
+
- `GET /public/requests`
|
|
226
|
+
- `GET /public/citations`
|
|
227
|
+
- `GET/POST/DELETE /public/presets`
|
|
228
|
+
- `GET /public/presets/{preset_id}`
|
|
229
|
+
- `GET /public/agency/{name}`
|
|
230
|
+
- `GET /public/timeline`
|
|
231
|
+
- `GET /public/heatmap`
|
|
232
|
+
- `POST /public/geocode`
|
|
233
|
+
- `POST /public/import/tabular`
|
|
234
|
+
- `POST /public/change-detection`
|
|
235
|
+
- `POST /public/export`
|
|
236
|
+
- `POST /public/agenda/scan`
|
|
237
|
+
- `POST /public/documents/ingest`
|
|
238
|
+
- `POST /public/documents/text`
|
|
239
|
+
- `GET/POST/PATCH /workspaces`
|
|
240
|
+
- `POST /workspaces/{workspace_id}/activate`
|
|
241
|
+
- `GET/POST/PUT/DELETE /investigations`
|
|
242
|
+
- `GET/POST/DELETE /bookmarks`
|
|
243
|
+
- `POST /discover`
|
|
244
|
+
- `WS /ws/graph` for live graph snapshots and background discovery events
|
|
245
|
+
|
|
246
|
+
The desktop app can subscribe to this stream and auto-refresh the graph when the workspace changes.
|
|
247
|
+
|
|
248
|
+
## Live Updates
|
|
249
|
+
|
|
250
|
+
EchoMap now ships with a lightweight graph event hub that emits updates whenever the local workspace changes.
|
|
251
|
+
|
|
252
|
+
That means:
|
|
253
|
+
|
|
254
|
+
- discovery runs can publish progress in real time
|
|
255
|
+
- background scans can push graph changes as they land
|
|
256
|
+
- the FastAPI websocket can stream snapshot and event messages to external tools
|
|
257
|
+
|
|
258
|
+
This keeps the desktop app, API, and headless workflows aligned around one live event model instead of three separate code paths.
|
|
259
|
+
|
|
260
|
+
## Run
|
|
261
|
+
|
|
262
|
+
```powershell
|
|
263
|
+
python -m pip install -e .
|
|
264
|
+
echomap
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
To run the API service:
|
|
268
|
+
|
|
269
|
+
```powershell
|
|
270
|
+
python -m pip install -e .[api]
|
|
271
|
+
echomap-api
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
To run the headless CLI:
|
|
275
|
+
|
|
276
|
+
```powershell
|
|
277
|
+
echomap-cli stats
|
|
278
|
+
echomap-cli discover magnexis.site --save-investigation --title "Magnexis Seed"
|
|
279
|
+
echomap-cli export-investigation 1 --format md --output .\\exports\\magnexis-report.md
|
|
280
|
+
echomap-cli compare nodes node:a node:b --save
|
|
281
|
+
echomap-cli compare graphs 1 --live --save
|
|
282
|
+
echomap-cli report --live --format md --output .\\exports\\workspace-report.md
|
|
283
|
+
echomap-cli report --investigation-id 1 --format html --output .\\exports\\investigation-report.html
|
|
284
|
+
echomap-cli public scan-agenda --text "Flock cameras on the agenda" --title "City Council Agenda"
|
|
285
|
+
echomap-cli public ingest-text "Police Contract" "Camera system and data sharing"
|
|
286
|
+
echomap-cli public heatmap --input .\\exports\\points.json
|
|
287
|
+
echomap-cli public echotrail Flock
|
|
288
|
+
echomap-cli public radar "Flock Safety Connecticut"
|
|
289
|
+
echomap-cli public radius "East Haven, CT" --radius-km 2.0
|
|
290
|
+
echomap-cli public radius "East Haven, CT" --radius-km 2.0 --package .\\exports\\radius-package.zip
|
|
291
|
+
echomap-cli public presets save "Flock Connecticut" --query "Flock Safety Connecticut" --notes "Radar preset"
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Configuration
|
|
295
|
+
|
|
296
|
+
- `ECHOMAP_BACKEND=sqlite|postgresql|neo4j`
|
|
297
|
+
- `ECHOMAP_BACKEND_DSN=<dsn or uri>`
|
|
298
|
+
- `ECHOMAP_API_HOST=127.0.0.1`
|
|
299
|
+
- `ECHOMAP_API_PORT=8000`
|
|
300
|
+
- Optional native backend installs:
|
|
301
|
+
- `pip install -e .[api]`
|
|
302
|
+
- `pip install -e .[postgres]`
|
|
303
|
+
- `pip install -e .[neo4j]`
|
|
304
|
+
- `pip install -e .[intel]`
|
|
305
|
+
- `pip install -e .[geo]`
|
|
306
|
+
- `pip install -e .[all]`
|
|
307
|
+
|
|
308
|
+
## CLI
|
|
309
|
+
|
|
310
|
+
The `echomap-cli` entrypoint is designed for automated or scripted workflows.
|
|
311
|
+
|
|
312
|
+
Supported commands:
|
|
313
|
+
|
|
314
|
+
- `discover`: run discovery headlessly, persist the result, and optionally save an investigation
|
|
315
|
+
- `export-investigation`: export a saved investigation as JSON, Markdown, HTML, or CSV
|
|
316
|
+
- `compare`: compare nodes or saved investigation graphs and optionally save the result
|
|
317
|
+
- `report`: generate Markdown or HTML reports from the live workspace, a saved investigation, or a saved comparison
|
|
318
|
+
- `public`: scan agendas, ingest documents, and summarize heatmaps
|
|
319
|
+
- `public geocode`: turn a place, agency, or business name into coordinates
|
|
320
|
+
- `public import-table`: map rows from CSV or Excel into graph-ready records
|
|
321
|
+
- `public agency-profile`: build an evidence-rich profile for an agency or company
|
|
322
|
+
- `public change-detect`: compare two snapshots and store the current version
|
|
323
|
+
- `public export-map`: publish the current public map as HTML, CSV, GeoJSON, or ZIP
|
|
324
|
+
- `list-investigations`: print saved investigations to stdout
|
|
325
|
+
- `stats`: emit a compact JSON snapshot of the current workspace
|
|
326
|
+
|
|
327
|
+
CLI notes:
|
|
328
|
+
|
|
329
|
+
- `echomap-cli --version` prints the installed package version
|
|
330
|
+
- `echomap-cli report` defaults to the live workspace when no source flag is provided
|
|
331
|
+
- `report` supports live workspace reports, investigation reports, and saved comparison reports
|
|
332
|
+
- `public` supports agenda scanning, document ingest, manual text ingest, and heatmap summaries
|
|
333
|
+
- `public` also supports geocoding, tabular imports, agency profiles, change detection, and map exports
|
|
334
|
+
- `public echotrail`, `public radar`, and `public radius` power the signature discovery-trail and surveillance views
|
|
335
|
+
- `public radius --package` writes a portable HTML + GeoJSON GIS layer bundle
|
|
336
|
+
- `public presets` lets you save and reuse workspace-scoped radar presets through the API
|
|
337
|
+
- the Surveillance Radius tab includes a one-click GIS package export for the current analysis
|
|
338
|
+
- `workspaces` let you keep investigations, layers, and evidence isolated by project
|
|
339
|
+
|
|
340
|
+
Example:
|
|
341
|
+
|
|
342
|
+
```powershell
|
|
343
|
+
echomap-cli discover openai.com --save-investigation --title "OpenAI Ecosystem"
|
|
344
|
+
echomap-cli export-investigation 3 --format html --output .\\exports\\openai-report.html
|
|
345
|
+
echomap-cli compare graphs 3 --live
|
|
346
|
+
echomap-cli report --comparison-id 2 --format md --output .\\exports\\comparison-report.md
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Shortcuts
|
|
350
|
+
|
|
351
|
+
- `Ctrl+K` open command palette
|
|
352
|
+
- `Ctrl+1` open overview
|
|
353
|
+
- `Ctrl+2` open discover
|
|
354
|
+
- `Ctrl+3` open graph
|
|
355
|
+
|
|
356
|
+
## Notes
|
|
357
|
+
|
|
358
|
+
Current capabilities include:
|
|
359
|
+
|
|
360
|
+
- A PySide6 desktop shell with the main sections
|
|
361
|
+
- A local SQLite graph store
|
|
362
|
+
- Optional FastAPI service layer
|
|
363
|
+
- Best-effort website/GitHub discovery
|
|
364
|
+
- Technology fingerprinting with stack DNA profiles
|
|
365
|
+
- Interactive graph visualization and a navigation minimap
|
|
366
|
+
- Dedicated graph detail drawer with expandable relationship chains and saved annotations
|
|
367
|
+
- Command palette
|
|
368
|
+
- Saved investigations and bookmarks
|
|
369
|
+
- Comparison mode, including saved-vs-live graph diffs
|
|
370
|
+
- CLI compare workflows for node-level and graph-level analysis
|
|
371
|
+
- CLI report workflows for live graphs, investigations, and comparisons
|
|
372
|
+
- CLI public-intelligence workflows for agenda scans, document ingest, and heatmap summaries
|
|
373
|
+
- Investigation search and tagging
|
|
374
|
+
- Backend read snapshots for local and remote graph stores
|
|
375
|
+
- Timeline, archaeology, and report export views
|
|
376
|
+
- Public intelligence workspace with layers, FOIA requests, source citations, and timeline playback
|
|
377
|
+
- PNG graph snapshot export
|
|
378
|
+
- Optional PostgreSQL and Neo4j backend drivers
|
|
379
|
+
- Rich documentation and badge-based status signaling
|
|
380
|
+
|
|
381
|
+
## Status
|
|
382
|
+
|
|
383
|
+
EchoMap is actively being implemented. The current codebase now includes:
|
|
384
|
+
|
|
385
|
+
- Background scanning
|
|
386
|
+
- Archaeology persistence
|
|
387
|
+
- Node selection and expansion
|
|
388
|
+
- Backend abstraction scaffolding
|
|
389
|
+
- Local report exports
|
|
390
|
+
- Graph minimap navigation
|
|
391
|
+
- Live websocket-ready graph event streaming
|
|
392
|
+
- Desktop live sync with websocket-driven graph refreshes
|
|
393
|
+
- Discovery artifact history
|
|
394
|
+
|