GitHub 트렌딩 딥다이브 · 2026-06-23

World Monitor 딥다이브
— 전 세계 뉴스·지정학·인프라를 한 화면에 모은 실시간 상황실 대시보드

500개 이상의 뉴스 피드, 29개 증권거래소, 위성 화재 데이터, 선박·항공기 추적, 사이버 위협까지 65개 넘는 외부 소스를 빨아들여 3D 지구본 + WebGL 평면 지도 위에 실시간으로 그린다. AI는 흩어진 뉴스를 브리프로 요약하고, 군사·경제·재난 신호가 한곳으로 수렴하는 순간(상관관계)을 잡아낸다. 놀라운 점은 거대한 인프라인데도 프레임워크 없는 순수 TypeScript로 짰고, Ollama 로컬 AI면 API 키 한 줄 없이도 돈다는 것. (저장소: koala73/worldmonitor · v2.8.0 · TypeScript · AGPL-3.0 · 라이브 데모 worldmonitor.app · TrendShift #15)

목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석 (수집→AI→렌더 파이프라인)
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어/시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

"전 세계에서 지금 무슨 일이 벌어지는지, 한 화면에서 보게 해주는 오픈소스 상황실."

한 줄로

World Monitor는 뉴스·금융·군사·재난·사이버 데이터를 실시간으로 모아 지도 위에 그리는 오픈소스 "글로벌 인텔리전스 대시보드"다.

영화에 나오는 국가 상황실(워룸)의 거대한 스크린을 떠올려 보자. 세계 지도 위에 분쟁 지점이 깜빡이고, 옆 패널에는 주가·유가·환율이 흐르고, 한쪽에선 속보가 올라온다. World Monitor는 바로 그 화면을 웹 브라우저와 데스크탑 앱으로 구현했다. 500개 넘는 뉴스 피드와 65개 넘는 데이터 제공처(증권사·위성 화재 API·선박 추적·정부 통계 등)를 한데 모아, 3D 지구본평면 지도, 그리고 86종의 전문 패널(작은 위젯 카드)로 보여준다.

핵심 용어 두 개부터 풀자. 상황 인식(situational awareness)은 군사·항공에서 온 말로 "지금 내 주변에서 무슨 일이 일어나는지 전체를 파악하는 능력"을 뜻한다. World Monitor는 흩어진 정보 소스를 하나로 묶어 이 "전체 그림"을 만든다. 대시보드(dashboard)는 자동차 계기판처럼 여러 지표를 한눈에 보여주는 화면이다. 즉 이 프로젝트는 "지구 전체의 계기판"을 짓는 일이다.

용어
뉴스 애그리게이션 (news aggregation)
여러 언론사·기관의 뉴스를 한곳에 자동으로 끌어모으는 것. World Monitor는 RSS 피드(웹사이트가 새 글을 알려주는 표준 형식) 500여 개를 15개 카테고리로 묶어 빨아들인 뒤, AI로 중복을 묶고 요약(브리프)을 만든다.
용어
셀프 호스팅 (self-hosting) & 로컬 AI
남의 클라우드에 맡기지 않고 내 컴퓨터·내 서버에서 직접 돌린다는 뜻. World Monitor는 docker compose up 한 줄로 전체 스택을 띄울 수 있고, AI 요약을 Ollama(로컬 LLM)로 돌리면 외부 API 키가 전혀 필요 없다. 민감한 정보를 다루는 상황실 도구로서 큰 장점.

만든 사람은 Elie Habib(koala73)이며, 단순 토이 프로젝트가 아니라 웹 앱 + 데스크탑 앱(Tauri) + 6가지 사이트 변종(전체/테크/금융/원자재/긍정뉴스/에너지)을 하나의 코드베이스에서 찍어내는, 운영 중인 실제 서비스(worldmonitor.app)다. 라이선스는 AGPL-3.0이라 소스 공개 의무를 지키면 누구나 쓸 수 있다.

2왜 주목받는가

"파편화된 정보 소스 수십 개를, 프레임워크 없이도 하나의 살아있는 화면으로 합쳤다."

오늘날 정세를 파악하려면 보통 탭을 10개씩 띄운다 — 뉴스 사이트, 트레이딩뷰, 항공 추적, 날씨, 트위터… 정보가 사방에 흩어져 있고, 그 사이의 연결(예: "이 지역 분쟁이 저 유가 급등과 관련 있나?")은 사람이 머릿속으로 이어붙여야 한다. 기존 상용 솔루션(Bloomberg Terminal, Palantir 등)은 비싸고 폐쇄적이다.

기존 방식의 함정
"소스는 많은데, 한곳에 모이지도 연결되지도 않는다"

탭 10개를 띄워도 각각 따로 논다. 사람이 직접 비교·연결해야 하고, 어느 데이터가 방금 갱신됐는지(신선도)도 알기 어렵다. 전문 터미널은 강력하지만 월 수십만 원~수백만 원에 코드도 닫혀 있어, 개인·연구자·소규모 팀은 손대기 힘들다. 결국 "정보는 넘치는데 상황 인식은 안 되는" 상태가 된다.

World Monitor의 해결
65개+ 소스를 한 화면에 + AI가 요약·연결 + 완전 오픈소스

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 요약·상관분석일부(고가)없음내장(브리프+수렴 탐지)
비용월 수십만 원~무료~유료무료(오픈소스)
실행 위치SaaSSaaS웹+데스크탑+셀프호스팅
로컬 AI(키 불필요)불가불가Ollama로 가능
라이선스독점독점AGPL-3.0

물론 한계도 있다. 일부 라이브 데이터(항공 운임, 정밀 시장 데이터 등)는 외부 API 키가 있어야 진짜 값이 나오고(없으면 "키 필요" 안내), 65개 넘는 소스를 다루다 보니 설정·운영 복잡도가 만만치 않다. 또 데이터의 정확성·해석은 출처에 의존하므로, 이 도구는 "판단을 대신해 주는 것"이 아니라 "판단을 돕는 상황판"으로 봐야 한다.

3기술 스택 전체 지도

프론트는 '프레임워크 없는 TS + 듀얼 WebGL 지도', 백엔드는 'Edge 함수 + Redis 캐시', 그리고 데스크탑은 Tauri.

World Monitor는 ① 프론트엔드(브라우저/데스크탑 화면) ② 백엔드(서버리스 API + 캐시) ③ 인프라/배포(데스크탑·컨테이너·계약) 세 축으로 보면 명확하다. 가장 큰 설계 철학은 "무거운 프레임워크를 쓰지 않는다""모든 데이터는 한 번 캐시해서 모두가 나눠 쓴다"이다.

① 프론트엔드 — 프레임워크 없는 TS + 듀얼 지도 엔진

가장 놀라운 선택은 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)
용어
WebGL & deck.gl / globe.gl
WebGL은 브라우저가 GPU(그래픽 카드)로 3D·대용량 그래픽을 그리는 기술이다. 수만 개의 점(선박·항공기)을 일반 HTML로 그리면 버벅이지만, deck.gl(평면 지도용)과 globe.gl(3D 지구본용)은 WebGL을 써서 대량의 지리 데이터를 부드럽게 렌더한다.

