OpenChart
Claude·Codex와 함께하는 무료 데스크톱 차트 도구. 알림 설정·차트 움직임 분석·데이터 제공자 선택
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.