RepoDaily · 2026-07-22 · Infrastructure / Runtime

WorldMonitor:一套 TypeScript 代码库,六个实时情报仪表盘

#9 Infrastructure / Runtime TypeScript +1,167 koala73/worldmonitor 打开仓库

AGPL-3.0 开源的 OSINT 仪表盘,纯 TypeScript 编写,使用 MapLibre GL、deck.gl 和自研 Protobuf RPC 框架。本期 1,167 星,排名第 9,提供 npm、PyPI、RubyGems 和 Go 多语言 SDK。

项目类型Infrastructure / Runtime
最适合需要自托管、以地图为核心的全景态势感知仪表盘的 OSINT 分析师、地缘政治研究人员和运营团队
风险等级中等 —— AGPL-3.0 网络使用披露要求、单一核心维护者(Elie Habib)、数据源依赖外部 RSS 和新闻源
评估时间2-3 小时完成克隆、安装依赖、本地运行某个变体并检查变体配置系统

核心问题: 你的团队是否能在满足 AGPL-3.0 源码披露义务的前提下,运行一个依赖第三方 RSS 和新闻数据源的实时 OSINT 仪表盘?

90/100

RepoDaily 采用评分

RepoDaily 将该项目的采用分评为 90/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。

基于 RepoDaily 来源和采用说明的方向性评分,不是基准测试。风险: 中
100证据质量

包含 5 个来源、覆盖 3 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。

100可安装/可试用性

检测到 7 个工作流步骤、6 个下一步动作,以及 5 个命令/安装信号。

70维护可信度

趋势热度为 +1,167 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。

93生产准备度

采纳风险标记为 medium,并包含 5 条安全说明与 4 条跳过条件。

100差异化

3 个机会视角、4 个替代方案,以及 3 个类型化模块支撑差异化判断。

82许可证清晰度

文章中包含许可证来源或许可证表述。

72Agent / AI 适配度

文章正文和元数据中检测到 4 个 AI/Agent 相关信号。

项目概览

WorldMonitor 是一个实时全球情报仪表盘,完全用纯 TypeScript 编写——没有 React、没有 Vue、没有任何 UI 框架。它聚合 OSINT 数据流,应用 AI 信号分析,并将所有内容渲染到由 MapLibre GL 和 deck.gl 驱动的交互式地图上。本期获得 1,167 颗星,排名第九,表明开发者正在积极寻找 Palantir、Recorded Future 等商业情报平台的开源替代方案。

项目最具代表性的架构选择是变体系统。一套代码库可以生成六个不同的仪表盘,每个针对不同的情报领域。`full` 变体覆盖地缘政治、军事冲突和基础设施;`tech` 聚焦初创企业、AI/ML、云和网络安全;`finance` 追踪市场、央行和大宗商品;`commodity` 和 `energy` 分别聚焦矿业/能源市场和能源安全咽喉点;`happy` 则呈现正面新闻和建设性信号。变体配置位于 `src/config/variants/`,在构建时通过 Vite 环境变量选择。

在底层,World Monitor 使用自研的 Protobuf 优先 RPC 框架 Sebuf。`proto/` 中的服务和消息定义覆盖 36 个领域,Sebuf 自动生成带类型的客户端和服务端存根到 `src/generated/`。这为 35 个服务端处理领域提供了编译时 API 契约,无需引入 gRPC-Web 或 tRPC 等重型框架。服务端处理器位于 `server/`,Edge Functions 位于 `api/`,最终通过 Vercel Edge Functions 部署为 API 网关。

分发渠道覆盖广泛:npm 包 `worldmonitor`、PyPI SDK `worldmonitor-sdk`、RubyGem `worldmonitor`、Go SDK(`github.com/koala73/worldmonitor/sdk/go`),以及通过 Smithery 发布的 MCP 服务器。桌面构建使用 Tauri v2 支持 Windows、macOS 和 Linux,通过 Node.js sidecar(`local-api-server.mjs`)包装 Vite 前端。许可证为 AGPL-3.0,允许自托管,但要求对网络上可访问的修改版本披露源码。