② 백엔드 — 서버리스 Edge 함수 + Redis 캐시 + 계약

백엔드는 전통적 서버 한 대가 아니라 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(소셜 카드 이미지 생성)
서버 AIGroq(기본) · OpenRouter(폴백) · 모든 OpenAI 호환 엔드포인트(= Ollama 로컬) · @anthropic-ai/sdk
비유

Edge 함수 + Redis 캐시 = 인기 카페의 "미리 내려둔 커피". 손님(브라우저)이 올 때마다 원두를 갈아 내리면(외부 API 직접 호출) 느리고 비싸다. 그래서 백그라운드 일꾼(Railway 릴레이)이 주기적으로 큰 주전자에 미리 내려(시드) 진열대(Redis)에 둔다. 손님이 오면 따라주기만 하니 빠르고, 100명이 와도 원두는 한 번만 갈면 된다.

③ 인프라·데스크탑 — Tauri 2 + 사이드카 + 컨테이너

같은 코드가 데스크탑 앱으로도 나온다. 껍데기는 Tauri 2(Rust로 만든 가벼운 앱 셸 — Electron보다 훨씬 작다)이고, 그 안에서 Node.js 사이드카가 미니 API 서버 역할을 한다. 비밀 키는 OS 키체인에 안전 보관한다.

