Situation Monitor:開源 OSINT 儀表板,把全球事件收進同一面板

Situation Monitor 是原始碼公開的 OSINT 儀表板,以 SvelteKit 2.0 寫成純靜態前端,把全球新聞、市場、地緣事件整合在同一個面板。本篇帶你看自架流程、API 來源、CORS proxy 預設依賴作者 Cloudflare Worker 的隱私邊界、BYOK API key 的 VITE_ 副作用,以及 4,170 顆星背後的專案停滯訊號。

用 AI 摘要這篇文章:

TL;DR

Situation Monitor 是一套把全球新聞、市場報價、地緣熱點與加密幣整合到同一個面板的 OSINT 儀表板,以 SvelteKit 2.0 加 Svelte 5 寫成純靜態前端,部署到 Vercel、Cloudflare Pages 或 GitHub Pages 都行。它在 GitHub 拿到 4,170 顆星但沒有 LICENSE 檔,main 分支從 2026 年 1 月 13 日以來沒再提交,沒有發布過任何 release。市場報價與經濟指標需要你自己申請 Finnhub 與 FRED API key,預設的 RSS 抓取會經過作者自己的 Cloudflare Worker。適合把全球脈動放第二螢幕追蹤的研究員、記者與跨市場工作者,不適合想要裝了就完整可用的人。

先說結論:這個工具的價值與邊界都在哪裡

把 Situation Monitor 直接想成「追新聞的儀表板」會低估它,想成「金融業的 Bloomberg 終端機替代品」又會高估它。它的真正定位是把分散在全球公開 API 與 RSS 的訊號,整合在同一個可自架的 Svelte 介面。資料來源是 GDELT、BBC、NPR、Guardian、NYT、CNBC、FT、White House、Federal Reserve、SEC、CSIS、Brookings、CoinGecko、Finnhub、FRED 這類公開渠道,不是某個付費資料庫。對於本來就在多個螢幕之間切換新聞 App、市場報價與地緣資訊的人,這個整合本身就值回票價;對於期待「裝完就有完整市場資料」的人,會發現預設狀態下市場面板是空的,需要自己申請 API key。

下判決之前有四個邊界必須先講清楚。先看授權:授權狀態未定:GitHub 顯示 License 為 None,倉庫根目錄沒有 LICENSE 檔,法律上 public 不等於 licensed,不能直接當作開源自由取用。再看維護:專案停滯:4,170 顆星與 924 個 fork 看似熱門,但 main 分支從 2026 年 1 月 13 日之後就沒再提交過,到現在已經超過半年,沒有任何 release,19 個 open issue 也沒處理。更關鍵的是:CORS proxy 預設指向作者自己的 Cloudflare Worker,你不修改設定就部署的話,所有 RSS 抓取會經過作者的基礎設施。最後是 BYOK 邊界:市場與經濟指標的 API key 要自備,Finnhub 與 FRED 都要自己申請 key,而且 SvelteKit 的 VITE_ 前綴會把 key 打包進用戶端 bundle,任何人都能從前端抽出來。

把這四個邊界記在心裡,再往下看它的功能與機制,會比較知道這個工具到底適不適合自己架一套。

打開 demo 會看到什麼:六種預設配置與 24 個面板

Situation Monitor 的官方 demo 部署在 Vercel,第一次打開會跳出一個「Welcome to Situation Monitor」的設定視窗,要你從六種預設配置擇一啟用。這六種預設對應不同使用情境,也決定了一開始會載入哪些面板。

  • News Junkie:聚焦突發新聞,涵蓋政治、科技與財經,7 個面板。
  • Trader:市場導向,含股票、加密幣、原物料,9 個面板。
  • Geopolitics Watcher:全球局勢與區域熱點,10 個面板。
  • Intelligence Analyst:深度分析、模式偵測與敘事追蹤,7 個面板。
  • Minimal:地圖、新聞、市場三個核心面板。
  • Everything:全部 24 個面板一次開。