解决什么问题

  • OSINT 数据分散在 RSS 源、新闻 API、社交媒体流和手动监控工具中,缺乏统一的可视化层
  • 商业情报平台(Palantir、Recorded Future、Maltego)闭源、昂贵且不可自托管
  • 分析师需要以地图为中心的实时叠加层来追踪地理事件——冲突、基础设施中断、航运咽喉点——并组合多种数据源
  • 自建完整的态势感知技术栈通常需要拼接独立的摄取、地图、告警和分析工具

工作原理

  1. 克隆仓库并运行 `npm ci`——postinstall 脚本同时安装 blog-site 依赖
  2. 通过 `npm run dev`(full)、`npm run dev:tech`、`dev:finance`、`dev:commodity`、`dev:happy` 或 `dev:energy` 选择变体——每个命令设置 `VITE_VARIANT` 并从 `src/config/variants/` 加载对应配置
  3. Sebuf 从 `proto/` 中覆盖 36 个领域的 Protobuf 定义生成带类型的客户端和服务端存本——输出到 `src/generated/`,不可手动编辑
  4. MapLibre GL 渲染基础地图(瓦片、地球模式、相机控制);deck.gl 叠加 WebGL 图层,包括散点图、GeoJSON、弧线和热力图
  5. d3 负责图表和迷你图;`src/workers/` 中的 Web Workers 处理后台信号分析,避免阻塞 UI
  6. Vercel Edge Functions 在 `api/` 中提供 API 网关;桌面版则由 Tauri v2 用 `src-tauri/sidecar/local-api-server.mjs` 包装前端
  7. Docker 自托管使用三阶段构建:通过 `docker/build-handlers.mjs` 编译 TS 处理器、构建 Vite 前端,最终在 supervisord 下通过 nginx + node 服务于 8080 端口

产品演示与界面预览

World Monitor 仪表盘展示以地图为中心的 OSINT 可视化,包含地理叠加层和实时情报面板
World Monitor 仪表盘界面 — 默认的 full 变体仪表盘,展示 MapLibre GL 基础地图、deck.gl 地理叠加层和实时情报面板。 README.md image

架构:纯 TypeScript、Sebuf RPC 与 163 个组件

World Monitor 刻意避免使用 UI 框架。整个前端——`src/components/` 中的 163 个顶级 TypeScript 组件文件——都是用 Vite 构建的纯 TypeScript。这消除了框架抽象开销,让渲染栈更贴近 DOM,但也意味着贡献者需要理解项目自建组件模式,而非依赖 React 或 Vue 的约定。

Sebuf RPC 框架是项目最具特色的底层设施选择。服务和消息定义使用 Protobuf 和 Buf 存放在 `proto/` 中。Sebuf 将其编译为 `src/services/` 中的带类型客户端包装器和 `server/` 中 35 个处理器领域的服务端存根。`src/generated/` 目录存放所有自动生成的代码,明确标记为禁止手动编辑。`scripts/enforce-sebuf-api-contract.mjs` lint 脚本验证 API 路由是否符合 proto 定义,在 CI 阶段捕获偏差。

地图技术栈将 MapLibre GL(基础渲染:瓦片、地球模式、相机)与 deck.gl(WebGL 叠加层:散点图、GeoJSON、弧线、热力图)配合使用。d3 处理补充图表和迷你图。这一组合支持密集的地理可视化而无需商业地图许可。地理要素、军事设施、管道和港口的静态数据集以 JSON 文件形式存放在 `src/config/` 和 `data/` 中。