레이어기술
데스크탑 셸Tauri 2(Rust) — macOS(ARM/x64)·Windows·Linux 빌드, 시스템 트레이·IPC
로컬 APINode.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
품질·CIbiome(린트·포맷) · playwright(E2E·골든 스크린샷) · vitest/node:test · @sentry/browser(오류추적)

4아키텍처 심화 분석 — 수집 → AI 처리 → 대시보드 렌더 파이프라인

데이터가 '외부 소스 → 시드/캐시 → Edge 함수 → 부트스트랩 → 패널·지도 → AI 분석'으로 흐른다.

World Monitor의 핵심은 "비싼 외부 호출은 미리·한 번만, 화면 표시는 빠르게"라는 흐름이다. 전체를 한 장으로 그리면 다음과 같다(실제 ARCHITECTURE.md 기준).

┌──────────────────────────────────────────────────────────────────────┐ │ 외부 소스 65+ : Finnhub·Yahoo·OpenSky·GDELT·ACLED·UCDP·FIRMS·FRED… │ └───────────────────────────────┬──────────────────────────────────────┘ │ ① 시드(seed) : Railway 릴레이가 주기적으로 가져옴 ▼ ┌────────────────────────────┐ │ Upstash Redis (캐시) │ ← seed-meta:<key> 에 │ 3~4단계 캐시·스탬피드 방지 │ {갱신시각, 건수} 함께 기록(신선도) └──────────────┬─────────────┘ │ ② 요청 시 Edge 함수가 캐시를 읽음(없으면 외부 호출 후 캐시) ▼ ┌──────────────────────────────────────────────────┐ │ Vercel Edge Functions 60+ (proto 계약 기반) │ │ gateway: 출처검사→CORS→키검증→레이트리밋→라우팅 │ │ →핸들러→ETag(304)→캐시헤더 │ └──────────────────────────┬───────────────────────┘ │ ③ /api/bootstrap 한 방으로 다량 키를 일괄 수화(hydration) ▼ ════════════ 브라우저 / 데스크탑 (App.init 8단계) ════════════ │ ④ 부트스트랩 수화(빠른 3s + 느린 5s 두 갈래 동시) │ ▼ ⑤ 렌더 : PanelLayoutManager → 86종 Panel + 듀얼 지도(globe.gl / deck.gl) │ (패널은 setContent로 그리고 viewport 근처일 때만 데이터 요청) ▼ ⑥ AI/분석 (웹 워커 — UI 안 끊김) │ • ml.worker : ONNX(@xenova) 임베딩·감성·요약·개체추출(NER) │ • analysis.worker : 뉴스 군집화(Jaccard) · 도메인 간 상관 탐지 │ • 상관관계 엔진 : 신호 수렴 시 'Convergence Card' 생성(필요시 LLM 평가) ▼ ⑦ 스마트 폴링 : 지수 백오프·뷰포트 조건부·탭 숨김 시 일시정지로 재요청 ════════════════════════════════════════════════════════════════
용어
시드(seed) & 부트스트랩(bootstrap) 수화
시드는 백그라운드 일꾼(Railway 릴레이)이 외부 데이터를 미리 가져와 Redis에 채워 두는 작업이다. 부트스트랩 수화는 브라우저가 켜질 때 /api/bootstrap 한 번 호출로 여러 키를 한꺼번에 받아와 화면을 채우는 것. 덕분에 첫 화면이 빠르게 뜬다("수화=hydration"은 빈 껍데기에 데이터를 부어 살리는 비유).

핵심 설계 패턴 1 — 게이트웨이 팩토리 (모든 Edge 함수의 공통 파이프라인)

