Commit Graph

156 Commits

Author SHA1 Message Date
Shadowbroker 144fca4e75 Merge pull request #76 from adust09/feat/east-asia-enhancement
feat: East Asia intelligence coverage enhancement
2026-03-15 23:46:30 -06:00
adust09 910d1fd633 feat: enhance East Asia coverage with adversary bases, news sources, ICAO ranges, and PLAN vessel DB
- Add 68 military bases (PLA, Russia, DPRK, ROC, Philippines, Australia)
  with data-driven color coding (red/blue/green) on the map
- Add 6 news RSS feeds (Yonhap, Nikkei Asia, Taipei Times, Asia Times,
  Defense News, Japan Times) and 15 geocoding keywords for islands,
  straits, and disputed areas
- Extend ICAO country ranges for Russia, Australia, Philippines,
  Singapore, DPRK and add Russian aircraft classification (fighters,
  bombers, cargo, recon)
- Create PLAN/CCG vessel enrichment module (90+ ships) following
  yacht_alert pattern for automatic MMSI-based identification
- Update frontend types and popup styling for adversary/allied/ROC
  color distinction

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 12:46:40 +09:00
Shadowbroker 95da3015d9 Create LICENSE
Freedom for the people
2026-03-15 18:43:26 -06:00
Shadowbroker 1ac05bad0b Merge pull request #72 from adust09/feat/military-bases-layer
feat: East Asia military tracking — ICAO enrichment, model classification, force display
2026-03-15 10:31:54 -06:00
adust09 4b9765791f feat: enrich military aircraft with ICAO country/force and East Asia model classification
Infer country and military force (PLA, JSDF, ROK, ROC) from ICAO hex
address blocks when the flag field is Unknown. Extract and extend aircraft
model classification to cover East Asian fighters, cargo, recon, and
tanker types with hyphen-normalized matching.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 01:05:44 +09:00
adust09 05de14af9d feat: add military bases map layer for Western Pacific
Add 18 US military bases (Japan, Guam, South Korea, Hawaii, Diego Garcia)
as a toggleable map layer. Follows the existing data center layer pattern:
static JSON → backend fetcher → slow-tier API → frontend GeoJSON layer.

Includes red circle markers with labels, click popups showing operator
and branch info, and a toggle in the left panel.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 00:33:35 +09:00
adust09 130287bb49 feat: add East Asia news sources and improve geocoding for Taiwan contingency
Add 5 East Asia-focused RSS feeds (FocusTaiwan, Kyodo, SCMP, The Diplomat,
Stars and Stripes) and 22 geographic keywords (Taiwan Strait, South/East
China Sea, Okinawa, Guam, military bases, etc.) to improve coverage of
Taiwan contingency scenarios.

Refactor keyword matching into a pure _resolve_coords() function with
longest-match-first sorting so specific locations like "Taiwan Strait"
are not absorbed by generic "Taiwan".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 23:19:55 +09:00
anoracleofra-code 4a33424924 fix: correct Helm chart path in README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 01:10:23 -06:00
anoracleofra-code acf1267681 fix: correct Helm chart image repos and apiVersion
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-15 01:07:20 -06:00
Shadowbroker b5f49fe882 Update README.md
Former-commit-id: 85110e82cc09ab746d323f8625b8ecb5b1c03500
2026-03-14 19:26:50 -06:00
Shadowbroker 42d301f6eb Merge pull request #66 from chr0n1x/helm-chart
feat: helm chart!
Former-commit-id: a5d440d990e1565d248d8f9ba6b7f5626dc46da0
2026-03-14 19:21:56 -06:00
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
Kevin R 078eac12d8 feat: helm chart!
Former-commit-id: 27a7d19a73f4360424d2654a078b6cc26c53d231
2026-03-14 19:39:55 -04: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