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.
Files changed (45) hide show
  1. echomap-0.2.0/.gitignore +37 -0
  2. echomap-0.2.0/LICENSE +21 -0
  3. echomap-0.2.0/PKG-INFO +394 -0
  4. echomap-0.2.0/README.md +345 -0
  5. echomap-0.2.0/assets/echomap-logo.png +0 -0
  6. echomap-0.2.0/assets/screenshots/command-palette.png +0 -0
  7. echomap-0.2.0/assets/screenshots/graph.png +0 -0
  8. echomap-0.2.0/assets/screenshots/overview.png +0 -0
  9. echomap-0.2.0/assets/screenshots/public-intel.png +0 -0
  10. echomap-0.2.0/pyproject.toml +65 -0
  11. echomap-0.2.0/src/echomap/__init__.py +5 -0
  12. echomap-0.2.0/src/echomap/__main__.py +6 -0
  13. echomap-0.2.0/src/echomap/api.py +871 -0
  14. echomap-0.2.0/src/echomap/app.py +27 -0
  15. echomap-0.2.0/src/echomap/backends.py +523 -0
  16. echomap-0.2.0/src/echomap/cli.py +651 -0
  17. echomap-0.2.0/src/echomap/db.py +1386 -0
  18. echomap-0.2.0/src/echomap/models.py +42 -0
  19. echomap-0.2.0/src/echomap/services/__init__.py +2 -0
  20. echomap-0.2.0/src/echomap/services/archaeology.py +179 -0
  21. echomap-0.2.0/src/echomap/services/comparison.py +109 -0
  22. echomap-0.2.0/src/echomap/services/discovery.py +329 -0
  23. echomap-0.2.0/src/echomap/services/fingerprint.py +224 -0
  24. echomap-0.2.0/src/echomap/services/insights.py +78 -0
  25. echomap-0.2.0/src/echomap/services/live.py +187 -0
  26. echomap-0.2.0/src/echomap/services/public_intelligence.py +1701 -0
  27. echomap-0.2.0/src/echomap/services/relationship.py +188 -0
  28. echomap-0.2.0/src/echomap/services/reporting.py +311 -0
  29. echomap-0.2.0/src/echomap/services/reports.py +82 -0
  30. echomap-0.2.0/src/echomap/services/scanner.py +138 -0
  31. echomap-0.2.0/src/echomap/ui/__init__.py +2 -0
  32. echomap-0.2.0/src/echomap/ui/command_palette.py +79 -0
  33. echomap-0.2.0/src/echomap/ui/graph_view.py +313 -0
  34. echomap-0.2.0/src/echomap/ui/main_window.py +413 -0
  35. echomap-0.2.0/src/echomap/ui/panels.py +2820 -0
  36. echomap-0.2.0/tests/conftest.py +11 -0
  37. echomap-0.2.0/tests/test_api.py +311 -0
  38. echomap-0.2.0/tests/test_archaeology.py +15 -0
  39. echomap-0.2.0/tests/test_backend.py +11 -0
  40. echomap-0.2.0/tests/test_cli.py +309 -0
  41. echomap-0.2.0/tests/test_discovery.py +32 -0
  42. echomap-0.2.0/tests/test_live_events.py +14 -0
  43. echomap-0.2.0/tests/test_live_sync.py +23 -0
  44. echomap-0.2.0/tests/test_scanner.py +20 -0
  45. echomap-0.2.0/tests/test_workspace.py +211 -0
@@ -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
+