도메인별 API(뉴스·시장·항공…)는 매번 보안·캐시 코드를 새로 짜지 않는다. server/gateway.tscreateDomainGateway()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…)

핵심 설계 패턴 2 — 캐시 코얼레싱 (같은 요청은 한 번만 외부로)

인기 데이터에 1초에 100명이 몰리면, 외부 API를 100번 부르면 안 된다. server/_shared/redis.tscachedFetchJson()동시에 들어온 같은 키의 캐시 미스를 하나로 묶어(coalesce), 외부 호출 1번 + Redis 쓰기 1번으로 처리하고 나머지는 그 결과를 공유한다. 이것이 65개 소스를 적은 비용으로 굴리는 비결이다.

캐시 티어s-maxage쓰임새
fast300초라이브 이벤트·항공 상태
medium600초시장 시세·종목 분석
slow1800초ACLED 분쟁·사이버 위협
static7200초인도주의 요약·ETF 흐름
daily86400초핵심 광물·정적 참조 데이터
no-store0선박·항공기 실시간 스냅샷

핵심 설계 패턴 3 — 국가 불안정 지수(CII)와 상관관계 엔진

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분 캐시). 즉 "군사+경제+재난 신호가 한 지역에 몰리는 순간"을 기계가 먼저 알아챈다.

핵심 설계 패턴 4 — 하나의 코드, 6가지 변종(variant)

tech.·finance.·commodity.·happy.·energy. 등 6개 사이트는 전부 같은 코드베이스다. 접속 호스트명(또는 데스크탑의 localStorage)으로 변종을 감지해 기본 패널·지도 레이어·새로고침 주기·테마·UI 문구를 통째로 바꾼다. Vite 빌드 시 변종별로 안 쓰는 패널 묶음을 잘라내(코드 분할), 같은 소스에서 가벼운 전용 앱들을 찍어낸다.

5디렉토리 구조 해부

레포는 '프론트(src/) + 서버리스(api·server/) + 계약(proto/) + 데스크탑(src-tauri/)'의 대형 모노레포다.

최상위는 크게 ① 프론트엔드(src/) ② 서버리스 API(api/·server/) ③ API 계약(proto/) ④ 데스크탑(src-tauri/) ⑤ 운영 스크립트(scripts/)로 나뉜다. src/ 안의 핵심은 3분할이다 — components(화면 부품 155개), services(도메인 데이터 로직 24개), workers(무거운 계산을 background로).

worldmonitor/ ← 저장소 루트 (모노레포) ├── src/ ★ 프론트엔드 (바닐라 TypeScript) │ ├── main.ts 진입점(Sentry·analytics·fetch 패치·App 생성) │ ├── App.ts App.init() 8단계 부팅 │ ├── app/ AppContext(중앙 상태)·refresh-scheduler │ ├── components/ ★ 화면 부품 155개 │ │ ├── Panel.ts 모든 패널의 부모(setContent·이벤트 위임) │ │ ├── DeckGLMap.ts 평면 WebGL 지도 │ │ └── GlobeMap.ts 3D 지구본 │ ├── services/ ★ 도메인 데이터 로직 24종 │ │ ├── market/ conflict/ maritime/ aviation/ cyber/ │ │ ├── climate/ wildfires/ displacement/ supply-chain/ │ │ ├── intelligence/ CII·위험점수 │ │ └── correlation-engine/ ★ 신호 수렴 탐지(engine.ts) │ ├── workers/ ★ 웹 워커(UI 안 끊기게 background) │ │ ├── ml.worker.ts ONNX 추론(@xenova): 임베딩·감성·요약·NER │ │ ├── analysis.worker.ts 뉴스 군집화·상관 탐지 │ │ └── vector-db.ts IndexedDB 벡터 저장(의미 검색) │ ├── config/ 변종(variant)·지도 레이어·ML 모델 정의 │ ├── generated/ proto에서 자동 생성된 client/server 코드 │ ├── locales/ 24개 언어 JSON(ko.json 포함) │ └── utils/ types/ styles/ ├── api/ ★ Vercel Edge Functions (47개 도메인 폴더) │ ├── bootstrap.js 한 번에 다량 키 수화 │ ├── health.js 각 키의 신선도(STALE/WARN/EMPTY) 점검 │ ├── _cors.js _rate-limit.js _api-key.js _relay.js 공통 헬퍼 │ └── news/ market/ conflict/ aviation/ cyber/ mcp/ … ├── server/ ★ 게이트웨이·도메인 핸들러(esbuild로 함수에 번들) │ ├── gateway.ts createDomainGateway(10단계 파이프라인) │ ├── _shared/redis.ts cachedFetchJson(캐시 코얼레싱) │ └── worldmonitor/<도메인>/v1/handler.ts ├── proto/ ★ Protocol Buffers 계약(276 proto·34 서비스) ├── shared/ 브라우저·서버 공용(cii-weights.ts 등) ├── src-tauri/ ★ 데스크탑(Rust) + Node.js 사이드카 │ ├── src/ Tauri 셸(키체인·IPC·창 관리) │ ├── sidecar/ local-api-server.mjs(로컬 API) │ └── tauri.conf.json 변종별 conf(tech/finance) ├── scripts/ 시드(seed-*.mjs)·릴레이(ais-relay.cjs)·린트·검증 ├── convex/ 문의·대기열 폼 백엔드 ├── docker/ Dockerfile.* docker-compose.yml 컨테이너 배포 └── ARCHITECTURE.md README.md SELF_HOSTING.md 문서
비유

