Commit Graph

144 Commits

Author SHA1 Message Date
Shadowbroker 71c00a6c57 Delete frontend/errors.txt
Former-commit-id: 257159ead999c4805217b3bcefb24101b34281b9
2026-03-14 19:16:22 -06:00
Shadowbroker a0c2ff68c0 Delete frontend/build_error.txt
Former-commit-id: b984825c75bb468d9b80c72e62b8f5ba897af9c7
2026-03-14 19:16:07 -06:00
Shadowbroker 3e41cc4999 Delete frontend/build_logs2.txt
Former-commit-id: c60db226c818c30ba78012b4906d3aaf763a7100
2026-03-14 19:15:48 -06:00
Shadowbroker 79ade6d92f Delete frontend/build_logs.txt
Former-commit-id: 2c6e44b2882a9d3646ebcbdc8c632f4f9e8a98a1
2026-03-14 19:15:26 -06:00
Shadowbroker 50a07fb419 Delete frontend/build_logs3.txt
Former-commit-id: 18910fb5ded0c99f9c4a9e6febfe3c8f464f754a
2026-03-14 19:15:13 -06:00
Shadowbroker 850a532d2b Delete frontend/build_logs4.txt
Former-commit-id: 873cf8224397f822e076d8c5a92796b9e2ceb2ad
2026-03-14 19:15:02 -06:00
Shadowbroker 2f6a3d56b0 Delete frontend/build_logs5.txt
Former-commit-id: 9e6f1567e68d3d55c285f4e5235b5ad6220ebd49
2026-03-14 19:12:13 -06:00
Shadowbroker e83d71bb1f Delete frontend/build_output.txt
Former-commit-id: 564ddfcb3f135243d3017c5eb8aff5bfed521601
2026-03-14 19:11:59 -06:00
Shadowbroker 21668a4d66 Update README.md
Former-commit-id: 28a314c7a4162c303bf4b7d71aec69b8441c197f
2026-03-14 16:19:33 -06:00
Shadowbroker 54993c3f89 Update README.md
Former-commit-id: 2a80e7ff67e5a3fd13df59bf547d1455ed563b20
2026-03-14 15:41:15 -06:00
anoracleofra-code b37bfc0162 fix: add path traversal guard to updater extraction
Validates that every destination path stays within project_root
before writing. Prevents a malicious zip from writing outside
the project directory via ../traversal entries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 3140416e80b1b56e4e6cccc930d11c2d5f9b1611
2026-03-14 14:48:47 -06:00
anoracleofra-code 95474c3ac5 fix: updater resolves project_root to / in Docker containers
In Docker, main.py lives at /app/main.py so Path.parent.parent
resolves to filesystem root /, causing PermissionError on .github
and other dirs. Now detects this case and falls back to cwd.
Also grants backenduser write access to /app for auto-update.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 12c8bb5816a70161d5ab5d79f9240e7eab6e6e15
2026-03-14 14:34:11 -06:00
anoracleofra-code b99a5e5d66 fix: updater crashes on os.makedirs PermissionError + prune protected dirs
os.makedirs was outside try/except so permission-denied on .github
directory creation crashed the entire update. Now both makedirs and
copy are caught. Also prunes protected dirs from os.walk so the
updater never even enters .github, .git, .claude, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: d4bdef4604095a82860a4bc91bec3435a878f899
2026-03-14 14:29:37 -06:00
anoracleofra-code 3cdd2c851e fix: updater permission denied on .github — add to protected dirs
The auto-updater tried to extract .github/ from the release zip,
causing Permission denied errors. Added .github and .claude to the
protected directories list so they are skipped during extraction.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 8916fa08e005820ddbfc3b195c387dbf6187587e
2026-03-14 14:23:03 -06:00
anoracleofra-code 8ff4516a7a fix: auto-updater proxy drop + protect internal docs from git
Auto-update POST goes through Next.js proxy which dies when extracted
files trigger hot-reload. Network drops now transition to restart polling
instead of showing failure. Also adds admin key header and FastAPI error
field fallback. Gitignore updated to protect internal docs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 03162f8a4b7ad8a0f2983f81361df7dba42a8689
2026-03-14 14:18:30 -06:00
anoracleofra-code 90c2e90e2c v0.9.5: The Voltron Update — modular architecture, stable IDs, parallelized boot
- Parallelized startup (60s → 15s) via ThreadPoolExecutor
- Adaptive polling engine with ETag caching (no more bbox interrupts)
- useCallback optimization for interpolation functions
- Sliding LAYERS/INTEL edge panels replace bulky Record Panel
- Modular fetcher architecture (flights, geo, infrastructure, financial, earth_observation)
- Stable entity IDs for GDELT & News popups (PR #63, credit @csysp)
- Admin auth (X-Admin-Key), rate limiting (slowapi), auto-updater
- Docker Swarm secrets support, env_check.py validation
- 85+ vitest tests, CI pipeline, geoJSON builder extraction
- Server-side viewport bbox filtering reduces payloads 80%+

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: f2883150b5bc78ebc139d89cc966a76f7d7c0408
v0.9.5
2026-03-14 14:01:54 -06:00
anoracleofra-code 60c90661d4 feat: wire TypeScript interfaces into all component props, fix 12 lint errors
Former-commit-id: 04b30a9e7af32b644140c45333f55c20afec45f2
2026-03-14 13:39:20 -06:00
anoracleofra-code 17c41d7ddf feat: add ADMIN_KEY auth guard to sensitive settings and system endpoints
Former-commit-id: 0eaa7813a16f13e123e9c131fcf90fcb8bf420fd
2026-03-14 13:39:20 -06:00
Shadowbroker 9ad35fb5d8 Merge pull request #63 from csysp/fix/c3-entity-id-index
fix/replace array-index entity IDs with stable keys for GDELT + popups

Former-commit-id: 3a965fb50893cd0fe9101d56fa80c09fafe75248
2026-03-14 11:47:07 -06:00
csysp ff61366543 fix: replace array-index entity IDs with stable keys for GDELT and news popups
selectedEntity.id was stored as a numeric array index into data.gdelt[]
and data.news[]. After any data refresh those arrays rebuild, so the
stored index pointed to a different item — showing wrong popup content.

GDELT features now use g.properties?.name || String(g.geometry.coordinates)
as a stable id; popups resolve via find(). News popups resolve via find()
matching alertKey. ThreatMarkers emits alertKey string instead of originalIdx.
ThreatMarkerProps updated: id: number → id: string | number.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Former-commit-id: c2bfd0897a9ebd27e7c905ea3ac848a89883f140
2026-03-14 10:16:04 -06:00
anoracleofra-code d4626e6f3b chore: add diff/temp files to .gitignore
Former-commit-id: bf9e28241df584657eb34710b41fc68e1ee00e74
2026-03-14 07:52:40 -06:00
Shadowbroker 1dcea6e3fc Merge pull request #61 from csysp/ui/remove-display-config-panel
UI/display declutter add panel chevrons + fix/c1-interp-useCallback

Former-commit-id: 641a03adfaa99231324c05d49d5c3e9f5c5724cd
2026-03-13 22:39:51 -06:00
csysp 10960c5a3f perf: wrap interpFlight/Ship/Sat in useCallback to prevent spurious re-renders
interpFlight, interpShip, and interpSat were plain arrow functions
recreated on every render. Because interpTick fires every second,
TrackedFlightLabels received a new function reference every second
(preventing memo bailout) and all downstream useMemos closed over
these functions re-executed unnecessarily.

Wrap all three in useCallback([dtSeconds]) — dtSeconds is their
only reactive closure variable; interpolatePosition is a stable
module-level import and does not need to be listed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Former-commit-id: 84c3c06407afa5c0227ac1b682cca1157498d1a5
2026-03-13 21:18:51 -06:00
csysp a9d21a0bb5 ui: remove display config panel + restore hideable sidebar tabs
- Remove WorldviewRightPanel from left HUD (declutter)
- Restore sliding sidebar animation via motion.div on both HUD containers
- Left tab (LAYERS): springs to x:-360 when hidden, tab tracks edge
- Right tab (INTEL): springs to x:+360 when hidden, tab tracks edge
- Both use spring animation (damping:30 stiffness:250)
- ChevronLeft/Right icons flip direction with open state

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Former-commit-id: 5a573165d27db1704f513ce9fd503ddc3f6892ef
2026-03-13 20:42:09 -06:00
csysp c18bc8f35e ui: remove display config panel from left HUD to declutter
Removes WorldviewRightPanel render and import from page.tsx.
The effects state is preserved as it continues to feed MaplibreViewer.
Left HUD column now contains only the data layers panel.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Former-commit-id: 0cdb2a60bd8436b7226866e2f4086496beed1587
2026-03-13 20:10:58 -06:00
anoracleofra-code cf349a4779 docs: clarify data sourcing in Why This Exists section
Acknowledge aircraft registration databases (public FAA records).
Reword "no data collected" to specifically mean no user data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: d00580da195984ec70475d649f0f0e091a90ba48
2026-03-13 18:39:02 -06:00
anoracleofra-code f3dd2e9656 docs: add "Why This Exists" section and soften disclaimer
Positions the project as a public data aggregator, not a surveillance
tool. Clarifies that no data is collected or transmitted beyond rendering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 53eb82c6104f5c061d361c71c44f8c61b7e12897
2026-03-13 18:35:05 -06:00
anoracleofra-code 1cd8e8ae17 fix: respect CelesTrak fair use policy to avoid IP bans
- Fetch interval: 30min → 24h (TLEs only update a few times daily)
- Add If-Modified-Since header for conditional requests (304 support)
- Remove 10-thread parallel blitz on TLE fallback API → sequential with 1s delay
- Increase timeout 5s → 15s (be patient with a free service)
- SGP4 propagation still runs every 60s — satellite positions stay live

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 67b7654b6cc2d05c0a8ff00faad7c45c9cf2aa2d
2026-03-13 17:47:26 -06:00
anoracleofra-code 9ac2312de5 feat: add pulse rings behind KiwiSDR radio tower icons
Adds subtle amber glow circles behind both cluster and individual
tower markers for a pulsing radar-station effect.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: bf6cee0f3b468006356fd95dcf83a27d5e62e5f6
2026-03-13 16:44:00 -06:00
anoracleofra-code ef61f528f9 fix: KiwiSDR clusters now use tower icon instead of circles
Replaced the circle cluster layer with a symbol layer using the same
radio tower icon. Clusters show the tower with a count label below.
No more orange blobs at any zoom level.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 0b1cb0d2a082dde4dcefe12518cdfb28b492ab89
2026-03-13 16:39:41 -06:00
anoracleofra-code eaa4210959 fix: replace KiwiSDR orange circles with radio tower icons
Individual nodes now render as amber radio tower SVGs with signal waves.
Clusters use a subtle amber glow ring with count label instead of solid
orange blobs. Much less visual clutter against the flight/ship markers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 96baa3415440118a6084c739d500a1ce5951d27f
2026-03-13 16:36:48 -06:00
anoracleofra-code 8ee807276c fix: KiwiSDR layer broken import + remove ugly iframe embed
- kiwisdr_fetcher.py imported non-existent `smart_request` (renamed to
  `fetch_with_curl`), causing silent ImportError → 0 nodes returned
- Replaced KiwiSDR iframe embed with clean "OPEN SDR RECEIVER" button.
  The full KiwiSDR web UI (waterfall, frequency controls, callsign
  prompt) is unusable at 288px — better opened in a new tab.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: aa0fcd92b2390d6a8943b68f2f7eb9b900c7bbb7
2026-03-13 16:32:32 -06:00
anoracleofra-code 3d910cded8 Fix POTUS tracker map and data fetch failing due to using array index instead of icao24 code
Former-commit-id: 418318b29816288d1846889d9b9e08f13ae42387
2026-03-13 14:27:31 -06:00
anoracleofra-code c8175dcdbe Fix commercial jet feature ID matching for popups
Former-commit-id: e02a08eb7c4a94eebd2aa33912a2419abf70cfb7
2026-03-13 14:10:52 -06:00
Shadowbroker 136766257f Update README.md
update section for old versions

Former-commit-id: 5299777abd9914e866967cdd3e533a3fa5ffd507
2026-03-13 12:59:38 -06:00
Shadowbroker 5cb3b7ae2b Update README.md
Former-commit-id: b443fc94edb2a15fe49769f84dcf319c18503dfa
2026-03-13 12:47:53 -06:00
anoracleofra-code 5f27a5cfb2 fix: pin backend Docker image to bookworm (fixes Playwright dep install)
python:3.10-slim now resolves to Debian Trixie where ttf-unifont and
ttf-ubuntu-font-family packages were renamed/removed, causing Playwright's
--with-deps chromium install to fail. Pin to bookworm (Debian 12) for
stable font package availability.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 805560e4b7e3df6441ed5d7221f6bf5e9e665438
v0.9.0
2026-03-13 11:39:01 -06:00
anoracleofra-code fc9eff865e v0.9.0: in-app auto-updater, ship toggle split, stable entity IDs, performance fixes
New features:
- In-app auto-updater with confirmation dialog, manual download fallback,
  restart polling, and protected file safety net
- Ship layers split into 4 independent toggles (Military/Carriers, Cargo/Tankers,
  Civilian, Cruise/Passenger) with per-category counts
- Stable entity IDs using MMSI/callsign instead of volatile array indices
- Dismissible threat alert bubbles (session-scoped, survives data refresh)

Performance:
- GDELT title fetching is now non-blocking (background enrichment)
- Removed duplicate startup fetch jobs
- Docker healthcheck start_period 15s → 90s

Bug fixes:
- Removed fake intelligence assessment generator (OSINT-only policy)
- Fixed carrier tracker GDELT 429/TypeError crash
- Fixed ETag collision (full payload hash)
- Added concurrent /api/refresh guard

Contributors: @imqdcr (ship split + stable IDs), @csysp (dismissible alerts, PR #48)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: a2c4c67da54345393f70a9b33b52e7e4fd6c049f
2026-03-13 11:32:16 -06:00
Shadowbroker 1eb2b21647 Merge pull request #52 from imqdcr/fix/selection-stability
fix: use stable icao24/mmsi identifiers for aircraft and ship selection
Former-commit-id: 69256a170a844e763d0cbeec63eea46204e5a547
2026-03-13 08:27:18 -06:00
imqdcr 45d82d7fcf fix: use stable icao24/mmsi identifiers for aircraft and ship selection
Replaces array-index-based selection with stable backend identifiers so
selected entities persist correctly across data refreshes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Former-commit-id: 14e316d055ba0b1fe16a2be301fcaaf4349b5a29
2026-03-13 13:46:46 +00:00
Shadowbroker 0d717daa71 Merge pull request #48 from csysp/feat/dismiss-incidents-popups
feat: add click-to-dismiss × button on global incidents popups
Former-commit-id: 6c21c37feecf64c101bc4008050c84de9310ef46
2026-03-12 20:20:59 -06:00
csysp 9aed9d3eea feat: add click-to-dismiss × button on global incidents popups
Each alert bubble now has an × button in the top-right corner.
Clicking it hides the alert for the session and clears its selection
if it was active.

- Dismissal keyed by stable content hash (title+coords) so dismissed
  state survives data.news array replacement on every 60s polling cycle
- Button stopPropagation prevents accidental entity selection on dismiss
- Single useState<Set<string>> — avoids naming collision with the
  react-map-gl `Map` import that caused the previous black-screen crash

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: ce2dec52a9a40a581995323354414b278abdf443
2026-03-12 18:26:43 -06:00
Shadowbroker 7c6049020d Update README.md
Former-commit-id: d66cbce25256556da9f7c3b5effb95c265489996
2026-03-12 10:41:43 -06:00
Shadowbroker a9305e5cfb Update README.md
Former-commit-id: e546e2000c5b21c9cf89eb988e08f233eb3a0df3
2026-03-12 09:54:08 -06:00
anoracleofra-code edf9fd8957 fix: restore API proxy route deleted during rebase
The catch-all route.ts that proxies frontend /api/* requests to the backend
was accidentally deleted during the v0.8.0 rebase against PR #44. Without it,
all API fetches return 404 and nothing loads on the map.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 811ec765320d9813efc654fee53ef0e5d5fecc78
2026-03-12 09:47:16 -06:00
anoracleofra-code 90f6fcdc0f chore: sync local polling adjustments and data updates
Former-commit-id: 4417623b0c0bb6d07d79081817110e80e699a538
2026-03-12 09:36:19 -06:00
anoracleofra-code 34db99deaf v0.8.0: POTUS fleet tracking, full aircraft color-coding, carrier fidelity, UI overhaul
New features:
- POTUS fleet (AF1, AF2, Marine One) with hot-pink icons + gold halo ring
- 9-color aircraft system: military, medical, police, VIP, privacy, dictators
- Sentinel-2 fullscreen overlay with download/copy/open buttons (green themed)
- Carrier homeport deconfliction — distinct pier positions instead of stacking
- Toggle all data layers button (cyan when active, excludes MODIS Terra)
- Version badge + update checker + Discussions shortcut in UI
- Overhauled MapLegend with POTUS fleet, wildfires, infrastructure sections
- Data center map layer with ~700 global DCs from curated dataset

Fixes:
- All Air Force Two ICAO hex codes now correctly identified
- POTUS icon priority over grounded state
- Sentinel-2 no longer overlaps bottom coordinate bar
- Region dossier Nominatim 429 rate-limit retry/backoff
- Docker ENV legacy format warnings resolved
- UI buttons cyan in dark mode, grey in light mode
- Circuit breaker for flaky upstream APIs

Community: @suranyami — parallel multi-arch Docker builds + runtime BACKEND_URL fix (PR #35, #44)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Former-commit-id: 7c523df70a2d26f675603166e3513d29230592cd
v0.8.0
2026-03-12 09:31:37 -06:00
Shadowbroker a0d0a449eb Merge pull request #44 from suranyami/fix-backend-url-regression-speed-up-docker-builds
ci: speed up multi-arch Docker builds + fix BACKEND_URL baked in at build time
Former-commit-id: 54ca8d59aede7e47df315ac526bde35f4e4d0622
2026-03-11 19:34:57 -06:00
David Parry 26a72f4f95 chore: untrack local config files (.claude, .mise.local.toml)
These are already covered by the .gitignore added in this branch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Former-commit-id: dcfdd7bb329ef7e63ee5755ccbe403bf951903f6
2026-03-12 12:11:09 +11:00
David Parry 3eff24c6ed Merge branch 'main' of github.com:suranyami/Shadowbroker
Former-commit-id: 8e9607c7adaf4f1b4b5013fab10429787671ec03
2026-03-12 12:08:19 +11:00