選了 Everything 之後會看到主介面:上方是橫幅標題「GLOBAL SITUATION MONITOR」與「Refreshing…」狀態列,中央是世界地圖(用 D3.js 渲染),上面標著各城市的事件熱點,顏色代表風險等級(紅色 High、黃色 Elevated、綠色 Low),可以看到 Caracas、Tehran、Moscow、Riyadh、Taipei、Delhi、Singapore、Nuuk 這類名稱。下方是並排的面板:POLITICS、WORLD LEADERS(含 19 位領袖名單)、VENEZUELA WATCH。地圖右下角有縮放與重置控制,右上角是圖例與 Settings 按鈕。

TechMoon 精選圖|Situation Monitor 的 Everything 預設主畫面:上方為 GLOBAL SITUATION MONITOR 橫幅與世界地圖,地圖以紅黃綠三色標記城市風險等級,下方為 POLITICS、WORLD LEADERS、VENEZUELA WATCH 三個面板。Pin
Situation Monitor 選擇 Everything 預設後的主畫面:世界地圖用紅黃綠三色標記城市風險等級(Caracas、Tehran 為紅色 High;Moscow、Riyadh、Taipei 為黃色 Elevated;Delhi、Singapore 為綠色 Low),下方三個面板分別是 POLITICS、WORLD LEADERS 與預設的 VENEZUELA WATCH。截圖自官方 Vercel demo。

地圖本身就是 Situation Monitor 的核心隱喻:它的用意是讓你一次看到「同一段時間內全球哪些地方在發生什麼」,而不是逐則滑過新聞。對於習慣用文字訊息流追蹤事件的人,這個空間式的呈現會帶來不同的判讀方式。例如同時看到 Caracas 與 Tehran 同為紅色高風險,會促使你回頭查這兩個地方是否在同一週內發生了關聯事件。

技術架構:SvelteKit 靜態站加三層服務層

package.jsonsvelte.config.js 翻開看,技術堆疊很清楚:SvelteKit 2.0 加 Svelte 5(用新的 $state$derived$effect runes 反應式寫法),TypeScript 開 strict 模式,Tailwind CSS 處理樣式,D3.js 畫地圖,Vitest 與 Playwright 跑測試。部署端用的是 @sveltejs/adapter-static,這是純靜態輸出,整個專案編譯完是一堆 HTML、JS、CSS 與靜態資源,沒有 server runtime。

這個「純靜態」性質比外表看來更重要。對外介紹把它描述成「Vercel 邊緣部署」,但其實它可以是任何靜態主機:Vercel、Cloudflare Pages、GitHub Pages、Netlify、甚至本機用 npx serve build/ 跑都行。vercel.json 只有 96 bytes,幾乎沒有 Vercel 專屬設定。真正的部署邏輯寫在 GitHub Actions workflow 裡,預設會推到 GitHub Pages 的 https://hipcityreg.github.io/situation-monitor/,Vercel 上的 demo 只是另一個入口。

純前端的代價是所有資料抓取都在瀏覽器裡發生,沒有後端可做快取或代理。為了不讓每個使用者都打 30 個 RSS 來源被對方擋 CORS 或速率限制,原始碼在 src/lib/services/ 加了三層服務層:CacheManager 處理 per-service 快取(市場資料 1 分鐘、新聞 5 分鐘、天氣 10 分鐘),CircuitBreaker 避免連鎖失敗,RequestDeduplicator 防止並發重複請求。所有 HTTP 請求都經過 ServiceClient 整合這三層。資料刷新分三階段:Critical(0ms,新聞、市場、警示)、Secondary(2s 延遲,加密幣、原物料、情報)、Tertiary(4s 延遲,合約、鯨魚動向、裁員、polymarket),用循序錯開避免一次灌爆 API。

資料來源:30 個以上的 RSS 加四個公開 API