이 구조는 대형 방송국과 같다. src/components스튜디오의 모니터·자막기(보이는 부품), src/services각 부서 취재팀(시장팀·국방팀·기상팀), src/workers지하 편집실(무거운 영상 처리를 따로), api·server외부 통신망과 자료실(외부 소스 받아 캐시), proto부서 간 공용 문서 양식(서로 어긋나지 않게)이다.

6학습 포인트 (기술별)

한 레포에 '프레임워크 없는 대규모 SPA + WebGL 지도 + 서버리스 + 브라우저 AI + 데스크탑'이 다 들어 있다.

① 프레임워크 없이 대규모 SPA 설계하기

"React 없이 어떻게 155개 컴포넌트를 관리하지?"의 살아 있는 답이다. Panel 기반 클래스(공통 setContent + 이벤트 위임)와 AppContext 중앙 객체로 상태 라이브러리 없이 상태를 다룬다. 프레임워크가 숨겨주던 것(렌더 타이밍·디바운스·이벤트 위임)을 직접 마주하며 배우기 좋다.

실습 아이디어

src/components/Panel.ts를 읽고 "setContent가 왜 150ms 디바운스를 거나", "이벤트 위임이 왜 안정적인 this.content에 붙나"를 정리해 보라. 그리고 같은 패턴으로 나만의 미니 패널을 하나 추가해 본다.

② WebGL 지리 시각화 — deck.gl & globe.gl

수만 개의 점(선박·항공기·이벤트)을 지도에 부드럽게 그리는 법을 배우는 최고의 교재다. src/config/map-layer-definitions.ts에는 각 레이어가 평면/지구본 중 어디서 되는지, 프리미엄인지, 어느 변종에 보이는지가 선언돼 있다. supercluster 군집화, pmtiles 셀프호스팅 타일도 실전 예제.

실습 아이디어

deck.gl ScatterplotLayer임의의 위경도 1만 개를 지도에 찍어 보고, supercluster를 붙여 줌 레벨에 따라 군집이 합쳐지는 걸 관찰하라.

③ 브라우저 안의 AI — Transformers.js + ONNX + 웹 워커

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요청을 보낼 때 외부 호출 횟수가 어떻게 줄어드는지 측정하라.

⑤ Protocol Buffers 계약 우선 개발

proto/의 276개 정의에서 TS 클라이언트·서버·OpenAPI가 자동 생성된다. CI(proto-check.yml)가 "생성물이 최신인지" 강제한다. "계약을 먼저 쓰고 코드는 생성"하는 대규모 API 설계를 배운다.

⑥ Tauri 2 데스크탑 + 보안 사이드카

