[{"data":1,"prerenderedAt":6568},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory":421,"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory-surround":1303},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"id":422,"title":423,"author":424,"body":425,"category":1278,"date":1281,"description":1282,"extension":1283,"image":1284,"imageAlt":1285,"isPublished":1286,"meta":1287,"minRead":1294,"navigation":1286,"path":277,"seo":1295,"stem":1296,"tags":1297,"updatedAt":424,"__hash__":1302},"article\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","基於Cloudflare Workers與MCP協定構建個人專屬AI持久化記憶系統，完美解決Context空白痛點",null,{"type":426,"value":427,"toc":1260},"minimark",[428,433,437,440,444,447,464,468,476,490,493,496,543,548,632,636,662,795,806,810,815,861,887,891,896,969,974,978,1011,1019,1059,1062,1094,1098,1106,1111,1152,1156,1206,1209,1212,1215,1218,1222,1256],[429,430,432],"h2",{"id":431},"持久化-ai-記憶對智慧體agent的重要性","持久化 AI 記憶對智慧體（Agent）的重要性",[434,435,436],"p",{},"隨著 AI 助手逐漸融入我們的日常生活與工作，我們經常會遇到「空白上下文」的問題（Blank Context Issue）。上週已經確認的決策在開啟新對話後便被遺忘，這迫使我们不得不一遍又一遍地輸入相同的技術堆疊（Tech Stack）細節，並在每個新會話中重新設定使用者偏好。",[434,438,439],{},"與其每次都從零開始，我們需要構建一個能夠持續演進、深入理解使用者決策的記憶系統，從而徹底消除重複輸入上下文的煩惱。",[429,441,443],{"id":442},"自行架設-ai-記憶系統-vs-內置-ai-記憶功能","自行架設 AI 記憶系統 vs. 內置 AI 記憶功能",[434,445,446],{},"雖然許多 AI 智慧體或用戶端（如 ChatGPT、Claude 等）自帶了內建記憶功能，但我們很少在所有場景下只使用單一智慧體。我們可能會用 Claude 來設計和規劃專案架構，用 Kimi 來編寫程式碼，用 ChatGPT 進行深度的背景研究。然而，這些不同的智慧體之間無法直接共享上下文，所有記憶依然被孤立在各自的生態黑盒子中。",[434,448,449,450,457,458,463],{},"從軟體工程的角度來看，我們並不信任無法控制的黑盒子。我們需要的是一個可觀察、可審計且完全處於自己掌控之下的 AI 記憶系統。開放原始碼專案 ",[451,452,456],"a",{"href":453,"rel":454},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[455],"nofollow","Second Brain","（Fork 自 ",[451,459,462],{"href":460,"rel":461},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare%EF%BC%89%E6%8F%90%E4%BE%9B%E4%BA%86%E4%B8%80%E5%80%8B%E6%94%AF%E6%8F%B4%E6%A8%A1%E5%9E%8B%E4%B8%8A%E4%B8%8B%E6%96%87%E5%8D%94%E5%AE%9A%EF%BC%88Model",[455],"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare）提供了一個支援模型上下文協定（Model"," Context Protocol，簡稱 MCP）的持久化自行架設 AI 記憶系統。任何相容 MCP 協定的 AI 智慧體（如 Claude、ChatGPT、Kimi Code 等）都可以完美共享相同的上下文記憶庫。",[429,465,467],{"id":466},"如何在-cloudflare-上構建-second-brain-ai-記憶系統","如何在 Cloudflare 上構建 Second Brain AI 記憶系統",[434,469,470,471,475],{},"Second Brain 記憶系統部署在 ",[472,473,474],"strong",{},"Cloudflare Workers"," 之上，其提供了全球分佈式、極低延遲的 Serverless 執行基礎設施。這使得在 AI 的推理和決策循環中，檢索記憶（Recall）及寫入等操作能夠以近乎零延遲的體驗執行。",[434,477,478,479,482,483,486,487,489],{},"系統使用 ",[472,480,481],{},"Workers AI"," 的嵌入（Embedding）模型来生成高維向量。這些嵌入向量儲存在 ",[472,484,485],{},"Cloudflare Vectorize"," 中，這是一項經過高度優化、全球分佈式的高性能向量資料庫服務。",[472,488,485],{}," 會執行餘弦相似度（Cosine Similarity）搜尋，以精準匹配具有語意相關性的記憶切片。",[434,491,492],{},"Second Brain 還內建了智慧的去重與合併機制。只有在內容相似度低於 85% 時，系統才會將其作為新記憶儲存；否則，該內容將被攔截或標記為潛在的重複候選。超過 1,600 字元的長文字會被系統在句子或換行符邊界處進行合理切分，並保持相鄰分片之間有 200 字元的重疊（Overlap），以防丟失上下文語境。隨後，每個文字分片都會被單獨向量化，從而實現極高精度的語意匹配。",[434,494,495],{},"系統為 AI 智慧體直接暴露了以下 MCP 工具介面：",[497,498,499,507,513,519,525,531,537],"ul",{},[500,501,502,506],"li",{},[503,504,505],"code",{},"remember","：儲存想法、決策、偏好及專案整體上下文",[500,508,509,512],{},[503,510,511],{},"append","：為已有的記憶內容追加新的更新或補充資訊",[500,514,515,518],{},[503,516,517],{},"update","：完全替換已有的某條記憶內容",[500,520,521,524],{},[503,522,523],{},"recall","：基於語意相似度檢索相關記憶，而非死板的關鍵字精確匹配",[500,526,527,530],{},[503,528,529],{},"list_recent","：瀏覽最近儲存的記憶記錄",[500,532,533,536],{},[503,534,535],{},"forget","：永久且徹底地刪除某條記憶",[500,538,539,542],{},[503,540,541],{},"link\u002Fconnections","：明示關聯不同的記憶節點（V2 版本提供的圖譜功能）",[544,545,547],"h3",{"id":546},"在-cloudflare-上設定-second-brain","在 Cloudflare 上設定 Second Brain",[549,550,551,570,577,584,591,598,609,616,619,626],"ol",{},[500,552,553,554,559,560,563,564,569],{},"在 ",[451,555,558],{"href":556,"rel":557},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[455],"Github 儲存庫"," 頁面，點擊 ",[503,561,562],{},"Deploy to Cloudflare"," 按鈕。 [[",[565,566],"img",{"alt":567,"src":568},"GitHub 頁面上突出顯示的 Deploy to Cloudflare 部署按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[500,571,572,573],{},"填寫彈出的 Cloudflare Worker 設定表單。\n",[565,574],{"alt":575,"src":576},"Cloudflare Workers 部署設定表單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[500,578,579,580],{},"在 Dimensions（維度）輸入 '384'，Metric（度量指標）選擇 'cosine'，然後點擊 Deploy 按鈕。\n",[565,581],{"alt":582,"src":583},"Cloudflare Vectorize 向量資料庫建立與維度設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[500,585,586,587],{},"部署成功後，以下是 Cloudflare Workers 平台中 Second Brain 實例的概覽資訊：\n",[565,588],{"alt":589,"src":590},"已部署的 Second Brain Worker 實例概覽首頁","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[500,592,593,594],{},"點擊 'Settings'（設定），然後點擊 'AUTH_TOKEN' 環境變數旁的編輯圖示，以建立一條高強度的存取權杖（Token）：\n",[565,595],{"alt":596,"src":597},"Cloudflare Worker 變數設定中高亮顯示的 AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[500,599,600,601,605],{},"點擊 'Rotate'（輪換）連結，以便能輸入新的安全值： ",[565,602],{"alt":603,"src":604},"AUTH_TOKEN 變數修改與金鑰輪換介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[565,606],{"alt":607,"src":608},"在 AUTH_TOKEN 值欄位中輸入產生的隨機安全字串","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[500,610,611,612,615],{},"在 macOS 終端機中執行 ",[503,613,614],{},"openssl rand -base64 32"," 命令來生成一個隨機的安全字串，並將其複製貼上到 'Value' 輸入框中。",[500,617,618],{},"點擊 'Deploy' 按鈕，使新設定的 'AUTH_TOKEN' 正式生效。",[500,620,621,622],{},"在瀏覽器中打開您剛剛建立的 Second Brain Worker 存取網域：\n",[565,623],{"alt":624,"src":625},"包含 Bearer Token 輸入欄位收藏的 Second Brain Web 登入介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[500,627,553,628,631],{},[503,629,630],{},"Bearer token"," 輸入框中填入剛才建立的 'AUTH_TOKEN'，然後點擊 'Connect' 按鈕登入 Web 主控台。",[544,633,635],{"id":634},"透過-mcp-協定整合-claude-desktop","透過 MCP 協定整合 Claude Desktop",[549,637,638,645,652],{},[500,639,640,641],{},"在 Claude Desktop 用戶端中點擊 'Customize'（自訂）按鈕。\n",[565,642],{"alt":643,"src":644},"Claude Desktop 介面中指向 Customize 自訂按鈕的位置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[500,646,647,648],{},"點擊 'Developer'（開發者）選項，手動編輯本地的 MCP 設定檔：\n",[565,649],{"alt":650,"src":651},"Claude Desktop 開發者設定選單中用於開啟 MCP 設定檔的選項","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[500,653,553,654,657,658,661],{},[503,655,656],{},"claude_desktop_config.json"," 的 ",[503,659,660],{},"mcpServers"," 欄位中加入以下設定程式碼區塊：",[663,664,669],"pre",{"className":665,"code":666,"language":667,"meta":668,"style":668},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","    \"second-brain\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n        \"--header\",\n        \"Authorization: Bearer \u003Cyour-token>\"\n      ]\n    }\n","json","",[503,670,671,694,720,735,748,760,772,783,789],{"__ignoreMap":668},[672,673,676,680,684,687,691],"span",{"class":674,"line":675},"line",1,[672,677,679],{"class":678},"sMK4o","    \"",[672,681,683],{"class":682},"sfazB","second-brain",[672,685,686],{"class":678},"\"",[672,688,690],{"class":689},"sTEyZ",": ",[672,692,693],{"class":678},"{\n",[672,695,697,700,704,706,709,712,715,717],{"class":674,"line":696},2,[672,698,699],{"class":678},"      \"",[672,701,703],{"class":702},"spNyl","command",[672,705,686],{"class":678},[672,707,708],{"class":678},":",[672,710,711],{"class":678}," \"",[672,713,714],{"class":682},"npx",[672,716,686],{"class":678},[672,718,719],{"class":678},",\n",[672,721,723,725,728,730,732],{"class":674,"line":722},3,[672,724,699],{"class":678},[672,726,727],{"class":702},"args",[672,729,686],{"class":678},[672,731,708],{"class":678},[672,733,734],{"class":678}," [\n",[672,736,738,741,744,746],{"class":674,"line":737},4,[672,739,740],{"class":678},"        \"",[672,742,743],{"class":682},"mcp-remote",[672,745,686],{"class":678},[672,747,719],{"class":678},[672,749,751,753,756,758],{"class":674,"line":750},5,[672,752,740],{"class":678},[672,754,755],{"class":682},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[672,757,686],{"class":678},[672,759,719],{"class":678},[672,761,763,765,768,770],{"class":674,"line":762},6,[672,764,740],{"class":678},[672,766,767],{"class":682},"--header",[672,769,686],{"class":678},[672,771,719],{"class":678},[672,773,775,777,780],{"class":674,"line":774},7,[672,776,740],{"class":678},[672,778,779],{"class":682},"Authorization: Bearer \u003Cyour-token>",[672,781,782],{"class":678},"\"\n",[672,784,786],{"class":674,"line":785},8,[672,787,788],{"class":678},"      ]\n",[672,790,792],{"class":674,"line":791},9,[672,793,794],{"class":678},"    }\n",[434,796,797,801,802],{},[565,798],{"alt":799,"src":800},"包含 Second Brain 遠端服務的 Claude Desktop MCP 設定檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. 重啟 Claude Desktop 並檢查 'Local MCP servers' 列表，狀態應顯示為 'running'（運行中）。\n",[565,803],{"alt":804,"src":805},"Claude Desktop 用戶端中顯示為執行（running）狀態的的 Second Brain MCP 服務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[544,807,809],{"id":808},"透過-mcp-協定整合-claude-code","透過 MCP 協定整合 Claude Code",[497,811,812],{},[500,813,814],{},"在終端機中執行以下命令以新增該遠端 MCP 服務：",[663,816,820],{"className":817,"code":818,"language":819,"meta":668,"style":668},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n","shell",[503,821,822],{"__ignoreMap":668},[672,823,824,828,831,834,837,840,843,846,849,852,855,858],{"class":674,"line":675},[672,825,827],{"class":826},"sBMFI","claude",[672,829,830],{"class":682}," mcp",[672,832,833],{"class":682}," add",[672,835,836],{"class":682}," --transport",[672,838,839],{"class":682}," http",[672,841,842],{"class":682}," second-brain",[672,844,845],{"class":682}," https:\u002F\u002F",[672,847,848],{"class":678},"\u003C",[672,850,851],{"class":682},"your-worker-ur",[672,853,854],{"class":689},"l",[672,856,857],{"class":678},">",[672,859,860],{"class":682},"\u002Fmcp\n",[497,862,863,870],{},[500,864,865,866,869],{},"Claude Code 會自動偵測到該端點需要 OAuth 身份驗證，並在您的預設瀏覽器中打開登入頁面，供您輸入並驗證剛才建立的 ",[503,867,868],{},"AUTH_TOKEN","。",[500,871,872,873,876,877,880,881,886],{},"在本地的 ",[503,874,875],{},"~\u002F.claude"," 目錄下建立 ",[503,878,879],{},"CLAUDE.md"," 檔案，並將 ",[451,882,885],{"href":883,"rel":884},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[455],"CLAUDE_INSTRUCTIONS.md"," 檔案中的引導詞和規則完整寫入其中。",[544,888,890],{"id":889},"透過-mcp-協定整合-gemini-cli","透過 MCP 協定整合 Gemini CLI",[549,892,893],{},[500,894,895],{},"将以下 MCP 設定資訊加入您本地的 '.\u002F.gemini\u002Fsettings.json' 檔案：",[663,897,899],{"className":665,"code":898,"language":667,"meta":668,"style":668},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[503,900,901,913,932,946,960,965],{"__ignoreMap":668},[672,902,903,905,907,909,911],{"class":674,"line":675},[672,904,679],{"class":678},[672,906,683],{"class":682},[672,908,686],{"class":678},[672,910,690],{"class":689},[672,912,693],{"class":678},[672,914,915,917,920,922,924,926,928,930],{"class":674,"line":696},[672,916,699],{"class":678},[672,918,919],{"class":702},"httpUrl",[672,921,686],{"class":678},[672,923,708],{"class":678},[672,925,711],{"class":678},[672,927,755],{"class":682},[672,929,686],{"class":678},[672,931,719],{"class":678},[672,933,934,936,939,941,943],{"class":674,"line":722},[672,935,699],{"class":678},[672,937,938],{"class":702},"oauth",[672,940,686],{"class":678},[672,942,708],{"class":678},[672,944,945],{"class":678}," {\n",[672,947,948,950,953,955,957],{"class":674,"line":737},[672,949,740],{"class":678},[672,951,952],{"class":826},"enabled",[672,954,686],{"class":678},[672,956,708],{"class":678},[672,958,959],{"class":678}," true\n",[672,961,962],{"class":674,"line":750},[672,963,964],{"class":678},"      }\n",[672,966,967],{"class":674,"line":762},[672,968,794],{"class":678},[549,970,971],{"start":696},[500,972,973],{},"啟動 Gemini CLI 用戶端。",[544,975,977],{"id":976},"在不同-ai-智慧體中測試-second-brain-效果","在不同 AI 智慧體中測試 Second Brain 效果",[549,979,980,990,1004],{},[500,981,553,982,985,986],{},[472,983,984],{},"Claude Desktop"," 中，如果我們只是進行簡單的品牌色調偏好設定，此時預設並不會呼叫外部的 Second Brain 服務：\n",[565,987],{"alt":988,"src":989},"在未啟用 Second Brain 記憶層時在 Claude Desktop 中進行的首次偏好設定測試","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[500,991,992,993,995,996,999,1000],{},"如果我們只是輸入 'remember' 等常規詞，由於其尚未觸發特定提示詞引導，",[472,994,984],{}," 此時僅會呼叫本地內建的 ",[503,997,998],{},"memory_user-edits"," 工具，並不會同步到雲端的持久化記憶層。\n",[565,1001],{"alt":1002,"src":1003},"Claude Desktop 預設呼叫本地內建使用者編輯工具而忽略雲端 Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[500,1005,1006,1007,1010],{},"而當我们在配置了規則引導的 ",[472,1008,1009],{},"Claude Code"," 終端機中，輸入以下具體指令時，系統便成功地在背景觸發並呼叫了 Second Brain 工具：",[663,1012,1017],{"className":1013,"code":1015,"language":1016},[1014],"language-text","Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n","text",[503,1018,1015],{"__ignoreMap":668},[434,1020,1021,1025,1026,1029,1030,1034,1035,1039,1040,1042,1043,1047,1048,1051,1052,1034,1056],{},[565,1022],{"alt":1023,"src":1024},"Claude Code 終端機視窗顯示成功觸發並寫入 Second Brain 遠端記憶","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. 登入 ",[472,1027,1028],{},"Cloudflare Workers 主控台"," 查看 Second Brain 的資料庫，確認這些顏色資訊已成功同步並儲存在雲端：\n",[565,1031],{"alt":1032,"src":1033},"在 Second Brain 主控台 Web UI 中驗證已成功儲存的品牌色設定資料","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[1036,1037,1038],"em",{},"Claude Code 之所以能夠自動無縫工作，得益於專案目錄下的 CLAUDE_INSTRUCTIONS.md 檔案。該檔案讓智慧體能夠理解並關聯包含 'Second Brain' 關鍵字的記憶流程。","\n5. 在 ",[472,1041,984],{}," 中若想達到相同效果，我們需要在提示詞中顯式提及 'Second Brain' 相關的指引，以強制智慧體讀取或寫入這一持久化記憶圖層。\n",[565,1044],{"alt":1045,"src":1046},"在提示詞中顯式提及 'Second Brain' 關鍵字以觸發遠端記憶讀寫","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. 同樣地，在 ",[472,1049,1050],{},"Gemini CLI"," 互動中，我們也需要提到 'Second Brain' 關鍵字，以喚醒並觸發其對應的遠端 MCP 工具。\n",[565,1053],{"alt":1054,"src":1055},"Gemini CLI 終端機命令列互動中成功觸發 Second Brain 讀寫","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[1036,1057,1058],{},"如果您仿照 CLAUDE_INSTRUCTIONS.md 的做法，在本地的 GEMINI.md 檔案中添加類似的上下文引導，AI 便可在背景靜默呼叫 Second Brain 記憶層，不再需要您每次都手動輸入觸發關鍵字。",[544,1060,1061],{"id":1061},"瀏覽器擴充功能与快捷剪輯",[497,1063,1064,1067],{},[500,1065,1066],{},"系統為 Chrome、Firefox 和 Microsoft Edge 瀏覽器提供了官方外掛程式支援。",[500,1068,1069,1070],{},"透過該外掛程式，您可以非常快捷地完成以下操作：\n",[497,1071,1072,1078,1084],{},[500,1073,1074,1077],{},[472,1075,1076],{},"網頁一鍵剪輯"," — 一鍵將當前頁面的網頁標題與 URL 網址快捷歸檔到您的 Second Brain 中。",[500,1079,1080,1083],{},[472,1081,1082],{},"選取文字摘要剪輯"," — 選取網頁中的任意精彩段落或技術細節後點擊剪輯，該摘錄便會配合網頁標題和 URL 被一併儲存。",[500,1085,1086,1089,1090,1093],{},[472,1087,1088],{},"自由文字速記"," — 在儲存前直接在功能彈窗中輸入額外的補充上下文，或直接附帶 ",[503,1091,1092],{},"#標記","；這些標記會被系統自動識別並提取。",[544,1095,1097],{"id":1096},"透過-obsidian-外掛程式同步個人本地知識庫","透過 Obsidian 外掛程式同步個人本地知識庫",[497,1099,1100,1103],{},[500,1101,1102],{},"系統提供了一個 Obsidian 專屬外掛程式，支援將您本地 Obsidian Vault（保險庫）中的特定筆記完美同步至 Cloudflare 端自託管的 Second Brain 記憶中心。",[500,1104,1105],{},"透過設定特定的同步標記，您可以精準控制哪些筆記能夠寫入您的持久化 AI 上下文庫中。",[1107,1108,1110],"h4",{"id":1109},"安装-obsidian-外掛程式","安装 Obsidian 外掛程式",[549,1112,1113,1127,1138,1145],{},[500,1114,1115,1116,1119,1120,1123],{},"啟動 Obsidian 用戶端 → 點擊 ",[672,1117,1118],{},"Settings（設定）"," → ",[672,1121,1122],{},"Community Plugins（第三方外掛程式）",[565,1124],{"alt":1125,"src":1126},"Obsidian 系統設定面板中指向第三方社群外掛程式的入口","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[500,1128,1129,1130,1133,1134],{},"點擊 ",[672,1131,1132],{},"Browse（瀏覽）"," 按鈕。\n",[565,1135],{"alt":1136,"src":1137},"Obsidian 第三方外掛程式市集並高亮顯示的 Browse 瀏覽按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[500,1139,1140,1141],{},"檢索關鍵詞 'Second Brain Sync'。\n",[565,1142],{"alt":1143,"src":1144},"在 Obsidian 第三方外掛程式市集中搜尋 Second Brain Sync 外掛程式","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[500,1146,1147,1148],{},"點擊 'Install' 進行安裝，然後點擊 'Enable' 啟用該外掛程式。\n",[565,1149],{"alt":1150,"src":1151},"在 Obsidian 中點擊安裝並啟用 Second Brain Sync 外掛程式","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[1107,1153,1155],{"id":1154},"設定-obsidian-外掛程式","設定 Obsidian 外掛程式",[549,1157,1158,1168,1175,1182,1189,1199],{},[500,1159,1160,1161,1163,1164,1167],{},"進入 Obsidian 用戶端 ",[672,1162,1118],{}," → 選取 ",[672,1165,1166],{},"Second Brain Sync"," 外掛程式設定頁面：",[500,1169,1170,1171],{},"準確填寫您的 Worker 的端點「URL」和剛才建立的「Auth token（身份權杖）」：\n",[565,1172],{"alt":1173,"src":1174},"在 Obsidian 外掛程式設定頁面中輸入 Worker URL 和 AUTH_TOKEN 身份憑證","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[500,1176,1177,1178],{},"點擊 'Test' 按鈕來驗證網路連線是否暢通：\n",[565,1179],{"alt":1180,"src":1181},"Obsidian 外掛程式連線測試傳回成功（Success）提示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[500,1183,1184,1185],{},"設定具體的同步策略。設定您的同步標記「Sync tag」並開啟「Auto-sync on save（儲存時自動同步）」功能：\n",[565,1186],{"alt":1187,"src":1188},"在 Obsidian 外掛程式中設定特定同步標記並啟用儲存時自動同步","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[500,1190,1191,1192,1194,1195],{},"在 Obsidian 知識庫中新建一篇筆記，並為其附帶您設定好的同步標記（例如： ",[503,1193,683],{},"）：\n",[565,1196],{"alt":1197,"src":1198},"在 Obsidian 中建立一篇帶有 'second-brain' 標籤的待同步本地筆記","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[500,1200,1201,1202],{},"筆記儲存後，其內容已成功觸發並自動同步到在 Cloudflare 上運行的自託管 Second Brain 實例中：\n",[565,1203],{"alt":1204,"src":1205},"在雲端 Second Brain 主控台 Web UI 中驗證已成功同步過來的 Obsidian 筆記","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[429,1207,1208],{"id":1208},"總結與展望",[434,1210,1211],{},"Second Brain 記憶系統為困擾當前 AI 生態的最大痛點之一 —— 長期上下文遺忘與記憶斷層，提供了一套極為優雅的開源解決方案。透過將自託管專案與 Cloudflare Workers 彈性、全球分佈的 Serverless 基礎設施深度結合，我們得以在邊緣網路上輕鬆架設起一條低延遲、高回應速度的個人語意記憶閘道。得益於 MCP 這一開放的標準，這條記憶脈絡如今已能無縫流動、並被移植共享於各種主流的 AI 助手和開發終端之間。",[434,1213,1214],{},"Obsidian 專屬同步外掛程式的加入，更是將這套架構完美融合進了個人日常的知識管理（PKM）流程。您平時隨手記錄的雜亂卡片或開發速記，能被有選擇地提煉並重構，轉化為可被 AI 完美解析的結構化上下文。",[434,1216,1217],{},"將私有化部署、高精度的語意向量搜尋以及開放式的 MCP 整合標準相融合，Second Brain 不僅僅是一層記憶的外掛，它正向我們展示著一個由使用者個人掌握核心資料所有權，安全、獨立、互聯的未來 Agent 生態系統基石。",[429,1219,1221],{"id":1220},"參考資料","參考資料：",[497,1223,1224,1230,1236,1243,1250],{},[500,1225,1226],{},[451,1227,1228],{"href":1228,"rel":1229},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[455],[500,1231,1232],{},[451,1233,1234],{"href":1234,"rel":1235},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[455],[500,1237,1238],{},[451,1239,1242],{"href":1240,"rel":1241},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[455],"Connect to AI Clients",[500,1244,1245],{},[451,1246,1249],{"href":1247,"rel":1248},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[455],"Second Brain Obsidian Plugin",[500,1251,1252],{},[451,1253,1254],{"href":1254,"rel":1255},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[455],[1257,1258,1259],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":668,"searchDepth":696,"depth":722,"links":1261},[1262,1263,1264,1276,1277],{"id":431,"depth":696,"text":432},{"id":442,"depth":696,"text":443},{"id":466,"depth":696,"text":467,"children":1265},[1266,1267,1268,1269,1270,1271,1272],{"id":546,"depth":722,"text":547},{"id":634,"depth":722,"text":635},{"id":808,"depth":722,"text":809},{"id":889,"depth":722,"text":890},{"id":976,"depth":722,"text":977},{"id":1061,"depth":722,"text":1061},{"id":1096,"depth":722,"text":1097,"children":1273},[1274,1275],{"id":1109,"depth":737,"text":1110},{"id":1154,"depth":737,"text":1155},{"id":1208,"depth":696,"text":1208},{"id":1220,"depth":696,"text":1221},[1279,1280],"cloudflare","ai-agents","2026-08-07","學習如何利用Cloudflare Workers、Vectorize與MCP協定自行架設AI持久化記憶系統（Second Brain）。在Claude、Gemini與Obsidian之間完美共享上下文。","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FTW-Use-Cloudflare-as-AI-memory.webp","基於 Cloudflare Workers 和 Vectorize 構建的自託管 AI 持久化記憶系統，支援 MCP 協定與 Obsidian 筆記雙向同步。",true,{"schemaOrg":1288,"robots":1292,"sitemap":1293},[1289],{"@type":1290,"headline":1291,"description":1282},"TechArticle","基於Cloudflare與MCP協定自行架設AI持久化記憶系統","index, follow",{"lastmod":1281},35,{"title":1291,"description":1282,"ogTitle":423,"ogDescription":1282,"twitterTitle":423,"twitterDescription":1282},"tw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[1298,1299,1300,456,1301],"Cloudflare","MCP","AI 記憶","Obsidian","YPOf86d5u4oQ6tOrox0pT9UIC3Wk6d7rbNYqAotfw5s",{"surround":1304,"related":2476},[1305,1869],{"id":1306,"title":1307,"author":668,"body":1308,"category":1851,"date":1853,"description":1854,"extension":1283,"image":1855,"imageAlt":1856,"isPublished":1286,"meta":1857,"minRead":696,"navigation":1286,"path":269,"seo":1862,"stem":1863,"tags":1864,"updatedAt":424,"__hash__":1868},"article\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md","使用MDM設定檔在macOS上無縫切換與設定多個Cloudflare WARP零信任組織的完整教學指南",{"type":426,"value":1309,"toc":1844},[1310,1314,1317,1324,1328,1331,1334,1337,1341,1344,1351,1367,1684,1803,1806,1809,1811,1841],[429,1311,1313],{"id":1312},"什麼是-cloudflare-warp","什麼是 Cloudflare WARP？",[434,1315,1316],{},"Cloudflare WARP 是一款用戶端應用程式，它會將指定裝置的網路流量引導至 Cloudflare 的全球網路進行路由，而不是直接傳送到公共網際網路。",[434,1318,1319,1320,1323],{},"它基於 ",[472,1321,1322],{},"WireGuard"," 通訊協定建立一條加密隧道，從而保護從裝置到最近的 Cloudflare 資料中心之間的流量安全。隨後，您可以在 Cloudflare 控制面板中建立原則，對這些流入的流量進行篩選、記錄、檢查或路由。",[429,1325,1327],{"id":1326},"為什麼我們需要-cloudflare-warp","為什麼我們需要 Cloudflare WARP？",[434,1329,1330],{},"為了向員工、承包商和其他專案關係人安全地公開內部資源（如私有 Web 服務或 SaaS 應用程式），Cloudflare WARP 用戶端被用作**零信任網路存取 (ZTNA)**的用戶端強制執行點。",[434,1332,1333],{},"Cloudflare WARP 用戶端安裝在用戶的筆記型電腦或手機上。它要求用戶在授予存取權限之前進行身分驗證，並滿足特定的安全性狀態檢查（例如來自經過核准的 IP 範圍、使用已註冊的電子郵件網域或執行處於作用狀態的防火牆）。",[434,1335,1336],{},"透過將裝置流量直接通道化傳輸到 Cloudflare，用戶的身分、裝置和原則將在要求到達內部資源之前得到驗證。因此，內部資源永遠不會暴露在公共網際網路上，每一次要求都將得到完整的記錄和稽核。",[429,1338,1340],{"id":1339},"在單一裝置上支援多個-warp-設定檔","在單一裝置上支援多個 WARP 設定檔",[434,1342,1343],{},"當用戶需要在個人和企業 Cloudflare 帳戶之間進行切換，或者當系統管理員需要管理多個租戶（tenant）時，在單一裝置上支援多個 WARP 設定檔就顯得至关重要。",[434,1345,1346,1347,1350],{},"要在 macOS 上實現此目標，我們可以使用 ",[503,1348,1349],{},".mobileconfig"," MDM 設定檔來定義和註冊不同的 WARP 環境。",[497,1352,1353,1364],{},[500,1354,1355,1356,869],{},"直接從 Cloudflare ",[451,1357,1360,1361,1363],{"href":1358,"rel":1359},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[455],"下載 ",[503,1362,1349],{}," 範例檔案",[500,1365,1366],{},"以下是該設定檔的範例文本：",[663,1368,1372],{"className":1369,"code":1370,"language":1371,"meta":668,"style":668},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n  \u003Ckey>PayloadContent\u003C\u002Fkey>\n  \u003Carray>\n    \u003Cdict>\n      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n      \u003Ckey>PayloadType\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n      \u003Cinteger>1\u003C\u002Finteger>\n      \u003Ckey>configs\u003C\u002Fkey>\n      \u003Carray>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 1\u003C\u002Fstring>\n        \u003C\u002Fdict>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 2\u003C\u002Fstring>\n        \u003C\u002Fdict>\n      \u003C\u002Farray>\n    \u003C\u002Fdict>\n  \u003C\u002Farray>\n  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n  \u003Cfalse\u002F>\n  \u003Ckey>PayloadScope\u003C\u002Fkey>\n  \u003Cstring>System\u003C\u002Fstring>\n  \u003Ckey>PayloadType\u003C\u002Fkey>\n  \u003Cstring>Configuration\u003C\u002Fstring>\n  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n  \u003Cinteger>1\u003C\u002Finteger>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n","xml",[503,1373,1374,1379,1384,1389,1394,1399,1404,1409,1414,1419,1425,1431,1437,1443,1449,1455,1461,1467,1473,1479,1485,1491,1497,1503,1509,1515,1521,1527,1532,1537,1543,1548,1554,1559,1565,1570,1576,1582,1588,1594,1600,1606,1612,1618,1624,1630,1636,1642,1648,1654,1660,1666,1672,1678],{"__ignoreMap":668},[672,1375,1376],{"class":674,"line":675},[672,1377,1378],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[672,1380,1381],{"class":674,"line":696},[672,1382,1383],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[672,1385,1386],{"class":674,"line":722},[672,1387,1388],{},"\u003Cplist version=\"1.0\">\n",[672,1390,1391],{"class":674,"line":737},[672,1392,1393],{},"\u003Cdict>\n",[672,1395,1396],{"class":674,"line":750},[672,1397,1398],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[672,1400,1401],{"class":674,"line":762},[672,1402,1403],{},"  \u003Carray>\n",[672,1405,1406],{"class":674,"line":774},[672,1407,1408],{},"    \u003Cdict>\n",[672,1410,1411],{"class":674,"line":785},[672,1412,1413],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[672,1415,1416],{"class":674,"line":791},[672,1417,1418],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[672,1420,1422],{"class":674,"line":1421},10,[672,1423,1424],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[672,1426,1428],{"class":674,"line":1427},11,[672,1429,1430],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[672,1432,1434],{"class":674,"line":1433},12,[672,1435,1436],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[672,1438,1440],{"class":674,"line":1439},13,[672,1441,1442],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[672,1444,1446],{"class":674,"line":1445},14,[672,1447,1448],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[672,1450,1452],{"class":674,"line":1451},15,[672,1453,1454],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[672,1456,1458],{"class":674,"line":1457},16,[672,1459,1460],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[672,1462,1464],{"class":674,"line":1463},17,[672,1465,1466],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[672,1468,1470],{"class":674,"line":1469},18,[672,1471,1472],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[672,1474,1476],{"class":674,"line":1475},19,[672,1477,1478],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[672,1480,1482],{"class":674,"line":1481},20,[672,1483,1484],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[672,1486,1488],{"class":674,"line":1487},21,[672,1489,1490],{},"      \u003Carray>\n",[672,1492,1494],{"class":674,"line":1493},22,[672,1495,1496],{},"        \u003Cdict>\n",[672,1498,1500],{"class":674,"line":1499},23,[672,1501,1502],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[672,1504,1506],{"class":674,"line":1505},24,[672,1507,1508],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[672,1510,1512],{"class":674,"line":1511},25,[672,1513,1514],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[672,1516,1518],{"class":674,"line":1517},26,[672,1519,1520],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[672,1522,1524],{"class":674,"line":1523},27,[672,1525,1526],{},"        \u003C\u002Fdict>\n",[672,1528,1530],{"class":674,"line":1529},28,[672,1531,1496],{},[672,1533,1535],{"class":674,"line":1534},29,[672,1536,1502],{},[672,1538,1540],{"class":674,"line":1539},30,[672,1541,1542],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[672,1544,1546],{"class":674,"line":1545},31,[672,1547,1514],{},[672,1549,1551],{"class":674,"line":1550},32,[672,1552,1553],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[672,1555,1557],{"class":674,"line":1556},33,[672,1558,1526],{},[672,1560,1562],{"class":674,"line":1561},34,[672,1563,1564],{},"      \u003C\u002Farray>\n",[672,1566,1567],{"class":674,"line":1294},[672,1568,1569],{},"    \u003C\u002Fdict>\n",[672,1571,1573],{"class":674,"line":1572},36,[672,1574,1575],{},"  \u003C\u002Farray>\n",[672,1577,1579],{"class":674,"line":1578},37,[672,1580,1581],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[672,1583,1585],{"class":674,"line":1584},38,[672,1586,1587],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[672,1589,1591],{"class":674,"line":1590},39,[672,1592,1593],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[672,1595,1597],{"class":674,"line":1596},40,[672,1598,1599],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[672,1601,1603],{"class":674,"line":1602},41,[672,1604,1605],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[672,1607,1609],{"class":674,"line":1608},42,[672,1610,1611],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[672,1613,1615],{"class":674,"line":1614},43,[672,1616,1617],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[672,1619,1621],{"class":674,"line":1620},44,[672,1622,1623],{},"  \u003Cfalse\u002F>\n",[672,1625,1627],{"class":674,"line":1626},45,[672,1628,1629],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[672,1631,1633],{"class":674,"line":1632},46,[672,1634,1635],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[672,1637,1639],{"class":674,"line":1638},47,[672,1640,1641],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[672,1643,1645],{"class":674,"line":1644},48,[672,1646,1647],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[672,1649,1651],{"class":674,"line":1650},49,[672,1652,1653],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[672,1655,1657],{"class":674,"line":1656},50,[672,1658,1659],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[672,1661,1663],{"class":674,"line":1662},51,[672,1664,1665],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[672,1667,1669],{"class":674,"line":1668},52,[672,1670,1671],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[672,1673,1675],{"class":674,"line":1674},53,[672,1676,1677],{},"\u003C\u002Fdict>\n",[672,1679,1681],{"class":674,"line":1680},54,[672,1682,1683],{},"\u003C\u002Fplist>\n",[497,1685,1686,1697,1711,1721,1727,1745,1758,1777,1794],{},[500,1687,1688,1689,1692,1693,1696],{},"將 ",[503,1690,1691],{},"your-team-name-1"," 和 ",[503,1694,1695],{},"your-team-name-2"," 替換為您各自的 Cloudflare Zero Trust 團隊名稱。",[500,1698,1699,1700,1703,1704,1706,1707,1710],{},"在終端機中執行指令 ",[503,1701,1702],{},"uuidgen"," 產生唯一的 UUID，並使用它們替換 ",[503,1705,1349],{}," 檔案中的預留位置 ",[503,1708,1709],{},"PayloadUUID"," 值。",[500,1712,1713,1714,1717,1718,1720],{},"確保 ",[503,1715,1716],{},"PayloadIdentifier"," 字串中也包含更新後的 ",[503,1719,1709],{},"，以保證設定檔的唯一性。",[500,1722,1723,1724,1726],{},"儲存編輯後的 ",[503,1725,1349],{}," 檔案。",[500,1728,1729,1730,1733,1734,1737,1738,1741],{},"打開 Mac 上的",[472,1731,1732],{},"系統設定","，搜尋並選擇",[472,1735,1736],{},"描述檔","（Profiles）。",[1739,1740],"br",{},[565,1742],{"alt":1743,"src":1744},"macOS 系統設定中的描述檔面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[500,1746,1747,1748,1751,1752,1754],{},"按一下",[472,1749,1750],{},"安裝、檢視或移除...","（Install, view or remove...）開始新增您的新設定檔。",[1739,1753],{},[565,1755],{"alt":1756,"src":1757},"macOS 描述檔安裝、檢視或移除按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[500,1759,1760,1761,1764,1765,1726,1767,1769,1773],{},"按一下左下角的 ",[472,1762,1763],{},"+","（加號）圖示，並選擇您儲存的 ",[503,1766,1349],{},[1739,1768],{},[565,1770],{"alt":1771,"src":1772},"macOS 描述檔左下角新增（+）按鈕","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[565,1774],{"alt":1775,"src":1776},"在 macOS 上選擇 .mobileconfig 設定檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[500,1778,1779,1780,1783,1784,1787,1788,1790],{},"選擇 ",[472,1781,1782],{},"Cloudflare WARP"," 並按一下",[472,1785,1786],{},"安裝","以套用此設定。",[1739,1789],{},[565,1791],{"alt":1792,"src":1793},"在 macOS 上確認安裝 Cloudflare WARP 描述檔","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[500,1795,1796,1797,1799],{},"重新啟動您的 Cloudflare WARP 用戶端。您現在應該可以在使用者介面中看到多組織切換器：",[1739,1798],{},[565,1800],{"alt":1801,"src":1802},"macOS 上支援多組織切換的 Cloudflare WARP 用戶端介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[429,1804,1805],{"id":1805},"結論",[434,1807,1808],{},"Cloudflare WARP 用戶端在用戶裝置上扮演著關鍵的安全邊界角色，使零信任網路存取（ZTNA）既穩固又極具實用性。透過將內部資源與公共網際網路隔離開來，可確保每一次連線嘗試都經過安全的身份驗證、評估與稽核。",[429,1810,1220],{"id":1220},[497,1812,1813,1820,1827,1834],{},[500,1814,1815],{},[451,1816,1819],{"href":1817,"rel":1818},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[455],"Managed Deployment Preparation",[500,1821,1822],{},[451,1823,1826],{"href":1824,"rel":1825},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[455],"Switch Between Zero Trust Organizations",[500,1828,1829],{},[451,1830,1833],{"href":1831,"rel":1832},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[455],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[500,1835,1836],{},[451,1837,1840],{"href":1838,"rel":1839},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[455],"Cloudflare One Client Documentation",[1257,1842,1843],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":668,"searchDepth":696,"depth":722,"links":1845},[1846,1847,1848,1849,1850],{"id":1312,"depth":696,"text":1313},{"id":1326,"depth":696,"text":1327},{"id":1339,"depth":696,"text":1340},{"id":1805,"depth":696,"text":1805},{"id":1220,"depth":696,"text":1220},[1852,1279],"security","2026-07-04","本指南將詳細介紹如何在macOS系統上，通過使用MDM .mobileconfig設定檔，實現多個Cloudflare WARP零信任組織或帳戶之間的無縫切換。本文為企業IT系統管理員提供了一套完整的、可直接落地部署的教學指南與設定步驟範本，幫助企業輕鬆管理並確保終端用戶的網路安全、合規審計與流暢體驗。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002FTW-Switch-Between-Multiple-Cloudflare-WARP-Orgs-on-Mac.webp","在Mac上配置和切換多個Cloudflare WARP組織帳戶",{"schemaOrg":1858,"robots":1292,"sitemap":1861},[1859],{"@type":1860,"headline":1307,"description":1854},"HowTo",{"lastmod":1853},{"title":1856,"description":1854,"ogTitle":1307,"ogDescription":1854,"twitterTitle":1307,"twitterDescription":1854},"tw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[1865,1782,1866,1867],"macOS","MDM","Zero Trust","zclGoAFYNMezL6vd0bCfBa4isSiwsXYfCQa7Cwm9YLI",{"id":1870,"title":1871,"author":668,"body":1872,"category":2459,"date":2460,"description":2461,"extension":1283,"image":2462,"imageAlt":2463,"isPublished":1286,"meta":2464,"minRead":696,"navigation":1286,"path":257,"seo":2468,"stem":2470,"tags":2471,"updatedAt":424,"__hash__":2475},"article\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md","從傳統初始化範本腳本到智慧體：AI Agent 技能如何優雅地取代 Nuxt 應用程式的腳手架建構腳本",{"type":426,"value":1873,"toc":2452},[1874,1888,1892,1895,2000,2003,2031,2037,2041,2056,2059,2076,2080,2091,2265,2269,2358,2362,2371,2391,2398,2413,2423,2426,2432,2435,2441,2449],[434,1875,1876,1877,1692,1880,1883,1884,1887],{},"當我們使用 Nuxt 框架啟動一個新應用程式時，總是需要經歷一系列繁瑣的初始化步驟，比如安裝各種依賴模組，以及配置 ",[503,1878,1879],{},"nuxt.config.ts",[503,1881,1882],{},"wrangler.jsonc"," 等檔案。傳統的腳本固然可以解決一部分問題，但隨著專案客製化需求的增加，腳本的局限性也迅速暴露出來。這正是我們探索並嘗試用 ",[472,1885,1886],{},"AI Agent 技能 (Agent Skill)"," 取代傳統腳本的原因。",[429,1889,1891],{"id":1890},"傳統-shell-腳本擅長什麼","傳統 Shell 腳本擅長什麼",[434,1893,1894],{},"傳統的 Shell 腳本非常適合按順序執行一組固定的指令，且其中的所有決策都是在程式碼中預先寫死的 (Hardcoded)。",[663,1896,1900],{"className":1897,"code":1898,"language":1899,"meta":668,"style":668},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#!\u002Fusr\u002Fbin\u002Fenv bash\nset -e\n\nnpx nuxi@latest init \"$1\" --template minimal --packageManager pnpm --no-gitInit -M @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n\ncd \"$1\"\n\ncp ~\u002Ftemplates\u002Fnuxt.config.ts .\ncp ~\u002Ftemplates\u002Fwrangler.jsonc .\n","bash",[503,1901,1902,1908,1917,1922,1961,1965,1976,1980,1991],{"__ignoreMap":668},[672,1903,1904],{"class":674,"line":675},[672,1905,1907],{"class":1906},"sHwdD","#!\u002Fusr\u002Fbin\u002Fenv bash\n",[672,1909,1910,1914],{"class":674,"line":696},[672,1911,1913],{"class":1912},"s2Zo4","set",[672,1915,1916],{"class":682}," -e\n",[672,1918,1919],{"class":674,"line":722},[672,1920,1921],{"emptyLinePlaceholder":1286},"\n",[672,1923,1924,1926,1929,1932,1934,1938,1940,1943,1946,1949,1952,1955,1958],{"class":674,"line":737},[672,1925,714],{"class":826},[672,1927,1928],{"class":682}," nuxi@latest",[672,1930,1931],{"class":682}," init",[672,1933,711],{"class":678},[672,1935,1937],{"class":1936},"sHdIc","$1",[672,1939,686],{"class":678},[672,1941,1942],{"class":682}," --template",[672,1944,1945],{"class":682}," minimal",[672,1947,1948],{"class":682}," --packageManager",[672,1950,1951],{"class":682}," pnpm",[672,1953,1954],{"class":682}," --no-gitInit",[672,1956,1957],{"class":682}," -M",[672,1959,1960],{"class":682}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[672,1962,1963],{"class":674,"line":750},[672,1964,1921],{"emptyLinePlaceholder":1286},[672,1966,1967,1970,1972,1974],{"class":674,"line":762},[672,1968,1969],{"class":1912},"cd",[672,1971,711],{"class":678},[672,1973,1937],{"class":1936},[672,1975,782],{"class":678},[672,1977,1978],{"class":674,"line":774},[672,1979,1921],{"emptyLinePlaceholder":1286},[672,1981,1982,1985,1988],{"class":674,"line":785},[672,1983,1984],{"class":826},"cp",[672,1986,1987],{"class":682}," ~\u002Ftemplates\u002Fnuxt.config.ts",[672,1989,1990],{"class":682}," .\n",[672,1992,1993,1995,1998],{"class":674,"line":791},[672,1994,1984],{"class":826},[672,1996,1997],{"class":682}," ~\u002Ftemplates\u002Fwrangler.jsonc",[672,1999,1990],{"class":682},[434,2001,2002],{},"但在面對以下開發痛點时，這種腳本就無能為力了：",[497,2004,2005,2011,2021],{},[500,2006,2007,2010],{},[472,2008,2009],{},"固定的預設值。"," 該腳本將 Nuxt UI 模組寫死了。如果我們想換成 Ant Design UI 呢？每增加一個可選的模組，就需要使用者提供更多的命令列參數。",[500,2012,2013,2016,2017,2020],{},[472,2014,2015],{},"無法理解使用者的真實意圖。"," 「幫我建一個部落格網站」需要引入 ",[503,2018,2019],{},"@nuxt\u002Fcontent","；「幫我建一個帶訂閱電子報功能的網站」則需要 Cloudflare D1 和 Drizzle ORM。普通的 Shell 腳本根本無法識別這些細微的語意差別——針對每種細微的變體，你都必須重新寫一個腳本。",[500,2022,2023,2026,2027,2030],{},[472,2024,2025],{},"在不知不覺中悄然過時。"," Nuxt 框架在大版本迭代時，其目錄規範往往會發生顯著改變。例如 Nuxt 4 將預設的原始碼目錄更改為了 ",[503,2028,2029],{},"app\u002F","。如果你繼續執行為 Nuxt 3 編寫的腳手架腳本，它會在背景靜默地生成錯誤的目錄結構，且絕不會向使用者發出任何警報。",[434,2032,2033,2036],{},[472,2034,2035],{},"應用程式腳手架的建構","（Scaffolding）本質上是一個需要「因地制宜做出決策」的問題，而不僅僅是「按步驟執行」。當決策變數增加時，傳統的腳本機制完全無法實現規模化擴充。",[429,2038,2040],{"id":2039},"為什麼要使用-ai-agent-技能取代傳統腳本","為什麼要使用 AI Agent 技能取代傳統腳本？",[434,2042,2043,2044,2047,2048,2051,2052,2055],{},"Agent 技能 (Agent Skill) 並非只是一段死板執行的程式碼，而是一套",[472,2045,2046],{},"供 AI Agent 遵循的結構化知識庫","。它包含一個核心的 ",[503,2049,2050],{},"SKILL.md"," 指南，並可以無縫捆綁該任務所需的任何其他檔案（如參考文件、配置範本和可執行腳本）。我們在 ",[451,2053,2054],{"href":351},"什麼是 AI Agent 技能？深入探討其工作原理並手把手教你如何建構高效、可複用的Agent技能"," 一文中詳細剖析了 Agent 技能的工作原理。",[434,2057,2058],{},"Agent 技能在保留了腳本執行力度的同時，注入了腳本所匱乏的合理決策能力：",[497,2060,2061,2064,2067,2070,2073],{},[500,2062,2063],{},"能夠推斷使用者的意圖，自動評估該應用程式是否需要搭配資料庫。",[500,2065,2066],{},"根據指定的候選清單，智慧判斷並按需安裝可選模組。例如，只有在使用者明確提出相關需求時，才會選擇性（Opt-in）匯入 Nuxt Content、i18n 多語言和流量分析模組。",[500,2068,2069],{},"能夠敏銳適應當前的開發生態，使用最新的 Nuxt 框架規範、針對 Cloudflare 綁定的 NuxtHub 以及用於部署的 Wrangler 命令列工具。",[500,2071,2072],{},"具備強大的自我修復能力，能夠在某一步驟失敗時自律分析原因並重新嘗試。",[500,2074,2075],{},"在最終交付專案前，能夠嚴格按照最終檢查清單 (Checklist) 进行校驗，確保交付品質。",[429,2077,2079],{"id":2078},"我們的-nuxt-cloudflare-腳手架-agent-技能技術內幕","我們的 Nuxt & Cloudflare 腳手架 Agent 技能技術內幕",[434,2081,2082,2083,2090],{},"這個開源技能 ",[451,2084,2087],{"href":2085,"rel":2086},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[455],[503,2088,2089],{},"scaffold-nuxt-cloudflare-app-skill"," 包含了一整套面向生產環境的自律建構流程：",[549,2092,2093,2127,2148,2174,2204,2243,2251],{},[500,2094,2095,2098,2099],{},[472,2096,2097],{},"自動澄清無法推斷的模糊要點","：\n",[497,2100,2101,2112,2118],{},[500,2102,2103,2104,2107,2108,2111],{},"確認首選的 UI 框架（預設是 ",[472,2105,2106],{},"Nuxt UI","，也可選擇 ",[472,2109,2110],{},"Antdv Next","）；",[500,2113,2114,2115,2111],{},"確認是否需要資料庫支援（如 ",[472,2116,2117],{},"Cloudflare D1",[500,2119,2120,2121,2124,2125,869],{},"確認是否需要額外模組，例如用於建構 CMS 功能的 ",[503,2122,2123],{},"@nuxtjs\u002Fi18n"," 或 ",[503,2126,2019],{},[500,2128,2129,2132,2133,2136,2137,2140,2141,1692,2144,2147],{},[472,2130,2131],{},"初始化基礎應用程式框架","：執行 ",[503,2134,2135],{},"pnpm dlx nuxi@latest init"," 命令，使用 ",[503,2138,2139],{},"pnpm"," 套件管理器初始化最新版的 Nuxt 框架。隨後配置原生建構白名冊 (native-build allowlists)，以確保 Cloudflare 的建構環境能夠順利編譯 ",[503,2142,2143],{},"better-sqlite3",[503,2145,2146],{},"sharp"," 等原生依賴包。",[500,2149,2150,2153,2154,2124,2157,2160,2161,2160,2164,2160,2167,2160,2170,2173],{},[472,2151,2152],{},"基於決策表按需安裝模組","：自動安裝 ",[503,2155,2156],{},"@nuxt\u002Fui",[503,2158,2159],{},"@antdv-next\u002Fnuxt","、",[503,2162,2163],{},"@nuxt\u002Fimage",[503,2165,2166],{},"@nuxtjs\u002Fseo",[503,2168,2169],{},"@nuxthub\u002Fcore",[503,2171,2172],{},"@vueuse\u002Fnuxt","，並在選中時條件分支安裝 Drizzle\u002FD1、Nuxt Content 以及 i18n。",[500,2175,2176,2098,2179],{},[472,2177,2178],{},"科學合理的目錄結構布局",[497,2180,2181,2186,2191,2196,2201],{},[500,2182,2183,2185],{},[503,2184,2029],{}," (Nuxt 4 規範)",[500,2187,2188],{},[503,2189,2190],{},"server\u002F",[500,2192,2193],{},[503,2194,2195],{},"shared\u002F",[500,2197,2198],{},[503,2199,2200],{},"tests\u002F",[500,2202,2203],{},"根目錄下的各類標準設定檔案。",[500,2205,2206,2098,2211],{},[472,2207,2208,2209],{},"精細配置 ",[503,2210,1879],{},[497,2212,2213,2222,2229,2236],{},[500,2214,2215,2216,1692,2219],{},"為 SEO 配置 ",[503,2217,2218],{},"site.url",[503,2220,2221],{},"site.name",[500,2223,2224,2225,2228],{},"寫入用於 Cloudflare 綁定的 NuxtHub ",[503,2226,2227],{},"hub"," 配置區塊",[500,2230,2231,2232,2235],{},"自動配置 ",[503,2233,2234],{},"routeRules"," 路由與快取規則",[500,2237,2238,2239,2242],{},"寫入最新的 ",[503,2240,2241],{},"compatibilityDate"," 相容性日期",[500,2244,2245],{},[472,2246,2247,2248,2250],{},"科學生成 ",[503,2249,1882],{}," 設定檔案並進行雲端資源綁定",[500,2252,2253,2256,2257,2260,2261,2264],{},[472,2254,2255],{},"配置 Vitest 測試框架與 ESLint 程式碼規範","，隨後執行",[472,2258,2259],{},"最終校驗清單","，在背景實際執行 ",[503,2262,2263],{},"pnpm install && pnpm dev"," 進行沙箱執行測試，全部通過後方才宣告建構成功。",[429,2266,2268],{"id":2267},"傳統-shell-腳本-vs-ai-agent-技能維度對比","傳統 Shell 腳本 vs AI Agent 技能：維度對比",[2270,2271,2272,2288],"table",{},[2273,2274,2275],"thead",{},[2276,2277,2278,2282,2285],"tr",{},[2279,2280,2281],"th",{},"對比維度",[2279,2283,2284],{},"傳統 Shell 腳本",[2279,2286,2287],{},"AI Agent 技能",[2289,2290,2291,2303,2314,2325,2336,2347],"tbody",{},[2276,2292,2293,2297,2300],{},[2294,2295,2296],"td",{},"意圖識別能力",[2294,2298,2299],{},"❌ 行為完全寫死",[2294,2301,2302],{},"✅ 自動理解自然語言並按需適配",[2276,2304,2305,2308,2311],{},[2294,2306,2307],{},"動態決策能力",[2294,2309,2310],{},"❌ 僅限硬編碼的參數判斷",[2294,2312,2313],{},"✅ 執行時動態推敲最佳方案",[2276,2315,2316,2319,2322],{},[2294,2317,2318],{},"生态更新適應度",[2294,2320,2321],{},"❌ 需開發者手動重寫程式碼",[2294,2323,2324],{},"✅ 自動感知當前技術棧規範並適配",[2276,2326,2327,2330,2333],{},[2294,2328,2329],{},"容錯與復原機制",[2294,2331,2332],{},"❌ 一旦出錯立即中斷退出",[2294,2334,2335],{},"✅ 自動定位錯誤、自癒並繼續執行",[2276,2337,2338,2341,2344],{},[2294,2339,2340],{},"成果品質校驗",[2294,2342,2343],{},"❌ 缺乏品質校驗機制",[2294,2345,2346],{},"✅ 依托最終檢查清單進行閉環測試",[2276,2348,2349,2352,2355],{},[2294,2350,2351],{},"長期維護成本",[2294,2353,2354],{},"❌ 參數膨脹、邏輯混亂、易崩壞",[2294,2356,2357],{},"✅ 只需維護人可讀的 Markdown 設計檔案",[429,2359,2361],{"id":2360},"如何使用-npx-skills-命令行工具安裝-ai-agent-技能","如何使用 npx skills 命令行工具安裝 AI Agent 技能",[434,2363,2364,2365,2370],{},"只需一行簡單的指令，即可透過 ",[451,2366,2369],{"href":2367,"rel":2368},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[455],"skills CLI"," 工具完成該技能的無縫匯入：",[663,2372,2374],{"className":1897,"code":2373,"language":1899,"meta":668,"style":668},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[503,2375,2376],{"__ignoreMap":668},[672,2377,2378,2380,2383,2385,2388],{"class":674,"line":675},[672,2379,714],{"class":826},[672,2381,2382],{"class":682}," skills",[672,2384,833],{"class":682},[672,2386,2387],{"class":682}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[672,2389,2390],{"class":682}," -g\n",[434,2392,2393,2394],{},"該工具會自動克隆倉庫、定位技能檔案，並詢問您希望將此技能關聯到本地系統所支援的 77 個 Agent 中的哪一個：\n",[565,2395],{"alt":2396,"src":2397},"在終端機中執行 npx skills add 命令列工具來全域安裝 Nuxt 腳手架建構技能的介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-add-scaffold-nuxt-installation.webp",[434,2399,2400,2401,2404,2405,2408,2409],{},"我們強烈推薦選擇 ",[472,2402,2403],{},"Symlink (符號連結)"," 方式。這種模式下，技能只需在 ",[503,2406,2407],{},"~\u002F.agents\u002Fskills"," 目錄中下載一次，所有被勾選的 Agent 都將指向這同一份原始檔案。\n",[565,2410],{"alt":2411,"src":2412},"終端機中顯示的集中式 Agent 技能安裝摘要以及軟連結 (Symlink) 路徑設定詳情","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-installation-summary-details.webp",[497,2414,2415],{},[500,2416,2417],{},[1036,2418,2419,2420,869],{},"如果您希望深入了解如何有效避免技能碎片化並在一處集中管理它們，請參閱我們的這篇深度好文：",[451,2421,2422],{"href":359},"使用 npx skills 徹底解決不同 AI Agent（如 Claude Code 或 Kimi）技能碎片化問題",[434,2424,2425],{},"完成安裝後，打開 Claude Code 終端機，輸入內建指令即可確認該技能已成功啟用。",[434,2427,2428],{},[565,2429],{"alt":2430,"src":2431},"Claude Code 命令列終端機中顯示的全新安裝且已啟用可用的 \u002Fscaffold-nuxt 斜線快捷命令","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fclaude-code-scaffold-nuxt-slash-command-active.webp",[434,2433,2434],{},"接下來，您只需輸入一句簡單的自然語言，即可瞬間搞定複雜的工程腳手架搭建：",[2436,2437,2438],"blockquote",{},[434,2439,2440],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"",[434,2442,2443,2444,2448],{},"該腳手架技能完全開源，歡迎訪問我們的 ",[451,2445,2447],{"href":2085,"rel":2446},[455],"GitHub 倉庫"," 提交 Feedback 並上手體驗！",[1257,2450,2451],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":668,"searchDepth":696,"depth":722,"links":2453},[2454,2455,2456,2457,2458],{"id":1890,"depth":696,"text":1891},{"id":2039,"depth":696,"text":2040},{"id":2078,"depth":696,"text":2079},{"id":2267,"depth":696,"text":2268},{"id":2360,"depth":696,"text":2361},[1280],"2026-08-25","輕鬆在 Cloudflare Workers 上快速建構 Nuxt 應用程式腳手架。深入剖析並學習我們如何使用功能強大、極具靈活性、能根據意圖決策且支援自我修復的 AI 智慧體技能，來徹底取代脆弱且難以維護的傳統 Shell 腳本，並詳細演示如何透過 npx skills 命令行工具將其無缝安裝到您的本地開發工作流中。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002FTW-How-AI-Agent-Skills-Replace-Nuxt-App-Scaffolding-Scripts.webp","Nuxt 應用程式在 Cloudflare 上的腳手架建構：傳統 Shell 腳本與 AI 智慧體技能對比。分析為什麼智慧體技能優於傳統初始化腳本。",{"schemaOrg":2465,"robots":1292,"sitemap":2467},[2466],{"@type":1290,"headline":1871,"description":2461,"image":2462},{"lastmod":2460},{"title":2469,"description":2461,"ogTitle":1871,"ogDescription":2461,"twitterTitle":1871,"twitterDescription":2461},"Nuxt 應用程式在 Cloudflare 上的腳手架建構：傳統 Shell 腳本與 AI 智慧體技能對比","tw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",[2472,1298,2473,2474],"Nuxt","AI Agent","Scaffolding","7Hh5zal4sRkoJezAuNT3T7Bv8UlZZI9OVmJtSb0kBX4",[2477,4413,6567],{"id":2478,"title":2479,"author":424,"body":2480,"category":4392,"date":4394,"description":4395,"extension":1283,"image":4396,"imageAlt":4397,"isPublished":1286,"meta":4398,"minRead":1493,"navigation":1286,"path":379,"seo":4405,"stem":4406,"tags":4407,"updatedAt":4411,"__hash__":4412},"article\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek.md","使用Docker與TREK自託管您的個性化智能旅行日程：一站式深度規劃並輕鬆管理預訂、財務和行李清單",{"type":426,"value":2481,"toc":4351},[2482,2485,2488,2491,2495,2499,2679,2682,2690,2710,2713,2716,2821,2832,2835,2840,2843,2855,2859,2863,2866,2869,2907,2911,2914,2947,2950,2992,2995,3000,3012,3016,3023,3027,3030,3122,3126,3129,3133,3140,3144,3147,3165,3176,3180,3183,3194,3198,3202,3212,3216,3220,3223,3227,3231,3234,3239,3242,3247,3253,3257,3261,3264,3268,3280,3285,3291,3296,3300,3303,3308,3313,3316,3323,3327,3330,3333,3343,3349,3354,3361,3366,3370,3376,3381,3384,3389,3393,3399,3403,3408,3412,3415,3418,3423,3428,3433,3437,3444,3449,3454,3459,3464,3468,3474,3479,3485,3489,3492,3496,3502,3507,3512,3518,3523,3528,3533,3546,3550,3555,3576,3581,3584,3588,3591,3596,3599,3647,3651,3658,3664,3669,3675,3680,3686,3691,3697,3700,3705,3712,3717,3723,3727,3734,3739,3742,3746,3750,3756,3760,3763,3770,3774,3781,3785,3797,3806,3810,3814,3824,3832,3837,3844,3849,3856,3860,3863,4016,4019,4023,4026,4031,4034,4040,4044,4051,4055,4058,4063,4070,4075,4079,4090,4157,4173,4176,4181,4185,4189,4200,4277,4290,4293,4297,4301,4304,4307,4310,4313,4322,4325,4348],[434,2483,2484],{},"在規劃旅行時，最繁瑣的部分莫過於那些零散的資料：機票預訂PDF、酒店確認信、旅伴之間的聊天記錄、想去的景點清單等，都散落在不同的角落。而當需要匯總總花費、拆分帳單時，又得在海量的出行記錄中不停翻找，極為耗費精力。",[434,2486,2487],{},"TREK是一款可以自託管的開源旅行規劃系統，能夠將您的行程、預訂、財務預算和行李清單一站式整合到同一個平台中。其內建的MCP（Model Context Protocol）伺服器還允許AI代理（如Claude Desktop）直接操作您的出行資料。",[434,2489,2490],{},"本教學將帶您一步步完成從系統部署到完整管理一次真實旅行的全過程。",[544,2492,2494],{"id":2493},"_1-如何使用docker部署trek旅行規劃器","1. 如何使用Docker部署TREK旅行規劃器",[1107,2496,2498],{"id":2497},"在ubuntu-vps上安裝docker","在Ubuntu VPS上安裝Docker",[663,2500,2502],{"className":1897,"code":2501,"language":1899,"meta":668,"style":668},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Verify docker is installed\ndocker --version\n\n# Starts automatically when your system boots\nsudo systemctl enable docker\n",[503,2503,2504,2509,2538,2542,2547,2590,2594,2599,2610,2614,2619,2640,2644,2649,2657,2661,2666],{"__ignoreMap":668},[672,2505,2506],{"class":674,"line":675},[672,2507,2508],{"class":1906},"# Add Docker's official GPG key and set up the Docker repository\n",[672,2510,2511,2514,2517,2520,2523,2526,2529,2532,2535],{"class":674,"line":696},[672,2512,2513],{"class":826},"curl",[672,2515,2516],{"class":682}," -fsSL",[672,2518,2519],{"class":682}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[672,2521,2522],{"class":678}," |",[672,2524,2525],{"class":826}," sudo",[672,2527,2528],{"class":682}," gpg",[672,2530,2531],{"class":682}," --dearmor",[672,2533,2534],{"class":682}," -o",[672,2536,2537],{"class":682}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[672,2539,2540],{"class":674,"line":722},[672,2541,1921],{"emptyLinePlaceholder":1286},[672,2543,2544],{"class":674,"line":737},[672,2545,2546],{"class":1906},"# Add the official Docker repository\n",[672,2548,2549,2552,2554,2557,2560,2563,2566,2569,2572,2574,2576,2578,2581,2584,2587],{"class":674,"line":750},[672,2550,2551],{"class":1912},"echo",[672,2553,711],{"class":678},[672,2555,2556],{"class":682},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[672,2558,2559],{"class":678},"$(",[672,2561,2562],{"class":826},"lsb_release",[672,2564,2565],{"class":682}," -cs",[672,2567,2568],{"class":678},")",[672,2570,2571],{"class":682}," stable",[672,2573,686],{"class":678},[672,2575,2522],{"class":678},[672,2577,2525],{"class":826},[672,2579,2580],{"class":682}," tee",[672,2582,2583],{"class":682}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[672,2585,2586],{"class":678}," >",[672,2588,2589],{"class":682}," \u002Fdev\u002Fnull\n",[672,2591,2592],{"class":674,"line":762},[672,2593,1921],{"emptyLinePlaceholder":1286},[672,2595,2596],{"class":674,"line":774},[672,2597,2598],{"class":1906},"# Update package list\n",[672,2600,2601,2604,2607],{"class":674,"line":785},[672,2602,2603],{"class":826},"sudo",[672,2605,2606],{"class":682}," apt",[672,2608,2609],{"class":682}," update\n",[672,2611,2612],{"class":674,"line":791},[672,2613,1921],{"emptyLinePlaceholder":1286},[672,2615,2616],{"class":674,"line":1421},[672,2617,2618],{"class":1906},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[672,2620,2621,2623,2625,2628,2631,2634,2637],{"class":674,"line":1427},[672,2622,2603],{"class":826},[672,2624,2606],{"class":682},[672,2626,2627],{"class":682}," install",[672,2629,2630],{"class":682}," docker-ce",[672,2632,2633],{"class":682}," docker-ce-cli",[672,2635,2636],{"class":682}," containerd.io",[672,2638,2639],{"class":682}," -y\n",[672,2641,2642],{"class":674,"line":1433},[672,2643,1921],{"emptyLinePlaceholder":1286},[672,2645,2646],{"class":674,"line":1439},[672,2647,2648],{"class":1906},"# Verify docker is installed\n",[672,2650,2651,2654],{"class":674,"line":1445},[672,2652,2653],{"class":826},"docker",[672,2655,2656],{"class":682}," --version\n",[672,2658,2659],{"class":674,"line":1451},[672,2660,1921],{"emptyLinePlaceholder":1286},[672,2662,2663],{"class":674,"line":1457},[672,2664,2665],{"class":1906},"# Starts automatically when your system boots\n",[672,2667,2668,2670,2673,2676],{"class":674,"line":1463},[672,2669,2603],{"class":826},[672,2671,2672],{"class":682}," systemctl",[672,2674,2675],{"class":682}," enable",[672,2677,2678],{"class":682}," docker\n",[1107,2680,2681],{"id":2681},"生成加密金鑰",[434,2683,2684,2685,2689],{},"TREK使用一个專門的金鑰來加密敏感資料。您可以使用以下指令或這個",[451,2686,2688],{"href":2687},"\u002Ftw\u002Ftools\u002Fsecret-key-hex","線上工具","來生成加密金鑰：",[663,2691,2693],{"className":1897,"code":2692,"language":1899,"meta":668,"style":668},"openssl rand -hex 32\n",[503,2694,2695],{"__ignoreMap":668},[672,2696,2697,2700,2703,2706],{"class":674,"line":675},[672,2698,2699],{"class":826},"openssl",[672,2701,2702],{"class":682}," rand",[672,2704,2705],{"class":682}," -hex",[672,2707,2709],{"class":2708},"sbssI"," 32\n",[434,2711,2712],{},"請務必將其妥善保存在安全的地方。如果遺失該金鑰，您將無法存取已加密的資料。",[1107,2714,2715],{"id":2715},"啟動容器",[663,2717,2719],{"className":1897,"code":2718,"language":1899,"meta":668,"style":668},"docker run -d \\\n  --name trek \\\n  -p 3000:3000 \\\n  -e ENCRYPTION_KEY=\"\u003Cgenerated_key>\" \\\n  -e APP_URL=\"https:\u002F\u002Ftrek.pafor.me\" \\\n  -v .\u002Fdata:\u002Fapp\u002Fdata \\\n  -v .\u002Fuploads:\u002Fapp\u002Fuploads \\\n  --restart unless-stopped \\\n  mauriceboe\u002Ftrek:latest\n",[503,2720,2721,2734,2744,2754,2771,2787,2797,2806,2816],{"__ignoreMap":668},[672,2722,2723,2725,2728,2731],{"class":674,"line":675},[672,2724,2653],{"class":826},[672,2726,2727],{"class":682}," run",[672,2729,2730],{"class":682}," -d",[672,2732,2733],{"class":689}," \\\n",[672,2735,2736,2739,2742],{"class":674,"line":696},[672,2737,2738],{"class":682},"  --name",[672,2740,2741],{"class":682}," trek",[672,2743,2733],{"class":689},[672,2745,2746,2749,2752],{"class":674,"line":722},[672,2747,2748],{"class":682},"  -p",[672,2750,2751],{"class":682}," 3000:3000",[672,2753,2733],{"class":689},[672,2755,2756,2759,2762,2764,2767,2769],{"class":674,"line":737},[672,2757,2758],{"class":682},"  -e",[672,2760,2761],{"class":682}," ENCRYPTION_KEY=",[672,2763,686],{"class":678},[672,2765,2766],{"class":682},"\u003Cgenerated_key>",[672,2768,686],{"class":678},[672,2770,2733],{"class":689},[672,2772,2773,2775,2778,2780,2783,2785],{"class":674,"line":750},[672,2774,2758],{"class":682},[672,2776,2777],{"class":682}," APP_URL=",[672,2779,686],{"class":678},[672,2781,2782],{"class":682},"https:\u002F\u002Ftrek.pafor.me",[672,2784,686],{"class":678},[672,2786,2733],{"class":689},[672,2788,2789,2792,2795],{"class":674,"line":762},[672,2790,2791],{"class":682},"  -v",[672,2793,2794],{"class":682}," .\u002Fdata:\u002Fapp\u002Fdata",[672,2796,2733],{"class":689},[672,2798,2799,2801,2804],{"class":674,"line":774},[672,2800,2791],{"class":682},[672,2802,2803],{"class":682}," .\u002Fuploads:\u002Fapp\u002Fuploads",[672,2805,2733],{"class":689},[672,2807,2808,2811,2814],{"class":674,"line":785},[672,2809,2810],{"class":682},"  --restart",[672,2812,2813],{"class":682}," unless-stopped",[672,2815,2733],{"class":689},[672,2817,2818],{"class":674,"line":791},[672,2819,2820],{"class":682},"  mauriceboe\u002Ftrek:latest\n",[497,2822,2823],{},[500,2824,2825,2831],{},[472,2826,2827,2828],{},"必須正確設定 ",[503,2829,2830],{},"APP_URL"," —— 因為MCP伺服器的OAuth授權探索流程完全依賴於它。請在一開始就將其設定為您最終的公開HTTPS網址。",[434,2833,2834],{},"首次執行需要一些時間來拉取映像檔：",[565,2836],{"src":2837,"alt":2838,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-pull-image.webp","TREK 的 Docker 拉取与執行日誌","max-width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,2841,2842],{},"驗證容器是否成功執行：",[663,2844,2846],{"className":1897,"code":2845,"language":1899,"meta":668,"style":668},"docker ps\n",[503,2847,2848],{"__ignoreMap":668},[672,2849,2850,2852],{"class":674,"line":675},[672,2851,2653],{"class":826},[672,2853,2854],{"class":682}," ps\n",[565,2856],{"src":2857,"alt":2858,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-ps-status.webp","透過 docker ps 驗證執行中的容器狀態",[544,2860,2862],{"id":2861},"_2-使用caddy反向代理設定網域路由與ssl憑證","2. 使用Caddy反向代理設定網域路由與SSL憑證",[434,2864,2865],{},"通行鑰（Passkeys）功能和MCP所需的OAuth授權都強制要求HTTPS加密。我們的網域託管在提供免費SSL憑證和DDoS保護的Cloudflare上。",[434,2867,2868],{},"我們將Caddy配置為安全的反向代理伺服器，用來指向容器的3000連接埠。Caddyfile設定範例如下：",[663,2870,2872],{"className":665,"code":2871,"language":667,"meta":668,"style":668},"{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n",[503,2873,2874,2887,2892,2902],{"__ignoreMap":668},[672,2875,2876,2879,2882,2885],{"class":674,"line":675},[672,2877,2878],{"class":678},"{",[672,2880,2881],{"class":689},"$TREK_DOMAIN",[672,2883,2884],{"class":678},"}",[672,2886,945],{"class":678},[672,2888,2889],{"class":674,"line":696},[672,2890,2891],{"class":689},"  encode zstd gzip\n",[672,2893,2894,2897,2899],{"class":674,"line":722},[672,2895,2896],{"class":689},"  reverse_proxy host.docker.internal",[672,2898,708],{"class":678},[672,2900,2901],{"class":2708},"3000\n",[672,2903,2904],{"class":674,"line":737},[672,2905,2906],{"class":678},"}\n",[544,2908,2910],{"id":2909},"_3-初始配置與安全的管理員設定","3. 初始配置與安全的管理員設定",[434,2912,2913],{},"建立管理員帳戶有兩種方式：",[497,2915,2916,2928],{},[500,2917,2918,2927],{},[472,2919,2920,2921,1692,2924],{},"在環境配置中直接設定 ",[503,2922,2923],{},"ADMIN_EMAIL",[503,2925,2926],{},"ADMIN_PASSWORD"," 變數，系統將直接使用該憑證。",[500,2929,2930,2931,2934,2935,2938,2939,2942,2943,2946],{},"TREK會自動生成一個信箱 ",[503,2932,2933],{},"admin@trek.local","、使用者名稱 ",[503,2936,2937],{},"admin","，以及一個",[472,2940,2941],{},"隨機生成的密碼，並列印到容器日誌中","。執行 ",[503,2944,2945],{},"docker logs trek"," 即可獲取。",[434,2948,2949],{},"如果您在日誌中找不到密碼，可以透過以下指令進行手動重置：",[663,2951,2953],{"className":1897,"code":2952,"language":1899,"meta":668,"style":668},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[503,2954,2955],{"__ignoreMap":668},[672,2956,2957,2959,2962,2965,2968,2971,2973,2976,2979,2982,2984,2986,2989],{"class":674,"line":675},[672,2958,2653],{"class":826},[672,2960,2961],{"class":682}," exec",[672,2963,2964],{"class":682}," -it",[672,2966,2967],{"class":682}," -e",[672,2969,2970],{"class":682}," RESET_ADMIN_EMAIL=admin@trek.local",[672,2972,2967],{"class":682},[672,2974,2975],{"class":682}," RESET_ADMIN_PASSWORD=",[672,2977,2978],{"class":678},"'",[672,2980,2981],{"class":682},"YourNewPassword",[672,2983,2978],{"class":678},[672,2985,2741],{"class":682},[672,2987,2988],{"class":682}," node",[672,2990,2991],{"class":682}," server\u002Freset-admin.js\n",[434,2993,2994],{},"在首次登入時，系統會提示您修改初始密碼。",[565,2996],{"src":2997,"alt":2998,"style":2999},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-initial-login-password-prompt.webp","初始登入與管理員密碼重設提示","max-width: 215px; width:100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3001,3002,3003,3006,3007],{},"按一下 ",[472,3004,3005],{},"Admin（管理員）"," 索引標籤並更新您的電子信箱：",[565,3008],{"src":3009,"alt":3010,"style":3011},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-email-update-panel.webp","在 TREK 管理員設定中設定自訂電子郵件","max-width: 700px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1107,3013,3015],{"id":3014},"_31-備份策略","3.1 備份策略",[434,3017,3018,3019],{},"在管理員後台，可以非常方便地配置帶有保留策略的自動備份方案：\n",[565,3020],{"src":3021,"alt":3022,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-backup-retention-policy.webp","設定自動備份排程與保留規則",[1107,3024,3026],{"id":3025},"_32-將上傳的檔案儲存到cloudflare-r2","3.2 將上傳的檔案儲存到Cloudflare R2",[434,3028,3029],{},"將上傳的檔案、照片和備份資料保存在Cloudflare R2中，能夠讓您的VPS磁碟保持乾淨和輕量。TREK全面支援S3相容的儲存後端，而Cloudflare R2正是這一需求的完美解決方案。",[549,3031,3032,3039,3051,3062,3073,3085,3096,3111],{},[500,3033,3034,3035,3038],{},"新建一個名為 ",[503,3036,3037],{},"trek"," 的R2儲存桶。",[500,3040,553,3041,3044,3045,3046],{},[472,3042,3043],{},"Account Details（帳戶詳情）"," 區域，找到您的帳戶ID：","\n  ",[565,3047],{"src":3048,"alt":3049,"style":3050},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-account-details-id.webp","在主控台中定位 Cloudflare 帳戶 ID","max-width: 325px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[500,3052,3002,3053,3056,3045,3057],{},[472,3054,3055],{},"Manage API Tokens（管理API權杖）","：",[565,3058],{"src":3059,"alt":3060,"style":3061},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-manage-api-tokens-button.webp","Cloudflare 主控台中的管理 API 權杖畫面","max-width: 282px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[500,3063,3002,3064,3067,3045,3068],{},[472,3065,3066],{},"Create Account API token（建立帳戶API權杖）","，並授予針對該桶的讀寫權限：",[565,3069],{"src":3070,"alt":3071,"style":3072},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-create-token-permissions.webp","建立具有讀寫權限的 R2 存取權杖","max-width: 360px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[500,3074,3075,3076,3079,3045,3080],{},"在管理員面板中，按一下 ",[472,3077,3078],{},"Storage（儲存）"," 配置頁：",[565,3081],{"src":3082,"alt":3083,"style":3084},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-administration-storage-menu.webp","導覽至 TREK 控制面板中的儲存設定","max-width: 539px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[500,3086,3002,3087,3090,3045,3091],{},[472,3088,3089],{},"Add Backend（新增後端）"," 按鈕，填入您的Endpoint（端點）、Bucket（儲存桶名稱）和API憑證：",[565,3092],{"src":3093,"alt":3094,"style":3095},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-storage-backend-credentials.webp","設定 S3 相容的 Cloudflare R2 儲存端","max-width: 445px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[500,3097,3002,3098,3101,3102,3105,3045,3106],{},[472,3099,3100],{},"Apply（套用）","，然後按一下 ",[472,3103,3104],{},"Test（測試）"," 連結。當看到「Connection OK」字樣时，說明連線測試成功：",[565,3107],{"src":3108,"alt":3109,"style":3110},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-test-storage-backend-connection-ok.webp","儲存端連線測試成功，顯示 Connection OK","max-width: 677px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[500,3112,3113,3114,3056,3045,3117],{},"将所有儲存類別切換為Cloudflare R2并按一下 ",[472,3115,3116],{},"Save changes（儲存修改）",[565,3118],{"src":3119,"alt":3120,"style":3121},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-switch-storage-categories-r2.webp","將所有檔案儲存分類路由至 Cloudflare R2","max-width: 653px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1107,3123,3125],{"id":3124},"_33-通行鑰passkey登入","3.3 通行鑰（Passkey）登入",[434,3127,3128],{},"TREK支援通行鑰、雙重身份驗證（2FA）以及基於OIDC的單一登入。如果想開啟通行鑰，請在設定中輸入您的網域名稱和Allowed Origins（允許的來源），然後儲存即可：",[565,3130],{"src":3131,"alt":3132,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-passkey-allowed-origins-settings.webp","註冊用於安全金鑰（Passkey）身分驗證的允許來源",[434,3134,3135,3136,3139],{},"如果沒有正確配置 ",[472,3137,3138],{},"Allowed Origins","，通行鑰註冊將會失敗。",[1107,3141,3143],{"id":3142},"_34-google-maps-api金鑰","3.4 Google Maps API金鑰",[434,3145,3146],{},"配置Google Maps金鑰可以讓您的地點檢索功能變得更豐富，自動補充評分、營業时间和地點實景圖。如果您不配置金鑰，TREK會預設降級使用免費的OpenStreetMap（只是不顯示評分和實景照片）。",[434,3148,3149,3150,3155,3156,3159,3160],{},"造訪此",[451,3151,3154],{"href":3152,"rel":3153},"https:\u002F\u002Fmapsplatform.google.com\u002Fmaps-demo-key\u002F",[455],"連結","並按一下 ",[472,3157,3158],{},"Get demo key"," 即可申請一個測試金鑰：                                                  ",[565,3161],{"src":3162,"alt":3163,"style":3164},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgoogle-maps-get-demo-api-key.webp","申請 Google Maps Platform API 金鑰","max-width: 176px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3166,3167,3168,3171,3172],{},"將獲取到的API Key貼上到設定中，然後按一下 ",[472,3169,3170],{},"Test"," 驗證連線是否通暢：\n",[565,3173],{"src":3174,"alt":3175,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-key-test-connection.webp","在設定中驗證 Google Maps API 金鑰的連通性",[1107,3177,3179],{"id":3178},"_35-ai整合","3.5 AI整合",[434,3181,3182],{},"內建的AI解析引擎主要用於處理您的預訂確認郵件和PDF，將它們自動轉換為結構化的預訂資料。",[434,3184,3185,3186,3189,3190,3193],{},"按一下左側選單中的 ",[472,3187,3188],{},"Addons（附加元件）"," 並啟用 ",[472,3191,3192],{},"AI Parsing","。選擇「OpenAI」（或其他相容的AI提供商）並填寫相應的憑證資訊：",[565,3195],{"src":3196,"alt":3197,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-ai-parsing-openai.webp","啟用附帶 OpenAI 整合的 AI 解析外掛",[1107,3199,3201],{"id":3200},"_36-mcp存取權限","3.6 MCP存取權限",[434,3203,3204,3205,3208,3209,3211],{},"同樣在 ",[472,3206,3207],{},"Addons"," 選項中，開啟 ",[472,3210,1299],{}," 協定：",[565,3213],{"src":3214,"alt":3215,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-mcp.webp","啟用 Model Context Protocol MCP 伺服器外掛",[1107,3217,3219],{"id":3218},"_37-外掛推薦","3.7 外掛推薦",[434,3221,3222],{},"以下幾款官方外掛非常推薦您順手啟用：",[565,3224],{"src":3225,"alt":3226,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","活躍的推薦外掛與擴充功能列表",[1107,3228,3230],{"id":3229},"_38-建立您的日常使用帳戶","3.8 建立您的日常使用帳戶",[434,3232,3233],{},"在平時規劃旅行時，建議使用一般使用者帳戶，而非管理員帳戶。讓我們在後台建立一個日常帳戶並登入：",[565,3235],{"src":3236,"alt":3237,"style":3238},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-regular-user-form.webp","在 TREK 面板中建立一般使用者帳戶","max-width: 420px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3240,3241],{},"登入後，建議立刻綁定通行鑰或設定2FA來強化該帳戶的安全層級：",[565,3243],{"src":3244,"alt":3245,"style":3246},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-user-security-passkey-2fa-setup.webp","使用安全金鑰（Passkey）與雙重認證設定使用者安全設定","max-width: 381px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3248,3002,3249,3252],{},[472,3250,3251],{},"+ Add a passkey","，輸入目前密碼，然後按照瀏覽器提示完成安全確認：",[565,3254],{"src":3255,"alt":3256,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-passkey-confirm-password.webp","確認密碼以註冊新的硬體安全金鑰",[544,3258,3260],{"id":3259},"_4-測試您的部署匯入歷史出行資料","4. 測試您的部署：匯入歷史出行資料",[434,3262,3263],{},"快速上手並熟悉TREK系統的一個極佳方式是，將您過去走過的旅行足跡錄入其中。",[1107,3265,3267],{"id":3266},"_41-建立旅行計劃","4.1 建立旅行計劃",[434,3269,3002,3270,3273,3274,1692,3277,3056],{},[472,3271,3272],{},"+ New Trip（新建旅行）","，並根據那次歷史旅行的真實起止時間設定 ",[472,3275,3276],{},"Start Date",[472,3278,3279],{},"End Date",[565,3281],{"src":3282,"alt":3283,"style":3284},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-trip-details.webp","建立具有自訂日期範圍的新旅行","max-width: 334px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3286,3287,3288,3056],{},"上傳一張好看的封面圖（可以直接將圖片拖入或從剪貼簿貼上），接著按一下 ",[472,3289,3290],{},"Create New Trip",[565,3292],{"src":3293,"alt":3294,"style":3295},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-cover-image-upload.webp","設定高品質的旅行封面圖片","max-width: 608px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1107,3297,3299],{"id":3298},"_42-匯入預訂資訊","4.2 匯入預訂資訊",[434,3301,3302],{},"將您當時留存的機票、火車票和其他交通工具預訂確認檔案直接拖放到上傳區域：",[565,3304],{"src":3305,"alt":3306,"style":3307},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-travel-booking-files.webp","用於匯入旅行 PDF 與預訂檔案的拖放區域","max-width: 570px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3309],{"src":3310,"alt":3311,"style":3312},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-booking-pdf-processing-status.webp","已上傳預訂的處理視窗，顯示擷取狀態","max-width: 377px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3314,3315],{},"由於我們已經啟用了AI解析引擎，預訂確認PDF檔案會被自動分析，提取出結構化的預訂日程。",[434,3317,3318,3319,3322],{},"檢查解析結果無誤后，按一下 ",[472,3320,3321],{},"Add"," 將其正式寫入預訂資料中：",[565,3324],{"src":3325,"alt":3326,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-review-parsed-booking-details.webp","審查由 AI 擷取的結構化預訂細節",[434,3328,3329],{},"如果有些預訂確認僅保存在郵件中，您可以將其匯出為PDF格式并上傳，同樣可以走這套提取流程。",[434,3331,3332],{},"在系統中，已匯入的預訂資訊會以極具現代感的方式呈現：",[434,3334,3335,3339],{},[565,3336],{"src":3337,"alt":3338,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-bookings-timeline-view.webp","旅行預訂的完整時間軸展示",[565,3340],{"src":3341,"alt":3342,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-booking-confirmation-details.webp","已確認交通預訂的詳細檢視",[434,3344,553,3345,3348],{},[472,3346,3347],{},"Plan（日程規劃）"," 頁面中，所有的飯店和住宿點都會在地圖上被優雅地標註出來：",[565,3350],{"src":3351,"alt":3352,"style":3353},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-plan-accommodations-map-display.webp","標有所有飯店住宿的互動式地圖","max-width: 546px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3355,3356,3357,3360],{},"按一下上方的 ",[472,3358,3359],{},"Atlas（旅行足跡）","，您將能从清單和世界地圖上直觀地看到所有已拜訪的国家：",[565,3362],{"src":3363,"alt":3364,"style":3365},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-atlas-countries-visited-summary.webp","個人 Atlas 追蹤器中的旅行歷史概述","max-width: 407px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1107,3367,3369],{"id":3368},"_43-新增旅行同伴","4.3 新增旅行同伴",[434,3371,3002,3372,3375],{},[472,3373,3374],{},"Share（分享）"," 按鈕：",[565,3377],{"src":3378,"alt":3379,"style":3380},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-share-options-button.webp","在 TREK 中開啟旅行分享對話方塊","max-width: 224px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3382,3383],{},"在彈出的對話方塊底部，可以直接新增旅行同伴為Guest（嘉賓）：",[565,3385],{"src":3386,"alt":3387,"style":3388},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-add-companions-guests.webp","新增自訂旅行同伴與隨行客人","max-width: 635px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1107,3390,3392],{"id":3391},"_44-記錄旅行費用","4.4 記錄旅行費用",[434,3394,3002,3395,3398],{},[472,3396,3397],{},"Add expense（新增開銷）","，來記錄那些無法透過PDF預訂單自動解析的雜項支出，例如境外險、當地公共交通費、臨時SIM卡等：",[565,3400],{"src":3401,"alt":3402,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-custom-expense-form.webp","在支出表單中輸入詳細的消費數據",[565,3404],{"src":3405,"alt":3406,"style":3407},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-expenses-list-billing-split.webp","分攤帳單明細與費用追蹤帳本","max-width: 526px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1107,3409,3411],{"id":3410},"_45-拆分旅行階段","4.5 拆分旅行階段",[434,3413,3414],{},"該功能需要提前在後台激活“Trip Segment”外掛。",[434,3416,3417],{},"對於那些超長週期的旅程，將其拆分為不同的階段能讓脈絡更清晰，每個階段都可以有自己獨立的預訂項目、待辦事項和成本帳單：",[565,3419],{"src":3420,"alt":3421,"style":3422},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-overview-display.webp","將複雜的行程拆分為旅行段","max-width: 465px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3424],{"src":3425,"alt":3426,"style":3427},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segment-itinerary-details.webp","顯示地點與計劃的活躍旅行段","max-width: 596px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3429],{"src":3430,"alt":3431,"style":3432},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-interactive-map.webp","在時間軸上繪製不同的旅行航段","max-width: 605px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1107,3434,3436],{"id":3435},"_46-建立journal日誌並查看旅行足跡atlas","4.6 建立Journal（日誌）並查看旅行足跡（Atlas）",[434,3438,3439,3440,3443],{},"您還可以將幾次旅行串聯成一個 ",[472,3441,3442],{},"Journey（旅程）","，並圖文並茂地撰寫遊記故事，方便分享給您的朋友們：",[565,3445],{"src":3446,"alt":3447,"style":3448},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-journey-group.webp","將多次旅行合併為一個視覺化的旅程","max-width: 441px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3450],{"src":3451,"alt":3452,"style":3453},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-timeline-story-writing.webp","在旅程面板中撰寫視覺化故事","max-width: 443px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3455],{"src":3456,"alt":3457,"style":3458},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-gallery-media-grid.webp","旅程內部的媒體收集與畫廊網格","max-width: 440px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3460],{"src":3461,"alt":3462,"style":3463},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-public-share-link.webp","為協同旅程產生公開分享連結","max-width: 532px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[544,3465,3467],{"id":3466},"_5-設計自訂行程與行李清單","5. 設計自訂行程與行李清單",[434,3469,3002,3470,3473],{},[472,3471,3472],{},"+ New Trip","，輸入旅行的專屬名稱並指定起止日期：",[565,3475],{"src":3476,"alt":3477,"style":3478},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-planning-new-trip-setup.webp","建立未定日期旅行的初始提示對話方塊","max-width: 432px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3480,3481,3484],{},[472,3482,3483],{},"如果具體的出行時間還沒有敲定，可以將日期項留空。"," 此時系統會顯示一個「天數配置（最高支援365天）」欄位，您可以先設計每日的遊玩內容，等後續買好機票後再一鍵錨定日期。",[1107,3486,3488],{"id":3487},"_51-新增地點景點","5.1 新增地點\u002F景點",[434,3490,3491],{},"這是旅行規劃中最耗時的一步，但TREK提供了四種極具效率的方式來協助您新增地點：",[565,3493],{"src":3494,"alt":3495,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-places-methods-overview.webp","向行程新增新地點的多種途徑",[434,3497,3498,3501],{},[472,3499,3500],{},"1. 直接在地圖上右鍵點擊："," 會該座標處直接建立新地點，其標準地址會被系統自動逆地理編碼解析出來：",[565,3503],{"src":3504,"alt":3505,"style":3506},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-map-location.webp","在地圖介面右鍵點擊以精確定位","max-width: 632px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3508],{"src":3509,"alt":3510,"style":3511},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-reverse-geocode-address.webp","所選地圖座標的自動逆地理編碼","max-width: 628px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3513,3514,3517],{},[472,3515,3516],{},"2. 按一下 + Add Place\u002FActivity："," 在搜尋框中直接透過關鍵字進行檢索",[565,3519],{"src":3520,"alt":3521,"style":3522},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-search-place-by-name-input.webp","使用文字輸入搜尋真實地點","max-width: 642px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3524],{"src":3525,"alt":3526,"style":3527},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-select-place-search-results-list.webp","顯示附帶地址標註的地點搜尋結果清單","max-width: 594px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,3529],{"src":3530,"alt":3531,"style":3532},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-place-details-rich-info-card.webp","包含評論與評分的完整地點資訊卡","max-width: 568px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3534,3535,3538,3539,2124,3542,3545],{},[472,3536,3537],{},"3. 直接貼上Google地圖分享連結："," （如 ",[503,3540,3541],{},"maps.app.goo.gl\u002F…",[503,3543,3544],{},"maps.google.com\u002F…","）貼上到檢索欄中。TREK會自動抓取該地點的名稱、地址和經緯度：",[565,3547],{"src":3548,"alt":3549,"style":3110},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-paste-google-maps-share-link.webp","直接從貼上的 Google 地圖分享連結解析地點",[565,3551],{"src":3552,"alt":3553,"style":3554},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-parsed-location.webp","成功從地圖 URL 中擷取座標","max-width: 543px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3556,3557,3560,3561,3564,3565,2124,3568,3571,3572,3575],{},[472,3558,3559],{},"4. 批次匯入資料："," 這是最輕鬆的方案。如果您在Google Maps中維護著自己的「想去清單」，可以將其匯出為 ",[503,3562,3563],{},".gpx"," 檔案（",[503,3566,3567],{},".kml",[503,3569,3570],{},".kmz"," 格式亦支援），然後按一下右側面板的 ",[472,3573,3574],{},"Import file","，一鍵拉取所有資料：",[565,3577],{"src":3578,"alt":3579,"style":3580},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-bulk-import-places-gpx-file.webp","使用 GPX 或 KML 檔案批次匯入地點","max-width: 389px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3582,3583],{},"推薦您可以先把所有感興趣的項目都新增進來。至於如何將它們科學地歸入到每一天的日程中，後續可以直接在面板裡拖拽處理。",[1107,3585,3587],{"id":3586},"_52-每日日程與備忘","5.2 每日日程與備忘",[434,3589,3590],{},"Day Plan（每日計劃）的核心邏輯是將所有的目的地按每日訪問順序進行排序。整個介面是一個可以折疊、支援任意拖放的模組：",[565,3592],{"src":3593,"alt":3594,"style":3595},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-drag-drop-ordering.webp","使用拖放操作自訂每日路線順序","max-width: 496px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3597,3598],{},"這些細節機制設計得極其精妙實用：",[497,3600,3601,3611,3621,3631],{},[500,3602,3603,3606,3607],{},[472,3604,3605],{},"中間移動方式","：按一下每日日程左上角的公車圖示，可以設定各節點之間的過渡交通方式（如地鐵、自駕、甚至是直達航班）：\n",[565,3608],{"src":3609,"alt":3610,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-commuting-transport-button.webp","登記日行程各段之間的通勤交通方式",[500,3612,3613,3616,3617],{},[472,3614,3615],{},"每日備忘","：按一下左下角的便簽圖示可以附加各種客製化提醒（例如：「今天需要提早出發」、「美術館門票需提前預約」）：\n",[565,3618],{"src":3619,"alt":3620,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-icon-tagged-notes-button.webp","為天行程新增顯眼的、帶有圖示的自訂備註",[500,3622,3623,3626,3627],{},[472,3624,3625],{},"指定時間段","：從右側拖拽地點並給它分配一個開始時間。設定了時間的地點會自動在地圖上生成推薦的行進路線：\n",[565,3628],{"src":3629,"alt":3630,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-timed-places-routing.webp","帶時間點的地點之間自動計算的交通路線",[500,3632,3633,3634,3637,3638,3641,3642,869],{},"關於智慧路線優化（",[472,3635,3636],{},"Route optimisation","）以及氣候（",[472,3639,3640],{},"Weather","），您可以查閱 ",[451,3643,3646],{"href":3644,"rel":3645},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[455],"Day Plans and Notes的Wiki文件",[1107,3648,3650],{"id":3649},"_53-收藏夾可重複使用的地點清單","5.3 收藏夾：可重複使用的地點清單",[434,3652,3653,3654,3657],{},"Collections（收藏夾）允許使用者在具體的旅行專案之外，保存並分類管理自己精心收集的寶藏地點。您可以將其打包分享給朋友。這些地點在加入旅行時是採用",[472,3655,3656],{},"複製","的方式，因此在旅行日程中對其進行的任何個性化標註，都不會破壞您收藏夾裡的原始乾淨資料。",[434,3659,3660,3661,3056],{},"按一下頂部選單列中的 ",[472,3662,3663],{},"Collections",[565,3665],{"src":3666,"alt":3667,"style":3668},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-dashboard-view.webp","存取儲存地點的自訂使用者收藏夾","max-width: 495px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3670,3002,3671,3674],{},[472,3672,3673],{},"+ New list"," 建立新的分類列表：",[565,3676],{"src":3677,"alt":3678,"style":3679},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-create-new-list.webp","在收藏夾中建立自訂清單","max-width: 269px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3681,3002,3682,3685],{},[472,3683,3684],{},"+ Add a place"," 並填入該地點的詳細情況：",[565,3687],{"src":3688,"alt":3689,"style":3690},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-add-place-manually-form.webp","手動輸入表單以填充自訂收藏清單","max-width: 271px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3692,3693,3696],{},[472,3694,3695],{},"注意："," 收藏夾內的搜尋元件偶爾可能會因網路原因失效，如果發生該情況，您可以透過手動輸入來建立。",[434,3698,3699],{},"當地點帶有準確的GPS座標時，它們會精美地展示在地圖中：",[565,3701],{"src":3702,"alt":3703,"style":3704},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-map-places-display.webp","在互動式地圖上視覺化自訂收藏中的地點","max-width: 592px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3706,3707,3708,3711],{},"如需批次整理這些地標，可以按一下 ",[472,3709,3710],{},"checkbox（勾選框）"," 圖示：",[565,3713],{"src":3714,"alt":3715,"style":3716},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-select-places-tickbox.webp","批次標記已儲存地點的選擇模式","max-width: 662px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3718,3719,3720,3056],{},"多選目標後，按一下 ",[472,3721,3722],{},"Assign label（分配標籤）",[565,3724],{"src":3725,"alt":3726,"style":3554},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","為選定的收藏地點分配描述性標籤",[434,3728,3729,3730,3733],{},"在分配之前，先按一下 ",[472,3731,3732],{},"Manage labels（管理標籤）"," 來新建一些醒目的彩色分組標籤：",[565,3735],{"src":3736,"alt":3737,"style":3738},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-manage-custom-labels.webp","建立與管理自訂標籤","max-width: 411px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3740,3741],{},"按一下一個具體標籤，接著選擇一鍵綁定：",[565,3743],{"src":3744,"alt":3745,"style":3365},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","套用自訂標籤至分群的地點",[1107,3747,3749],{"id":3748},"_54-費用與預算","5.4 費用與預算",[434,3751,553,3752,3755],{},[472,3753,3754],{},"Costs（財務管理）"," 頁面中，我們可以錄入其他的預備預算和旅途支出。",[565,3757],{"src":3758,"alt":3759,"style":3595},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-budget-overall-expenses-list.webp","完整的支出表格與餘額結算帳本",[434,3761,3762],{},"在結伴出行時，您可以在此頁記錄每個人的墊付帳單，並選定分攤規則。",[434,3764,3765,3766,3769],{},"系統的結算後台採用了一種貪心匹配演算法，計算並生成",[472,3767,3768],{},"最簡化的轉帳精算方案","，幫大家用最少的轉帳次數輕鬆對齊帳目。",[544,3771,3773],{"id":3772},"_6-利用model-context-protocolmcp實現ai驅動的旅行規劃","6. 利用Model Context Protocol（MCP）實現AI驅動的旅行規劃",[434,3775,3776,3777,3780],{},"TREK內建了 ",[472,3778,3779],{},"MCP（模型上下文協定）伺服器","。這意味著，AI代理可以直接「讀寫」您的行程規劃資料。它提供了超過150个精細的原子工具和30個核心資料源，全方位覆蓋行程、地點、帳目、行李、預訂和多人協作。",[1107,3782,3784],{"id":3783},"_61-cloudflare-zero-trust網路配置","6.1 Cloudflare Zero Trust網路配置",[434,3786,3787,3788,3791,3792,869],{},"由於我們的自託管服務執行在 ",[451,3789,3790],{"href":363},"Cloudflare Zero Trust"," 內網環境下，我們需要在「Split Tunnels（分流隧道）」配置中，將該服務的網域加入到 Inclusion List（包含\u002F直連白名單）中。否則在進行 OAuth 登入授權探索時，介面呼叫會被網路策略阻斷。具體的配置排障可以參考這個 GitHub 討論貼：",[451,3793,3796],{"href":3794,"rel":3795},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[455],"GitHub Issue",[3798,3799],"article-card",{"description":3800,"image":3801,"image-alt":3802,"label":3803,"min-read":3804,"title":3805,"to":363},"本文深入探討如何使用 Cloudflare WARP 與 Zero Trust 技術，在完全不需要開啟任何防火牆入站連接埠的情況下，安全地將您的 Hermes Agent 暴露到私有網路中，從而實現全球範圍內的安全存取。這為您構建專屬私有遠端 AI 基礎架構打下堅實基礎。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FTW-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","透過 Cloudflare Zero Trust 和 WARP 隧道安全地將 Hermes Agent 暴露至私有網路","相關指南","5","教學：使用 Cloudflare WARP 安全地將 Hermes Agent 暴露至私有網路",[565,3807],{"src":3808,"alt":3809,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-zero-trust-split-tunnels-domain.webp","向 Cloudflare Warp 分流隧道（Split Tunnels）新增自訂網域名稱",[1107,3811,3813],{"id":3812},"_62-claude-desktop用戶端配置","6.2 Claude Desktop用戶端配置",[434,3815,3002,3816,3819,3820],{},[472,3817,3818],{},"+ New Client"," 創設一個新的 AI 用戶端介面：\n",[565,3821],{"src":3822,"alt":3823,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-register-new-mcp-client.webp","在設定中註冊新的自訂用戶端權杖",[434,3825,1779,3826,3828,3829,3056],{},[472,3827,984],{}," 項目，然後按一下 ",[472,3830,3831],{},"Register Client（註冊用戶端）",[565,3833],{"src":3834,"alt":3835,"style":3836},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-claude-desktop-client-credentials.webp","產生 Claude Desktop 用戶端憑據","max-width: 354px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3838,3839,3840,3843],{},"系統此時會展示唯一的 Client ID 和 Client Secret，請妥善保存。接著按一下 ",[472,3841,3842],{},"Client Configuration（用戶端配置）"," 調出我們需要在本地寫入的 JSON 程式碼片段：",[565,3845],{"src":3846,"alt":3847,"style":3848},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-client-configuration-block.webp","取得預先格式化的 MCP 伺服器組態組塊","max-width: 508px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,3850,3851,3852,3855],{},"在 Claude Desktop 軟體中，按一下 ",[472,3853,3854],{},"Edit Config"," 會在編輯器中打開您本地的 MCP server 檔案：",[565,3857],{"src":3858,"alt":3859,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-config-json.webp","編輯 Claude Desktop 的本機 MCP 設定檔 json",[434,3861,3862],{},"將 TREK 的 MCP 程式碼區塊貼上進去，並把佔位符部分替換為上一步生成的用戶端憑證：",[663,3864,3866],{"className":665,"code":3865,"language":667,"meta":668,"style":668},"  \"mcpServers\": {\n    \"trek\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n        \"--static-oauth-client-info\",\n        \"{\\\"client_id\\\": \\\"\u003Cyour_client_id>\\\", \\\"client_secret\\\": \\\"\u003Cyour_client_secret>\\\"}\"\n      ]\n    }\n  },\n",[503,3867,3868,3881,3893,3911,3923,3933,3944,3955,4001,4005,4009],{"__ignoreMap":668},[672,3869,3870,3873,3875,3877,3879],{"class":674,"line":675},[672,3871,3872],{"class":678},"  \"",[672,3874,660],{"class":682},[672,3876,686],{"class":678},[672,3878,690],{"class":689},[672,3880,693],{"class":678},[672,3882,3883,3885,3887,3889,3891],{"class":674,"line":696},[672,3884,679],{"class":678},[672,3886,3037],{"class":702},[672,3888,686],{"class":678},[672,3890,708],{"class":678},[672,3892,945],{"class":678},[672,3894,3895,3897,3899,3901,3903,3905,3907,3909],{"class":674,"line":722},[672,3896,699],{"class":678},[672,3898,703],{"class":826},[672,3900,686],{"class":678},[672,3902,708],{"class":678},[672,3904,711],{"class":678},[672,3906,714],{"class":682},[672,3908,686],{"class":678},[672,3910,719],{"class":678},[672,3912,3913,3915,3917,3919,3921],{"class":674,"line":737},[672,3914,699],{"class":678},[672,3916,727],{"class":826},[672,3918,686],{"class":678},[672,3920,708],{"class":678},[672,3922,734],{"class":678},[672,3924,3925,3927,3929,3931],{"class":674,"line":750},[672,3926,740],{"class":678},[672,3928,743],{"class":682},[672,3930,686],{"class":678},[672,3932,719],{"class":678},[672,3934,3935,3937,3940,3942],{"class":674,"line":762},[672,3936,740],{"class":678},[672,3938,3939],{"class":682},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[672,3941,686],{"class":678},[672,3943,719],{"class":678},[672,3945,3946,3948,3951,3953],{"class":674,"line":774},[672,3947,740],{"class":678},[672,3949,3950],{"class":682},"--static-oauth-client-info",[672,3952,686],{"class":678},[672,3954,719],{"class":678},[672,3956,3957,3959,3961,3964,3967,3969,3971,3973,3976,3978,3981,3983,3986,3988,3990,3992,3995,3997,3999],{"class":674,"line":785},[672,3958,740],{"class":678},[672,3960,2878],{"class":682},[672,3962,3963],{"class":689},"\\\"",[672,3965,3966],{"class":682},"client_id",[672,3968,3963],{"class":689},[672,3970,690],{"class":682},[672,3972,3963],{"class":689},[672,3974,3975],{"class":682},"\u003Cyour_client_id>",[672,3977,3963],{"class":689},[672,3979,3980],{"class":682},", ",[672,3982,3963],{"class":689},[672,3984,3985],{"class":682},"client_secret",[672,3987,3963],{"class":689},[672,3989,690],{"class":682},[672,3991,3963],{"class":689},[672,3993,3994],{"class":682},"\u003Cyour_client_secret>",[672,3996,3963],{"class":689},[672,3998,2884],{"class":682},[672,4000,782],{"class":678},[672,4002,4003],{"class":674,"line":791},[672,4004,788],{"class":678},[672,4006,4007],{"class":674,"line":1421},[672,4008,794],{"class":678},[672,4010,4011,4014],{"class":674,"line":1427},[672,4012,4013],{"class":678},"  }",[672,4015,719],{"class":689},[434,4017,4018],{},"重新啟動 Claude Desktop 用戶端。此時在 Local MCP servers（本地MCP服務）列表中就會看到 TREK 已經成功連線：",[565,4020],{"src":4021,"alt":4022,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-trek-server-connected.webp","在 Claude 介面中驗證活躍的 TREK 連線狀態",[434,4024,4025],{},"現在，您可以直接用日常口語來下達規劃指令了：",[565,4027],{"src":4028,"alt":4029,"style":4030},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-natural-language-prompt.webp","使用自然語言提示 Claude 操作旅行資料","max-width: 550px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,4032,4033],{},"例如，我们用純中文錄入一筆非標準化的日常開支：",[663,4035,4038],{"className":4036,"code":4037,"language":1016,"meta":668},[1014],"For the West Europe trip, the Grab from KLIA1 to the hotel cost RM115.90 on 26\u002F4\u002F2025. Please add it as an expense without split to the trip.\n",[503,4039,4037],{"__ignoreMap":668},[565,4041],{"src":4042,"alt":4043,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-expense-response.webp","Claude 呼叫工具自動記錄一筆支出",[434,4045,4046,4047,4050],{},"回到後台，重新整理 ",[472,4048,4049],{},"Costs"," 面板。我們可以看到這筆打車費用已經被精確地記錄下來，且因為命令中並未提及“由誰付款”，系統體貼地將付款人項歸納為了“No one paid yet（尚未有人支付）”：",[565,4052],{"src":4053,"alt":4054,"style":3011},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-page-mcp-parsed-expense.webp","在費用檢視中確認最新由 AI 解析的支出",[434,4056,4057],{},"管理行李清單的方式也完全一致：",[565,4059],{"src":4060,"alt":4061,"style":4062},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-packing-items.webp","Claude 使用自然語言提示新增打包清單物品","max-width: 631px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,4064,4065,4066,4069],{},"再次重新整理 ",[472,4067,4068],{},"Packing List"," 頁面，指定的这三樣出行裝備已經被整齊地加入到了清單之中：",[565,4071],{"src":4072,"alt":4073,"style":4074},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-packing-list-mcp-parsed-items.webp","在打包清單頁面中確認最新解析的打包物品","max-width: 312px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1107,4076,4078],{"id":4077},"_63-gemini-cli動態註冊","6.3 Gemini CLI（動態註冊）",[434,4080,4081,4082,4085,4086,4089],{},"Gemini CLI 對 ",[472,4083,4084],{},"Dynamic Registration（動態註冊機制）"," 提供了極佳的支援，這使得您完全無需在系統後台手動預註冊任何用戶端憑證。直接將以下程式碼追加到您本地的 ",[503,4087,4088],{},".gemini\u002Fsettings.json"," 檔案中：",[663,4091,4093],{"className":665,"code":4092,"language":667,"meta":668,"style":668},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[503,4094,4095,4107,4125,4137,4149,4153],{"__ignoreMap":668},[672,4096,4097,4099,4101,4103,4105],{"class":674,"line":675},[672,4098,679],{"class":678},[672,4100,3037],{"class":682},[672,4102,686],{"class":678},[672,4104,690],{"class":689},[672,4106,693],{"class":678},[672,4108,4109,4111,4113,4115,4117,4119,4121,4123],{"class":674,"line":696},[672,4110,699],{"class":678},[672,4112,919],{"class":702},[672,4114,686],{"class":678},[672,4116,708],{"class":678},[672,4118,711],{"class":678},[672,4120,3939],{"class":682},[672,4122,686],{"class":678},[672,4124,719],{"class":678},[672,4126,4127,4129,4131,4133,4135],{"class":674,"line":722},[672,4128,699],{"class":678},[672,4130,938],{"class":702},[672,4132,686],{"class":678},[672,4134,708],{"class":678},[672,4136,945],{"class":678},[672,4138,4139,4141,4143,4145,4147],{"class":674,"line":737},[672,4140,740],{"class":678},[672,4142,952],{"class":826},[672,4144,686],{"class":678},[672,4146,708],{"class":678},[672,4148,959],{"class":678},[672,4150,4151],{"class":674,"line":750},[672,4152,964],{"class":678},[672,4154,4155],{"class":674,"line":762},[672,4156,794],{"class":678},[434,4158,4159,4160,4163,4164,4167,4168],{},"在終端機執行 ",[503,4161,4162],{},"gemini"," 指令，並在隨後拉起的網頁授權頁面中按一下 ",[472,4165,4166],{},"Approve（批准）"," 即可：\n",[565,4169],{"src":4170,"alt":4171,"style":4172},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fmcp-client-oauth-authorization-prompt.webp","批准針對 TREK MCP 伺服器的 OAuth 存取授權","max-width: 488px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,4174,4175],{},"現在便可以透過極簡的命令列終端機向 AI 提問了：",[565,4177],{"src":4178,"alt":4179,"style":4180},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-prompt-itinerary.webp","使用 Gemini CLI 提示獲取旅行行程","max-width: 415px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[565,4182],{"src":4183,"alt":4184,"style":3458},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-display-itinerary.webp","Gemini CLI 成功展示結構化的旅行資訊",[1107,4186,4188],{"id":4187},"_64-kimi-cli動態註冊","6.4 Kimi CLI（動態註冊）",[434,4190,4191,4192,4195,4196,4199],{},"原理基本相同。請在本地 ",[503,4193,4194],{},"\u002FUsers\u002F\u003C您的用戶名>\u002F.kimi\u002F"," 目錄下找到 ",[503,4197,4198],{},"mcp.json"," 並寫入以下連線配置：",[663,4201,4203],{"className":665,"code":4202,"language":667,"meta":668,"style":668},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[503,4204,4205,4217,4237,4256,4273],{"__ignoreMap":668},[672,4206,4207,4209,4211,4213,4215],{"class":674,"line":675},[672,4208,679],{"class":678},[672,4210,3037],{"class":682},[672,4212,686],{"class":678},[672,4214,690],{"class":689},[672,4216,693],{"class":678},[672,4218,4219,4221,4224,4226,4228,4230,4233,4235],{"class":674,"line":696},[672,4220,699],{"class":678},[672,4222,4223],{"class":702},"type",[672,4225,686],{"class":678},[672,4227,708],{"class":678},[672,4229,711],{"class":678},[672,4231,4232],{"class":682},"http",[672,4234,686],{"class":678},[672,4236,719],{"class":678},[672,4238,4239,4241,4244,4246,4248,4250,4252,4254],{"class":674,"line":722},[672,4240,699],{"class":678},[672,4242,4243],{"class":702},"url",[672,4245,686],{"class":678},[672,4247,708],{"class":678},[672,4249,711],{"class":678},[672,4251,3939],{"class":682},[672,4253,686],{"class":678},[672,4255,719],{"class":678},[672,4257,4258,4260,4263,4265,4267,4269,4271],{"class":674,"line":737},[672,4259,699],{"class":678},[672,4261,4262],{"class":702},"auth",[672,4264,686],{"class":678},[672,4266,708],{"class":678},[672,4268,711],{"class":678},[672,4270,938],{"class":682},[672,4272,782],{"class":678},[672,4274,4275],{"class":674,"line":750},[672,4276,794],{"class":678},[434,4278,4159,4279,4282,4283,4286,4287],{},[503,4280,4281],{},"kimi mcp auth trek"," 並在網頁上按一下 ",[472,4284,4285],{},"Approve"," 完成快速授權：\n",[565,4288],{"src":4170,"alt":4171,"style":4289},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[434,4291,4292],{},"完成授權後，您將網頁在命令列直接呼叫所有關聯的微服務工具：",[565,4294],{"src":4295,"alt":4296,"style":2839},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fkimi-cli-mcp-authorized-tools-list.webp","授權成功後 Kimi CLI 顯示的可用工具清單",[544,4298,4300],{"id":4299},"_7-行動端使用體驗","7. 行動端使用體驗",[434,4302,4303],{},"在手機和行動裝置上，TREK是以 PWA（漸進式Web應用程式）的形式呈現的。其內建的 Service Worker 能夠將地圖網格瓦片和日程 API 資料離線快取，確保在野外或沒有網路訊號的極佳狀態下，您依然能夠流暢查看已制定的全部行程。不過，離線狀態下的推播通知回應速度相較原生應用程式會有微小的延遲。",[544,4305,4306],{"id":4306},"結語",[434,4308,4309],{},"透過 MCP 將 AI 代理接入您的日常旅行規劃，可以幫您省去那些因手動鍵入繁多的航班和酒店確認單而產生的大量枯燥勞動。不僅如此，AI 還能根據您指定的具體出行節點和所處季節，智慧推薦周邊的特色景點。僅僅透過幾句隨意的對話，AI 就能輕鬆打通從前期靈感檢索、行程路線設計，再到後期預算拆分和行李打包的完整全鏈路。",[434,4311,4312],{},"不過在目前的版本中，依然存在一些微小的體驗瑕疵。例如：透過 PDF 智慧解析匯入訂單時，帳單貨幣會預設對齊到旅行專案的主貨幣，而不是當時實際刷卡結算的付款貨幣。此外，在 Collections 收藏夾中新建清單列表時，如果在列表尚未保存時就給它配置封面，該封面可能在保存後失效（您需要在列表正式建立後，點擊「編輯」來重新添加並保存，即可解決）。",[434,4314,4315,4316,4321],{},"此外，因為它需要您擁有一定的 VPS 運維基礎來親自執行這套程序，對一般使用者確實存在一些上手門檻。TREK 更適合那些重度旅行愛好者、數位游牧以及對於自身出行資料隱私和排版有著高水準要求的極客使用者。我們由衷地建議您在下定決心搭建自託管服務之前，可以先在 ",[451,4317,4320],{"href":4318,"rel":4319},"https:\u002F\u002Fdemo.liketrek.com\u002F",[455],"demo.liketrek.com"," 上完整試用一下官方提供的公測 DEMO，看它是否切中您的日常痛點。",[544,4323,4324],{"id":1220},"參考資料:",[497,4326,4327,4334,4341],{},[500,4328,4329],{},[451,4330,4333],{"href":4331,"rel":4332},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[455],"TREK Quick Start",[500,4335,4336],{},[451,4337,4340],{"href":4338,"rel":4339},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[455],"TREK Troubleshooting",[500,4342,4343],{},[451,4344,4347],{"href":4345,"rel":4346},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[455],"TREK MCP Scopes",[1257,4349,4350],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":668,"searchDepth":696,"depth":722,"links":4352},[4353,4358,4359,4369,4377,4383,4389,4390,4391],{"id":2493,"depth":722,"text":2494,"children":4354},[4355,4356,4357],{"id":2497,"depth":737,"text":2498},{"id":2681,"depth":737,"text":2681},{"id":2715,"depth":737,"text":2715},{"id":2861,"depth":722,"text":2862},{"id":2909,"depth":722,"text":2910,"children":4360},[4361,4362,4363,4364,4365,4366,4367,4368],{"id":3014,"depth":737,"text":3015},{"id":3025,"depth":737,"text":3026},{"id":3124,"depth":737,"text":3125},{"id":3142,"depth":737,"text":3143},{"id":3178,"depth":737,"text":3179},{"id":3200,"depth":737,"text":3201},{"id":3218,"depth":737,"text":3219},{"id":3229,"depth":737,"text":3230},{"id":3259,"depth":722,"text":3260,"children":4370},[4371,4372,4373,4374,4375,4376],{"id":3266,"depth":737,"text":3267},{"id":3298,"depth":737,"text":3299},{"id":3368,"depth":737,"text":3369},{"id":3391,"depth":737,"text":3392},{"id":3410,"depth":737,"text":3411},{"id":3435,"depth":737,"text":3436},{"id":3466,"depth":722,"text":3467,"children":4378},[4379,4380,4381,4382],{"id":3487,"depth":737,"text":3488},{"id":3586,"depth":737,"text":3587},{"id":3649,"depth":737,"text":3650},{"id":3748,"depth":737,"text":3749},{"id":3772,"depth":722,"text":3773,"children":4384},[4385,4386,4387,4388],{"id":3783,"depth":737,"text":3784},{"id":3812,"depth":737,"text":3813},{"id":4077,"depth":737,"text":4078},{"id":4187,"depth":737,"text":4188},{"id":4299,"depth":722,"text":4300},{"id":4306,"depth":722,"text":4306},{"id":1220,"depth":722,"text":4324},[4393,1280],"travel","2026-09-01","本文詳細介紹如何使用Docker部署開源旅行規劃系統TREK。我們將帶您配置Caddy反向代理和Cloudflare R2物件儲存，實現資料的安全備份與圖片的高效載入。此外，還將演示如何利用MCP（模型上下文協定）連接Claude等AI代理，通過自然语言對話一鍵生成您的專屬旅行日程，開啟完美旅程。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002FTW-Self-hosted-travel-planner-TREK.webp","在一張溫和的羊皮紙背景上，高品質極簡風格的TREK自託管旅行規劃器儀表板3D插圖。",{"schemaOrg":4399,"robots":1292,"sitemap":4404},[4400,4401],{"@type":1860,"headline":2479,"description":4395},{"@type":4402,"headline":4403,"description":4395},"Article","如何自託管AI旅行規劃器TREK：基於Docker、Caddy與Cloudflare R2的終極部署教程",{"lastmod":4394},{"title":4403,"description":4395,"ogTitle":2479,"ogDescription":4395,"twitterTitle":2479,"twitterDescription":4395},"tw\u002Farticle\u002Fself-hosted-travel-planner-trek",[4408,4409,4410,1298,1299],"Docker","TREK","Caddy","2026-09-03","4z3qxnioPNFhbOX0uBxJtousA1aOkRBZl0xQJeZeC7M",{"id":4414,"title":4415,"author":668,"body":4416,"category":6533,"date":6535,"description":6536,"extension":1283,"image":6537,"imageAlt":6538,"isPublished":1286,"meta":6539,"minRead":1427,"navigation":1286,"path":383,"seo":6561,"stem":6563,"tags":6564,"updatedAt":424,"__hash__":6566},"article\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md","自建 Block 旗下 Buzz 協作平台：輕鬆構建人類與 AI 智能體高效協同工作的全新共享工作空間",{"type":426,"value":4417,"toc":6503},[4418,4421,4427,4433,4437,4440,4478,4482,4488,4526,4530,4534,4548,4554,4559,4563,4567,4580,4586,4635,4661,4665,4674,4680,4684,4687,4866,4870,4914,4921,4928,4934,4984,4990,5019,5023,5027,5046,5074,5087,5129,5137,5407,5411,5456,5461,5468,5473,5477,5500,5503,5509,5515,5519,5527,5533,5536,5542,5548,5576,5583,5589,5592,5598,5602,5605,5608,5611,5617,5620,5626,5632,5638,5643,5647,5658,5665,5671,5674,5680,5683,5690,5696,5703,5707,5715,5778,5787,5841,5844,5913,5919,5935,5941,5945,5991,5997,6000,6006,6009,6015,6019,6036,6052,6058,6155,6158,6164,6175,6224,6230,6236,6249,6265,6268,6274,6278,6285,6307,6317,6415,6425,6431,6438,6444,6447,6453,6456,6462,6464,6467,6470,6500],[434,4419,4420],{},"在與多個 AI 智能體（AI Agent）協同工作時，最讓人頭痛的障礙莫過於「上下文斷片化（Context Fragmentation）」。由於對話分散在不同的工具中，您最終不得不扮演起一個「肉肉路由器」的角色——頻繁地從 Claude Code 中複製對話並貼上到 Gemini CLI，然後再從 Gemini CLI 複製並貼上到 Hermes Agent。而當您身邊還有人類團隊成員一起協作時，這種繁瑣的摩擦感更是成倍增長。",[434,4422,4423],{},[565,4424],{"alt":4425,"src":4426},"Buzz 協作工作空間的使用者介面，顯示聊天頻道和活躍的 AI 智能體","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[434,4428,4429,4432],{},[472,4430,4431],{},"Buzz"," 是一款開源的協同工作空間，它將人類團隊和 AI 智能體凝聚在一個統一環境中。在這裡，人類同事與 AI 智能體能夠共享相同的任務和專案歷史，並實現天衣無缝的工作交接。",[429,4434,4436],{"id":4435},"什麼是-block-旗下的-buzz人機協同的-ai-智能體共享空間","什麼是 Block 旗下的 Buzz？人機協同的 AI 智能體共享空間",[434,4438,4439],{},"Buzz 是 Block 公司（由推特創辦人傑克·多西創立）推出的開源協作工作空間，它讓團隊成員和 AI 智能體能夠在相同的頻道與專案中並肩工作。它具有以下幾個核心亮點：",[497,4441,4442,4448,4454,4460,4466,4472],{},[500,4443,4444,4447],{},[472,4445,4446],{},"共享上下文："," 頻道是團隊成員與智能體開展協作的核心陣地。所有的對話記錄和專案歷史都完整保留在頻道中。",[500,4449,4450,4453],{},[472,4451,4452],{},"智能體間通信："," 智能體之間能够跨機器直接進行交流。一個 AI 智能體可以 @ 另一個智能體，從上完成工作的轉交或代碼的交叉審查。",[500,4455,4456,4459],{},[472,4457,4458],{},"提及驅動激活："," AI 智能體僅在被 @ 提及時才會激活，平時則保持靜默。被提及時，智能體將讀取頻道中的相關上下文並開始工作。",[500,4461,4462,4465],{},[472,4463,4464],{},"統一身份系統："," 團隊成員與 AI 智能體使用同一套身份系統，並通過加密私鑰\u002F公鑰進行安全認證。",[500,4467,4468,4471],{},[472,4469,4470],{},"委派命令："," 您可以向人類同事授予指揮您的智能體的權限，讓整個團隊都能輕鬆指派和調用彼此的數位助手。",[500,4473,4474,4477],{},[472,4475,4476],{},"自託管伺服器："," 因為您是該伺服器的託管者，所以您的數據完全由您掌控。您可以自由決定誰能加入，並定義專屬的運行規則。",[429,4479,4481],{"id":4480},"基於-nostr-的加密級-buzz-架構解析","基於 Nostr 的加密級 Buzz 架構解析",[434,4483,4484],{},[565,4485],{"alt":4486,"src":4487},"基於 Nostr 協定的 Buzz 協作空間加密級架構拓撲圖","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[497,4489,4490,4496,4502,4508,4514,4520],{},[500,4491,4492,4495],{},[472,4493,4494],{},"Nostr 中繼器充當伺服器："," 消息、工作流、代碼倉庫以及其他事件都經過加密簽名和驗證，並儲存在 Nostr 中繼伺服器（Relay）上。Nostr 協定原生支援通過 WebSockets 和 REST API 進行通信。",[500,4497,4498,4501],{},[472,4499,4500],{},"統一加密身份："," 人類和智能體都使用各自的加密金鑰進行認證。此身份完全保留在用戶端，絕不會儲存在伺服器上。",[500,4503,4504,4507],{},[472,4505,4506],{},"一等公民級智能體："," 每个智能體都擁有獨立的身份、頻道成員資格和審計跟蹤（Audit Trail）。智能體使用智能體通信協定（ACP）連接到工作空間。",[500,4509,4510,4513],{},[472,4511,4512],{},"去中心化 Git 倉庫："," 代碼庫儲存在相容 S3 的物件儲存中，而任務、拉取請求（PR）和代碼審查則在 Nostr 事件日誌中進行追蹤。因此，Buzz 的 Git 倉庫實際上是託管在 Nostr 中繼器上，而非 GitHub。",[500,4515,4516,4519],{},[472,4517,4518],{},"Buzz 用戶端屬於 Nostr 用戶端："," Buzz 應用與 Nostr 中繼器是分離的；它是一個桌面或移動端用戶端，負責連接到中繼器的 URL 節點。",[500,4521,4522,4525],{},[472,4523,4524],{},"基礎技術棧："," 由 PostgreSQL 資料庫處理事件儲存與全文檢索，Redis 負責管理發佈\u002F訂閱（Pub\u002FSub）消息佇列，而相容 S3 的 MinIO 用於儲存媒體檔案。",[429,4527,4529],{"id":4528},"如何在-linux-vps-上部署自託管的-block-旗下-buzz","如何在 Linux VPS 上部署自託管的 Block 旗下 Buzz",[544,4531,4533],{"id":4532},"_0-前提條件","0. 前提條件",[497,4535,4536,4539,4542,4545],{},[500,4537,4538],{},"一台 Linux VPS",[500,4540,4541],{},"域名已指向您的伺服器 IP 地址",[500,4543,4544],{},"Docker 以及 Docker Compose 外掛程式",[500,4546,4547],{},"Cloudflare 帳戶（免費服務計劃）",[434,4549,4550,4551,4553],{},"在本指南中，我們將把 Nostr 中繼器部署在 Ubuntu VPS 上，並通過 ",[451,4552,3805],{"href":363}," 保護其安全。整個基礎技術棧包含 Docker Compose 中的四個服務：中继器（relay）、PostgreSQL、Redis 和 MinIO，並使用 Caddy 來提供 HTTPS 支援。",[3798,4555],{"description":4556,"image":3801,"image-alt":4557,"label":3803,"min-read":4558,"title":3805,"to":363},"了解如何利用 Cloudflare WARP 和 Zero Trust（零信任）在不開放入站防火牆端口的情況下，安全地在全球範圍內暴露和存取您的 Hermes Agent。","使用 Cloudflare Zero Trust 和 WARP 隧道安全地將 Hermes Agent 暴露到私有網路","8",[544,4560,4562],{"id":4561},"_1-cloudflare-dns-與-api-權杖","1. Cloudflare DNS 與 API 權杖",[1107,4564,4566],{"id":4565},"創建-cloudflare-api-權杖token","創建 Cloudflare API 權杖（Token）",[549,4568,4569,4575],{},[500,4570,4571,4572,869],{},"點擊右上角的個人頭像，並在下拉選單中選擇 ",[472,4573,4574],{},"Profile",[500,4576,1129,4577,869],{},[472,4578,4579],{},"API Tokens",[434,4581,4582],{},[565,4583],{"alt":4584,"src":4585},"Cloudflare 使用者個人資料頁面，顯示 API 權杖創建選單","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[549,4587,4588,4594,4600,4620,4625,4629,4632],{"start":722},[500,4589,1129,4590,4593],{},[472,4591,4592],{},"Create Token"," 按鈕。",[500,4595,4596,4597,869],{},"選擇使用範本 ",[472,4598,4599],{},"Edit zone DNS",[500,4601,4602,4603],{},"配置範本如下：\n",[497,4604,4605,4611],{},[500,4606,4607,4610],{},[472,4608,4609],{},"Permissions",": Zone — DNS — Edit",[500,4612,4613,4616,4617],{},[472,4614,4615],{},"Zone Resources",": Include — Specific zone — ",[503,4618,4619],{},"example.com",[500,4621,1129,4622,869],{},[472,4623,4624],{},"Continue to summary",[500,4626,1129,4627,869],{},[472,4628,4592],{},[500,4630,4631],{},"拷貝生成的 API 權杖，因為頁面關閉後它將不再顯示。",[500,4633,4634],{},"在終端機中驗證生成的權杖，確保其能正常工作：",[663,4636,4638],{"className":1897,"code":4637,"language":1899,"meta":668,"style":668},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[503,4639,4640],{"__ignoreMap":668},[672,4641,4642,4644,4646,4649,4651,4654,4656,4659],{"class":674,"line":675},[672,4643,2513],{"class":826},[672,4645,711],{"class":678},[672,4647,4648],{"class":682},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[672,4650,686],{"class":678},[672,4652,4653],{"class":682}," -H",[672,4655,711],{"class":678},[672,4657,4658],{"class":682},"Authorization: Bearer YOUR_TOKEN_HERE",[672,4660,782],{"class":678},[1107,4662,4664],{"id":4663},"dns-解析記錄","DNS 解析記錄",[497,4666,4667],{},[500,4668,4669,4670,4673],{},"創建一條 A 記錄，並將代理狀態設置為 ",[472,4671,4672],{},"僅限 DNS","（DNS only）。",[434,4675,4676],{},[565,4677],{"alt":4678,"src":4679},"在 Cloudflare 控制台中配置 Buzz 域名的 DNS A 記錄，並將代理狀態設置為僅限 DNS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[544,4681,4683],{"id":4682},"_2-在-ubuntu-上安裝-docker","2. 在 Ubuntu 上安裝 Docker",[434,4685,4686],{},"運行以下命令在 Ubuntu 上安裝 Docker：",[663,4688,4690],{"className":1897,"code":4689,"language":1899,"meta":668,"style":668},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[503,4691,4692,4696,4716,4720,4724,4756,4760,4764,4772,4776,4780,4796,4800,4805,4815,4819,4823,4829,4833,4847,4851,4856],{"__ignoreMap":668},[672,4693,4694],{"class":674,"line":675},[672,4695,2508],{"class":1906},[672,4697,4698,4700,4702,4704,4706,4708,4710,4712,4714],{"class":674,"line":696},[672,4699,2513],{"class":826},[672,4701,2516],{"class":682},[672,4703,2519],{"class":682},[672,4705,2522],{"class":678},[672,4707,2525],{"class":826},[672,4709,2528],{"class":682},[672,4711,2531],{"class":682},[672,4713,2534],{"class":682},[672,4715,2537],{"class":682},[672,4717,4718],{"class":674,"line":722},[672,4719,1921],{"emptyLinePlaceholder":1286},[672,4721,4722],{"class":674,"line":737},[672,4723,2546],{"class":1906},[672,4725,4726,4728,4730,4732,4734,4736,4738,4740,4742,4744,4746,4748,4750,4752,4754],{"class":674,"line":750},[672,4727,2551],{"class":1912},[672,4729,711],{"class":678},[672,4731,2556],{"class":682},[672,4733,2559],{"class":678},[672,4735,2562],{"class":826},[672,4737,2565],{"class":682},[672,4739,2568],{"class":678},[672,4741,2571],{"class":682},[672,4743,686],{"class":678},[672,4745,2522],{"class":678},[672,4747,2525],{"class":826},[672,4749,2580],{"class":682},[672,4751,2583],{"class":682},[672,4753,2586],{"class":678},[672,4755,2589],{"class":682},[672,4757,4758],{"class":674,"line":762},[672,4759,1921],{"emptyLinePlaceholder":1286},[672,4761,4762],{"class":674,"line":774},[672,4763,2598],{"class":1906},[672,4765,4766,4768,4770],{"class":674,"line":785},[672,4767,2603],{"class":826},[672,4769,2606],{"class":682},[672,4771,2609],{"class":682},[672,4773,4774],{"class":674,"line":791},[672,4775,1921],{"emptyLinePlaceholder":1286},[672,4777,4778],{"class":674,"line":1421},[672,4779,2618],{"class":1906},[672,4781,4782,4784,4786,4788,4790,4792,4794],{"class":674,"line":1427},[672,4783,2603],{"class":826},[672,4785,2606],{"class":682},[672,4787,2627],{"class":682},[672,4789,2630],{"class":682},[672,4791,2633],{"class":682},[672,4793,2636],{"class":682},[672,4795,2639],{"class":682},[672,4797,4798],{"class":674,"line":1433},[672,4799,1921],{"emptyLinePlaceholder":1286},[672,4801,4802],{"class":674,"line":1439},[672,4803,4804],{"class":1906},"# Start automatically when the system boots\n",[672,4806,4807,4809,4811,4813],{"class":674,"line":1445},[672,4808,2603],{"class":826},[672,4810,2672],{"class":682},[672,4812,2675],{"class":682},[672,4814,2678],{"class":682},[672,4816,4817],{"class":674,"line":1451},[672,4818,1921],{"emptyLinePlaceholder":1286},[672,4820,4821],{"class":674,"line":1457},[672,4822,2648],{"class":1906},[672,4824,4825,4827],{"class":674,"line":1463},[672,4826,2653],{"class":826},[672,4828,2656],{"class":682},[672,4830,4831],{"class":674,"line":1469},[672,4832,1921],{"emptyLinePlaceholder":1286},[672,4834,4835,4837,4839,4841,4844],{"class":674,"line":1475},[672,4836,2603],{"class":826},[672,4838,2606],{"class":682},[672,4840,2627],{"class":682},[672,4842,4843],{"class":682}," -y",[672,4845,4846],{"class":682}," docker-compose-plugin\n",[672,4848,4849],{"class":674,"line":1481},[672,4850,1921],{"emptyLinePlaceholder":1286},[672,4852,4853],{"class":674,"line":1487},[672,4854,4855],{"class":1906},"# Verify the compose plugin is installed\n",[672,4857,4858,4860,4863],{"class":674,"line":1493},[672,4859,2653],{"class":826},[672,4861,4862],{"class":682}," compose",[672,4864,4865],{"class":682}," version\n",[544,4867,4869],{"id":4868},"_3-克隆倉庫並進行配置","3. 克隆倉庫並進行配置",[663,4871,4873],{"className":1897,"code":4872,"language":1899,"meta":668,"style":668},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[503,4874,4875,4886,4890,4897,4907],{"__ignoreMap":668},[672,4876,4877,4880,4883],{"class":674,"line":675},[672,4878,4879],{"class":826},"git",[672,4881,4882],{"class":682}," clone",[672,4884,4885],{"class":682}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[672,4887,4888],{"class":674,"line":696},[672,4889,1921],{"emptyLinePlaceholder":1286},[672,4891,4892,4894],{"class":674,"line":722},[672,4893,1969],{"class":1912},[672,4895,4896],{"class":682}," buzz\u002Fdeploy\u002Fcompose\n",[672,4898,4899,4901,4904],{"class":674,"line":737},[672,4900,1984],{"class":826},[672,4902,4903],{"class":682}," .env.example",[672,4905,4906],{"class":682}," .env\n",[672,4908,4909,4912],{"class":674,"line":750},[672,4910,4911],{"class":826},"nano",[672,4913,4906],{"class":682},[434,4915,4916,4917,4920],{},"編輯 ",[503,4918,4919],{},".env"," 文件：",[497,4922,4923],{},[500,4924,4925],{},[472,4926,4927],{},"域名配置:",[663,4929,4932],{"className":4930,"code":4931,"language":1016},[1014],"BUZZ_DOMAIN=buzz.pafor.me\nRELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\nBUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_MEDIA_BASE_URL=https:\u002F\u002Fbuzz.pafor.me\u002Fmedia\nBUZZ_MEDIA_SERVER_DOMAIN=buzz.pafor.me\nBUZZ_CORS_ORIGINS=https:\u002F\u002Fbuzz.pafor.me\n",[503,4933,4931],{"__ignoreMap":668},[497,4935,4936,4946],{},[500,4937,4938,4941,4942,4945],{},[472,4939,4940],{},"所有者金鑰:"," ",[503,4943,4944],{},"RELAY_OWNER_PUBKEY"," 欄位需要填入您的 64 位 16 進位公鑰。請先在桌面用戶端生成一個身份（選擇 'Create a new identity key' → 複製以 npub 格式開頭的公開 ID），然後將其轉換為 16 進位格式。",[500,4947,4948,4951],{},[472,4949,4950],{},"金鑰安全（Secrets）:",[497,4952,4953,4963,4977],{},[500,4954,4955,4956,4958,4959,4962],{},"使用該 ",[451,4957,2688],{"href":2687}," 或運行命令 ",[503,4960,4961],{},"openssl rand -hex 32","（運行 7 次）來生成高強度的隨機金鑰。",[500,4964,4965,4966,4969,4970,2160,4973,4976],{},"將所有的 ",[503,4967,4968],{},"CHANGE_ME"," 佔位符替換掉：包括 ",[503,4971,4972],{},"BUZZ_RELAY_PRIVATE_KEY",[503,4974,4975],{},"BUZZ_GIT_HOOK_HMAC_SECRET","、Postgres\u002FRedis\u002FTypesense 的密碼以及 S3 的 Access\u002FSecret Key。",[500,4978,4979,4980,4983],{},"未替換的佔位符是導致容器陷入無限重啟循環的最常見原因；請通過命令 ",[503,4981,4982],{},"grep CHANGE_ME .env"," 來核對並排除隱患。",[663,4985,4988],{"className":4986,"code":4987,"language":1016},[1014],"    BUZZ_RELAY_PRIVATE_KEY=CHANGE_ME_64_HEX_PRIVATE_KEY\n    BUZZ_GIT_HOOK_HMAC_SECRET=CHANGE_ME_RANDOM_64_HEX\n    POSTGRES_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    REDIS_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    TYPESENSE_API_KEY=CHANGE_ME_RANDOM_API_KEY\n    BUZZ_S3_ACCESS_KEY=CHANGE_ME_RANDOM_ACCESS_KEY\n    BUZZ_S3_SECRET_KEY=CHANGE_ME_RANDOM_SECRET_KEY\n",[503,4989,4987],{"__ignoreMap":668},[497,4991,4992],{},[500,4993,4994,4997],{},[472,4995,4996],{},"其他配置項:",[497,4998,4999,5006],{},[500,5000,5001,5002,5005],{},"將環境變數 ",[503,5003,5004],{},"CLOUDFLARE_API_TOKEN"," 添加到您的配置中，並賦予先前生成的 API 權杖值。Caddy 將用其自動申請憑證。",[500,5007,5008,5009,5011,5012,1692,5015,5018],{},"Buzz 的預設配置非常開放，任何知道您中繼器地址的人都可以驗證並加入。為了安全起見，請務必配置 ",[503,5010,4944],{},"，並將 ",[503,5013,5014],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[503,5016,5017],{},"BUZZ_REQUIRE_AUTH_TOKEN=true"," 設為啟用狀態。",[544,5020,5022],{"id":5021},"_4-使用-caddy-開啟-https-訪問","4. 使用 Caddy 開啟 HTTPS 訪問",[1107,5024,5026],{"id":5025},"構建集成-cloudflare-dns-模組的自定義-caddy-鏡像","構建集成 Cloudflare DNS 模組的自定義 Caddy 鏡像",[497,5028,5029,5040,5043],{},[500,5030,5031,5032,5035,5036,5039],{},"我們在 Caddy 中配置基於 Cloudflare 的 DNS-01 挑戰（Challenge）。DNS-01 驗證的原理是讓 Caddy 外掛程式向您的",[472,5033,5034],{},"公網 DNS"," 寫入一條 TXT 挑戰記錄 ",[503,5037,5038],{},"_acme-challenge.buzz.pafor.me","；",[500,5041,5042],{},"隨後 Let's Encrypt 從公共網際網路查詢該記錄，以確權您的域名。這意味著您的域名必須是 Cloudflare 帳戶中的公網解析區域，而不能只是 Zero Trust \u002F WARP 區域網路 DNS 內的私有域名。如果您的域名只在私網下分发解析而沒有公網節點，DNS-01 將會失敗，需要改用其他驗證方式。",[500,5044,5045],{},"將以下配置加入到 Caddyfile 中：",[663,5047,5051],{"className":5048,"code":5049,"language":5050,"meta":668,"style":668},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n","yml",[503,5052,5053,5057,5070],{"__ignoreMap":668},[672,5054,5055],{"class":674,"line":675},[672,5056,693],{"class":678},[672,5058,5059,5062,5065,5068],{"class":674,"line":696},[672,5060,5061],{"class":682},"  acme_dns cloudflare",[672,5063,5064],{"class":678}," {",[672,5066,5067],{"class":682},"env.CLOUDFLARE_API_TOKEN",[672,5069,2906],{"class":678},[672,5071,5072],{"class":674,"line":722},[672,5073,2906],{"class":678},[497,5075,5076],{},[500,5077,5078,5079,5082,5083,5086],{},"創建一個 ",[503,5080,5081],{},"Dockerfile.caddy","，其内容如下，這是 ",[503,5084,5085],{},"compose.caddy.yml"," 運行所必需的：",[663,5088,5090],{"className":5048,"code":5089,"language":5050,"meta":668,"style":668},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[503,5091,5092,5097,5101,5106,5111,5115,5120,5124],{"__ignoreMap":668},[672,5093,5094],{"class":674,"line":675},[672,5095,5096],{"class":682},"FROM caddy:2-builder AS builder\n",[672,5098,5099],{"class":674,"line":696},[672,5100,1921],{"emptyLinePlaceholder":1286},[672,5102,5103],{"class":674,"line":722},[672,5104,5105],{"class":682},"RUN xcaddy build \\\n",[672,5107,5108],{"class":674,"line":737},[672,5109,5110],{"class":682},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[672,5112,5113],{"class":674,"line":750},[672,5114,1921],{"emptyLinePlaceholder":1286},[672,5116,5117],{"class":674,"line":762},[672,5118,5119],{"class":682},"FROM caddy:2-alpine\n",[672,5121,5122],{"class":674,"line":774},[672,5123,1921],{"emptyLinePlaceholder":1286},[672,5125,5126],{"class":674,"line":785},[672,5127,5128],{"class":682},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[497,5130,5131],{},[500,5132,5133,5134,5136],{},"修改 ",[503,5135,5085],{},"，以使用我們剛生成的帶有 Cloudflare 外掛程式的 Caddy 鏡像，並傳入 API 權杖參數：",[663,5138,5140],{"className":5048,"code":5139,"language":5050,"meta":668,"style":668},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[503,5141,5142,5151,5158,5171,5175,5182,5189,5198,5208,5218,5225,5232,5242,5249,5259,5269,5275,5287,5298,5305,5312,5319,5326,5336,5343,5350,5354,5361,5368,5375,5385,5392,5398],{"__ignoreMap":668},[672,5143,5144,5148],{"class":674,"line":675},[672,5145,5147],{"class":5146},"swJcz","services",[672,5149,5150],{"class":678},":\n",[672,5152,5153,5156],{"class":674,"line":696},[672,5154,5155],{"class":5146},"  relay",[672,5157,5150],{"class":678},[672,5159,5160,5163,5165,5168],{"class":674,"line":722},[672,5161,5162],{"class":5146},"    ports",[672,5164,708],{"class":678},[672,5166,5167],{"class":702}," !reset",[672,5169,5170],{"class":678}," []\n",[672,5172,5173],{"class":674,"line":737},[672,5174,1921],{"emptyLinePlaceholder":1286},[672,5176,5177,5180],{"class":674,"line":750},[672,5178,5179],{"class":5146},"  caddy",[672,5181,5150],{"class":678},[672,5183,5184,5187],{"class":674,"line":762},[672,5185,5186],{"class":5146},"    build",[672,5188,5150],{"class":678},[672,5190,5191,5194,5196],{"class":674,"line":774},[672,5192,5193],{"class":5146},"      context",[672,5195,708],{"class":678},[672,5197,1990],{"class":2708},[672,5199,5200,5203,5205],{"class":674,"line":785},[672,5201,5202],{"class":5146},"      dockerfile",[672,5204,708],{"class":678},[672,5206,5207],{"class":682}," Dockerfile.caddy\n",[672,5209,5210,5213,5215],{"class":674,"line":791},[672,5211,5212],{"class":5146},"    image",[672,5214,708],{"class":678},[672,5216,5217],{"class":682}," buzz-caddy:cloudflare\n",[672,5219,5220,5223],{"class":674,"line":1421},[672,5221,5222],{"class":5146},"    depends_on",[672,5224,5150],{"class":678},[672,5226,5227,5230],{"class":674,"line":1427},[672,5228,5229],{"class":5146},"      relay",[672,5231,5150],{"class":678},[672,5233,5234,5237,5239],{"class":674,"line":1433},[672,5235,5236],{"class":5146},"        condition",[672,5238,708],{"class":678},[672,5240,5241],{"class":682}," service_healthy\n",[672,5243,5244,5247],{"class":674,"line":1439},[672,5245,5246],{"class":5146},"    environment",[672,5248,5150],{"class":678},[672,5250,5251,5254,5256],{"class":674,"line":1445},[672,5252,5253],{"class":5146},"      BUZZ_DOMAIN",[672,5255,708],{"class":678},[672,5257,5258],{"class":682}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[672,5260,5261,5264,5266],{"class":674,"line":1451},[672,5262,5263],{"class":5146},"      CLOUDFLARE_API_TOKEN",[672,5265,708],{"class":678},[672,5267,5268],{"class":682}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[672,5270,5271,5273],{"class":674,"line":1457},[672,5272,5162],{"class":5146},[672,5274,5150],{"class":678},[672,5276,5277,5280,5282,5285],{"class":674,"line":1463},[672,5278,5279],{"class":678},"      -",[672,5281,711],{"class":678},[672,5283,5284],{"class":682},"${CADDY_HTTP_PORT:-80}:80",[672,5286,782],{"class":678},[672,5288,5289,5291,5293,5296],{"class":674,"line":1469},[672,5290,5279],{"class":678},[672,5292,711],{"class":678},[672,5294,5295],{"class":682},"${CADDY_HTTPS_PORT:-443}:443",[672,5297,782],{"class":678},[672,5299,5300,5303],{"class":674,"line":1475},[672,5301,5302],{"class":5146},"    volumes",[672,5304,5150],{"class":678},[672,5306,5307,5309],{"class":674,"line":1481},[672,5308,5279],{"class":678},[672,5310,5311],{"class":682}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[672,5313,5314,5316],{"class":674,"line":1487},[672,5315,5279],{"class":678},[672,5317,5318],{"class":682}," buzz-caddy-data:\u002Fdata\n",[672,5320,5321,5323],{"class":674,"line":1493},[672,5322,5279],{"class":678},[672,5324,5325],{"class":682}," buzz-caddy-config:\u002Fconfig\n",[672,5327,5328,5331,5333],{"class":674,"line":1499},[672,5329,5330],{"class":5146},"    restart",[672,5332,708],{"class":678},[672,5334,5335],{"class":682}," unless-stopped\n",[672,5337,5338,5341],{"class":674,"line":1505},[672,5339,5340],{"class":5146},"    networks",[672,5342,5150],{"class":678},[672,5344,5345,5347],{"class":674,"line":1511},[672,5346,5279],{"class":678},[672,5348,5349],{"class":682}," buzz-net\n",[672,5351,5352],{"class":674,"line":1517},[672,5353,1921],{"emptyLinePlaceholder":1286},[672,5355,5356,5359],{"class":674,"line":1523},[672,5357,5358],{"class":5146},"volumes",[672,5360,5150],{"class":678},[672,5362,5363,5366],{"class":674,"line":1529},[672,5364,5365],{"class":5146},"  buzz-caddy-data",[672,5367,5150],{"class":678},[672,5369,5370,5373],{"class":674,"line":1534},[672,5371,5372],{"class":5146},"    labels",[672,5374,5150],{"class":678},[672,5376,5377,5380,5382],{"class":674,"line":1539},[672,5378,5379],{"class":5146},"      com.buzz.volume",[672,5381,708],{"class":678},[672,5383,5384],{"class":682}," caddy-data\n",[672,5386,5387,5390],{"class":674,"line":1545},[672,5388,5389],{"class":5146},"  buzz-caddy-config",[672,5391,5150],{"class":678},[672,5393,5394,5396],{"class":674,"line":1550},[672,5395,5372],{"class":5146},[672,5397,5150],{"class":678},[672,5399,5400,5402,5404],{"class":674,"line":1556},[672,5401,5379],{"class":5146},[672,5403,708],{"class":678},[672,5405,5406],{"class":682}," caddy-config\n",[1107,5408,5410],{"id":5409},"啟動-docker-容器組合","啟動 Docker 容器組合",[663,5412,5414],{"className":1897,"code":5413,"language":1899,"meta":668,"style":668},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[503,5415,5416,5439,5443,5448],{"__ignoreMap":668},[672,5417,5418,5420,5422,5425,5428,5430,5433,5436],{"class":674,"line":675},[672,5419,2653],{"class":826},[672,5421,4862],{"class":682},[672,5423,5424],{"class":682}," -f",[672,5426,5427],{"class":682}," compose.yml",[672,5429,5424],{"class":682},[672,5431,5432],{"class":682}," compose.caddy.yml",[672,5434,5435],{"class":682}," up",[672,5437,5438],{"class":682}," -d\n",[672,5440,5441],{"class":674,"line":696},[672,5442,1921],{"emptyLinePlaceholder":1286},[672,5444,5445],{"class":674,"line":722},[672,5446,5447],{"class":1906},"#Check the Docker status\n",[672,5449,5450,5452,5454],{"class":674,"line":737},[672,5451,2653],{"class":826},[672,5453,4862],{"class":682},[672,5455,2854],{"class":682},[565,5457],{"src":5458,"alt":5459,"style":5460},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","終端機視窗顯示通過 docker compose ps 運行的 Buzz 服務容器狀態","max-width: 700px; width: 100%; height: auto;",[434,5462,5463,5464,5467],{},"打開您的網頁瀏覽器並訪問 ",[503,5465,5466],{},"http:\u002F\u002Fbuzz.pafor.me","，驗證中繼服務是否已順利跑起來。",[565,5469],{"src":5470,"alt":5471,"style":5472},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","瀏覽器驗證頁面，顯示自託管 Block's Buzz 中繼伺服器的成功運行響應","max-width: 500px; width: 100%; height: auto;",[544,5474,5476],{"id":5475},"步驟-5建立起首日備份機制","步驟 5：建立起首日備份機制",[663,5478,5480],{"className":1897,"code":5479,"language":1899,"meta":668,"style":668},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[503,5481,5482,5493],{"__ignoreMap":668},[672,5483,5484,5487,5490],{"class":674,"line":675},[672,5485,5486],{"class":826},"mkdir",[672,5488,5489],{"class":682}," -p",[672,5491,5492],{"class":682}," \u002Fbuzz_backups\n",[672,5494,5495,5498],{"class":674,"line":696},[672,5496,5497],{"class":826},"crontab",[672,5499,1916],{"class":682},[434,5501,5502],{},"添加一個每日凌晨自動執行的資料庫快照定時任務（Cron Job）：",[663,5504,5507],{"className":5505,"code":5506,"language":1016},[1014],"0 3 * * * cd \u002Fhome\u002F\u003Cuser>\u002Fbuzz\u002Fdeploy\u002Fcompose && docker compose exec -T postgres pg_dump -U buzz buzz > \u002Fbuzz_backups\u002Fbuzz-$(date +\\%Y\\%m\\%d).sql\n",[503,5508,5506],{"__ignoreMap":668},[434,5510,5511,5512,5514],{},"注意：請將 ",[503,5513,4972],{}," 視為永久不可失配的金鑰。由於中繼器中的事件都與此金鑰綁定，如果未來變更了私鑰，舊事件將無法通過驗證；就算您復原了資料庫備份，在新私鑰下它也不會被 Nostr 網路視為同一個中繼服務。",[429,5516,5518],{"id":5517},"配置-buzz-桌面用戶端與-nostr-加密身份","配置 Buzz 桌面用戶端與 Nostr 加密身份",[434,5520,5521,5522,5526],{},"從 ",[451,5523,5524],{"href":5524,"rel":5525},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[455]," 下載最新版 Buzz 桌面用戶端並運行。依次完善個人資料，直到您來到 “Join or create a community” 介面。",[434,5528,5529],{},[565,5530],{"alt":5531,"src":5532},"Buzz 桌面用戶端簡易設定介面，用於加入或創建社區","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[434,5534,5535],{},"點擊 “Join a community” 並拷貝您的公鑰（Public Key）。",[434,5537,5538],{},[565,5539],{"alt":5540,"src":5541},"Buzz 用戶端介面顯示加入社區前的公鑰數位身份","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[434,5543,553,5544,5547],{},[472,5545,5546],{},"VPS 上","運行以下命令列工具，將您自己添加為該平台的首位會員：",[663,5549,5551],{"className":1897,"code":5550,"language":1899,"meta":668,"style":668},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[503,5552,5553],{"__ignoreMap":668},[672,5554,5555,5557,5559,5561,5564,5567,5570,5573],{"class":674,"line":675},[672,5556,2653],{"class":826},[672,5558,4862],{"class":682},[672,5560,2961],{"class":682},[672,5562,5563],{"class":682}," relay",[672,5565,5566],{"class":682}," buzz-admin",[672,5568,5569],{"class":682}," add-member",[672,5571,5572],{"class":682}," --pubkey",[672,5574,5575],{"class":682}," npub1yourkeyhere\n",[434,5577,5578,5579,5582],{},"在用戶端中填入 ",[503,5580,5581],{},"wss:\u002F\u002Fbuzz.pafor.me"," 作為社區接入 URL，然後點擊 “Next”。",[434,5584,5585],{},[565,5586],{"alt":5587,"src":5588},"在 Buzz 桌面用戶端中輸入自託管社區中繼伺服器的 URL 地址","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[434,5590,5591],{},"起一個帥氣的暱稱，然後點擊 “Next” 按鈕。",[434,5593,5594],{},[565,5595],{"alt":5596,"src":5597},"Buzz 用戶端個人資料配置介面，用於輸入使用者暱稱","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-profile-name-input.webp",[544,5599,5601],{"id":5600},"協作頻道與-ai-智能體","協作頻道與 AI 智能體",[434,5603,5604],{},"頻道是圍繞特定任務或專案劃分的群組。為您手頭的每個任務或工程建立獨立的頻道，並將團隊成員與所需的 AI 智能體拉入其中。",[434,5606,5607],{},"頻道內的所有消息、代碼與文件都會被自動分享，免去了逐一向新成員同步前因後果的煩惱。任何人都可以通過「@」來點名激活特定的 AI 智能體，智能體收到召喚後會讀取相關歷史消息並立刻著手處理。更妙的是，不同的 AI 智能體之間也能互相 @ 指派任務。",[434,5609,5610],{},"讓我們試著給預置的智能體發一條私信（DM）",[434,5612,5613],{},[565,5614],{"alt":5615,"src":5616},"在 Buzz 協同桌面用戶端中給 AI 智能體發送私信（DM）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[434,5618,5619],{},"創建一個新頻道并拉幾個 AI 智能體進來吧",[434,5621,5622],{},[565,5623],{"alt":5624,"src":5625},"在 Buzz 桌面用戶端中創建新的任務或專案協作頻道","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[434,5627,5628],{},[565,5629],{"alt":5630,"src":5631},"將團隊成員和 AI 智能體添加至新創建的協作頻道中","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[434,5633,5634],{},[565,5635],{"alt":5636,"src":5637},"活躍協作頻道視圖，展示合併後的聊天歷史和專案任務","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[565,5639],{"src":5640,"alt":5641,"style":5642},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-active-agents.webp","已整合到協同專案頻道中的活躍 AI 智能體列表細節檢視","max-width: 367px; width: 100%; height: auto;",[544,5644,5646],{"id":5645},"激活智能體運行時agent-runtimes","激活智能體運行時（Agent Runtimes）",[434,5648,5649,5650,5653,5654,5657],{},"平台自帶的運行時預設依賴於「自動探測」來查找特定系統目錄（例如 ",[503,5651,5652],{},"~\u002F.local\u002Fbin","）下的執行程序（如 ",[503,5655,5656],{},"hermes-acp","）。如果您的智能體軟體安裝在非標準路徑下，Buzz 將無法正確識別。",[434,5659,5660,5661,5664],{},"以 Kimi Code 為例，它的智能體 ID 為 kimi，Buzz 預設會在 ",[503,5662,5663],{},"~\u002F.local\u002Fbin\u002Fkimi"," 尋找它。通過創建一個軟連結（Symbolic Link）即可輕鬆搞定：",[663,5666,5669],{"className":5667,"code":5668,"language":1016},[1014],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[503,5670,5668],{"__ignoreMap":668},[434,5672,5673],{},"此時，Kimi Code 就會顯示在「Agent runtimes」列表中。",[434,5675,5676],{},[565,5677],{"alt":5678,"src":5679},"Buzz 用戶端設置介面，顯示已配置的 AI 智能體執行期列表（包括 Kimi）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[544,5681,5682],{"id":5682},"專案與代碼倉庫管理",[434,5684,5685,5686,5689],{},"請先在 Settings → Experiments 菜單中激活「",[472,5687,5688],{},"Projects","」實驗性功能：",[434,5691,5692],{},[565,5693],{"alt":5694,"src":5695},"在 Buzz 用戶端設置的 Experiments 標籤頁中激活實驗性 Projects 功能","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[434,5697,5698,5699,5702],{},"目前，一個專案（Project）必須使用 ",[503,5700,5701],{},"buzz-cli"," 命令列工具來創建（雖然在後續版本中會加入 UI 直接創建的支持）。",[1107,5704,5706],{"id":5705},"在-vps-上安裝並部署-buzz-cli","在 VPS 上安裝並部署 buzz-cli",[434,5708,553,5709,5711,5712,5714],{},[472,5710,5546],{},"依次執行以下命令，編譯並安裝好 ",[503,5713,5701],{}," 用戶端：",[663,5716,5718],{"className":1897,"code":5717,"language":1899,"meta":668,"style":668},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[503,5719,5720,5731,5738,5751],{"__ignoreMap":668},[672,5721,5722,5724,5726,5728],{"class":674,"line":675},[672,5723,2603],{"class":826},[672,5725,2606],{"class":682},[672,5727,2627],{"class":682},[672,5729,5730],{"class":682}," cargo\n",[672,5732,5733,5735],{"class":674,"line":696},[672,5734,1969],{"class":1912},[672,5736,5737],{"class":682}," ~\u002Fbuzz\n",[672,5739,5740,5743,5745,5748],{"class":674,"line":722},[672,5741,5742],{"class":826},"cargo",[672,5744,2627],{"class":682},[672,5746,5747],{"class":682}," --path",[672,5749,5750],{"class":682}," crates\u002Fbuzz-cli\n",[672,5752,5753,5755,5758,5761,5763,5766,5769,5772,5775],{"class":674,"line":737},[672,5754,2551],{"class":1912},[672,5756,5757],{"class":678}," '",[672,5759,5760],{"class":682},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[672,5762,2978],{"class":678},[672,5764,5765],{"class":678}," >>",[672,5767,5768],{"class":682}," ~\u002F.bashrc",[672,5770,5771],{"class":678}," &&",[672,5773,5774],{"class":1912}," source",[672,5776,5777],{"class":682}," ~\u002F.bashrc\n",[434,5779,5780,5781,5783,5784,5786],{},"使用線上工具或通過 ",[503,5782,5701],{}," 生成一對 Nostr 加密公私鑰。這組金鑰將代表该 ",[503,5785,5701],{}," 工具在 Nostr 網路中的數位身份。",[663,5788,5790],{"className":1897,"code":5789,"language":1899,"meta":668,"style":668},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[503,5791,5792,5813,5817,5822],{"__ignoreMap":668},[672,5793,5794,5796,5798,5801,5804,5807,5810],{"class":674,"line":675},[672,5795,2653],{"class":826},[672,5797,2727],{"class":682},[672,5799,5800],{"class":682}," --rm",[672,5802,5803],{"class":682}," --entrypoint",[672,5805,5806],{"class":682}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[672,5808,5809],{"class":682}," ghcr.io\u002Fblock\u002Fbuzz:main",[672,5811,5812],{"class":682}," generate-key\n",[672,5814,5815],{"class":674,"line":696},[672,5816,1921],{"emptyLinePlaceholder":1286},[672,5818,5819],{"class":674,"line":722},[672,5820,5821],{"class":1906},"# Use the generated Public Key\n",[672,5823,5824,5826,5828,5830,5832,5834,5836,5838],{"class":674,"line":737},[672,5825,2653],{"class":826},[672,5827,4862],{"class":682},[672,5829,2961],{"class":682},[672,5831,5563],{"class":682},[672,5833,5566],{"class":682},[672,5835,5569],{"class":682},[672,5837,5572],{"class":682},[672,5839,5840],{"class":682}," generated_Public_key\n",[434,5842,5843],{},"配置您的 CLI 變數：",[663,5845,5847],{"className":1897,"code":5846,"language":1899,"meta":668,"style":668},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[503,5848,5849,5854,5884,5888],{"__ignoreMap":668},[672,5850,5851],{"class":674,"line":675},[672,5852,5853],{"class":1906},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[672,5855,5856,5858,5860,5863,5865,5868,5871,5873,5876,5879,5881],{"class":674,"line":696},[672,5857,2551],{"class":1912},[672,5859,5757],{"class":678},[672,5861,5862],{"class":682},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[672,5864,2978],{"class":678},[672,5866,5867],{"class":678},"  >>",[672,5869,5870],{"class":682}," \u002Fhome\u002F",[672,5872,848],{"class":678},[672,5874,5875],{"class":682},"use",[672,5877,5878],{"class":689},"r",[672,5880,857],{"class":678},[672,5882,5883],{"class":682},"\u002F.bashrc\n",[672,5885,5886],{"class":674,"line":722},[672,5887,1921],{"emptyLinePlaceholder":1286},[672,5889,5890,5892,5894,5897,5899,5901,5903,5905,5907,5909,5911],{"class":674,"line":737},[672,5891,2551],{"class":1912},[672,5893,5757],{"class":678},[672,5895,5896],{"class":682},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[672,5898,2978],{"class":678},[672,5900,5867],{"class":678},[672,5902,5870],{"class":682},[672,5904,848],{"class":678},[672,5906,5875],{"class":682},[672,5908,5878],{"class":689},[672,5910,857],{"class":678},[672,5912,5883],{"class":682},[434,5914,5915,5916,5918],{},"運行以下命令來測試 ",[503,5917,5701],{}," 是否已經與您的中繼器配对暢通：",[663,5920,5922],{"className":1897,"code":5921,"language":1899,"meta":668,"style":668},"buzz channels list\n",[503,5923,5924],{"__ignoreMap":668},[672,5925,5926,5929,5932],{"class":674,"line":675},[672,5927,5928],{"class":826},"buzz",[672,5930,5931],{"class":682}," channels",[672,5933,5934],{"class":682}," list\n",[434,5936,5937],{},[565,5938],{"alt":5939,"src":5940},"終端機命令列運行驗證，通過列出活躍頻道來檢查 buzz-cli 配置是否正確","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-cli-channels-list-terminal.webp",[1107,5942,5944],{"id":5943},"使用-buzz-cli-創建全新的專案","使用 buzz-cli 創建全新的專案",[663,5946,5948],{"className":1897,"code":5947,"language":1899,"meta":668,"style":668},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[503,5949,5950,5955],{"__ignoreMap":668},[672,5951,5952],{"class":674,"line":675},[672,5953,5954],{"class":1906},"# --channel refers to the UUID of the channel\n",[672,5956,5957,5959,5962,5965,5968,5971,5974,5976,5979,5981,5984,5986,5989],{"class":674,"line":696},[672,5958,5928],{"class":826},[672,5960,5961],{"class":682}," repos",[672,5963,5964],{"class":682}," create",[672,5966,5967],{"class":682}," --id",[672,5969,5970],{"class":682}," TestKOA",[672,5972,5973],{"class":682}," --name",[672,5975,5757],{"class":678},[672,5977,5978],{"class":682},"Display Name",[672,5980,2978],{"class":678},[672,5982,5983],{"class":682}," --channel",[672,5985,711],{"class":678},[672,5987,5988],{"class":682},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[672,5990,782],{"class":678},[434,5992,5993,5994,5996],{},"專案的所有權極為嚴格，只有創建者才有權將其刪除。由於該「Display Name」專案是由 ",[503,5995,5701],{}," 發起創建的，而目前的命令列版本尚未內置刪除指令，因此該專案無法通過常規方式清空。",[434,5998,5999],{},"再次點開您的桌面用戶端，驗證該專案是否已顯示在工作區中。",[434,6001,6002],{},[565,6003],{"alt":6004,"src":6005},"Buzz 桌面用戶端專案檢視頁面，確認專案已成功創建","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[434,6007,6008],{},"一旦專案列表在介面中開啟，後續您便可以直接通過右上角的 「+」 按鈕隨心所欲地添加更多子專案了。",[434,6010,6011],{},[565,6012],{"alt":6013,"src":6014},"在 Buzz 桌面用戶端中點擊右上角加號按鈕來添加新專案","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-project-button.webp",[1107,6016,6018],{"id":6017},"拉入現有的-git-代碼倉庫","拉入現有的 Git 代碼倉庫",[434,6020,6021,6022,6025,6026,6029,6030,6035],{},"在您的本地開發機器上安裝 ",[503,6023,6024],{},"git-credential-nostr"," 憑證輔助工具。這需要您的系統已安裝 ",[472,6027,6028],{},"Git 2.46+"," 版本並配有 Rust 構建環境。詳情可參考此專案的 ",[451,6031,6034],{"href":6032,"rel":6033},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[455],"Readme"," 描述：",[663,6037,6039],{"className":1897,"code":6038,"language":1899,"meta":668,"style":668},"cargo install --path crates\u002Fgit-credential-nostr\n",[503,6040,6041],{"__ignoreMap":668},[672,6042,6043,6045,6047,6049],{"class":674,"line":675},[672,6044,5742],{"class":826},[672,6046,2627],{"class":682},[672,6048,5747],{"class":682},[672,6050,6051],{"class":682}," crates\u002Fgit-credential-nostr\n",[434,6053,6054,6055,6057],{},"對 ",[503,6056,6024],{}," 進行配置，使其獲得 Buzz 中繼器的授權權限：",[663,6059,6061],{"className":1897,"code":6060,"language":1899,"meta":668,"style":668},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[503,6062,6063,6068,6084,6097,6101,6106,6115,6142],{"__ignoreMap":668},[672,6064,6065],{"class":674,"line":675},[672,6066,6067],{"class":1906},"# 1. Register the helper and enable per-path credentials.\n",[672,6069,6070,6072,6075,6078,6081],{"class":674,"line":696},[672,6071,4879],{"class":826},[672,6073,6074],{"class":682}," config",[672,6076,6077],{"class":682}," --global",[672,6079,6080],{"class":682}," credential.helper",[672,6082,6083],{"class":682}," nostr\n",[672,6085,6086,6088,6090,6092,6095],{"class":674,"line":722},[672,6087,4879],{"class":826},[672,6089,6074],{"class":682},[672,6091,6077],{"class":682},[672,6093,6094],{"class":682}," credential.useHttpPath",[672,6096,959],{"class":678},[672,6098,6099],{"class":674,"line":737},[672,6100,1921],{"emptyLinePlaceholder":1286},[672,6102,6103],{"class":674,"line":750},[672,6104,6105],{"class":1906},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[672,6107,6108,6110,6112],{"class":674,"line":762},[672,6109,5486],{"class":826},[672,6111,5489],{"class":682},[672,6113,6114],{"class":682}," ~\u002F.nostr\n",[672,6116,6117,6119,6121,6124,6126,6128,6131,6133,6136,6139],{"class":674,"line":774},[672,6118,2551],{"class":1912},[672,6120,711],{"class":678},[672,6122,6123],{"class":682},"nsec1...",[672,6125,686],{"class":678},[672,6127,2586],{"class":678},[672,6129,6130],{"class":682}," ~\u002F.nostr\u002Fkey",[672,6132,5771],{"class":678},[672,6134,6135],{"class":826}," chmod",[672,6137,6138],{"class":2708}," 600",[672,6140,6141],{"class":682}," ~\u002F.nostr\u002Fkey\n",[672,6143,6144,6146,6148,6150,6153],{"class":674,"line":785},[672,6145,4879],{"class":826},[672,6147,6074],{"class":682},[672,6149,6077],{"class":682},[672,6151,6152],{"class":682}," nostr.keyfile",[672,6154,6141],{"class":682},[434,6156,6157],{},"在 Buzz 中繼上開闢出該 Git 庫的儲存節點：",[663,6159,6162],{"className":6160,"code":6161,"language":1016},[1014],"buzz repos create --id koa-email-routing --name \"KOA Email Routing\" --clone \"https:\u002F\u002Fbuzz.pafor.me\u002Fgit\u002F\u003Cpub_key>\u002Fkoa-email-routing\" --nostr-relay \"wss:\u002F\u002Fbuzz.pafor.me\"\n",[503,6163,6161],{"__ignoreMap":668},[434,6165,6166,6167,6170,6171,6174],{},"在第一次執行 ",[503,6168,6169],{},"git push"," 時，您可能會被攔截並報錯 ",[503,6172,6173],{},"remote: missing Authorization header","。這是由於 Git 寫入控制（ACL）是由頻道成員資格決定的，您必須先將該倉庫 ID 與一個具體的 Buzz 頻道進行綁定，從而授權合規寫入：",[663,6176,6178],{"className":1897,"code":6177,"language":1899,"meta":668,"style":668},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[503,6179,6180,6208,6212,6217],{"__ignoreMap":668},[672,6181,6182,6184,6186,6189,6191,6194,6196,6199,6202,6205],{"class":674,"line":675},[672,6183,5928],{"class":826},[672,6185,5961],{"class":682},[672,6187,6188],{"class":682}," bind",[672,6190,5967],{"class":682},[672,6192,6193],{"class":682}," koa-email-routing",[672,6195,5983],{"class":682},[672,6197,6198],{"class":678}," \u003C",[672,6200,6201],{"class":682},"CHANNEL_UUI",[672,6203,6204],{"class":689},"D",[672,6206,6207],{"class":678},">\n",[672,6209,6210],{"class":674,"line":696},[672,6211,1921],{"emptyLinePlaceholder":1286},[672,6213,6214],{"class":674,"line":722},[672,6215,6216],{"class":1906},"# push the code again\n",[672,6218,6219,6221],{"class":674,"line":737},[672,6220,4879],{"class":826},[672,6222,6223],{"class":682}," push\n",[434,6225,6226,6227,6229],{},"在某些情況下，在 Buzz 桌面版中查閱專案進度時會遇到類似下方的 Git 模組拉取失敗提示。這是由於該桌面應用要求系統必須搭載 ",[472,6228,6028],{}," 版本，而應用直接啟動時可能預設尋址到了系統中的舊版 Git 引擎：",[434,6231,6232],{},[565,6233],{"alt":6234,"src":6235},"Buzz 用戶端展示由於本地 Git 版本低於 2.46 導致的 Git 庫載入失敗報錯介面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[434,6237,6238,6239,6242,6243,6248],{},"請在您的 shell 設定檔中通過執行 ",[503,6240,6241],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\""," 聲明新版 Git 所在的 PATH，並直接在終端中拉起 Buzz 應用。對此可參考該 ",[451,6244,6247],{"href":6245,"rel":6246},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[455],"Issue"," 的詳細排查記錄。",[663,6250,6252],{"className":1897,"code":6251,"language":1899,"meta":668,"style":668},"open -a Buzz\n",[503,6253,6254],{"__ignoreMap":668},[672,6255,6256,6259,6262],{"class":674,"line":675},[672,6257,6258],{"class":826},"open",[672,6260,6261],{"class":682}," -a",[672,6263,6264],{"class":682}," Buzz\n",[434,6266,6267],{},"重新進入用戶端中的 Projects 標籤頁，您會驚喜地發現代碼庫的所有提交與詳情已經完美載入出來了。",[434,6269,6270],{},[565,6271],{"alt":6272,"src":6273},"代碼庫提交詳情成功載入後的 Buzz 桌面用戶端專案面板","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-repository-details-loaded.webp",[429,6275,6277],{"id":6276},"利用二維碼將-ai-助手同步至手機端-buzz-app","利用二維碼將 AI 助手同步至手機端 Buzz App",[434,6279,6280,6281,6284],{},"Buzz 手機端的「掃碼配對」只認 HTTPS 協定，且 VPS 上的中繼服務預設並不會在背景運行 ",[503,6282,6283],{},"buzz-pair-relay"," 組件。",[663,6286,6288],{"className":1897,"code":6287,"language":1899,"meta":668,"style":668},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[503,6289,6290,6296],{"__ignoreMap":668},[672,6291,6292,6294],{"class":674,"line":675},[672,6293,1969],{"class":1912},[672,6295,5737],{"class":682},[672,6297,6298,6300,6302,6304],{"class":674,"line":696},[672,6299,5742],{"class":826},[672,6301,2627],{"class":682},[672,6303,5747],{"class":682},[672,6305,6306],{"class":682}," crates\u002Fbuzz-pair-relay\n",[434,6308,6309,6310,6313,6314,6316],{},"將以下配置注入到您的 ",[503,6311,6312],{},"compose.yml"," 文件中，聲明並啟動 ",[503,6315,6283],{}," 容器進程：",[663,6318,6320],{"className":5048,"code":6319,"language":5050,"meta":668,"style":668},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[503,6321,6322,6329,6338,6358,6364,6374,6380,6391,6399,6405],{"__ignoreMap":668},[672,6323,6324,6327],{"class":674,"line":675},[672,6325,6326],{"class":5146},"  pair",[672,6328,5150],{"class":678},[672,6330,6331,6333,6335],{"class":674,"line":696},[672,6332,5212],{"class":5146},[672,6334,708],{"class":678},[672,6336,6337],{"class":682}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[672,6339,6340,6343,6345,6348,6350,6353,6355],{"class":674,"line":722},[672,6341,6342],{"class":5146},"    entrypoint",[672,6344,708],{"class":678},[672,6346,6347],{"class":678}," [",[672,6349,686],{"class":678},[672,6351,6352],{"class":682},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[672,6354,686],{"class":678},[672,6356,6357],{"class":678},"]\n",[672,6359,6360,6362],{"class":674,"line":737},[672,6361,5246],{"class":5146},[672,6363,5150],{"class":678},[672,6365,6366,6369,6371],{"class":674,"line":750},[672,6367,6368],{"class":5146},"      BUZZ_PAIR_RELAY_BIND_ADDR",[672,6370,708],{"class":678},[672,6372,6373],{"class":682}," 0.0.0.0:5000\n",[672,6375,6376,6378],{"class":674,"line":762},[672,6377,5162],{"class":5146},[672,6379,5150],{"class":678},[672,6381,6382,6384,6386,6389],{"class":674,"line":774},[672,6383,5279],{"class":678},[672,6385,711],{"class":678},[672,6387,6388],{"class":682},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[672,6390,782],{"class":678},[672,6392,6393,6395,6397],{"class":674,"line":785},[672,6394,5330],{"class":5146},[672,6396,708],{"class":678},[672,6398,5335],{"class":682},[672,6400,6401,6403],{"class":674,"line":791},[672,6402,5340],{"class":5146},[672,6404,5150],{"class":678},[672,6406,6407,6410,6413],{"class":674,"line":1421},[672,6408,6409],{"class":678},"      [",[672,6411,6412],{"class":682},"buzz-net",[672,6414,6357],{"class":678},[434,6416,6417,6418,6420,6421,6424],{},"在您的 ",[503,6419,4919],{}," 中聲明 ",[503,6422,6423],{},"BUZZ_PAIRING_RELAY_URL"," 及其專用的運行埠號：",[663,6426,6429],{"className":6427,"code":6428,"language":1016},[1014],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[503,6430,6428],{"__ignoreMap":668},[434,6432,6433,6434,6437],{},"點擊桌面端應用中的 Settings, 進入 「",[472,6435,6436],{},"Mobile","」 配對項：",[434,6439,6440],{},[565,6441],{"alt":6442,"src":6443},"Buzz 桌面用戶端設置中展示的 Mobile 行動端配對配置標籤頁","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[434,6445,6446],{},"點擊 “Start pairing” —— 介面會生成專屬的綁定二維碼；打開手機端 App 掃一掃，接著在桌面端點擊 “Code Match” 確認無誤，雙端便立即完成信任綁定。",[434,6448,6449],{},[565,6450],{"alt":6451,"src":6452},"在桌面用戶端中生成安全的配對二維碼，用於同步 Buzz 手機端 App","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[434,6454,6455],{},"注意：手機端应用中的智能體之所以能隨叫隨到，是基於您的桌面端應用在背景持續維繫運行。只有保障桌面機處於線上狀態，手機端派發的智能體指令才能被順利分發與執行。",[434,6457,6458],{},[565,6459],{"alt":6460,"src":6461},"在手機端 Buzz App 中成功載入同步後的活躍 AI 智能體列表","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[429,6463,4306],{"id":4306},[434,6465,6466],{},"不可否認，作為一個還處於發展初期的技術方案，Buzz 在面對大規模生產環境時依然稍顯稚嫩，伴隨著一些偶發的系統 Bug 與介面互動上的限制。但對於小型團隊或單兵作戰的獨立開發者而言，這無疑是一場令人血脈偾張的前沿探索。它為我们揭開了一幅波瀾壯闊的人機無縫協奏畫卷，讓我們提前觸碰到了「AI 智能體成為工作夥伴」的未來工作模式。",[429,6468,6469],{"id":6469},"參考資源",[497,6471,6472,6479,6486,6493],{},[500,6473,6474],{},[451,6475,6478],{"href":6476,"rel":6477},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[455],"Buzz releases",[500,6480,6481],{},[451,6482,6485],{"href":6483,"rel":6484},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[455],"Introducing Buzz",[500,6487,6488],{},[451,6489,6492],{"href":6490,"rel":6491},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[455],"What is buzz",[500,6494,6495],{},[451,6496,6499],{"href":6497,"rel":6498},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[455],"How to self-host Buzz (Miget)",[1257,6501,6502],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":668,"searchDepth":696,"depth":722,"links":6504},[6505,6506,6507,6521,6530,6531,6532],{"id":4435,"depth":696,"text":4436},{"id":4480,"depth":696,"text":4481},{"id":4528,"depth":696,"text":4529,"children":6508},[6509,6510,6514,6515,6516,6520],{"id":4532,"depth":722,"text":4533},{"id":4561,"depth":722,"text":4562,"children":6511},[6512,6513],{"id":4565,"depth":737,"text":4566},{"id":4663,"depth":737,"text":4664},{"id":4682,"depth":722,"text":4683},{"id":4868,"depth":722,"text":4869},{"id":5021,"depth":722,"text":5022,"children":6517},[6518,6519],{"id":5025,"depth":737,"text":5026},{"id":5409,"depth":737,"text":5410},{"id":5475,"depth":722,"text":5476},{"id":5517,"depth":696,"text":5518,"children":6522},[6523,6524,6525],{"id":5600,"depth":722,"text":5601},{"id":5645,"depth":722,"text":5646},{"id":5682,"depth":722,"text":5682,"children":6526},[6527,6528,6529],{"id":5705,"depth":737,"text":5706},{"id":5943,"depth":737,"text":5944},{"id":6017,"depth":737,"text":6018},{"id":6276,"depth":696,"text":6277},{"id":4306,"depth":696,"text":4306},{"id":6469,"depth":696,"text":6469},[6534,1280,5928],"collaboration","2026-09-08","本教學將手把手帶您在 Ubuntu VPS 上部署自託管的 Block 旗下 Nostr 中繼 Buzz，並配置 Cloudflare DNS 安全網路。我們將幫助您搭建起一個安全性的共享工作空間，讓您的團隊成員與多個 AI 智能體（如 Claude、Kimi）能夠基於加密身份進行高效溝通、共享專案上下文並實現無縫協作。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FTW-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","一張高顏值的 16:9 科技質感卡片，具有深藍色 and 橙色色調，插圖展示如何在 Ubuntu VPS 上部署自託管的 Block 旗下 Buzz 協作中繼伺服器，其中包含一個帶有置中文字的毛玻璃微動質感面板。",{"schemaOrg":6540,"robots":1292,"sitemap":6560},[6541,6542],{"@type":1290,"headline":4415,"description":6536,"image":6537},{"@type":1860,"name":4415,"description":6536,"image":6537,"step":6543},[6544,6548,6551,6554,6557],{"@type":6545,"name":6546,"text":6547},"HowToStep","階段 1：Cloudflare 設置","創建 Cloudflare API 權杖並配置 DNS 解析設置。",{"@type":6545,"name":6549,"text":6550},"階段 2：安裝 Docker","在 Ubuntu VPS 上設置並安裝 Docker 容器引擎。",{"@type":6545,"name":6552,"text":6553},"階段 3：克隆與配置","克隆倉庫代碼並配置 docker-compose 環境變數。",{"@type":6545,"name":6555,"text":6556},"階段 4：整合 Caddy","編譯帶有 Cloudflare DNS 挑戰模組的的自訂 Caddy 鏡像。",{"@type":6545,"name":6558,"text":6559},"階段 5：自動備份","配置 cron 定時任務以實現 PostgreSQL 資料庫的自動備份。",{"lastmod":4411},{"title":6562,"description":6536,"ogTitle":4415,"ogDescription":6536,"twitterTitle":4415,"twitterDescription":6536},"如何在 Ubuntu VPS 上自建 Block 旗下的 Buzz 協作中繼伺服器","tw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[6565,4408,4431,4410,1298],"Nostr","IBYHxp-6BbUZwuDc9Hxf1yMQj3uMpBUTAm2W1CTRUic",{"id":1870,"title":1871,"author":668,"body":1872,"category":2459,"date":2460,"description":2461,"extension":1283,"image":2462,"imageAlt":2463,"isPublished":1286,"meta":2464,"minRead":696,"navigation":1286,"path":367,"seo":2468,"stem":2470,"tags":2471,"updatedAt":424,"__hash__":2475},1792490003953]