命令、Lint 脚本与安全检查

  • 开发:`npm run dev`(full)、`npm run dev:tech`、`dev:finance`、`dev:commodity`、`dev:happy`、`dev:energy`——各使用 `cross-env` 设置 `VITE_VARIANT`
  • Lint:`npm run lint` 在 `src`、`server`、`api`、`tests`、`e2e`、`scripts` 和 `middleware.ts` 上运行 Biome,外加 `lint:safe-html` 用于 HTML 消毒强制执行
  • API 契约:`npm run lint:api-contract` 执行 `scripts/enforce-sebuf-api-contract.mjs` 验证路由/proto 对齐
  • 限流:`npm run lint:rate-limit-policies` 通过专用 tsx 脚本强制执行限流配置
  • 安全:`npm run security:local-env-dumps` 和 `npm run security:vite-env-secrets` 扫描本地环境和 Vite 环境文件中的泄露密钥
  • Unicode 安全:`npm run lint:unicode` 运行 `scripts/check-unicode-safety.mjs` 防止有问题的 Unicode 字符
  • 构建:`npm run build` 执行 `security:vite-env-secrets --strict`,然后构建 Vite 前端和可抓取语料库

Docker 自托管:三阶段构建、8080 端口、非 Root 运行

Dockerfile 定义了三阶段多阶段构建。第一阶段(builder)使用 `node:24-alpine`,运行 `npm ci --ignore-scripts`,通过 `docker/build-handlers.mjs` 将 TypeScript API 处理器编译为自包含 ESM 包,然后构建可抓取静态语料库和 Vite 前端到 `dist/`。第二阶段(runtime-deps)仅安装 `docker/runtime-package.json` 中列出的最小运行时包——刻意小于完整生产依赖图。第三阶段(final)将 nginx(静态文件)与 Node.js sidecar(API 路由)通过 supervisord 组合管理。

最终镜像以非 root 的 `appuser`(属于 `appgroup` 组)运行。健康检查通过 nginx 的 `/api/` 代理探测 `/api/sidecar-health`——这是 `local-api-server.mjs` 中的一个免认证存活路由——地址为 `127.0.0.1:8080`。Dockerfile 明确说明使用 `127.0.0.1` 而非 `localhost`,因为 `localhost` 会先解析为 `::1`,而 nginx 不在该地址监听。Sidecar 需要运行时依赖如 `@upstash/ratelimit`,这些依赖未被 `build-handlers.mjs` 打包,Dockerfile 明确记录了将 `node_modules` 复制到最终阶段的原因。

谁适合关注

适合关注

  • 需要自托管、以地图为中心的仪表盘而非商业 SaaS 的 OSINT 分析师和地缘政治研究人员
  • 追踪军事、能源、金融和科技领域实时全球事件的新闻编辑室和智库
  • 评估纯 TypeScript + Protobuf 架构用于大规模地图仪表盘的开发者
  • 需要通过 Tauri v2 打包的桌面情报工具以支持离线或隔离环境的团队

可以先跳过

  • 无法满足 AGPL-3.0 对网络可访问修改版本源码披露要求的组织
  • 数据可靠性依赖有保障 SLA 的团队——World Monitor 聚合的外部 RSS 和新闻源的可用性不在项目控制范围内
  • 需要成熟的多维护者治理模式的项目——LICENSE 中仅列出 Elie Habib 为版权持有人
  • 需要无需任何本地设置、配置或 Docker 部署的即用型 SaaS 的用户

风险与注意事项

AGPL-3.0 限制商业网络部署,代码库规模庞大(163 个组件、35 个处理器领域、25 个语言文件)且由单一核心维护者维护,数据可靠性依赖第三方 RSS 和新闻源。

  • AGPL-3.0 第 13 条要求对网络上可访问的修改版本披露源码,这限制了闭源商业使用
  • 代码库包含 163 个顶级组件文件和 35 个服务端处理器领域——新贡献者上手需要理解 Sebuf、变体系统和自定义 lint 流水线
  • 外部数据源(RSS 源、新闻 API)不在项目控制范围内;源中断或 API 变更可能在无预警的情况下降低仪表盘准确性
  • LICENSE 仅列出单一版权持有人(Elie Habib),长期维护承诺存在关键人员风险
  • Dockerfile 最终镜像以非 root `appuser` 运行,明确 chown 了可写目录
  • 两个专用安全脚本:`security:local-env-dumps` 和 `security:vite-env-secrets`(后者在构建时以 `--strict` 模式运行)
  • 自定义 lint 脚本强制执行 API 契约合规性、限流策略、安全 HTML 渲染和 Unicode 安全
  • Docker 中的运行时依赖集刻意最小化(`docker/runtime-package.json`),以减少攻击面
  • `e2e/` 目录中的 Playwright 覆盖端到端和视觉回归测试

