[{"data":1,"prerenderedAt":1645},["ShallowReactive",2],{"page-\u002Farticles\u002Fshannon":3,"related-\u002Farticles\u002Fshannon":915,"content-query-gfeqzkq8FO":941},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"category":11,"image":12,"tags":13,"series":16,"readingTime":17,"difficulty":18,"local":19,"platforms":20,"gpu":23,"body":24,"_type":909,"_id":910,"_source":911,"_file":912,"_stem":913,"_extension":914},"\u002Farticles\u002Fshannon","articles",false,"","Shannon AI Pentest Agent 安裝與實測指南（macOS\u002FLinux）","我用 10 個 AI agents 打自己的網站，2 小時後交出完整資安報告。Shannon 比我想像的成熟。","2026-05-21","Security","\u002Fimages\u002FShannon.png",[14,11,15],"AI Agents","Automation","ai-agent","8 min read","Hard",true,[21,22],"macOS","Linux","8GB+ VRAM",{"type":25,"children":26,"toc":897},"root",[27,36,42,53,65,69,74,187,190,196,201,256,261,280,283,289,312,320,328,331,336,346,358,381,386,389,394,441,451,454,460,471,476,494,499,522,525,531,536,636,657,662,746,749,754,789,792,797,814,836,857,860,868,891],{"type":28,"tag":29,"props":30,"children":32},"element","h2",{"id":31},"為什麼我試-shannon",[33],{"type":34,"value":35},"text","為什麼我試 Shannon？",{"type":28,"tag":37,"props":38,"children":39},"p",{},[40],{"type":34,"value":41},"AI 已經開始自己做滲透測試了。",{"type":28,"tag":37,"props":43,"children":44},{},[45,47],{"type":34,"value":46},"最近 vibe coding 很紅，大家用 Cursor \u002F Claude Code \u002F Gemini 幾小時就能做出產品，然後直接部署到 Cloudflare \u002F Vercel \u002F Supabase。但有個問題很少人提：",{"type":28,"tag":48,"props":49,"children":50},"strong",{},[51],{"type":34,"value":52},"你真的知道自己的站安不安全嗎？",{"type":28,"tag":37,"props":54,"children":55},{},[56,58,63],{"type":34,"value":57},"所以我做了一個很瘋的實驗：把自己的網站丟給 AI pentest agent framework ",{"type":28,"tag":48,"props":59,"children":60},{},[61],{"type":34,"value":62},"Shannon",{"type":34,"value":64},"，讓它自己做 recon、逆向前端 bundle、追 API、驗證漏洞，最後自動生成完整滲透測試報告。",{"type":28,"tag":66,"props":67,"children":68},"hr",{},[],{"type":28,"tag":29,"props":70,"children":72},{"id":71},"本次實測環境",[73],{"type":34,"value":71},{"type":28,"tag":75,"props":76,"children":77},"table",{},[78,98],{"type":28,"tag":79,"props":80,"children":81},"thead",{},[82],{"type":28,"tag":83,"props":84,"children":85},"tr",{},[86,93],{"type":28,"tag":87,"props":88,"children":90},"th",{"align":89},"left",[91],{"type":34,"value":92},"項目",{"type":28,"tag":87,"props":94,"children":95},{"align":89},[96],{"type":34,"value":97},"內容",{"type":28,"tag":99,"props":100,"children":101},"tbody",{},[102,122,135,148,161,174],{"type":28,"tag":83,"props":103,"children":104},{},[105,111],{"type":28,"tag":106,"props":107,"children":108},"td",{"align":89},[109],{"type":34,"value":110},"Target",{"type":28,"tag":106,"props":112,"children":113},{"align":89},[114],{"type":28,"tag":115,"props":116,"children":120},"a",{"href":117,"rel":118},"https:\u002F\u002Ffindtt.top",[119],"nofollow",[121],{"type":34,"value":117},{"type":28,"tag":83,"props":123,"children":124},{},[125,130],{"type":28,"tag":106,"props":126,"children":127},{"align":89},[128],{"type":34,"value":129},"Stack",{"type":28,"tag":106,"props":131,"children":132},{"align":89},[133],{"type":34,"value":134},"Cloudflare Pages \u002F Cloudflare Functions \u002F Supabase \u002F Vue",{"type":28,"tag":83,"props":136,"children":137},{},[138,143],{"type":28,"tag":106,"props":139,"children":140},{"align":89},[141],{"type":34,"value":142},"Framework",{"type":28,"tag":106,"props":144,"children":145},{"align":89},[146],{"type":34,"value":147},"Shannon v1.2.0",{"type":28,"tag":83,"props":149,"children":150},{},[151,156],{"type":28,"tag":106,"props":152,"children":153},{"align":89},[154],{"type":34,"value":155},"Model",{"type":28,"tag":106,"props":157,"children":158},{"align":89},[159],{"type":34,"value":160},"DeepSeek v4 Pro（透過 Anthropic 相容 Base URL）",{"type":28,"tag":83,"props":162,"children":163},{},[164,169],{"type":28,"tag":106,"props":165,"children":166},{"align":89},[167],{"type":34,"value":168},"Agents",{"type":28,"tag":106,"props":170,"children":171},{"align":89},[172],{"type":34,"value":173},"10",{"type":28,"tag":83,"props":175,"children":176},{},[177,182],{"type":28,"tag":106,"props":178,"children":179},{"align":89},[180],{"type":34,"value":181},"Duration",{"type":28,"tag":106,"props":183,"children":184},{"align":89},[185],{"type":34,"value":186},"128m 37s",{"type":28,"tag":66,"props":188,"children":189},{},[],{"type":28,"tag":29,"props":191,"children":193},{"id":192},"shannon-在做什麼多代理工作流",[194],{"type":34,"value":195},"Shannon 在做什麼？（多代理工作流）",{"type":28,"tag":37,"props":197,"children":198},{},[199],{"type":34,"value":200},"Shannon 不是那種「掃關鍵字 → 生成報告」的 scanner。它是多代理 autonomous workflow，而且每個代理都有自己上下文，會自己驗證 exploit。",{"type":28,"tag":202,"props":203,"children":204},"ol",{},[205,216,226,236,246],{"type":28,"tag":206,"props":207,"children":208},"li",{},[209,214],{"type":28,"tag":48,"props":210,"children":211},{},[212],{"type":34,"value":213},"Pre-Recon",{"type":34,"value":215},"：讀 repo、理解框架、部署方式、API 結構、Auth flow，甚至會讀 migration \u002F SQL \u002F env 用法與 Supabase config",{"type":28,"tag":206,"props":217,"children":218},{},[219,224],{"type":28,"tag":48,"props":220,"children":221},{},[222],{"type":34,"value":223},"Recon",{"type":34,"value":225},"：反解 JS bundle、抓 API endpoint、追 request flow、看 Cloudflare topology",{"type":28,"tag":206,"props":227,"children":228},{},[229,234],{"type":28,"tag":48,"props":230,"children":231},{},[232],{"type":34,"value":233},"Vuln Analysis",{"type":34,"value":235},"：XSS \u002F Auth \u002F Authz \u002F Injection \u002F SSRF 五個代理並行找線索",{"type":28,"tag":206,"props":237,"children":238},{},[239,244],{"type":28,"tag":48,"props":240,"children":241},{},[242],{"type":34,"value":243},"Exploit Validation",{"type":34,"value":245},"：找到線索後就嘗試真實利用，排除 false positive",{"type":28,"tag":206,"props":247,"children":248},{},[249,254],{"type":28,"tag":48,"props":250,"children":251},{},[252],{"type":34,"value":253},"Report",{"type":34,"value":255},"：只保留「可利用」漏洞進報告",{"type":28,"tag":37,"props":257,"children":258},{},[259],{"type":34,"value":260},"最誇張的是它不只打前端，還會直接：",{"type":28,"tag":262,"props":263,"children":264},"ul",{},[265,270,275],{"type":28,"tag":206,"props":266,"children":267},{},[268],{"type":34,"value":269},"打 Supabase REST API",{"type":28,"tag":206,"props":271,"children":272},{},[273],{"type":34,"value":274},"測 CORS \u002F anon key \u002F auth boundary",{"type":28,"tag":206,"props":276,"children":277},{},[278],{"type":34,"value":279},"嘗試真正 exploit",{"type":28,"tag":66,"props":281,"children":282},{},[],{"type":28,"tag":29,"props":284,"children":286},{"id":285},"temporal-timeline-的體感",[287],{"type":34,"value":288},"Temporal Timeline 的體感",{"type":28,"tag":37,"props":290,"children":291},{},[292,294,299,301,305,307,310],{"type":34,"value":293},"這次我最有感的是 ",{"type":28,"tag":48,"props":295,"children":296},{},[297],{"type":34,"value":298},"Temporal 真的很適合 AI agents",{"type":34,"value":300},"。",{"type":28,"tag":302,"props":303,"children":304},"br",{},[],{"type":34,"value":306},"\n這種 workflow 本來就是：長時間、多代理、會 retry、會 queue orchestration。",{"type":28,"tag":302,"props":308,"children":309},{},[],{"type":34,"value":311},"\n看 timeline 很像在看 AI SOC team 自己工作。",{"type":28,"tag":37,"props":313,"children":314},{},[315],{"type":28,"tag":316,"props":317,"children":319},"img",{"alt":318,"src":12},"Shannon 終端畫面",[],{"type":28,"tag":37,"props":321,"children":322},{},[323],{"type":28,"tag":316,"props":324,"children":327},{"alt":325,"src":326},"執行任務時間線","\u002Fimages\u002Ftimeline.png",[],{"type":28,"tag":66,"props":329,"children":330},{},[],{"type":28,"tag":29,"props":332,"children":334},{"id":333},"這次實測結果",[335],{"type":34,"value":333},{"type":28,"tag":37,"props":337,"children":338},{},[339,341,344],{"type":34,"value":340},"**高風險：**完全沒有 server-side rate limiting",{"type":28,"tag":302,"props":342,"children":343},{},[],{"type":34,"value":345},"\n**低風險：**部分 route parameter 存在 path traversal，但影響不高",{"type":28,"tag":37,"props":347,"children":348},{},[349,351,356],{"type":34,"value":350},"更意外的是它確認了",{"type":28,"tag":48,"props":352,"children":353},{},[354],{"type":34,"value":355},"沒有",{"type":34,"value":357},"：",{"type":28,"tag":262,"props":359,"children":360},{},[361,366,371,376],{"type":28,"tag":206,"props":362,"children":363},{},[364],{"type":34,"value":365},"SSRF",{"type":28,"tag":206,"props":367,"children":368},{},[369],{"type":34,"value":370},"可利用的 XSS",{"type":28,"tag":206,"props":372,"children":373},{},[374],{"type":34,"value":375},"SQL injection",{"type":28,"tag":206,"props":377,"children":378},{},[379],{"type":34,"value":380},"Auth bypass",{"type":28,"tag":37,"props":382,"children":383},{},[384],{"type":34,"value":385},"很多掃描器會亂噴，但 Shannon 會驗證 false positive，這點我很買單。",{"type":28,"tag":66,"props":387,"children":388},{},[],{"type":28,"tag":29,"props":390,"children":392},{"id":391},"成本與時間",[393],{"type":34,"value":391},{"type":28,"tag":75,"props":395,"children":396},{},[397,413],{"type":28,"tag":79,"props":398,"children":399},{},[400],{"type":28,"tag":83,"props":401,"children":402},{},[403,408],{"type":28,"tag":87,"props":404,"children":405},{"align":89},[406],{"type":34,"value":407},"指標",{"type":28,"tag":87,"props":409,"children":410},{"align":89},[411],{"type":34,"value":412},"數值",{"type":28,"tag":99,"props":414,"children":415},{},[416,429],{"type":28,"tag":83,"props":417,"children":418},{},[419,424],{"type":28,"tag":106,"props":420,"children":421},{"align":89},[422],{"type":34,"value":423},"Total Cost",{"type":28,"tag":106,"props":425,"children":426},{"align":89},[427],{"type":34,"value":428},"$13.67（CLI 預估，以 Claude 價格計）",{"type":28,"tag":83,"props":430,"children":431},{},[432,436],{"type":28,"tag":106,"props":433,"children":434},{"align":89},[435],{"type":34,"value":168},{"type":28,"tag":106,"props":437,"children":438},{"align":89},[439],{"type":34,"value":440},"10 completed",{"type":28,"tag":37,"props":442,"children":443},{},[444,446,449],{"type":34,"value":445},"我實際是走自訂 Base URL 接 DeepSeek，官方顯示成本約 1.15U，落差非常大。",{"type":28,"tag":302,"props":447,"children":448},{},[],{"type":34,"value":450},"\n（Shannon 的成本估算是以 Claude 價格計算，實際費用會因模型與代理路由而不同。）",{"type":28,"tag":66,"props":452,"children":453},{},[],{"type":28,"tag":29,"props":455,"children":457},{"id":456},"必要條件docker-真的必要",[458],{"type":34,"value":459},"必要條件（Docker 真的必要）",{"type":28,"tag":37,"props":461,"children":462},{},[463,465,470],{"type":34,"value":464},"Shannon 會用 Docker 跑一個預先建好的工作映像，",{"type":28,"tag":48,"props":466,"children":467},{},[468],{"type":34,"value":469},"npx 模式也一樣需要 Docker",{"type":34,"value":300},{"type":28,"tag":37,"props":472,"children":473},{},[474],{"type":34,"value":475},"實際上它會：",{"type":28,"tag":262,"props":477,"children":478},{},[479,484,489],{"type":28,"tag":206,"props":480,"children":481},{},[482],{"type":34,"value":483},"從 Docker Hub 拉取約 1GB 的工作映像",{"type":28,"tag":206,"props":485,"children":486},{},[487],{"type":34,"value":488},"在容器中執行完整測試",{"type":28,"tag":206,"props":490,"children":491},{},[492],{"type":34,"value":493},"把你的 repo 以唯讀方式掛載進容器",{"type":28,"tag":37,"props":495,"children":496},{},[497],{"type":34,"value":498},"最低需求：",{"type":28,"tag":262,"props":500,"children":501},{},[502,507,512,517],{"type":28,"tag":206,"props":503,"children":504},{},[505],{"type":34,"value":506},"Docker Desktop（必須）",{"type":28,"tag":206,"props":508,"children":509},{},[510],{"type":34,"value":511},"Node.js 18+（npx）",{"type":28,"tag":206,"props":513,"children":514},{},[515],{"type":34,"value":516},"目標 URL 可連線",{"type":28,"tag":206,"props":518,"children":519},{},[520],{"type":34,"value":521},"測試目標與程式碼庫的明確授權",{"type":28,"tag":66,"props":523,"children":524},{},[],{"type":28,"tag":29,"props":526,"children":528},{"id":527},"快速上手白盒測試",[529],{"type":34,"value":530},"快速上手（白盒測試）",{"type":28,"tag":37,"props":532,"children":533},{},[534],{"type":34,"value":535},"Shannon 是白盒測試，必須提供 repo 路徑。",{"type":28,"tag":537,"props":538,"children":542},"pre",{"className":539,"code":540,"language":541,"meta":7,"style":7},"language-bash shiki shiki-themes one-dark-pro","# 一次性設定\nnpx @keygraph\u002Fshannon setup\n\n# 開始測試\nnpx @keygraph\u002Fshannon start -u https:\u002F\u002Fyour-app.com -r \u002Fabs\u002Fpath\u002Fto\u002Fyour-repo\n","bash",[543],{"type":28,"tag":544,"props":545,"children":546},"code",{"__ignoreMap":7},[547,559,580,589,598],{"type":28,"tag":548,"props":549,"children":552},"span",{"class":550,"line":551},"line",1,[553],{"type":28,"tag":548,"props":554,"children":556},{"style":555},"--shiki-default:#7F848E;--shiki-default-font-style:italic",[557],{"type":34,"value":558},"# 一次性設定\n",{"type":28,"tag":548,"props":560,"children":562},{"class":550,"line":561},2,[563,569,575],{"type":28,"tag":548,"props":564,"children":566},{"style":565},"--shiki-default:#61AFEF",[567],{"type":34,"value":568},"npx",{"type":28,"tag":548,"props":570,"children":572},{"style":571},"--shiki-default:#98C379",[573],{"type":34,"value":574}," @keygraph\u002Fshannon",{"type":28,"tag":548,"props":576,"children":577},{"style":571},[578],{"type":34,"value":579}," setup\n",{"type":28,"tag":548,"props":581,"children":583},{"class":550,"line":582},3,[584],{"type":28,"tag":548,"props":585,"children":586},{"emptyLinePlaceholder":19},[587],{"type":34,"value":588},"\n",{"type":28,"tag":548,"props":590,"children":592},{"class":550,"line":591},4,[593],{"type":28,"tag":548,"props":594,"children":595},{"style":555},[596],{"type":34,"value":597},"# 開始測試\n",{"type":28,"tag":548,"props":599,"children":601},{"class":550,"line":600},5,[602,606,610,615,621,626,631],{"type":28,"tag":548,"props":603,"children":604},{"style":565},[605],{"type":34,"value":568},{"type":28,"tag":548,"props":607,"children":608},{"style":571},[609],{"type":34,"value":574},{"type":28,"tag":548,"props":611,"children":612},{"style":571},[613],{"type":34,"value":614}," start",{"type":28,"tag":548,"props":616,"children":618},{"style":617},"--shiki-default:#D19A66",[619],{"type":34,"value":620}," -u",{"type":28,"tag":548,"props":622,"children":623},{"style":571},[624],{"type":34,"value":625}," https:\u002F\u002Fyour-app.com",{"type":28,"tag":548,"props":627,"children":628},{"style":617},[629],{"type":34,"value":630}," -r",{"type":28,"tag":548,"props":632,"children":633},{"style":571},[634],{"type":34,"value":635}," \u002Fabs\u002Fpath\u002Fto\u002Fyour-repo\n",{"type":28,"tag":37,"props":637,"children":638},{},[639,641,647,649,655],{"type":34,"value":640},"你可以用 ",{"type":28,"tag":544,"props":642,"children":644},{"className":643},[],[645],{"type":34,"value":646},"npx @keygraph\u002Fshannon logs \u003Cworkspace>",{"type":34,"value":648}," 看進度，或開 ",{"type":28,"tag":544,"props":650,"children":652},{"className":651},[],[653],{"type":34,"value":654},"http:\u002F\u002Flocalhost:8233",{"type":34,"value":656}," 看 Temporal UI。",{"type":28,"tag":37,"props":658,"children":659},{},[660],{"type":34,"value":661},"如果你走自訂 Base URL（例如代理到非 Claude 模型）：",{"type":28,"tag":537,"props":663,"children":665},{"className":539,"code":664,"language":541,"meta":7,"style":7},"export ANTHROPIC_BASE_URL=https:\u002F\u002Fyour-proxy.example.com\nexport ANTHROPIC_AUTH_TOKEN=your-auth-token\n",[666],{"type":28,"tag":544,"props":667,"children":668},{"__ignoreMap":7},[669,725],{"type":28,"tag":548,"props":670,"children":671},{"class":550,"line":551},[672,678,684,690,695,701,706,711,716,720],{"type":28,"tag":548,"props":673,"children":675},{"style":674},"--shiki-default:#C678DD",[676],{"type":34,"value":677},"export",{"type":28,"tag":548,"props":679,"children":681},{"style":680},"--shiki-default:#E06C75",[682],{"type":34,"value":683}," ANTHROPIC_BASE_URL",{"type":28,"tag":548,"props":685,"children":687},{"style":686},"--shiki-default:#56B6C2",[688],{"type":34,"value":689},"=",{"type":28,"tag":548,"props":691,"children":692},{"style":680},[693],{"type":34,"value":694},"https",{"type":28,"tag":548,"props":696,"children":698},{"style":697},"--shiki-default:#ABB2BF",[699],{"type":34,"value":700},":\u002F\u002F",{"type":28,"tag":548,"props":702,"children":703},{"style":680},[704],{"type":34,"value":705},"your-proxy",{"type":28,"tag":548,"props":707,"children":708},{"style":697},[709],{"type":34,"value":710},".",{"type":28,"tag":548,"props":712,"children":713},{"style":680},[714],{"type":34,"value":715},"example",{"type":28,"tag":548,"props":717,"children":718},{"style":697},[719],{"type":34,"value":710},{"type":28,"tag":548,"props":721,"children":722},{"style":680},[723],{"type":34,"value":724},"com\n",{"type":28,"tag":548,"props":726,"children":727},{"class":550,"line":561},[728,732,737,741],{"type":28,"tag":548,"props":729,"children":730},{"style":674},[731],{"type":34,"value":677},{"type":28,"tag":548,"props":733,"children":734},{"style":680},[735],{"type":34,"value":736}," ANTHROPIC_AUTH_TOKEN",{"type":28,"tag":548,"props":738,"children":739},{"style":686},[740],{"type":34,"value":689},{"type":28,"tag":548,"props":742,"children":743},{"style":680},[744],{"type":34,"value":745},"your-auth-token\n",{"type":28,"tag":66,"props":747,"children":748},{},[],{"type":28,"tag":29,"props":750,"children":752},{"id":751},"使用提醒",[753],{"type":34,"value":751},{"type":28,"tag":262,"props":755,"children":756},{},[757,769,779,784],{"type":28,"tag":206,"props":758,"children":759},{},[760,762,767],{"type":34,"value":761},"Shannon 會",{"type":28,"tag":48,"props":763,"children":764},{},[765],{"type":34,"value":766},"主動利用",{"type":34,"value":768},"漏洞，請只在 staging \u002F sandbox 跑",{"type":28,"tag":206,"props":770,"children":771},{},[772,774],{"type":34,"value":773},"你必須擁有目標系統的",{"type":28,"tag":48,"props":775,"children":776},{},[777],{"type":34,"value":778},"明確授權",{"type":28,"tag":206,"props":780,"children":781},{},[782],{"type":34,"value":783},"只會報告「可利用」漏洞，無法利用的問題會被丟棄",{"type":28,"tag":206,"props":785,"children":786},{},[787],{"type":34,"value":788},"代理流程可能很長，請預留 1～2 小時",{"type":28,"tag":66,"props":790,"children":791},{},[],{"type":28,"tag":29,"props":793,"children":795},{"id":794},"個人心得",[796],{"type":34,"value":794},{"type":28,"tag":37,"props":798,"children":799},{},[800,802,807,809,812],{"type":34,"value":801},"這次跑完後，我第一次覺得 ",{"type":28,"tag":48,"props":803,"children":804},{},[805],{"type":34,"value":806},"AI security agent 已經脫離玩具階段",{"type":34,"value":808},"了。",{"type":28,"tag":302,"props":810,"children":811},{},[],{"type":34,"value":813},"\n尤其對 indie hacker 或小團隊，這種「部署後丟給 AI 自跑兩小時 → 回收報告」的流程，非常實用。",{"type":28,"tag":37,"props":815,"children":816},{},[817,819,822,824,827,829,834],{"type":34,"value":818},"但它也暴露了一個現實：AI agent 容易過度 digging。",{"type":28,"tag":302,"props":820,"children":821},{},[],{"type":34,"value":823},"\n有一段時間它開始 recursive exploit validation，不斷 merge findings、重跑測試。",{"type":28,"tag":302,"props":825,"children":826},{},[],{"type":34,"value":828},"\n所以如果要長期使用，",{"type":28,"tag":48,"props":830,"children":831},{},[832],{"type":34,"value":833},"規則與邊界很重要",{"type":34,"value":835},"（例如限制速率、限制範圍、限制漏洞類型）。",{"type":28,"tag":37,"props":837,"children":838},{},[839,841,844,846,849,851,856],{"type":34,"value":840},"我現在的感想是：",{"type":28,"tag":302,"props":842,"children":843},{},[],{"type":34,"value":845},"\n未來很可能變成「快速上線 → AI pentest → 迭代修補」的標準流程，",{"type":28,"tag":302,"props":847,"children":848},{},[],{"type":34,"value":850},"\n而人類的角色會變成：",{"type":28,"tag":48,"props":852,"children":853},{},[854],{"type":34,"value":855},"定義 scope、解讀報告、修補與驗證",{"type":34,"value":300},{"type":28,"tag":66,"props":858,"children":859},{},[],{"type":28,"tag":37,"props":861,"children":862},{},[863],{"type":28,"tag":48,"props":864,"children":865},{},[866],{"type":34,"value":867},"相關連結：",{"type":28,"tag":262,"props":869,"children":870},{},[871,881],{"type":28,"tag":206,"props":872,"children":873},{},[874],{"type":28,"tag":115,"props":875,"children":878},{"href":876,"rel":877},"https:\u002F\u002Fgithub.com\u002FKeygraphHQ\u002Fshannon",[119],[879],{"type":34,"value":880},"Shannon GitHub",{"type":28,"tag":206,"props":882,"children":883},{},[884],{"type":28,"tag":115,"props":885,"children":888},{"href":886,"rel":887},"https:\u002F\u002Fgithub.com\u002FKeygraphHQ\u002Fshannon\u002Fblob\u002Fmain\u002F.env.example",[119],[889],{"type":34,"value":890},"Shannon .env 範例",{"type":28,"tag":892,"props":893,"children":894},"style",{},[895],{"type":34,"value":896},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":561,"depth":561,"links":898},[899,900,901,902,903,904,905,906,907,908],{"id":31,"depth":561,"text":35},{"id":71,"depth":561,"text":71},{"id":192,"depth":561,"text":195},{"id":285,"depth":561,"text":288},{"id":333,"depth":561,"text":333},{"id":391,"depth":561,"text":391},{"id":456,"depth":561,"text":459},{"id":527,"depth":561,"text":530},{"id":751,"depth":561,"text":751},{"id":794,"depth":561,"text":794},"markdown","content:articles:Shannon.md","content","articles\u002FShannon.md","articles\u002FShannon","md",[916,925,932],{"_path":917,"title":918,"description":919,"date":920,"category":921,"image":922,"tags":923,"score":561},"\u002Farticles\u002Fhermes-hyperframes-self-intro-video","Hermes Agent x HyperFrames 實戰：AI 助理自介影片自動生成指南","叫 Hermes 自己拍一支自我介紹影片。從文案發想、HTML 動畫編寫、到渲染輸出 MP4 全部自動化。HyperFrames 是什麼？為什麼比 Remotion 更適合 AI Agent？","2026-05-09","AI & Tools","\u002Fimages\u002Fcode.png",[14,924,15],"Video Processing",{"_path":926,"title":927,"description":928,"date":929,"category":921,"image":922,"tags":930,"score":561},"\u002Farticles\u002Fhermes-deepseek-v4","DeepSeek V4 Pro x Hermes Agent 自動寫自我介紹評測與部署指南","我叫 Hermes 自己寫這篇。1M context、0.87 鎂\u002F百萬 token、跨平台部署、自主截圖寫文 git push。這篇文章由 AI 從研究到發布全部自己來。","2026-05-08",[14,931,15],"LLM",{"_path":933,"title":934,"description":935,"date":936,"category":937,"image":938,"tags":939,"score":551},"\u002Farticles\u002Farnis","Arnis 地理 GIS 數據轉換工具安裝與 Minecraft 3D 真實地圖生成實戰","如果你曾經想過把自己的家鄉、城市甚至整片地形直接生成到 Minecraft 裡，Arnis 真的很誇張。","2026-05-15","Tools","\u002Fimages\u002Farnis-hero.png",[940,15],"Game",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"category":11,"image":12,"tags":942,"series":16,"readingTime":17,"difficulty":18,"local":19,"platforms":943,"gpu":23,"body":944,"_type":909,"_id":910,"_source":911,"_file":912,"_stem":913,"_extension":914},[14,11,15],[21,22],{"type":25,"children":945,"toc":1633},[946,950,954,962,971,974,978,1068,1071,1075,1079,1122,1126,1141,1144,1148,1165,1171,1177,1180,1184,1192,1201,1220,1224,1227,1231,1273,1281,1284,1288,1297,1301,1316,1320,1339,1342,1346,1350,1423,1439,1443,1511,1514,1518,1546,1549,1553,1566,1583,1600,1603,1610,1629],{"type":28,"tag":29,"props":947,"children":948},{"id":31},[949],{"type":34,"value":35},{"type":28,"tag":37,"props":951,"children":952},{},[953],{"type":34,"value":41},{"type":28,"tag":37,"props":955,"children":956},{},[957,958],{"type":34,"value":46},{"type":28,"tag":48,"props":959,"children":960},{},[961],{"type":34,"value":52},{"type":28,"tag":37,"props":963,"children":964},{},[965,966,970],{"type":34,"value":57},{"type":28,"tag":48,"props":967,"children":968},{},[969],{"type":34,"value":62},{"type":34,"value":64},{"type":28,"tag":66,"props":972,"children":973},{},[],{"type":28,"tag":29,"props":975,"children":976},{"id":71},[977],{"type":34,"value":71},{"type":28,"tag":75,"props":979,"children":980},{},[981,995],{"type":28,"tag":79,"props":982,"children":983},{},[984],{"type":28,"tag":83,"props":985,"children":986},{},[987,991],{"type":28,"tag":87,"props":988,"children":989},{"align":89},[990],{"type":34,"value":92},{"type":28,"tag":87,"props":992,"children":993},{"align":89},[994],{"type":34,"value":97},{"type":28,"tag":99,"props":996,"children":997},{},[998,1013,1024,1035,1046,1057],{"type":28,"tag":83,"props":999,"children":1000},{},[1001,1005],{"type":28,"tag":106,"props":1002,"children":1003},{"align":89},[1004],{"type":34,"value":110},{"type":28,"tag":106,"props":1006,"children":1007},{"align":89},[1008],{"type":28,"tag":115,"props":1009,"children":1011},{"href":117,"rel":1010},[119],[1012],{"type":34,"value":117},{"type":28,"tag":83,"props":1014,"children":1015},{},[1016,1020],{"type":28,"tag":106,"props":1017,"children":1018},{"align":89},[1019],{"type":34,"value":129},{"type":28,"tag":106,"props":1021,"children":1022},{"align":89},[1023],{"type":34,"value":134},{"type":28,"tag":83,"props":1025,"children":1026},{},[1027,1031],{"type":28,"tag":106,"props":1028,"children":1029},{"align":89},[1030],{"type":34,"value":142},{"type":28,"tag":106,"props":1032,"children":1033},{"align":89},[1034],{"type":34,"value":147},{"type":28,"tag":83,"props":1036,"children":1037},{},[1038,1042],{"type":28,"tag":106,"props":1039,"children":1040},{"align":89},[1041],{"type":34,"value":155},{"type":28,"tag":106,"props":1043,"children":1044},{"align":89},[1045],{"type":34,"value":160},{"type":28,"tag":83,"props":1047,"children":1048},{},[1049,1053],{"type":28,"tag":106,"props":1050,"children":1051},{"align":89},[1052],{"type":34,"value":168},{"type":28,"tag":106,"props":1054,"children":1055},{"align":89},[1056],{"type":34,"value":173},{"type":28,"tag":83,"props":1058,"children":1059},{},[1060,1064],{"type":28,"tag":106,"props":1061,"children":1062},{"align":89},[1063],{"type":34,"value":181},{"type":28,"tag":106,"props":1065,"children":1066},{"align":89},[1067],{"type":34,"value":186},{"type":28,"tag":66,"props":1069,"children":1070},{},[],{"type":28,"tag":29,"props":1072,"children":1073},{"id":192},[1074],{"type":34,"value":195},{"type":28,"tag":37,"props":1076,"children":1077},{},[1078],{"type":34,"value":200},{"type":28,"tag":202,"props":1080,"children":1081},{},[1082,1090,1098,1106,1114],{"type":28,"tag":206,"props":1083,"children":1084},{},[1085,1089],{"type":28,"tag":48,"props":1086,"children":1087},{},[1088],{"type":34,"value":213},{"type":34,"value":215},{"type":28,"tag":206,"props":1091,"children":1092},{},[1093,1097],{"type":28,"tag":48,"props":1094,"children":1095},{},[1096],{"type":34,"value":223},{"type":34,"value":225},{"type":28,"tag":206,"props":1099,"children":1100},{},[1101,1105],{"type":28,"tag":48,"props":1102,"children":1103},{},[1104],{"type":34,"value":233},{"type":34,"value":235},{"type":28,"tag":206,"props":1107,"children":1108},{},[1109,1113],{"type":28,"tag":48,"props":1110,"children":1111},{},[1112],{"type":34,"value":243},{"type":34,"value":245},{"type":28,"tag":206,"props":1115,"children":1116},{},[1117,1121],{"type":28,"tag":48,"props":1118,"children":1119},{},[1120],{"type":34,"value":253},{"type":34,"value":255},{"type":28,"tag":37,"props":1123,"children":1124},{},[1125],{"type":34,"value":260},{"type":28,"tag":262,"props":1127,"children":1128},{},[1129,1133,1137],{"type":28,"tag":206,"props":1130,"children":1131},{},[1132],{"type":34,"value":269},{"type":28,"tag":206,"props":1134,"children":1135},{},[1136],{"type":34,"value":274},{"type":28,"tag":206,"props":1138,"children":1139},{},[1140],{"type":34,"value":279},{"type":28,"tag":66,"props":1142,"children":1143},{},[],{"type":28,"tag":29,"props":1145,"children":1146},{"id":285},[1147],{"type":34,"value":288},{"type":28,"tag":37,"props":1149,"children":1150},{},[1151,1152,1156,1157,1160,1161,1164],{"type":34,"value":293},{"type":28,"tag":48,"props":1153,"children":1154},{},[1155],{"type":34,"value":298},{"type":34,"value":300},{"type":28,"tag":302,"props":1158,"children":1159},{},[],{"type":34,"value":306},{"type":28,"tag":302,"props":1162,"children":1163},{},[],{"type":34,"value":311},{"type":28,"tag":37,"props":1166,"children":1167},{},[1168],{"type":28,"tag":316,"props":1169,"children":1170},{"alt":318,"src":12},[],{"type":28,"tag":37,"props":1172,"children":1173},{},[1174],{"type":28,"tag":316,"props":1175,"children":1176},{"alt":325,"src":326},[],{"type":28,"tag":66,"props":1178,"children":1179},{},[],{"type":28,"tag":29,"props":1181,"children":1182},{"id":333},[1183],{"type":34,"value":333},{"type":28,"tag":37,"props":1185,"children":1186},{},[1187,1188,1191],{"type":34,"value":340},{"type":28,"tag":302,"props":1189,"children":1190},{},[],{"type":34,"value":345},{"type":28,"tag":37,"props":1193,"children":1194},{},[1195,1196,1200],{"type":34,"value":350},{"type":28,"tag":48,"props":1197,"children":1198},{},[1199],{"type":34,"value":355},{"type":34,"value":357},{"type":28,"tag":262,"props":1202,"children":1203},{},[1204,1208,1212,1216],{"type":28,"tag":206,"props":1205,"children":1206},{},[1207],{"type":34,"value":365},{"type":28,"tag":206,"props":1209,"children":1210},{},[1211],{"type":34,"value":370},{"type":28,"tag":206,"props":1213,"children":1214},{},[1215],{"type":34,"value":375},{"type":28,"tag":206,"props":1217,"children":1218},{},[1219],{"type":34,"value":380},{"type":28,"tag":37,"props":1221,"children":1222},{},[1223],{"type":34,"value":385},{"type":28,"tag":66,"props":1225,"children":1226},{},[],{"type":28,"tag":29,"props":1228,"children":1229},{"id":391},[1230],{"type":34,"value":391},{"type":28,"tag":75,"props":1232,"children":1233},{},[1234,1248],{"type":28,"tag":79,"props":1235,"children":1236},{},[1237],{"type":28,"tag":83,"props":1238,"children":1239},{},[1240,1244],{"type":28,"tag":87,"props":1241,"children":1242},{"align":89},[1243],{"type":34,"value":407},{"type":28,"tag":87,"props":1245,"children":1246},{"align":89},[1247],{"type":34,"value":412},{"type":28,"tag":99,"props":1249,"children":1250},{},[1251,1262],{"type":28,"tag":83,"props":1252,"children":1253},{},[1254,1258],{"type":28,"tag":106,"props":1255,"children":1256},{"align":89},[1257],{"type":34,"value":423},{"type":28,"tag":106,"props":1259,"children":1260},{"align":89},[1261],{"type":34,"value":428},{"type":28,"tag":83,"props":1263,"children":1264},{},[1265,1269],{"type":28,"tag":106,"props":1266,"children":1267},{"align":89},[1268],{"type":34,"value":168},{"type":28,"tag":106,"props":1270,"children":1271},{"align":89},[1272],{"type":34,"value":440},{"type":28,"tag":37,"props":1274,"children":1275},{},[1276,1277,1280],{"type":34,"value":445},{"type":28,"tag":302,"props":1278,"children":1279},{},[],{"type":34,"value":450},{"type":28,"tag":66,"props":1282,"children":1283},{},[],{"type":28,"tag":29,"props":1285,"children":1286},{"id":456},[1287],{"type":34,"value":459},{"type":28,"tag":37,"props":1289,"children":1290},{},[1291,1292,1296],{"type":34,"value":464},{"type":28,"tag":48,"props":1293,"children":1294},{},[1295],{"type":34,"value":469},{"type":34,"value":300},{"type":28,"tag":37,"props":1298,"children":1299},{},[1300],{"type":34,"value":475},{"type":28,"tag":262,"props":1302,"children":1303},{},[1304,1308,1312],{"type":28,"tag":206,"props":1305,"children":1306},{},[1307],{"type":34,"value":483},{"type":28,"tag":206,"props":1309,"children":1310},{},[1311],{"type":34,"value":488},{"type":28,"tag":206,"props":1313,"children":1314},{},[1315],{"type":34,"value":493},{"type":28,"tag":37,"props":1317,"children":1318},{},[1319],{"type":34,"value":498},{"type":28,"tag":262,"props":1321,"children":1322},{},[1323,1327,1331,1335],{"type":28,"tag":206,"props":1324,"children":1325},{},[1326],{"type":34,"value":506},{"type":28,"tag":206,"props":1328,"children":1329},{},[1330],{"type":34,"value":511},{"type":28,"tag":206,"props":1332,"children":1333},{},[1334],{"type":34,"value":516},{"type":28,"tag":206,"props":1336,"children":1337},{},[1338],{"type":34,"value":521},{"type":28,"tag":66,"props":1340,"children":1341},{},[],{"type":28,"tag":29,"props":1343,"children":1344},{"id":527},[1345],{"type":34,"value":530},{"type":28,"tag":37,"props":1347,"children":1348},{},[1349],{"type":34,"value":535},{"type":28,"tag":537,"props":1351,"children":1352},{"className":539,"code":540,"language":541,"meta":7,"style":7},[1353],{"type":28,"tag":544,"props":1354,"children":1355},{"__ignoreMap":7},[1356,1363,1378,1385,1392],{"type":28,"tag":548,"props":1357,"children":1358},{"class":550,"line":551},[1359],{"type":28,"tag":548,"props":1360,"children":1361},{"style":555},[1362],{"type":34,"value":558},{"type":28,"tag":548,"props":1364,"children":1365},{"class":550,"line":561},[1366,1370,1374],{"type":28,"tag":548,"props":1367,"children":1368},{"style":565},[1369],{"type":34,"value":568},{"type":28,"tag":548,"props":1371,"children":1372},{"style":571},[1373],{"type":34,"value":574},{"type":28,"tag":548,"props":1375,"children":1376},{"style":571},[1377],{"type":34,"value":579},{"type":28,"tag":548,"props":1379,"children":1380},{"class":550,"line":582},[1381],{"type":28,"tag":548,"props":1382,"children":1383},{"emptyLinePlaceholder":19},[1384],{"type":34,"value":588},{"type":28,"tag":548,"props":1386,"children":1387},{"class":550,"line":591},[1388],{"type":28,"tag":548,"props":1389,"children":1390},{"style":555},[1391],{"type":34,"value":597},{"type":28,"tag":548,"props":1393,"children":1394},{"class":550,"line":600},[1395,1399,1403,1407,1411,1415,1419],{"type":28,"tag":548,"props":1396,"children":1397},{"style":565},[1398],{"type":34,"value":568},{"type":28,"tag":548,"props":1400,"children":1401},{"style":571},[1402],{"type":34,"value":574},{"type":28,"tag":548,"props":1404,"children":1405},{"style":571},[1406],{"type":34,"value":614},{"type":28,"tag":548,"props":1408,"children":1409},{"style":617},[1410],{"type":34,"value":620},{"type":28,"tag":548,"props":1412,"children":1413},{"style":571},[1414],{"type":34,"value":625},{"type":28,"tag":548,"props":1416,"children":1417},{"style":617},[1418],{"type":34,"value":630},{"type":28,"tag":548,"props":1420,"children":1421},{"style":571},[1422],{"type":34,"value":635},{"type":28,"tag":37,"props":1424,"children":1425},{},[1426,1427,1432,1433,1438],{"type":34,"value":640},{"type":28,"tag":544,"props":1428,"children":1430},{"className":1429},[],[1431],{"type":34,"value":646},{"type":34,"value":648},{"type":28,"tag":544,"props":1434,"children":1436},{"className":1435},[],[1437],{"type":34,"value":654},{"type":34,"value":656},{"type":28,"tag":37,"props":1440,"children":1441},{},[1442],{"type":34,"value":661},{"type":28,"tag":537,"props":1444,"children":1445},{"className":539,"code":664,"language":541,"meta":7,"style":7},[1446],{"type":28,"tag":544,"props":1447,"children":1448},{"__ignoreMap":7},[1449,1492],{"type":28,"tag":548,"props":1450,"children":1451},{"class":550,"line":551},[1452,1456,1460,1464,1468,1472,1476,1480,1484,1488],{"type":28,"tag":548,"props":1453,"children":1454},{"style":674},[1455],{"type":34,"value":677},{"type":28,"tag":548,"props":1457,"children":1458},{"style":680},[1459],{"type":34,"value":683},{"type":28,"tag":548,"props":1461,"children":1462},{"style":686},[1463],{"type":34,"value":689},{"type":28,"tag":548,"props":1465,"children":1466},{"style":680},[1467],{"type":34,"value":694},{"type":28,"tag":548,"props":1469,"children":1470},{"style":697},[1471],{"type":34,"value":700},{"type":28,"tag":548,"props":1473,"children":1474},{"style":680},[1475],{"type":34,"value":705},{"type":28,"tag":548,"props":1477,"children":1478},{"style":697},[1479],{"type":34,"value":710},{"type":28,"tag":548,"props":1481,"children":1482},{"style":680},[1483],{"type":34,"value":715},{"type":28,"tag":548,"props":1485,"children":1486},{"style":697},[1487],{"type":34,"value":710},{"type":28,"tag":548,"props":1489,"children":1490},{"style":680},[1491],{"type":34,"value":724},{"type":28,"tag":548,"props":1493,"children":1494},{"class":550,"line":561},[1495,1499,1503,1507],{"type":28,"tag":548,"props":1496,"children":1497},{"style":674},[1498],{"type":34,"value":677},{"type":28,"tag":548,"props":1500,"children":1501},{"style":680},[1502],{"type":34,"value":736},{"type":28,"tag":548,"props":1504,"children":1505},{"style":686},[1506],{"type":34,"value":689},{"type":28,"tag":548,"props":1508,"children":1509},{"style":680},[1510],{"type":34,"value":745},{"type":28,"tag":66,"props":1512,"children":1513},{},[],{"type":28,"tag":29,"props":1515,"children":1516},{"id":751},[1517],{"type":34,"value":751},{"type":28,"tag":262,"props":1519,"children":1520},{},[1521,1530,1538,1542],{"type":28,"tag":206,"props":1522,"children":1523},{},[1524,1525,1529],{"type":34,"value":761},{"type":28,"tag":48,"props":1526,"children":1527},{},[1528],{"type":34,"value":766},{"type":34,"value":768},{"type":28,"tag":206,"props":1531,"children":1532},{},[1533,1534],{"type":34,"value":773},{"type":28,"tag":48,"props":1535,"children":1536},{},[1537],{"type":34,"value":778},{"type":28,"tag":206,"props":1539,"children":1540},{},[1541],{"type":34,"value":783},{"type":28,"tag":206,"props":1543,"children":1544},{},[1545],{"type":34,"value":788},{"type":28,"tag":66,"props":1547,"children":1548},{},[],{"type":28,"tag":29,"props":1550,"children":1551},{"id":794},[1552],{"type":34,"value":794},{"type":28,"tag":37,"props":1554,"children":1555},{},[1556,1557,1561,1562,1565],{"type":34,"value":801},{"type":28,"tag":48,"props":1558,"children":1559},{},[1560],{"type":34,"value":806},{"type":34,"value":808},{"type":28,"tag":302,"props":1563,"children":1564},{},[],{"type":34,"value":813},{"type":28,"tag":37,"props":1567,"children":1568},{},[1569,1570,1573,1574,1577,1578,1582],{"type":34,"value":818},{"type":28,"tag":302,"props":1571,"children":1572},{},[],{"type":34,"value":823},{"type":28,"tag":302,"props":1575,"children":1576},{},[],{"type":34,"value":828},{"type":28,"tag":48,"props":1579,"children":1580},{},[1581],{"type":34,"value":833},{"type":34,"value":835},{"type":28,"tag":37,"props":1584,"children":1585},{},[1586,1587,1590,1591,1594,1595,1599],{"type":34,"value":840},{"type":28,"tag":302,"props":1588,"children":1589},{},[],{"type":34,"value":845},{"type":28,"tag":302,"props":1592,"children":1593},{},[],{"type":34,"value":850},{"type":28,"tag":48,"props":1596,"children":1597},{},[1598],{"type":34,"value":855},{"type":34,"value":300},{"type":28,"tag":66,"props":1601,"children":1602},{},[],{"type":28,"tag":37,"props":1604,"children":1605},{},[1606],{"type":28,"tag":48,"props":1607,"children":1608},{},[1609],{"type":34,"value":867},{"type":28,"tag":262,"props":1611,"children":1612},{},[1613,1621],{"type":28,"tag":206,"props":1614,"children":1615},{},[1616],{"type":28,"tag":115,"props":1617,"children":1619},{"href":876,"rel":1618},[119],[1620],{"type":34,"value":880},{"type":28,"tag":206,"props":1622,"children":1623},{},[1624],{"type":28,"tag":115,"props":1625,"children":1627},{"href":886,"rel":1626},[119],[1628],{"type":34,"value":890},{"type":28,"tag":892,"props":1630,"children":1631},{},[1632],{"type":34,"value":896},{"title":7,"searchDepth":561,"depth":561,"links":1634},[1635,1636,1637,1638,1639,1640,1641,1642,1643,1644],{"id":31,"depth":561,"text":35},{"id":71,"depth":561,"text":71},{"id":192,"depth":561,"text":195},{"id":285,"depth":561,"text":288},{"id":333,"depth":561,"text":333},{"id":391,"depth":561,"text":391},{"id":456,"depth":561,"text":459},{"id":527,"depth":561,"text":530},{"id":751,"depth":561,"text":751},{"id":794,"depth":561,"text":794},1779779149618]