Situation Monitor 最有價值的部分其實是資料來源清單本身。把 src/lib/config/feeds.ts 打開,可以看到 RSS 來源分成六大類,全部是主流媒體與官方機構的公開 feed:

  • Politics:BBC World、NPR News、Guardian World、NYT World。
  • Tech:Hacker News、Ars Technica、The Verge、MIT Tech Review、ArXiv AI、OpenAI Blog。
  • Finance:CNBC、MarketWatch、Yahoo Finance、BBC Business、FT。
  • Government:White House、Federal Reserve、SEC Announcements、DoD News。
  • AI:OpenAI Blog、ArXiv AI(與 Tech 重複)。
  • Intelligence:CSIS、Brookings、CFR、Defense One。

除了 RSS,還接了四個 API:GDELT(Google 資助的全球事件追蹤資料庫,是專案內 news.ts 的核心來源)、CoinGecko(加密幣報價,免 key)、Finnhub(股票/ETF/原物料報價,需 BYO key)、FRED(聖路易斯 Fed 的總經指標,需 BYO key)。資料來源透明度這一條,Situation Monitor 給得很乾淨:所有來源都在 config 檔裡,沒有不可查的私有資料供應商。

這裡有個值得一提的 source-vs-code 校正:.env.example 只列了 VITE_FINNHUB_API_KEY,但實際的 src/lib/config/api.ts 還用了 VITE_FRED_API_KEY。也就是說,只照 .env.example 設定的話,FRED 經濟指標面板會抓不到資料。實際自架時兩個 key 都要申請。

TechMoon 精選圖|Situation Monitor 的市場面板,顯示主要指數 ETF、原物料與加密幣報價,數字來自 Finnhub 與 CoinGecko API,使用者需自備 BYOK key。Pin
市場面板:指數 ETF(DIA、SPY、QQQ、IWM)、原物料(黃金、白銀、原油)與加密幣(Bitcoin、Ethereum)報價,資料來自 Finnhub(需 BYO key)與 CoinGecko。截圖自官方 Vercel demo。

那個沒被講清楚的 CORS proxy:你的 RSS 查詢預設經過作者的 Cloudflare Worker

純前端抓 RSS 會撞到瀏覽器的 same-origin policy,多數 RSS 來源不送 CORS header。Situation Monitor 的解法寫在 src/lib/config/api.ts 裡,預設的 CORS_PROXIES 是:

export const CORS_PROXIES = {
  primary: 'https://situation-monitor-proxy.seanthielen-e.workers.dev/?url=',
  fallback: 'https://corsproxy.io/?url='
} as const;

翻成白話文:你不修改設定就部署,所有 RSS 抓取會先經過作者的 Cloudflare Worker(situation-monitor-proxy.seanthielen-e.workers.dev),失敗才 fallback 到第三方 corsproxy.io。這意味著你開 demo、或自己架一份卻沒改 config 的話,每次刷新面板,RSS 查詢的 URL、頻率、來源 IP 都會經過作者 control 的 worker。作者有沒有記 log、記多少、保留多久,原始碼與對外文件都沒說。

這個設計本身是純前端 App 常見的折衷,類似 FeedCraft 的 RSS 中介層也在處理同一個問題,只是人家把 proxy 邏輯寫成你自己架的中介層,不是綁在作者基礎設施上。Situation Monitor 沒有給「自架 proxy」的範例,作者也沒在倉庫附 worker 原始碼。要避開這個依賴,你得自己 fork 一份、把 CORS_PROXIES 改成自己架的 proxy URL,或改成 serverless function 直抓。

對於把這個工具當研究面板、RSS 來源都是公開媒體的人,這個依賴或許可以接受;對於把 Situation Monitor 部署到公司內部、或追蹤較敏感的區域事件的人,這條 proxy 預設值就是個需要正視的隱私決策點。最低限度,自架之前先到 src/lib/config/api.ts 把這兩個 URL 換掉。

BYOK 的兩個 API key 與 VITE_ 前綴的副作用

