尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Real-time global situational-awareness console: country risk, live signals, markets and world news on a GPU-rendered globe. Built on free, open data.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Real-time global situational-awareness console — country risk, cross-stream signals, markets and world news on a GPU-rendered globe. Built entirely on free, keyless, open data and deployed as a zero-config Next.js app on Vercel.
Live: https://atlas-eight-fawn.vercel.app
| Dark | Light |
|---|---|
noUncheckedIndexedAccess)map.transform API deck.gl's overlay needs, so v5 is pinned until deck.gl supports it)| Source | Used for | Key | Terms |
|---|---|---|---|
| Publisher RSS (The Hindu, NDTV, TOI, Mint, ET, BBC, Al Jazeera, DW, France 24, Guardian, NPR, UN News) | News backbone, subject-country tagging | none | Headlines + links only, per publisher terms |
| GDELT DOC 2.0 | Supplementary world news + tone (throttled to 1 req / 5 s per IP, so best-effort) | none | Open use with citation |
| Yahoo Finance chart API | India + global markets | none | Unofficial endpoint, Yahoo terms |
| Alpha Vantage | Top gainer (and per-article news sentiment on a premium plan; free keys get "premium endpoint" for that). Free tier is 25 requests/day and 1/second, so calls are spaced apart and cached for 3 h | optional ALPHA_VANTAGE_API_KEY | Free tier terms |
Groq / OpenRouter (openrouter/free) | AI briefs, deterministic fallback otherwise | optional GROQ_API_KEY / OPENROUTER_API_KEY | Provider terms |
| OpenFreeMap (OSM) · CARTO fallback | Vector basemaps | none | ODbL (OSM data), attribution shown on map |
| USGS real-time feed | Earthquakes M2.5+ (browser-direct, CORS-open) | none | U.S. public domain |
| NASA EONET · GDACS | Natural events + disaster impact alerts (via /api/hazards) | none | NASA open data · GDACS free use with attribution |
| adsb.lol | Live aircraft in the visible area (via /api/flights) | none | ODbL |
| IODA (Georgia Tech) · abuse.ch Feodo Tracker | Internet outages by country, botnet C2 hosting (via /api/cyber) | none | IODA terms · CC0 |
| TfL JamCams | London traffic-camera stills (via /api/cctv) | none | Open Government Licence ("Powered by TfL Open Data") |
| YouTube live embeds | 24/7 news channels (privacy-enhanced youtube-nocookie) | none | YouTube terms |
| U.S. EIA · Lloyd's List · ICG CrisisWatch | Static reference: chokepoints, major ports, flashpoint areas | none |
flowchart LR
subgraph Browser
UI["Console (React 19)<br/>HUD · intel panel · inspector"]
Store["Zustand store<br/>⇄ URL deep link"]
Q["TanStack Query<br/>polling · backoff · persisted cache"]
Map["MapLibre globe + deck.gl overlay<br/>(lazy chunk)"]
UI <--> Store
UI --> Q
Store --> Map
Q --> Map
end
subgraph Vercel["Vercel (Next.js route handlers, CDN-cached)"]
Metrics["/api/metrics<br/>RSS · GDELT · markets → risk, signals"]
Live["/api/hazards · cyber · flights · cctv<br/>per-source timeouts, coalescing"]
Brief["/api/brief<br/>validated · LRU · rate-limited"]
end
Q -->|"s-maxage + swr"| Metrics
Q --> Live
UI -->|shared keys| Brief
Q -->|CORS-open| USGS[(USGS quakes)]
UI -->|BYOK, key stays in browser| LLM[(Groq / OpenRouter)]
Brief --> LLM
Metrics --> Up[(Publisher RSS · GDELT · Yahoo · Alpha Vantage)]
Live --> Up2[(EONET · GDACS · adsb.lol · IODA · Feodo · TfL)]
app/
page.tsx static shell → <Console/> (client)
api/metrics/route.ts aggregated payload; CDN cached (s-maxage=60, swr=300)
api/briefing/route.ts AI "Today's briefing", served apart from /api/metrics so a slow free model never delays it;
30 min per-headline-set cache, rule-based digest until it arrives
api/brief/route.ts AI brief on shared free-tier keys: validated input, 15 min LRU, 8 req/min/IP
api/{hazards,cyber,cctv,flights}/route.ts
live-layer proxies: per-source timeouts, in-instance coalescing,
CDN s-maxage tuned per feed (10 s flights … 1 h cameras)
api/health/route.ts
src/
server/ data pipeline: fetchers (all via fetchWithTimeout), RSS parser,
country gazetteer, risk index, signals, sentiment, LLM chain, TTL cache
state/ Zustand store + typed contracts + URL sync
layers/ registry (label, hotkey, method, source) → dock/palette/help;
pure upstream parsers → normalized GeoItem; useLiveLayers queries
map/ MapCanvas (dynamic import, ssr: false), deck.gl layer factories, geometry
components/hud/ top bar, layer dock, tabbed intel panel / mobile sheet, status rail, palette
components/modules/ risk index, signals, markets, news feed, briefs
types/metrics.ts wire contract shared by server and client
Resilience: every upstream self-falls-back; the route coalesces concurrent cold requests into one fetch, serves the last good payload on failure, and keeps the last real news feed if a refresh comes back empty.
src/server/headlineSentiment.ts), because per-article news sentiment is a premium Alpha Vantage feature. The tile, gauge and chips say how the number was produced; an Alpha Vantage premium key is used automatically when present.G and click any point to open the inspector. It shows facts and the source link, the country found by point-in-polygon on the loaded geometry, events within 500 km by great-circle distance, a coverage/event timeline, and the latest matching headlines./api/brief (input validation, LRU cache, per-IP rate limit, rule-based fallback). With bring your own key, the browser calls Groq or OpenRouter directly (both allow CORS), so the key stays in localStorage and never reaches Atlas's server.prefers-reduced-motion).PathLayer because LineLayer doesn't draw under the globe projection.Every push and PR runs ci.yml (audit gate → typecheck → lint → Vitest → build → initial-JS budget → Playwright smoke) and security.yml (gitleaks + Semgrep).
npm run size sums the gzip size of every script the prerendered page loads (skipping noModule polyfills, which modern browsers never fetch) and fails above 180 kB. Currently ~165 kB; MapLibre, deck.gl, the inspector, palette, help, media viewer and asset drawer are all lazy chunks.src/**/*.test.ts): 234 unit + integration tests covering the full server data pipeline, all six API routes (/api/health, /api/metrics, /api/hazards, /api/cyber, /api/flights, /api/cctv), headline sentiment, URL sync, LLM chain, and rate-limit logic.e2e/): health endpoint, shell renders with no uncaught errors and the WebGL globe mounts (SwiftShader on CI), URL deep link ⇄ layer toggles, and the lazily loaded ⌘K palette.e2e/a11y.spec.ts runs axe color-contrast (WCAG AA) in light and dark over every intel tab, the layer dock, inspector, ⌘K palette, help overlay and a mobile viewport. Colour is semantic (blue --accent = interactive, --sev-1..5 = severity, --cat-* = layer kind) and every token pair is checked by axe.Strict CSP and hardening headers on every response, secret scanning, Semgrep, weekly Dependabot with a one-week cooldown, and a CI npm audit gate. One accepted advisory (maplibre-gl, not reachable here) is documented with a review date in SECURITY.md.
MIT © 2026 Rishabh Verma. Data sources keep their own terms (see the table above).
npm install
cp .env.example .env.local # optional keys
npm run dev # http://localhost:3000
npm run typecheck && npm run lint && npm test && npm run build
npm run size # initial JS budget (after build)
npm run audit:gate # npm audit, minus documented accepted risks
npx playwright install chromium --only-shell
npm run test:e2e # smoke tests against `next start`
Feature concepts adapted from koala73/worldmonitor (AGPL-3.0) — ideas only, no code copied.
| Cited reference figures, labelled static in the UI |
?l=risk,news&v=20,25,1.6&s=world&c=France restores layers, camera, scope and selection.⌘K palette · / search · [ ] panels · 1–4 tabs · G pick a location · layers R N E H F C P V B · Esc · ? help.