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