替代方案比较

方案适用场景代价
OpenCTI
需要结构化网络威胁情报管理,支持 STIX/危害指标工作流,而非地缘政治地图仪表盘免费 / 开源(BSD-3-Clause)
MISP
优先在组织和社区间共享威胁指标,而非实时态势地图可视化免费 / 开源(AGPL-3.0)
Recorded Future
需要商业化的全托管情报平台,配备专属分析师支持和专有数据集合商业订阅
Palantir Foundry / Gotham
组织需要企业级数据集成、本体建模和政府合规的大规模部署商业企业许可

这个趋势说明了什么

为垂直领域创建自定义变体

`src/config/variants/` 中的变体系统使用 Vite 环境变量切换面板、地图图层和 RSS 源。创建一个新变体——例如气候监测或公共卫生监控——只需添加一个配置目录和一个模仿现有 `dev:*` 模式的 npm 脚本。

克隆仓库,从 `src/config/variants/` 复制现有变体配置,在 package.json 中添加 `dev:climate` 脚本,本地运行验证面板和源切换。

通过 MCP 服务器实现 AI 驱动的情报简报

World Monitor 通过 Smithery 发布了 MCP 服务器(`wm-mcp`)。这允许 AI 代理以编程方式查询仪表盘数据——通过标准化工具接口请求实时地缘政治摘要、基础设施状态或市场信号。

从 `smithery.ai/servers/worldmonitor/wm-mcp` 安装 MCP 服务器,连接到兼容 MCP 的 AI 客户端,发出关于当前地缘政治事件的自然语言查询。

为新闻编辑室部署自托管情报仪表盘

目前依赖跨多个标签页和源手动监控的新闻编辑室,可以部署 Docker 镜像到 8080 端口,配置特定领域的 RSS 源,为记者提供统一的地图视角来查看突发事件。

通过三阶段 Dockerfile 部署,在 `src/config/` 中配置 RSS 源,验证 `/api/sidecar-health` 健康检查通过 nginx 代理。

下一步建议

本地运行 Full 变体并检查 Sebuf 流水线

评估 World Monitor 最快的方式是克隆、运行默认的 `full` 变体,并追踪一个 Protobuf 定义如何变成类型化 API 端点。这能在投入自定义变体创建或 Docker 部署之前揭示架构是否适合团队的约束。

  1. 克隆:`git clone https://github.com/koala73/worldmonitor.git && cd worldmonitor`
  2. 安装:`npm ci`(注意:postinstall 同时安装 blog-site 依赖)
  3. 运行 full 变体:`npm run dev`,打开 Vite 开发服务器 URL
  4. 检查 `proto/` 查看 36 个领域的服务定义
  5. 查看 `src/config/variants/` 理解六个变体的差异
  6. 运行 `npm run lint:api-contract` 验证 Sebuf API 契约强制执行

RepoDaily 判断

World Monitor 是目前架构上最具雄心的开源 OSINT 仪表盘。其纯 TypeScript + Sebuf + MapLibre 技术栈虽然非传统但内部一致,一套代码库生成六个变体的设计确实精巧。AGPL-3.0 许可证、单一维护者治理和对外部源的依赖是真正的采用障碍——但对于能驾驭这些约束的团队来说,这是一个严肃的、可自托管的商业情报平台替代方案。

信息来源