src-tauri/는 웹 코드를 네이티브 데스크탑 앱으로 만드는 법을 보여준다. 특히 OS 키체인에 비밀 저장 → IPC로 사이드카에 주입, 렌더러↔사이드카 신뢰 경계, fetch 패치로 API를 로컬로 우회하는 설계는 보안 관점에서도 훌륭한 사례다.

7하드웨어/시스템 요구사항

그냥 쓰는 건 브라우저면 충분 — 부담은 '셀프호스팅 운영'과 '브라우저 AI 모델 다운로드'다.

그냥 써보는 거라면 worldmonitor.app에 접속하거나 데스크탑 앱을 받으면 끝이다. 직접 돌리는(셀프호스팅) 경우, 무거운 LLM 추론은 외부(Groq/OpenRouter)나 로컬 Ollama가 맡고, 코드 자체는 Node 환경에서 가볍게 돈다. 진짜 변수는 ① 일부 기능의 API 키, ② 브라우저 AI를 켜면 받는 ONNX 모델 용량, ③ 로컬 Ollama를 쓸 때의 GPU/RAM이다.

항목최소/기본비고
개발 환경Node.js + npm installnpm run dev환경변수 0개로도 구동(localhost:3000)
셀프호스팅docker compose up -d --buildapp + 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 CLImacOS(ARM/x64)·Windows·Linux 타깃
초보자가 놓치는 함정
"키가 없어도 돌아간다 = 모든 데이터가 진짜로 나온다 가 아니다"

World Monitor의 미덕은 graceful degradation(키 없으면 해당 기능만 끔)이다. 그래서 처음엔 "잘 도네!" 싶지만, 항공 운임(fly 명령)처럼 키가 있어야 진짜 값이 나오는 기능은 "credentials required"만 뜬다(가짜 데이터를 만들어 보여주지 않는 게 설계 원칙). 또 Docker로 띄울 땐 REDIS_TOKEN·REDIS_PASSWORDopenssl rand -hex 32직접 생성해야 컨테이너가 뜬다(기본값 없음).

8직접 해볼 수 있는 실습 과제

"실행 → 패널 추가 → 지도 레이어 → 캐시·계약 → AI 워커"로 난이도 상승.

과제 1. 클론해서 띄우고 변종 둘러보기 난이도 ★☆☆☆☆

git clonenpm installnpm run dev로 기본 앱을 띄운다(환경변수 0개). 이어서 npm run dev:tech·dev:finance같은 코드가 어떻게 다른 앱이 되는지 비교하고, 어떤 패널·지도 레이어가 달라지는지 메모한다.

과제 2. 나만의 패널 한 개 추가 난이도 ★★☆☆☆

src/components/Panel.ts를 부모로 하는 작은 패널을 만들어 패널 그리드에 띄운다. setContent(html)로 그리고, 버튼 클릭을 이벤트 위임으로 처리해 본다. 프레임워크 없이 컴포넌트를 다루는 감을 잡는 단계.

과제 3. deck.gl 지도 레이어 실험 난이도 ★★★☆☆

src/config/map-layer-definitions.ts 구조를 읽고, 새 ScatterplotLayer를 정의해 임의 데이터를 평면 지도에 띄운다. 가능하면 supercluster 군집화를 붙이고, 3D 지구본(globe.gl)에서는 어떻게 표현이 달라지는지 확인한다.

과제 4. Edge 함수 + 캐시 코얼레싱 직접 구현 난이도 ★★★★☆

server/gateway.ts의 파이프라인과 cachedFetchJson을 참고해, 외부 API 하나를 감싸는 미니 게이트웨이를 만든다. ETag/304, IP 레이트리밋, 동시 미스 코얼레싱을 넣고 부하 테스트로 외부 호출 횟수를 측정하면 설계의 효과가 숫자로 보인다.

과제 5. 브라우저 AI로 뉴스 군집화 + 상관 카드 난이도 ★★★★★

