500개 이상의 뉴스 피드, 29개 증권거래소, 위성 화재 데이터, 선박·항공기 추적, 사이버 위협까지 65개 넘는 외부 소스를 빨아들여 3D 지구본 + WebGL 평면 지도 위에 실시간으로 그린다. AI는 흩어진 뉴스를 브리프로 요약하고, 군사·경제·재난 신호가 한곳으로 수렴하는 순간(상관관계)을 잡아낸다. 놀라운 점은 거대한 인프라인데도 프레임워크 없는 순수 TypeScript로 짰고, Ollama 로컬 AI면 API 키 한 줄 없이도 돈다는 것. (저장소: koala73/worldmonitor · v2.8.0 · TypeScript · AGPL-3.0 · 라이브 데모 worldmonitor.app · TrendShift #15)
"전 세계에서 지금 무슨 일이 벌어지는지, 한 화면에서 보게 해주는 오픈소스 상황실."
영화에 나오는 국가 상황실(워룸)의 거대한 스크린을 떠올려 보자. 세계 지도 위에 분쟁 지점이 깜빡이고, 옆 패널에는 주가·유가·환율이 흐르고, 한쪽에선 속보가 올라온다. World Monitor는 바로 그 화면을 웹 브라우저와 데스크탑 앱으로 구현했다. 500개 넘는 뉴스 피드와 65개 넘는 데이터 제공처(증권사·위성 화재 API·선박 추적·정부 통계 등)를 한데 모아, 3D 지구본과 평면 지도, 그리고 86종의 전문 패널(작은 위젯 카드)로 보여준다.
핵심 용어 두 개부터 풀자. 상황 인식(situational awareness)은 군사·항공에서 온 말로 "지금 내 주변에서 무슨 일이 일어나는지 전체를 파악하는 능력"을 뜻한다. World Monitor는 흩어진 정보 소스를 하나로 묶어 이 "전체 그림"을 만든다. 대시보드(dashboard)는 자동차 계기판처럼 여러 지표를 한눈에 보여주는 화면이다. 즉 이 프로젝트는 "지구 전체의 계기판"을 짓는 일이다.
docker compose up 한 줄로 전체 스택을 띄울 수 있고, AI 요약을 Ollama(로컬 LLM)로 돌리면 외부 API 키가 전혀 필요 없다. 민감한 정보를 다루는 상황실 도구로서 큰 장점.만든 사람은 Elie Habib(koala73)이며, 단순 토이 프로젝트가 아니라 웹 앱 + 데스크탑 앱(Tauri) + 6가지 사이트 변종(전체/테크/금융/원자재/긍정뉴스/에너지)을 하나의 코드베이스에서 찍어내는, 운영 중인 실제 서비스(worldmonitor.app)다. 라이선스는 AGPL-3.0이라 소스 공개 의무를 지키면 누구나 쓸 수 있다.
"파편화된 정보 소스 수십 개를, 프레임워크 없이도 하나의 살아있는 화면으로 합쳤다."
오늘날 정세를 파악하려면 보통 탭을 10개씩 띄운다 — 뉴스 사이트, 트레이딩뷰, 항공 추적, 날씨, 트위터… 정보가 사방에 흩어져 있고, 그 사이의 연결(예: "이 지역 분쟁이 저 유가 급등과 관련 있나?")은 사람이 머릿속으로 이어붙여야 한다. 기존 상용 솔루션(Bloomberg Terminal, Palantir 등)은 비싸고 폐쇄적이다.
탭 10개를 띄워도 각각 따로 논다. 사람이 직접 비교·연결해야 하고, 어느 데이터가 방금 갱신됐는지(신선도)도 알기 어렵다. 전문 터미널은 강력하지만 월 수십만 원~수백만 원에 코드도 닫혀 있어, 개인·연구자·소규모 팀은 손대기 힘들다. 결국 "정보는 넘치는데 상황 인식은 안 되는" 상태가 된다.
World Monitor는 모든 소스를 하나의 지도와 패널 그리드로 통합한다. AI가 뉴스를 브리프로 요약하고, 상관관계 엔진이 군사·경제·재난 신호가 같은 시점·같은 지역으로 수렴하는 순간을 자동 포착한다. 모든 데이터에 신선도(언제 갱신됐나)가 붙고, 전부 AGPL 오픈소스 + 셀프호스팅 + 로컬 AI라 비용·프라이버시 부담이 없다.
트렌딩을 끌어올린 결정적 요소는 "엔지니어링의 밀도"다. 거대 인프라인데 React·Vue 같은 무거운 프레임워크 없이 순수 바닐라 TypeScript로 짜서 초기 로딩이 가볍고, 3D 지구본(globe.gl)과 평면 WebGL 지도(deck.gl)를 둘 다 갖췄으며, 276개 Protocol Buffers 계약으로 API를 엄격하게 관리한다. "혼자서 이 정도 규모를 이렇게 깔끔하게?"라는 감탄이 화제의 핵심이다.
기존 = 신문·TV·증권앱·날씨앱을 따로 켜 둔 책상 — 정보는 다 있지만 내가 일일이 눈을 옮겨 다니며 머릿속에서 합쳐야 한다.
World Monitor = 영화 속 NASA 관제실 대형 스크린 — 지도·지표·속보·경보가 한 화면에 모이고, 위험이 한 지점으로 모이면 시스템이 먼저 "여기 주목" 하고 알려준다.
| 구분 | 전문 터미널 (Bloomberg/Palantir) | 뉴스 애그리게이터 (Feedly 등) | World Monitor |
|---|---|---|---|
| 다루는 범위 | 금융/정보 분석 | 뉴스만 | 뉴스+금융+군사+재난+사이버+인프라 |
| 지도 시각화 | 제한적 | 없음 | 3D 지구본 + WebGL 평면(56 레이어) |
| AI 요약·상관분석 | 일부(고가) | 없음 | 내장(브리프+수렴 탐지) |
| 비용 | 월 수십만 원~ | 무료~유료 | 무료(오픈소스) |
| 실행 위치 | SaaS | SaaS | 웹+데스크탑+셀프호스팅 |
| 로컬 AI(키 불필요) | 불가 | 불가 | Ollama로 가능 |
| 라이선스 | 독점 | 독점 | AGPL-3.0 |
물론 한계도 있다. 일부 라이브 데이터(항공 운임, 정밀 시장 데이터 등)는 외부 API 키가 있어야 진짜 값이 나오고(없으면 "키 필요" 안내), 65개 넘는 소스를 다루다 보니 설정·운영 복잡도가 만만치 않다. 또 데이터의 정확성·해석은 출처에 의존하므로, 이 도구는 "판단을 대신해 주는 것"이 아니라 "판단을 돕는 상황판"으로 봐야 한다.
프론트는 '프레임워크 없는 TS + 듀얼 WebGL 지도', 백엔드는 'Edge 함수 + Redis 캐시', 그리고 데스크탑은 Tauri.
World Monitor는 ① 프론트엔드(브라우저/데스크탑 화면) ② 백엔드(서버리스 API + 캐시) ③ 인프라/배포(데스크탑·컨테이너·계약) 세 축으로 보면 명확하다. 가장 큰 설계 철학은 "무거운 프레임워크를 쓰지 않는다"와 "모든 데이터는 한 번 캐시해서 모두가 나눠 쓴다"이다.
가장 놀라운 선택은 React/Vue/Svelte를 안 쓴다는 점이다. 화면은 바닐라 TypeScript로 짜고, 모든 패널은 공통 Panel 클래스를 상속한다(상태 라이브러리도 없이 AppContext라는 중앙 객체 하나로 관리). 지도는 두 개를 갖췄다 — 3D는 globe.gl(Three.js 기반 지구본), 평면은 deck.gl(WebGL 대용량 레이어) + MapLibre GL이다.
| 역할 | 기술 |
|---|---|
| 언어·빌드 | TypeScript 5.7 · Vite 6 (프레임워크 없음 / 빌드시 코드 분할) |
| 3D 지구본 | globe.gl + three.js — 대기 셰이더·자동 회전·HTML 마커 |
| 평면 지도 | deck.gl 9(Scatterplot/GeoJson/Arc/Heatmap/H3 등) + maplibre-gl + pmtiles(셀프호스팅 타일) |
| 지도 보조 | supercluster(마커 군집화) · h3-js(육각 격자) · satellite.js(위성 궤도) |
| 브라우저 AI | @xenova/transformers + onnxruntime-web — 브라우저 안에서 ONNX 모델 추론 |
| 데이터 처리 | d3 · papaparse(CSV) · fast-xml-parser(RSS) · topojson · marked+dompurify |
| 국제화·실시간 | i18next(24개 언어·RTL) · hls.js(라이브 영상) · ws(WebSocket) |
백엔드는 전통적 서버 한 대가 아니라 Vercel Edge Functions(요청이 올 때만 전 세계 엣지에서 깨어나는 작은 함수) 60여 개로 이뤄진다. 이 함수들은 외부 API를 직접 부르지 않고, 먼저 Upstash Redis 캐시를 본다. 그리고 API 모양(계약)은 사람이 손으로 안 짜고 Protocol Buffers로 정의해 자동 생성한다.
| 역할 | 기술 |
|---|---|
| API 실행 | Vercel Edge Functions 60+ · middleware.ts(봇 차단·소셜 OG) |
| 캐시·속도제한 | @upstash/redis(3~4단계 캐시·스탬피드 방지) · @upstash/ratelimit(IP별 슬라이딩 윈도) |
| API 계약 | Protocol Buffers(276개 proto·34개 서비스) + sebuf HTTP 어노테이션 → TS 클라이언트/서버 자동 생성 |
| 실시간 릴레이 | Railway의 AIS Relay(ais-relay.cjs) — WebSocket 선박 스트림 프록시 + 주기적 시드(market/aviation/risk 등) |
| 경량 백엔드 | convex(문의·대기열 폼) · @vercel/og+preact(소셜 카드 이미지 생성) |
| 서버 AI | Groq(기본) · OpenRouter(폴백) · 모든 OpenAI 호환 엔드포인트(= Ollama 로컬) · @anthropic-ai/sdk |
Edge 함수 + Redis 캐시 = 인기 카페의 "미리 내려둔 커피". 손님(브라우저)이 올 때마다 원두를 갈아 내리면(외부 API 직접 호출) 느리고 비싸다. 그래서 백그라운드 일꾼(Railway 릴레이)이 주기적으로 큰 주전자에 미리 내려(시드) 진열대(Redis)에 둔다. 손님이 오면 따라주기만 하니 빠르고, 100명이 와도 원두는 한 번만 갈면 된다.
같은 코드가 데스크탑 앱으로도 나온다. 껍데기는 Tauri 2(Rust로 만든 가벼운 앱 셸 — Electron보다 훨씬 작다)이고, 그 안에서 Node.js 사이드카가 미니 API 서버 역할을 한다. 비밀 키는 OS 키체인에 안전 보관한다.
| 레이어 | 기술 |
|---|---|
| 데스크탑 셸 | Tauri 2(Rust) — macOS(ARM/x64)·Windows·Linux 빌드, 시스템 트레이·IPC |
| 로컬 API | Node.js 사이드카(local-api-server.mjs) — Edge 핸들러를 로컬에서 실행, 키는 OS 키링에서 주입 |
| 인증·결제 | @clerk/clerk-js(로그인) · @dodopayments/convex·dodopayments-checkout(구독) |
| 배포 | Vercel(SPA+함수) · Railway(릴레이) · Docker(docker-compose로 app+redis+relay 한 번에) · GHCR 멀티아치 이미지 · PWA |
| 품질·CI | biome(린트·포맷) · playwright(E2E·골든 스크린샷) · vitest/node:test · @sentry/browser(오류추적) |
데이터가 '외부 소스 → 시드/캐시 → Edge 함수 → 부트스트랩 → 패널·지도 → AI 분석'으로 흐른다.
World Monitor의 핵심은 "비싼 외부 호출은 미리·한 번만, 화면 표시는 빠르게"라는 흐름이다. 전체를 한 장으로 그리면 다음과 같다(실제 ARCHITECTURE.md 기준).
/api/bootstrap 한 번 호출로 여러 키를 한꺼번에 받아와 화면을 채우는 것. 덕분에 첫 화면이 빠르게 뜬다("수화=hydration"은 빈 껍데기에 데이터를 부어 살리는 비유).도메인별 API(뉴스·시장·항공…)는 매번 보안·캐시 코드를 새로 짜지 않는다. server/gateway.ts의 createDomainGateway()가 10단계 공통 파이프라인을 만들어 준다. 개발자는 "라우트와 핸들러"만 채우면, 나머지(출처 검사·CORS·키 검증·레이트리밋·ETag 등)는 자동으로 붙는다.
# 게이트웨이가 매 요청에 자동으로 거는 단계 (요지)
1. 출처(Origin) 검사 # 허용 안 된 곳이면 403
2. CORS 헤더 부여
3. OPTIONS 프리플라이트 처리
4. API 키 검증 # 데스크탑/프리미엄은 키 필수
5. 레이트리밋(IP별 슬라이딩 윈도)
6. 라우트 매칭 # 정적 Map → 동적 {param}
7. POST→GET 호환(옛 클라이언트 대비)
8. 핸들러 실행(에러 경계)
9. ETag(FNV-1a 해시) 생성 → 변화 없으면 304 Not Modified
10. 캐시 헤더 적용(fast/medium/slow/static/daily…)
인기 데이터에 1초에 100명이 몰리면, 외부 API를 100번 부르면 안 된다. server/_shared/redis.ts의 cachedFetchJson()은 동시에 들어온 같은 키의 캐시 미스를 하나로 묶어(coalesce), 외부 호출 1번 + Redis 쓰기 1번으로 처리하고 나머지는 그 결과를 공유한다. 이것이 65개 소스를 적은 비용으로 굴리는 비결이다.
| 캐시 티어 | s-maxage | 쓰임새 |
|---|---|---|
| fast | 300초 | 라이브 이벤트·항공 상태 |
| medium | 600초 | 시장 시세·종목 분석 |
| slow | 1800초 | ACLED 분쟁·사이버 위협 |
| static | 7200초 | 인도주의 요약·ETF 흐름 |
| daily | 86400초 | 핵심 광물·정적 참조 데이터 |
| no-store | 0 | 선박·항공기 실시간 스냅샷 |
World Monitor의 "분석 두뇌"는 두 가지다. 첫째 CII(Country Instability Index) — 31개 주요국에 대해 서버에서 권위 있게 계산하는 스트레스 점수다. 핵심 아이디어는 단순·투명하다: 나라마다 기본 위험치(baselineRisk)와 이벤트 배수(eventMultiplier)를 두고, 뉴스에서 그 나라 관련 사건을 키워드로 잡아 점수를 올린다(계수표는 shared/cii-weights.ts에 단일 출처로 두어 브라우저·서버가 어긋나지 않게 한다).
# shared/cii-weights.ts — 국가별 계수(실제 값 일부)
US: { baselineRisk: 5, eventMultiplier: 0.3 } # 안정·둔감
RU: { baselineRisk: 35, eventMultiplier: 2.0 }
KP: { baselineRisk: 45, eventMultiplier: 3.0 } # 고위험·민감
UA: { baselineRisk: 50, eventMultiplier: 0.8 }
# 점수 ≈ baselineRisk + (관련 이벤트 강도 × eventMultiplier)
# 계수 수정 시 CII_FORMULA_VERSION 올리고 방법론 문서도 같은 커밋에 갱신
둘째 상관관계 엔진(CorrelationEngine) — 각 도메인 어댑터가 신호를 모으고, haversineKm(지구 두 점 사이 거리)로 가까운 신호를 군집화한 뒤 점수를 매겨, 임계치를 넘으면 "수렴 카드(Convergence Card)"를 만든다. 점수가 높으면(≥60) LLM에게 "이게 무슨 의미냐"를 물어 평가까지 붙인다(동시 호출은 3개로 제한, 30분 캐시). 즉 "군사+경제+재난 신호가 한 지역에 몰리는 순간"을 기계가 먼저 알아챈다.
tech.·finance.·commodity.·happy.·energy. 등 6개 사이트는 전부 같은 코드베이스다. 접속 호스트명(또는 데스크탑의 localStorage)으로 변종을 감지해 기본 패널·지도 레이어·새로고침 주기·테마·UI 문구를 통째로 바꾼다. Vite 빌드 시 변종별로 안 쓰는 패널 묶음을 잘라내(코드 분할), 같은 소스에서 가벼운 전용 앱들을 찍어낸다.
레포는 '프론트(src/) + 서버리스(api·server/) + 계약(proto/) + 데스크탑(src-tauri/)'의 대형 모노레포다.
최상위는 크게 ① 프론트엔드(src/) ② 서버리스 API(api/·server/) ③ API 계약(proto/) ④ 데스크탑(src-tauri/) ⑤ 운영 스크립트(scripts/)로 나뉜다. src/ 안의 핵심은 3분할이다 — components(화면 부품 155개), services(도메인 데이터 로직 24개), workers(무거운 계산을 background로).
이 구조는 대형 방송국과 같다. src/components는 스튜디오의 모니터·자막기(보이는 부품), src/services는 각 부서 취재팀(시장팀·국방팀·기상팀), src/workers는 지하 편집실(무거운 영상 처리를 따로), api·server는 외부 통신망과 자료실(외부 소스 받아 캐시), proto는 부서 간 공용 문서 양식(서로 어긋나지 않게)이다.
한 레포에 '프레임워크 없는 대규모 SPA + WebGL 지도 + 서버리스 + 브라우저 AI + 데스크탑'이 다 들어 있다.
"React 없이 어떻게 155개 컴포넌트를 관리하지?"의 살아 있는 답이다. Panel 기반 클래스(공통 setContent + 이벤트 위임)와 AppContext 중앙 객체로 상태 라이브러리 없이 상태를 다룬다. 프레임워크가 숨겨주던 것(렌더 타이밍·디바운스·이벤트 위임)을 직접 마주하며 배우기 좋다.
src/components/Panel.ts를 읽고 "setContent가 왜 150ms 디바운스를 거나", "이벤트 위임이 왜 안정적인 this.content에 붙나"를 정리해 보라. 그리고 같은 패턴으로 나만의 미니 패널을 하나 추가해 본다.
수만 개의 점(선박·항공기·이벤트)을 지도에 부드럽게 그리는 법을 배우는 최고의 교재다. src/config/map-layer-definitions.ts에는 각 레이어가 평면/지구본 중 어디서 되는지, 프리미엄인지, 어느 변종에 보이는지가 선언돼 있다. supercluster 군집화, pmtiles 셀프호스팅 타일도 실전 예제.
deck.gl ScatterplotLayer로 임의의 위경도 1만 개를 지도에 찍어 보고, supercluster를 붙여 줌 레벨에 따라 군집이 합쳐지는 걸 관찰하라.
src/workers/ml.worker.ts는 서버 없이 브라우저에서 ONNX 모델(all-MiniLM-L6-v2 임베딩, sst-2 감성, flan-t5 요약, bert NER)을 돌린다. 무거운 추론을 웹 워커(별도 스레드)로 빼서 UI가 안 끊기게 하는 패턴, 그리고 IndexedDB 벡터 저장으로 의미 검색까지 한다.
@xenova/transformers로 문장 임베딩을 뽑아 코사인 유사도로 "비슷한 헤드라인 찾기"를 만들어 보라. 메인 스레드 vs 웹 워커에서 돌릴 때 UI 멈춤 차이를 체감.
server/gateway.ts와 _shared/redis.ts는 프로덕션 서버리스의 정석이다. 게이트웨이 팩토리로 공통 미들웨어를 조립하고, cachedFetchJson으로 캐시 스탬피드(동시 미스 폭주)를 막으며, ETag로 304를 돌려 대역폭을 아낀다.
외부 API 하나를 골라 "캐시 없음 / 메모리 캐시 / Redis + 코얼레싱" 세 버전을 만들고, 동시 100요청을 보낼 때 외부 호출 횟수가 어떻게 줄어드는지 측정하라.
proto/의 276개 정의에서 TS 클라이언트·서버·OpenAPI가 자동 생성된다. CI(proto-check.yml)가 "생성물이 최신인지" 강제한다. "계약을 먼저 쓰고 코드는 생성"하는 대규모 API 설계를 배운다.
src-tauri/는 웹 코드를 네이티브 데스크탑 앱으로 만드는 법을 보여준다. 특히 OS 키체인에 비밀 저장 → IPC로 사이드카에 주입, 렌더러↔사이드카 신뢰 경계, fetch 패치로 API를 로컬로 우회하는 설계는 보안 관점에서도 훌륭한 사례다.
그냥 쓰는 건 브라우저면 충분 — 부담은 '셀프호스팅 운영'과 '브라우저 AI 모델 다운로드'다.
그냥 써보는 거라면 worldmonitor.app에 접속하거나 데스크탑 앱을 받으면 끝이다. 직접 돌리는(셀프호스팅) 경우, 무거운 LLM 추론은 외부(Groq/OpenRouter)나 로컬 Ollama가 맡고, 코드 자체는 Node 환경에서 가볍게 돈다. 진짜 변수는 ① 일부 기능의 API 키, ② 브라우저 AI를 켜면 받는 ONNX 모델 용량, ③ 로컬 Ollama를 쓸 때의 GPU/RAM이다.
| 항목 | 최소/기본 | 비고 |
|---|---|---|
| 개발 환경 | Node.js + npm install → npm run dev | 환경변수 0개로도 구동(localhost:3000) |
| 셀프호스팅 | docker compose up -d --build | app + Redis + AIS 릴레이 한 번에 (단, REDIS_TOKEN 필수) |
| 브라우저 AI | 모던 브라우저(WebGL2·WASM) | ONNX 모델을 최초 1회 다운로드(브라우저 캐시) · 메모리 여유 권장 |
| 로컬 LLM(선택) | Ollama 등 OpenAI 호환 엔드포인트 | API 키 불필요 · 모델 크기에 따라 GPU/RAM 필요 |
| 핵심 키(선택) | GROQ_API_KEY·FINNHUB_API_KEY·NASA_FIRMS_API_KEY 등 | 없으면 해당 기능만 비활성/안내 — 앱은 정상 동작 |
| 데스크탑 빌드 | Rust 툴체인 + Tauri CLI | macOS(ARM/x64)·Windows·Linux 타깃 |
World Monitor의 미덕은 graceful degradation(키 없으면 해당 기능만 끔)이다. 그래서 처음엔 "잘 도네!" 싶지만, 항공 운임(fly 명령)처럼 키가 있어야 진짜 값이 나오는 기능은 "credentials required"만 뜬다(가짜 데이터를 만들어 보여주지 않는 게 설계 원칙). 또 Docker로 띄울 땐 REDIS_TOKEN·REDIS_PASSWORD를 openssl rand -hex 32로 직접 생성해야 컨테이너가 뜬다(기본값 없음).
"실행 → 패널 추가 → 지도 레이어 → 캐시·계약 → AI 워커"로 난이도 상승.
git clone → npm install → npm run dev로 기본 앱을 띄운다(환경변수 0개). 이어서 npm run dev:tech·dev:finance로 같은 코드가 어떻게 다른 앱이 되는지 비교하고, 어떤 패널·지도 레이어가 달라지는지 메모한다.
src/components/Panel.ts를 부모로 하는 작은 패널을 만들어 패널 그리드에 띄운다. setContent(html)로 그리고, 버튼 클릭을 이벤트 위임으로 처리해 본다. 프레임워크 없이 컴포넌트를 다루는 감을 잡는 단계.
src/config/map-layer-definitions.ts 구조를 읽고, 새 ScatterplotLayer를 정의해 임의 데이터를 평면 지도에 띄운다. 가능하면 supercluster 군집화를 붙이고, 3D 지구본(globe.gl)에서는 어떻게 표현이 달라지는지 확인한다.
server/gateway.ts의 파이프라인과 cachedFetchJson을 참고해, 외부 API 하나를 감싸는 미니 게이트웨이를 만든다. ETag/304, IP 레이트리밋, 동시 미스 코얼레싱을 넣고 부하 테스트로 외부 호출 횟수를 측정하면 설계의 효과가 숫자로 보인다.
src/workers/ml.worker.ts와 analysis.worker.ts, correlation-engine/engine.ts를 읽고, 임베딩 → 유사도 군집 → 거리 기반 신호 수렴 → 수렴 카드의 흐름을 미니 버전으로 재현한다. 여유가 되면 점수가 높을 때만 LLM 평가를 붙여(동시 호출 제한·캐시 포함) World Monitor의 분석 두뇌를 따라 만들어 본다.
'바닐라 TS SPA → WebGL 지도 → 서버리스·캐시 → 브라우저 AI → 데스크탑·계약'의 5주 코스.
| 주차 | 주제 | 학습 내용 & World Monitor 연결 |
|---|---|---|
| 1주차 | 프레임워크 없는 SPA & 상태관리 | TS 모듈·클래스, 이벤트 위임, 디바운스, URL 상태 동기화. App.ts의 8단계 부팅과 Panel.ts를 읽고 "프레임워크가 해주던 일"을 손으로 정리. |
| 2주차 | WebGL 지리 시각화 | deck.gl 레이어, MapLibre, globe.gl/Three.js, 군집화·타일(pmtiles). DeckGLMap.ts·GlobeMap.ts·레이어 정의로 "대량 점 렌더"를 학습. |
| 3주차 | 서버리스 & 캐시 전략 | Edge Functions, 다단계 캐시, ETag/304, 레이트리밋, 캐시 코얼레싱·스탬피드. gateway.ts·_shared/redis.ts를 정독. |
| 4주차 | 브라우저 AI & 웹 워커 | Transformers.js·ONNX, 임베딩·감성·요약·NER, 워커 스레드, IndexedDB 벡터 검색. ml.worker.ts·vector-db.ts로 "서버 없는 추론". |
| 5주차 | 계약 우선 API & Tauri 데스크탑 | Protocol Buffers/sebuf, 코드 생성·CI 강제, Tauri 셸·사이드카·키체인 보안. proto/·src-tauri/로 "웹→네이티브" 확장. |
World Monitor는 드물게 아키텍처 문서가 코드와 CI로 검증되는(숫자를 손으로 못 고치게 막은) 레포다. 1) ARCHITECTURE.md에서 전체 그림을 잡고 → 2) 해당 섹션의 "Source files"에 적힌 실제 파일을 열어 대조하고 → 3) worldmonitor.app 라이브 데모에서 그 기능이 화면에 어떻게 나오는지 확인하면, 대규모 실서비스의 설계가 입체적으로 잡힌다.
World Monitor 문서·코드에서 반복되는 용어를 한 곳에.
baselineRisk(기본 위험)와 eventMultiplier(이벤트 민감도)를 두고, 뉴스 속 관련 사건으로 점수를 올린다. 계수는 shared/cii-weights.ts에 단일 출처로 둔다.createDomainGateway)는 출처검사·CORS·키검증·레이트리밋·ETag 같은 공통 단계를 자동 조립해 준다.cachedFetchJson이 담당./api/*를 처리한다(실패 시 클라우드로 폴백).공식 저장소·라이브 데모·문서·커뮤니티.
GitHub 저장소 · github.com/koala73/worldmonitor — 본체 소스. ARCHITECTURE.md · src/ · server/부터 보면 좋다.
라이브 데모(웹 앱) · worldmonitor.app — 바로 써볼 수 있는 실제 대시보드. 변종: tech. · finance. · commodity. · happy. · energy.
공식 문서 · docs.worldmonitor.app — 아키텍처·데이터 소스·알고리즘·셀프호스팅 가이드.
데스크탑 다운로드 · Releases — Windows(.exe)·macOS(Apple Silicon/Intel)·Linux(.AppImage).
셀프호스팅 · SELF_HOSTING.md — Docker Compose로 app+Redis+릴레이 한 번에.
커뮤니티 · Discord — 질문·기여 논의.
TrendShift · trendshift.io/repositories/20793