要讓市場與總經面板真的有數字,需要兩個 API key:Finnhub(市場報價,免費 tier 每分鐘 60 次,到 finnhub.io 註冊)與 FRED(聖路易斯 Fed 的總經資料,免費 tier 無限請求,到 stlouisfed.org 註冊)。CoinGecko 與 GDELT 不需要 key。

這裡的關鍵 gotcha:SvelteKit 的環境變數用 VITE_ 前綴代表「會被打包進用戶端 bundle」。也就是說,你申請的 Finnhub 與 FRED key 會以明文形式嵌進編譯後的 JavaScript,任何打開你部署的網站、按 F12 看 source 的人都能抽出來。免費 tier 的 key 被抽走影響有限(頂多觸發速率限制),但這個性質要先理解:BYOK 在純前端 SvelteKit 專案裡,本質上不是「你的 key 留在本機」,而是「你的 key 跟著每個造訪者的瀏覽器一起發請求」。

Finnhub 號稱免費 tier 每分鐘 60 次,但實際上 Situation Monitor 的 Critical 階段一次刷新就會打將近 10 個 quote 請求(4 個大盤 ETF 加上多個原物料與加密幣),多人同時使用同一個 key 很容易撞限制。如果你打算給團隊用,建議直接升 Finnhub 付費 tier 或自建市場資料的快取層。

「開源」這兩個字:原始碼公開不等於授權使用

Situation Monitor 在對外介紹裡一直被稱為「開源」,但實際查 GitHub 倉庫 hipcityreg/situation-monitor 的 License 欄位,顯示的是 None。根目錄也沒有 LICENSE 檔案(用 curlraw.githubusercontent.com/.../main/LICENSE 回 404)。GitHub 的預設規則是:沒有 LICENSE 檔的倉庫,法律上保留所有權利給作者,public 不等於 licensed,你不能直接當作開源自由取用、修改、再散布或商業使用。

這個區分在中文圈常被混淆。「原始碼公開」(source-available)與「開源」(open source)不是同一件事:前者只是「你看得見 code」,後者還包含一份具法律效力的授權條款(MIT、Apache-2.0、GPL 等)允許你使用、修改、再散布。Situation Monitor 目前是前者。要把它當作開源專案使用,至少得等作者補上 LICENSE 檔,或取得作者書面授權。

個人拿來自架、自己追蹤訊號,多數情境下沒人會管你;但若打算商業部署、改作、或包進自家產品,這個授權真空就是必須先處理的硬阻塞。如果是後者,建議直接聯繫作者(GitHub 倉庫的 issue 或 discussions)釐清授權意圖。

4,170 顆星的另一面:明星專案的停滯訊號

4,170 顆星、924 個 fork、19 個 open issues、0 個 release。把 GitHub API 撈出來的時間軸對齊來看,會看到一個耐人尋味的模式:倉庫建立於 2026 年 1 月 7 日,最後一次 commit 在 1 月 13 日,整個開發活動集中在 6 天內,之後 main 分支就凍結到現在updated_at 雖然顯示 2026 年 7 月 24 日,但那是 GitHub metadata(stars、forks、wiki 編輯等)的更新,不是原始碼變動。要判斷一個專案是否還活著,看 main 分支最後 commit 比看 pushed_at 準。

