每天一个开源项目#46 World Monitor:6.6万星、56层地图的全球情报中枢
GitHub Trending 第 1/21 名|2026-07-22 快照|66,724 Stars|10,331 Forks|TypeScript|AGPL-3.0-only
📋 项目概览
| 项目 | 信息 |
|---|---|
| 项目名 | koala73/worldmonitor |
| 一句话定位 | 将新闻、军事、灾害、金融与基础设施数据汇聚到同一张实时态势图,并向人和 AI Agent 提供统一情报接口 |
| Trending 排名 | 今日第 1,共收录 21 个项目 |
| Stars / Forks | 66,724 / 10,331(Trending 快照) |
| 主要语言 | TypeScript 53.0%、JavaScript 43.3%、CSS 2.2%、HTML 0.9%,另含 Rust、Go、Python、Ruby |
| License | 仓库 LICENSE 与 package.json 均为 AGPL-3.0;GitHub API 的 NOASSERTION 未正确识别许可证 |
| 创建时间 | 2026-01-08 |
| 源码版本 | main/package.json:2.10.0 |
| 发布版本 | GitHub Release:v2.5.23;npm CLI:0.1.3;MCP Server:1.15.0,各发布面版本独立 |
| 项目规模 | 4,415 个文件;281 个 Proto;35 个服务域;56 类地图图层;25 种语言 |
🔥 为什么值得关注
World Monitor 不是"把 RSS 铺到地图上"的简单看板。它试图解决的是一个更难的工程问题:如何把 567 个新闻源、65+ 上游服务、军事与民航轨迹、灾害、市场、制裁、通信中断和关键基础设施转换为可查询、可关联、可降级的统一态势图。仓库在不到七个月内获得 6.6 万 Stars,并冲到今日 Trending 第一,说明实时 OSINT(开源情报)正在从少数分析师使用的专业系统,走向开发者、媒体、研究机构和 AI Agent 都能消费的平台能力。
它真正有技术含量的地方是"中间层":前端用双地图引擎承载 56 类图层,后台以 Proto 契约生成客户端、服务端类型和 OpenAPI;Redis、CDN、内存缓存与 stale-on-error 构成多级容错;浏览器 Web Worker 又负责聚类、本地 ONNX 推理和语义记忆。项目还把同一套能力暴露成 REST、MCP、CLI 和四种语言 SDK,使其不只是一款产品,也是一套可被自动化系统调用的全球事件数据底座。
不过,规模大不等于结论可靠。CII(国家不稳定指数)、战略风险和级联影响都含有人工权重、基线与启发式规则;数据源也存在授权、时效、地理覆盖和政治偏差。更合适的定位是"态势发现与调查入口",而不是能够替代专业分析、事实核验或投资决策的权威系统。
🏗️ 核心特性
1. 567 个信息源与 56 类地图图层
仓库内由 CI 生成的 docs/generated/stats.json 显示:项目当前维护 567 个 Feed 定义、56 类地图图层、105 个 Panel 类、200 个顶层 Service 入口。六种站点变体从同一代码库构建:
| 变体 | 默认图层数 | 侧重点 |
|---|---|---|
| Full / World | 37 | 地缘、军事、灾害与综合态势 |
| Tech | 13 | 科技新闻、网络安全、研究动态 |
| Finance | 17 | 交易所、市场、宏观指标 |
| Commodity | 18 | 能源、金属、供应链 |
| Happy | 6 | 正向事件与公益数据 |
| Energy | 18 | 能源设施、价格和运输 |
地图不是单一路径:平面模式采用 deck.gl + MapLibre GL,支持 GeoJSON、路径、热力、H3 六边形、弧线与聚类;3D 模式采用 globe.gl + Three.js。所有标记使用 _kind 判别联合类型,让 TypeScript 在新增标记类型时暴露未处理的渲染分支。
2. 跨流关联,而非单源告警
项目的热点升级不是由一条新闻直接触发,而是组合多种信号:
text
新闻活动 35% + 国家不稳定指数 25%
+ 地理汇聚 25% + 军事活动 15%
↓
动态分数 × 70% + 静态基线 × 30%
↓
热点升级、战略风险与情报缺口提示
地理汇聚把 24 小时内的抗议、军机、舰船和地震等事件装入 1° × 1° 网格;同一网格出现至少三类事件才发出高优先级告警。CII v8 则为 31 个 Tier-1 国家计算 0---100 分:结构性基线占 40%,事件分占 60%,后者继续拆成抗议、冲突、安全与信息压力。对民主国家的高频抗议采用对数压缩,对部分威权国家采用更接近线性的放大方式,意图降低"事件多就一定更危险"的机械偏差。
这些公式透明、可审计是优点,但权重仍是模型假设。读者应把分数视为线索排序,而非事件真伪或国家风险的客观测量。
3. 浏览器本地 AI 与离线降级
ml.worker.ts 通过 Transformers.js / ONNX Runtime Web 在 Web Worker 中执行 MiniLM-L6 嵌入、情感分析、摘要和实体识别;vector-db.ts 以 IndexedDB 保存向量,用于标题语义记忆。analysis.worker.ts 负责 Jaccard 新闻聚类与跨域关联,避免把重计算压到主线程。
AI 摘要采用多级回退:本地 Ollama → Groq → OpenRouter → 浏览器侧模型。没有任何 API Key 时,地图、静态层与本地模型仍能运行;依赖特定凭据的数据层会被跳过,而不是让整个应用崩溃。这种"能力逐层减少"的设计比宣称"完全离线"更准确。
4. 面向 Agent 的 MCP、REST、CLI 与 SDK
World Monitor 的公开 MCP 端点为 https://worldmonitor.app/mcp,支持 Streamable HTTP、OAuth 2.1 与 X-WorldMonitor-Key。匿名客户端可以执行 initialize、tools/list 等发现方法;真正返回数据的 tools/call 需要认证。仓库统计给出 41 个 MCP 工具,并提供风险、全球简报、市场、冲突、灾害和预测市场等 10 个可嵌入 MCP Apps 的交互界面。
bash
# 无需密钥,查看 MCP 工具目录
npx worldmonitor tools
# 有密钥后查询伊朗风险
npx worldmonitor risk IR --api-key wm_xxx
程序化入口覆盖:
- REST:
https://api.worldmonitor.app - MCP:
https://worldmonitor.app/mcp - CLI:npm 包
worldmonitor,命令别名wm - SDK:Python、Ruby、Go,以及 npm CLI 内置客户端
- 契约发现:OpenAPI、
llms.txt、Agent Skills manifest、API Catalog
5. 多端交付与同构 API
同一代码库产出 Vercel Web、PWA、Tauri 2 桌面程序、Docker 镜像和六个专题站点。桌面版并非简单 WebView 包壳:Rust 负责生命周期、系统密钥环与 IPC,Node.js Sidecar 动态加载 api/ 处理器;渲染进程把 /api/* 请求重写到本地 Sidecar,并用五分钟 TTL 的 Bearer 凭据鉴权,Sidecar 故障时再回退云端 API。
🔬 技术架构深度解析
总体数据路径
text
567 Feeds / 65+ APIs / WebSocket
│
├── Railway Relay + 21 类 Seed 任务
│ └── 原子发布、数据校验、freshness 元数据
│
├── Vercel Edge Functions
│ └── CORS → API Key → 限流 → 路由 → ETag → 缓存
│
└── Upstash Redis
├── 批量 Bootstrap
├── 防缓存击穿
└── stale-on-error
│
Browser / Tauri
┌────────────────┼─────────────────┐
│ │ │
deck.gl 平面图 globe.gl 3D 地球 105 个 Panel
│ │ │
└──── Web Workers / IndexedDB ─────┘
聚类、关联、ONNX、本地向量
│
REST / MCP / CLI / SDK
契约优先:281 个 Proto 驱动 35 个服务域
API 的核心不是手写路由集合,而是 sebuf + Protocol Buffers:
text
proto/*.proto
├── protoc-gen-ts-client → 类型安全 Fetch 客户端
├── protoc-gen-ts-server → Handler 接口与路由描述
└── protoc-gen-openapiv3 → OpenAPI 3.1 文档
Proto 注解把 RPC 映射到 HTTP 动词与路径,buf.validate 描述字段约束。CI 运行代码生成并检查提交结果是否漂移,也用 buf breaking 捕获破坏性契约变更。部署时,各领域的 Edge Function 通过 createDomainGateway 组合对应 Handler,而非把整个服务端一起打包。
共享 Gateway 的处理顺序值得借鉴:来源检查 → CORS → OPTIONS → API Key → 端点与全局限流 → 静态/动态路由 → Handler 边界 → FNV-1a ETag → Cache-Control。其价值不是算法新颖,而是把 35 个领域服务必须遵守的安全和缓存规则固定在一条管线上。
从 38 次冷启动请求压到 2 次
项目将常用数据集分成 fast 与 slow 两个 Bootstrap 层,在页面初始化时并行读取;服务端通过一次 Redis Pipeline 拉取一组键,浏览器把结果放入一次性 hydration cache,Panel 首次挂载时直接消费。
| 工程指标 | 仓库文档给出的实现/结果 | 本次核验结论 |
|---|---|---|
| 首屏数据请求 | 38 个独立请求合并为 2 个 Bootstrap 请求 | 架构与源码文档一致 |
| 首屏收益 | 文档声称典型网络可缩短 2---4 秒 | 未做独立性能复测,不应当作普适基准 |
| 缓存层 | 浏览器内存 → Redis → 上游,外加 CDN | 架构文档与 Gateway 设计一致 |
| 并发 Cache Miss | 同键请求共享 in-flight Promise | 可避免同一实例内的缓存击穿 |
| 后台刷新 | 指数退避,最高 4 倍;隐藏标签页降频 | 通过 SmartPollLoop 统一编排 |
| 带宽 | Relay 响应启用 gzip;文档声称约降 80% | 属项目方陈述,取决于响应内容 |
这里也存在文档版本差异:根 ARCHITECTURE.md 描述 fast/slow 超时分别为 3 秒与 5 秒,而设计文档仍写两个 800ms Abort;因此精确超时应以当前源码为准,不宜只抄某一页文档。
缓存与失败语义
项目没有把"请求成功"误当成"数据新鲜"。Seed 任务在写业务键的同时写入 seed-meta:<key>,记录抓取时间和数据量;Health API 按每个数据源的最大陈旧时间返回 OK / STALE / WARN / EMPTY。如果上游失败,缓存可以返回旧值,同时界面以 Intelligence Gap 显示看不到的数据源。
负缓存也很重要:上游错误会被短暂缓存,避免大量客户端立即重试;Redis 不可用时回退到内存;并发 miss 由 Promise 合并。对于实时数据平台,"如何失败"往往比"顺利时多快"更决定可用性。
代码规模与工程成熟度
本次对 main 分支做了浅克隆和静态统计(排除 .git、构建产物与依赖目录):
| 指标 | 数量 |
|---|---|
| 仓库文件 | 4,415 |
| TypeScript 文件 / 行 | 1,355 / 345,750 |
| JavaScript 文件 / 行 | 111 / 19,537 |
| Proto 文件 / 行 | 281 / 13,378 |
| Rust 文件 / 行 | 3 / 1,578 |
| 名称含 test/spec 的文件 | 1,048 |
tests/ 文件 |
949 |
e2e/ 文件 |
113 |
| CI 工作流 | 21 |
"1,048 个测试文件"是文件名口径,并不等于同等数量的独立测试用例;但测试目录规模、Playwright 六变体冒烟、Proto 漂移检查、API 契约 lint、安全审计和 MCP 在线探针,足以说明它已超出展示型 Demo 的工程阶段。
无框架前端:优势与代价
主应用使用 Vanilla TypeScript,而不是 React/Vue/Svelte。组件由 Panel 基类、事件委托、CustomEvent、localStorage、集中式 AppContext 和 SmartPollLoop 组合完成。优势是运行时开销低、DOM 和 WebView 行为可控;代价则是中央可变状态会随功能增长而变复杂,直接拼接 HTML 也要求严格落实转义、DOMPurify 和安全 lint。
值得注意的是依赖中仍包含 Preact,但核心 Dashboard 的 Panel 系统不以 Preact 为主;因此更准确的表述是"主应用无通用 UI 框架",而不是"仓库完全没有任何框架依赖"。
📖 README 核心内容摘要
README 将 World Monitor 定义为统一态势感知界面,核心承诺可归纳为五层:
- 数据层:500+(当前生成统计为 567)精选 Feed,覆盖 15 类新闻及军事、灾害、金融、气候、网络安全等垂直数据。
- 分析层:新闻聚类、跨流关联、热点升级、CII v8、市场七信号合成和基础设施级联传播。
- 交互层:globe.gl 三维地球与 deck.gl 平面地图,56 种图层、105 类信息面板、25 种语言和 RTL 支持。
- 运行层:Web、PWA、Tauri 桌面、Docker、自托管及本地 Ollama;无环境变量也可启动基础应用。
- Agent 层:MCP、REST、OpenAPI、CLI 与 Python/Ruby/Go SDK,把看板能力转化为机器可调用能力。
README 中最值得保留的设计思想不是"AI 驱动",而是三条工程原则:Speed over perfection、Assume failure、Show what you can't see。即先用快速分类给出结果,再异步精炼;默认外部 API 会失败;数据缺口必须显式展示。
版本信息需要分面理解:源码应用版本已到 2.10.0,但最新 GitHub Release 是 v2.5.23,npm CLI 为 0.1.3,MCP 文档标识 1.15.0。这不必然是发布错误,却说明 App、桌面发行物、CLI 与协议服务并不共享一个版本轴,集成前应分别锁定版本。
🚀 快速上手指南
方式一:直接体验托管版
- 综合版:www.worldmonitor.app
- 科技版:tech.worldmonitor.app
- 金融版:finance.worldmonitor.app
- 能源版:energy.worldmonitor.app
方式二:本地启动
需要 Node.js 22+。基础应用不要求环境变量:
bash
git clone https://github.com/koala73/worldmonitor.git
cd worldmonitor
npm install
npm run dev
当前 vite.config.ts 将开发端口默认设为 3000,可通过环境变量覆盖:
bash
DEV_PORT=4173 npm run dev
然后访问 http://localhost:3000 或自定义端口。部分旧版 Getting Started 文档仍写 Vite 默认的 5173,实际应以当前配置和终端输出为准。
专题变体:
bash
npm run dev:tech
npm run dev:finance
npm run dev:commodity
npm run dev:happy
npm run dev:energy
方式三:调用公开 MCP 发现接口
匿名列举工具不需要 API Key:
bash
curl -s https://worldmonitor.app/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
--data '{
"jsonrpc":"2.0",
"id":1,
"method":"tools/list",
"params":{}
}'
tools/call 和数据型 resources/read 需要 OAuth 或 X-WorldMonitor-Key。不要把 wm_... API Key 当作 Bearer Token;MCP 文档明确要求 API Key 使用专用请求头。
方式四:完整自托管
Docker 自托管不等于"一条命令零配置"。完整栈包含 Dashboard、Relay、Redis 和 Seed 任务,并要求设置 RELAY_SHARED_SECRET、REDIS_PASSWORD、REDIS_TOKEN 等无安全默认值的变量。若要重生成 Proto 客户端和 OpenAPI,还需要 Go 1.21+、Buf 和 sebuf 插件。
AGPL-3.0 对网络服务尤其重要:如果你修改后通过网络向用户提供服务,通常需要向这些用户提供对应修改版源代码。商业部署前应审阅许可证与第三方数据源条款。
📊 增长速度与社区热度
增长速度评估
项目从 2026-01-08 创建到 2026-07-22 快照约 194.3 天,累计 66,724 Stars。由此得到的终身均值是:
- 约 343.5 Stars/天
- 折合约 10,304 Stars/30 天
- Fork/Star 比约 15.48%
这个均值只能说明项目自创建以来总体增长极快,不能冒充今日新增 Stars。本次 Trending 快照没有保存"今日新增 Star"字段,因此无法严谨计算当日增速,也不能从排名第一反推出新增量。
同日稍后的 GitHub API 补充核验显示 Stars 已从快照的 66,724 增至 66,725、Forks 从 10,331 增至 10,333;这只是小时级变化,不足以构成日增长统计。
社区活跃度
| 指标 | 2026-07-22 同日 API 补充核验 |
|---|---|
| Watchers / Subscribers | 417 |
| Open Issues(不含 PR) | 141 |
| Open PR | 97 |
| Closed Issues | 852 |
| Closed PR | 4,221 |
| Issue 历史关闭率 | 85.8% |
| PR 历史关闭率 | 97.8% |
| 近 7 天提交 | 42(约 6.0/天) |
| 近 7 天新 Issue | 47(约 6.7/天) |
| 近 7 天新 PR | 65(约 9.3/天) |
| GitHub Contributors 分页口径 | 约 104 个(含匿名口径) |
活跃度很高,但贡献仍明显集中:API 的贡献榜中维护者 koala73 为 4,465 次,第二名为 84 次。大量外部 PR 与 97 个待处理 PR 说明生态在扩张,同时也意味着合并队列、架构一致性和维护者负荷是后续风险。
今日 GitHub Trending 完整榜单
脚本仅保留了除冠军外项目的仓库名,没有保留它们各自的 Stars、语言和今日新增量;下表因此只呈现可验证的名次与仓库,不补造缺失数据。
| 排名 | 仓库 | 排名 | 仓库 |
|---|---|---|---|
| 1 | koala73/worldmonitor |
12 | hyprwm/Hyprland |
| 2 | bojieli/ai-agent-book |
13 | chrislgarry/Apollo-11 |
| 3 | tirth8205/code-review-graph |
14 | DioxusLabs/dioxus |
| 4 | ayghri/i-have-adhd |
15 | langchain-ai/open_deep_research |
| 5 | earthtojake/text-to-cad |
16 | diegosouzapw/OmniRoute |
| 6 | 1jehuang/jcode |
17 | agegr/pi-web |
| 7 | oblien/openship |
18 | schollz/croc |
| 8 | AstrBotDevs/AstrBot |
19 | microsoft/Ontology-Playground |
| 9 | every-app/open-seo |
20 | dottxt-ai/outlines |
| 10 | tradesdontlie/tradingview-mcp |
21 | KnockOutEZ/wigolo |
| 11 | AlexsJones/llmfit |
🎯 适用场景
| 场景 | 价值 | 使用建议 |
|---|---|---|
| OSINT 与地缘研究 | 将新闻、冲突、军机、舰船、灾害和基础设施叠加,快速发现值得调查的交汇点 | 用作线索发现,回到 ACLED、UCDP、USGS 等原始来源复核 |
| 媒体编辑与应急值班 | 统一观察突发新闻、网络中断、航班延误和灾害 | 配置专题 Panel,并把数据陈旧状态纳入值班规则 |
| 企业风险与供应链 | 追踪港口、航道、海缆、能源与制裁变化 | CII 和级联分数只能作为辅助,不替代行业模型 |
| AI Agent / RAG | 通过 MCP、REST、OpenAPI 获取结构化实时数据 | 先用匿名 discovery 评估工具,再规划认证、配额和缓存 |
| 数据可视化教学 | 学习 deck.gl、globe.gl、H3、Web Worker 和多源地图叠加 | 从单一变体或少量图层切入,不必先理解完整平台 |
| 内网或私有部署 | Tauri Sidecar、Docker 与本地 Ollama 支持敏感工作流 | 审查 AGPL、数据源授权、密钥隔离和网络出口 |
不适合直接承担的任务
- 不能将 AI 摘要、启发式评分或预测直接当作事实结论。
- 不应据此自动执行交易、军事、安全或人员撤离决策。
- 不能假定"自托管"就意味着所有数据都离线;大量图层依赖外部 API。
- 不应忽略数据源覆盖差异、宣传偏差、API 延迟和许可证限制。
💡 总结
World Monitor 最值得研究的不是暗色地图或"开源 Palantir"式视觉冲击,而是它把实时数据产品的几条困难链路放在了同一仓库:多源抓取、契约生成、缓存容错、浏览器本地计算、双地图渲染、多端交付,以及面向 Agent 的标准接口。66,724 Stars 与 15.48% 的 Fork/Star 比证明其需求强烈,42 次周提交和 65 个周新增 PR 则显示项目仍处于高速演进期。
对开发者而言,它是一份大型 TypeScript 实时系统的工程样本;对分析者而言,它是一块高密度"线索雷达";对 Agent 团队而言,它展示了如何把可视化产品进一步变成 MCP/REST 数据能力。真正的采用门槛不在 npm install,而在数据授权、评分解释、来源核验、版本治理和 AGPL 合规。