src/workers/ml.worker.tsanalysis.worker.ts, correlation-engine/engine.ts를 읽고, 임베딩 → 유사도 군집 → 거리 기반 신호 수렴 → 수렴 카드의 흐름을 미니 버전으로 재현한다. 여유가 되면 점수가 높을 때만 LLM 평가를 붙여(동시 호출 제한·캐시 포함) World Monitor의 분석 두뇌를 따라 만들어 본다.

9관련 기술 심화 학습 로드맵

'바닐라 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/로 "웹→네이티브" 확장.
학습 팁
"ARCHITECTURE.md → 코드 → 라이브 데모"의 삼각 독해

World Monitor는 드물게 아키텍처 문서가 코드와 CI로 검증되는(숫자를 손으로 못 고치게 막은) 레포다. 1) ARCHITECTURE.md에서 전체 그림을 잡고 → 2) 해당 섹션의 "Source files"에 적힌 실제 파일을 열어 대조하고 → 3) worldmonitor.app 라이브 데모에서 그 기능이 화면에 어떻게 나오는지 확인하면, 대규모 실서비스의 설계가 입체적으로 잡힌다.

10핵심 키워드 사전

World Monitor 문서·코드에서 반복되는 용어를 한 곳에.

용어
상황 인식 (Situational Awareness)
군사·항공에서 온 개념으로, "지금 내 주변 전체에서 무슨 일이 일어나는지 파악하는 능력". World Monitor의 존재 이유 — 흩어진 소스를 하나의 작전 그림(operational picture)으로 합친다.
용어
CII (Country Instability Index)
31개 주요국의 불안정 스트레스 점수. 나라별 baselineRisk(기본 위험)와 eventMultiplier(이벤트 민감도)를 두고, 뉴스 속 관련 사건으로 점수를 올린다. 계수는 shared/cii-weights.ts에 단일 출처로 둔다.
용어
상관관계 엔진 (Correlation Engine) / 수렴 카드
군사·경제·재난 등 여러 도메인 신호가 같은 시점·지역으로 모이는 순간을 거리(haversine) 기반 군집화로 잡아 "수렴 카드(Convergence Card)"를 만든다. 점수가 높으면 LLM이 의미를 평가한다.
용어
Edge Functions / 게이트웨이 팩토리
Edge Function은 요청이 올 때만 전 세계 엣지에서 깨어나는 작은 서버리스 함수. 게이트웨이 팩토리(createDomainGateway)는 출처검사·CORS·키검증·레이트리밋·ETag 같은 공통 단계를 자동 조립해 준다.
용어
캐시 코얼레싱 & 스탬피드 방지
스탬피드는 캐시가 비는 순간 같은 요청이 외부 API로 폭주하는 현상. 코얼레싱(coalescing)은 동시에 들어온 같은 키의 미스를 하나로 묶어 외부 호출 1번만 하고 결과를 공유하는 것. cachedFetchJson이 담당.
용어
Protocol Buffers / sebuf
구글이 만든 데이터·API 계약 형식(언어 중립). World Monitor는 276개 proto에 sebuf HTTP 어노테이션을 달아 TS 클라이언트·서버·OpenAPI를 자동 생성한다(손으로 안 짬). CI가 생성물 최신 여부를 강제.
용어
Tauri & 사이드카(sidecar)
Tauri는 Rust로 만든 가벼운 데스크탑 앱 셸(Electron 대안). 사이드카는 그 안에서 도는 Node.js 미니 API 서버로, OS 키체인의 비밀을 받아 로컬에서 /api/*를 처리한다(실패 시 클라우드로 폴백).
용어
변종 (Variant)
하나의 코드베이스로 찍어내는 6개 사이트(world/tech/finance/commodity/happy/energy). 호스트명으로 감지해 기본 패널·지도 레이어·테마·새로고침 주기·UI 문구를 통째로 바꾼다.
용어
graceful degradation (우아한 성능 저하)
의존하는 외부 키·데이터가 없을 때 앱 전체가 죽지 않고 해당 기능만 비활성/안내되는 설계. World Monitor가 "환경변수 0개로도 구동"되는 비결이자, 가짜 데이터를 만들지 않는 원칙.

11참고 링크

공식 저장소·라이브 데모·문서·커뮤니티.

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