這在開源專案裡不算罕見模式:一個專案在初期衝上 Hacker News、reddit、推特,幾天內湧入大量星,作者解掉最 immediate 的 bug(看 commit 訊息是 PR #17 修 Vercel redirect URL),然後熱情退燒、回歸主業、專案進入維護停滯。高星數不等於活躍維護,這個觀察也適用於其他號稱熱門的監控類工具,例如 Sniffnet 的 network 監控或 DeepSeek API 監控工具

實際影響是:你今天 fork 一份部署,半年後想回頭跟上游 sync 新功能或修過的 bug,會發現上游沒有動,等於 fork 的瞬間就是 final 版本。對個人使用者影響有限(你拿到的是 1 月 13 日版的快照),但對團隊部署來說,要評估「上游不會再修 CVE、不會再加新資料來源」這個長期風險。

自架流程:四步把 Situation Monitor 部署成你自己的

部署流程本身不複雜,多數時間會花在決定要不要 fork、改 proxy URL、申請 API key 這幾個前置決策上。

申請 API key:先到 finnhub.iostlouisfed.org 註冊兩個免費 key,不然 market 與 economic 面板會是空的。

決定是否 fork:如果要避開前面講的 CORS proxy 預設值,建議 fork 一份,改 src/lib/config/api.tsCORS_PROXIES.primary 換成自己架的 proxy URL(或直接刪除讓它 fallback 到 corsproxy.io)。

clone 與 build:用 SvelteKit 標準指令 build:

git clone https://github.com/hipcityreg/situation-monitor.git
cd situation-monitor
cp .env.example .env
# 編輯 .env 填入 VITE_FINNHUB_API_KEY 與 VITE_FRED_API_KEY
npm install
npm run build

部署到靜態主機:把 build/ 目錄推到任何靜態主機。最常見的選擇是 Vercel、Cloudflare Pages、GitHub Pages、Netlify。Vercel 的 vercel deploy --prod 一行解決;GitHub Pages 的話設定 BASE_PATH=/situation-monitor/ 再用 GitHub Actions workflow 推。

本機預覽用 npm run preview,會在 localhost:4177 跑起來。開發模式用 npm run dev,會在 localhost:5177,並啟用熱重載。

OSINT 監控工具的橫向對照

「開源、自架、把外部訊號整合進同一個介面」這個分類,Situation Monitor 並非唯一選擇。下表把幾個常被放在一起比較的工具並排:

工具監控對象技術堆疊資料來源授權
Situation Monitor全球新聞、市場、地緣事件SvelteKit 靜態前端RSS、GDELT、Finnhub、FRED、CoinGecko無 LICENSE(原始碼公開)
Sniffnet本機與區網流量Rust 桌面應用本機網路封包MIT / Apache-2.0
FeedCraftRSS 處理與分發自架中介層使用者提供的 RSS開源
FiNews財經新聞追蹤Web App財經媒體 RSS閉源
Hacker TrendsHacker News 趨勢Web 儀表板Hacker News API開源

Sniffnet 是最接近「同類不同向」的對照:兩者都是開源監控儀表板,但 Sniffnet 監控的是你自己的網路(封包層),Situation Monitor 監控的是全球外部事件(資訊層)。一個向內看、一個向外看,關心的隱私邊界也完全不同。FeedCraft 處理的是 RSS 抓取與轉發的中介層問題,可以想成 Situation Monitor 在 CORS proxy 那一層的獨立替代品。

適合誰、不適合誰:四個決策軸

  • 媒體研究員、記者、智庫分析師:適合。把 30 個主流媒體 RSS 與 GDELT 整合在一個介面就是它的核心價值,自架一份能避開商業儀表板的訂閱費與資料留存。
  • 跨市場交易者、避險玩家:部分適合。市場報價延遲(Finnhub 免費 tier 60 calls/min)與無歷史資料,只能當宏觀情境感知,不適合做高頻或精準進出場。
  • 地緣政治長期觀察者:適合,但要調整。預設的 VENEZUELA WATCH 面板是 US-centric 視角,若你關心亞洲局勢,可能想把這個 panel 換成台海、東海或南海的關鍵字,要改 src/lib/config/keywords.tsmap.ts
  • 只想要一個漂亮的副螢幕畫面:直接用官方 demo 就好。自架的價值在於改資料來源、改 proxy、改監控關鍵字,如果完全不打算改,部署一份跟用 demo 沒差。

限制與風險:先看清楚再決定要不要投時間

  • 無授權條款:法律上不能直接當開源商用,個人使用目前處於灰色地帶。
  • 專案停滯:main 分支 6 個月以上未動,未的安全更新與資料來源異常要自己 fork 維護。
  • CORS proxy 預設依賴作者基礎設施:自架前要改 src/lib/config/api.ts,否則所有 RSS 查詢經過作者的 Cloudflare Worker。
  • BYOK 在純前端的副作用:Finnhub 與 FRED 的 key 會被打包進用戶端 bundle,理論上可被抽取,請用免費 tier 或專用測試 key。
  • 無歷史資料:純前端加 5 到 10 分鐘快取,沒有持久化層,每次重開都是當下快照,不能回看一週前的某個事件。
  • 資料來源可用性受第三方制約:GDELT、Finnhub、FRED 任一方改 API、限流或下線,面板會直接壞,無 server-side fallback。
  • OSINT 雙用途性質:把全球事件集中可視化,可用於研究、新聞、避險,也可被用於監控或 doxxing。原始碼 CLAUDE.md 的 analysis engine 寫了 pattern correlation 與 narrative tracking,使用者要自己拿捏倫理邊界。

三個讀者最常問的問題

1. 我可以免費商用 Situation Monitor 嗎?

目前不能。GitHub 倉庫沒有 LICENSE 檔,License 欄位顯示 None。法律上 public 不等於 licensed,要商用得先取得作者書面授權,或等作者補上 LICENSE 條款。個人研究或自用相對寬容,但商用部署、改作、再散布都踩到授權真空。

2. 為什麼市場面板是空的?

因為你還沒申請 Finnhub 與 FRED 的 API key。.env.example 只列了 Finnhub,但實際 src/lib/config/api.ts 還用了 FRED。兩個都到官方網站註冊免費 key,填進 .env(記得用 VITE_ 前綴)再 npm run build 一次,面板就會有數字。

3. 我可以直接 fork 一份改成中文介面嗎?

技術上可以,SvelteKit 加 Tailwind 的 stack 對 i18n 支援成熟,字串大多集中在 components 裡。但 fork 之前要先處理兩件事:一是沒有 LICENSE 的法律前提(建議先在 issue 跟作者確認 fork 意圖),二是預設 CORS proxy 的依賴(建議改成自架)。中文介面改完,部署到 Cloudflare Pages 或 Vercel 都行。

把這個工具擺進你的工作流之前

Situation Monitor 是那種「概念漂亮、執行待打磨、社群熱度超過實際維護」的開源專案典型。它整合的資料來源清單本身就值回票價,SvelteKit 加 Svelte 5 的技術堆疊對於想學現代前端工程的人也是好教材(原始碼結構清晰,CLAUDE.md 的 dev guide 寫得相當完整)。但把它當作日常依賴的工具前,要誠實面對四件事:沒有授權條款、半年沒有維護、預設依賴作者的 Cloudflare Worker、BYOK key 會被打包進用戶端。

對於本來就在做 OSINT 研究、媒體監控或地緣分析的讀者,自己 fork 一份、改 proxy、改關鍵字、改地圖熱點,這個工具可以變成貼合自己需求的客製化儀表板。對於期待「下載、解壓、跑起來就一切搞定」的人,建議先用官方 demo 體驗一週,再決定要不要走自架這條路。

順帶一提,如果你對 OSINT 工具的「向內監控」端有興趣,Sniffnet 是網路流量層的同類選擇;FeedCraft 處理的是 RSS 中介層的問題,可視為 Situation Monitor 在 proxy 那一層的獨立替代;FiNews 聚焦財經新聞,Hacker Trends 聚焦科技圈趨勢。把這幾個工具擺在一起看,會比較知道「自架監控儀表板」這個分類的完整光譜。

Sliven 褚崇名
Sliven 褚崇名

每日分享科技新知、免費資源以及 WordPress、虛擬主機相關主題,任何問題歡迎在科技月球下方留言,或是發送 Email 至 [email protected] 與我聯繫。

文章: 720

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *