Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

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,任何人都能從前端抽出來。
把這四個邊界記在心裡,再往下看它的功能與機制,會比較知道這個工具到底適不適合自己架一套。
Situation Monitor 的官方 demo 部署在 Vercel,第一次打開會跳出一個「Welcome to Situation Monitor」的設定視窗,要你從六種預設配置擇一啟用。這六種預設對應不同使用情境,也決定了一開始會載入哪些面板。
選了 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 按鈕。

地圖本身就是 Situation Monitor 的核心隱喻:它的用意是讓你一次看到「同一段時間內全球哪些地方在發生什麼」,而不是逐則滑過新聞。對於習慣用文字訊息流追蹤事件的人,這個空間式的呈現會帶來不同的判讀方式。例如同時看到 Caracas 與 Tehran 同為紅色高風險,會促使你回頭查這兩個地方是否在同一週內發生了關聯事件。
把 package.json 與 svelte.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。
Situation Monitor 最有價值的部分其實是資料來源清單本身。把 src/lib/config/feeds.ts 打開,可以看到 RSS 來源分成六大類,全部是主流媒體與官方機構的公開 feed:
除了 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 都要申請。

純前端抓 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 換掉。
要讓市場與總經面板真的有數字,需要兩個 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 檔案(用 curl 抓 raw.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 顆星、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、不會再加新資料來源」這個長期風險。
部署流程本身不複雜,多數時間會花在決定要不要 fork、改 proxy URL、申請 API key 這幾個前置決策上。
申請 API key:先到 finnhub.io 與 stlouisfed.org 註冊兩個免費 key,不然 market 與 economic 面板會是空的。
決定是否 fork:如果要避開前面講的 CORS proxy 預設值,建議 fork 一份,改 src/lib/config/api.ts 把 CORS_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,並啟用熱重載。
「開源、自架、把外部訊號整合進同一個介面」這個分類,Situation Monitor 並非唯一選擇。下表把幾個常被放在一起比較的工具並排:
| 工具 | 監控對象 | 技術堆疊 | 資料來源 | 授權 |
|---|---|---|---|---|
| Situation Monitor | 全球新聞、市場、地緣事件 | SvelteKit 靜態前端 | RSS、GDELT、Finnhub、FRED、CoinGecko | 無 LICENSE(原始碼公開) |
| Sniffnet | 本機與區網流量 | Rust 桌面應用 | 本機網路封包 | MIT / Apache-2.0 |
| FeedCraft | RSS 處理與分發 | 自架中介層 | 使用者提供的 RSS | 開源 |
| FiNews | 財經新聞追蹤 | Web App | 財經媒體 RSS | 閉源 |
| Hacker Trends | Hacker News 趨勢 | Web 儀表板 | Hacker News API | 開源 |
Sniffnet 是最接近「同類不同向」的對照:兩者都是開源監控儀表板,但 Sniffnet 監控的是你自己的網路(封包層),Situation Monitor 監控的是全球外部事件(資訊層)。一個向內看、一個向外看,關心的隱私邊界也完全不同。FeedCraft 處理的是 RSS 抓取與轉發的中介層問題,可以想成 Situation Monitor 在 CORS proxy 那一層的獨立替代品。
src/lib/config/keywords.ts 與 map.ts。src/lib/config/api.ts,否則所有 RSS 查詢經過作者的 Cloudflare Worker。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 聚焦科技圈趨勢。把這幾個工具擺在一起看,會比較知道「自架監控儀表板」這個分類的完整光譜。