[{"data":1,"prerenderedAt":5985},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts":421,"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts-surround":1061},[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":1038,"date":1040,"description":1041,"extension":1042,"image":1043,"imageAlt":1044,"isPublished":487,"meta":1045,"minRead":536,"navigation":487,"path":221,"seo":1051,"stem":1053,"tags":1054,"updatedAt":1059,"__hash__":1060},"article\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md","Como habilidades de agentes de IA substituem scripts Nuxt","",{"type":426,"value":427,"toc":1031},"minimark",[428,446,451,454,579,582,612,619,623,639,656,660,672,840,844,932,936,945,966,974,989,1001,1004,1010,1013,1019,1027],[429,430,431,432,436,437,440,441,445],"p",{},"Quando iniciamos uma nova aplicação usando o framework Nuxt, temos que passar por etapas tediosas como instalar módulos e configurar arquivos como ",[433,434,435],"code",{},"nuxt.config.ts"," e ",[433,438,439],{},"wrangler.jsonc",". Um script pode resolver esse problema, mas ele atinge seus limites à medida que as variações aumentam. É por isso que exploramos e substituímos os scripts por uma ",[442,443,444],"strong",{},"habilidade de agente"," (agent skill).",[447,448,450],"h2",{"id":449},"no-que-os-scripts-de-shell-tradicionais-são-bons","No que os scripts de shell tradicionais são bons",[429,452,453],{},"Um script é excelente para executar um conjunto fixo de instruções em sequência com decisões predefinidas no próprio código.",[455,456,460],"pre",{"className":457,"code":458,"language":459,"meta":424,"style":424},"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",[433,461,462,471,482,489,534,539,552,557,569],{"__ignoreMap":424},[463,464,467],"span",{"class":465,"line":466},"line",1,[463,468,470],{"class":469},"sHwdD","#!\u002Fusr\u002Fbin\u002Fenv bash\n",[463,472,474,478],{"class":465,"line":473},2,[463,475,477],{"class":476},"s2Zo4","set",[463,479,481],{"class":480},"sfazB"," -e\n",[463,483,485],{"class":465,"line":484},3,[463,486,488],{"emptyLinePlaceholder":487},true,"\n",[463,490,492,496,499,502,506,510,513,516,519,522,525,528,531],{"class":465,"line":491},4,[463,493,495],{"class":494},"sBMFI","npx",[463,497,498],{"class":480}," nuxi@latest",[463,500,501],{"class":480}," init",[463,503,505],{"class":504},"sMK4o"," \"",[463,507,509],{"class":508},"sHdIc","$1",[463,511,512],{"class":504},"\"",[463,514,515],{"class":480}," --template",[463,517,518],{"class":480}," minimal",[463,520,521],{"class":480}," --packageManager",[463,523,524],{"class":480}," pnpm",[463,526,527],{"class":480}," --no-gitInit",[463,529,530],{"class":480}," -M",[463,532,533],{"class":480}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[463,535,537],{"class":465,"line":536},5,[463,538,488],{"emptyLinePlaceholder":487},[463,540,542,545,547,549],{"class":465,"line":541},6,[463,543,544],{"class":476},"cd",[463,546,505],{"class":504},[463,548,509],{"class":508},[463,550,551],{"class":504},"\"\n",[463,553,555],{"class":465,"line":554},7,[463,556,488],{"emptyLinePlaceholder":487},[463,558,560,563,566],{"class":465,"line":559},8,[463,561,562],{"class":494},"cp",[463,564,565],{"class":480}," ~\u002Ftemplates\u002Fnuxt.config.ts",[463,567,568],{"class":480}," .\n",[463,570,572,574,577],{"class":465,"line":571},9,[463,573,562],{"class":494},[463,575,576],{"class":480}," ~\u002Ftemplates\u002Fwrangler.jsonc",[463,578,568],{"class":480},[429,580,581],{},"Este script funciona até que aconteça o seguinte:",[583,584,585,592,602],"ul",{},[586,587,588,591],"li",{},[442,589,590],{},"Valores padrão fixos."," O script traz o módulo Nuxt UI fixado no código; e se quisermos usar o módulo Ant Design UI? Cada nova opção de módulo exige um novo argumento fornecido pelo usuário.",[586,593,594,597,598,601],{},[442,595,596],{},"Não consegue ler a intenção do usuário."," \"Crie um blog\" precisa do ",[433,599,600],{},"@nuxt\u002Fcontent","; \"crie um site com newsletters\" precisa do Cloudflare D1 + Drizzle. Um script não consegue distinguir a diferença — cada variação exige um novo script.",[586,603,604,607,608,611],{},[442,605,606],{},"Fica desatualizado silenciosamente."," As convenções do Nuxt mudam entre versões principais. O Nuxt 4 mudou o diretório de origem para ",[433,609,610],{},"app\u002F",". Um script escrito para o Nuxt 3 criará o scaffolding da estrutura errada sem nunca alertar o usuário.",[429,613,614,615,618],{},"A ",[442,616,617],{},"inicialização do projeto"," (app scaffolding) é um problema de decisão, não de execução. O script não escalará quando o número de decisões aumentar.",[447,620,622],{"id":621},"por-que-usar-uma-habilidade-de-agente-de-ia-em-vez-de-scripts-tradicionais","Por que usar uma habilidade de agente de IA em vez de scripts tradicionais?",[429,624,625,626,629,630,633,634,638],{},"Uma habilidade de agente (agent skill) não é um bloco de código que simplesmente executa, mas um ",[442,627,628],{},"conjunto de conhecimentos que o agente de IA segue",". Ela contém um arquivo ",[433,631,632],{},"SKILL.md"," e pode agrupar quaisquer outros arquivos que a tarefa exigir (como documentos de referência, modelos e scripts executáveis). O artigo ",[635,636,637],"a",{"href":351},"Habilidades de agentes de IA: o que são e como criá-las"," explica o funcionamento de uma habilidade de agente. Uma habilidade mantém a diligência de um script ao mesmo tempo que adiciona o julgamento razoável que falta ao script:",[583,640,641,644,647,650,653],{},[586,642,643],{},"Deduz a intenção do usuário para determinar se o aplicativo precisa de um banco de dados.",[586,645,646],{},"Decide quais módulos opcionais são necessários a partir da lista especificada. Por exemplo, Nuxt Content, i18n e analytics são opcionais de acordo com a solicitação do usuário.",[586,648,649],{},"Adapta-se ao ecossistema atual usando o framework Nuxt mais recente, o NuxtHub para integrações com o Cloudflare e o Wrangler para o deployment.",[586,651,652],{},"Recupera-se quando uma etapa falha.",[586,654,655],{},"Valida o projeto por meio de um checklist final antes de entregá-lo.",[447,657,659],{"id":658},"por-trás-dos-bastidores-da-nossa-habilidade-de-scaffolding-do-nuxt-e-cloudflare","Por trás dos bastidores da nossa habilidade de scaffolding do Nuxt e Cloudflare",[429,661,662,663,671],{},"A habilidade, ",[635,664,668],{"href":665,"rel":666},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[667],"nofollow",[433,669,670],{},"scaffold-nuxt-cloudflare-app-skill",", guia você por um scaffolding voltado para produção:",[673,674,675,707,729,755,785,820,826],"ol",{},[586,676,677,680,681],{},[442,678,679],{},"Esclarece qualquer detalhe"," que não possa ser deduzido:\n",[583,682,683,694,697],{},[586,684,685,686,689,690,693],{},"O kit de UI (",[442,687,688],{},"Nuxt UI"," por padrão ou ",[442,691,692],{},"Antdv Next",");",[586,695,696],{},"Se um banco de dados é necessário (como Cloudflare D1);",[586,698,699,700,703,704,706],{},"Módulos extras como ",[433,701,702],{},"@nuxtjs\u002Fi18n"," ou ",[433,705,600],{}," para recursos de CMS.",[586,708,709,712,713,716,717,720,721,724,725,728],{},[442,710,711],{},"Inicializa o aplicativo base"," com ",[433,714,715],{},"pnpm dlx nuxi@latest init"," para obter a versão mais recente do framework Nuxt com o ",[433,718,719],{},"pnpm"," como gerenciador de pacotes. Em seguida, configura listas de permissões para compilações nativas de modo que o ambiente de compilação do Cloudflare possa compilar ",[433,722,723],{},"better-sqlite3","\u002F",[433,726,727],{},"sharp",".",[586,730,731,734,735,703,738,741,742,741,745,741,748,741,751,754],{},[442,732,733],{},"Instala os módulos a partir de uma tabela de decisão",": ",[433,736,737],{},"@nuxt\u002Fui",[433,739,740],{},"@antdv-next\u002Fnuxt",", ",[433,743,744],{},"@nuxt\u002Fimage",[433,746,747],{},"@nuxtjs\u002Fseo",[433,749,750],{},"@nuxthub\u002Fcore",[433,752,753],{},"@vueuse\u002Fnuxt",", além de Drizzle\u002FD1, Nuxt Content e i18n apenas se forem selecionados.",[586,756,757,760,761],{},[442,758,759],{},"Organiza a estrutura de diretórios",":\n",[583,762,763,767,772,777,782],{},[586,764,765],{},[433,766,610],{},[586,768,769],{},[433,770,771],{},"server\u002F",[586,773,774],{},[433,775,776],{},"shared\u002F",[586,778,779],{},[433,780,781],{},"tests\u002F",[586,783,784],{},"arquivos de configuração na raiz.",[586,786,787,760,792],{},[442,788,789,790],{},"Configura o ",[433,791,435],{},[583,793,794,803,810,815],{},[586,795,796,724,799,802],{},[433,797,798],{},"site.url",[433,800,801],{},"site.name"," para SEO",[586,804,805,806,809],{},"Bloco ",[433,807,808],{},"hub"," do NuxtHub para o Cloudflare",[586,811,812],{},[433,813,814],{},"routeRules",[586,816,817],{},[433,818,819],{},"compatibilityDate",[586,821,822],{},[442,823,789,824],{},[433,825,439],{},[586,827,828,831,832,835,836,839],{},[442,829,830],{},"Configura o Vitest e o ESLint",", em seguida executa um ",[442,833,834],{},"checklist final"," incluindo ",[433,837,838],{},"pnpm install && pnpm dev"," antes de dar o trabalho por encerrado.",[447,841,843],{"id":842},"scripts-de-shell-vs-habilidades-de-agentes-de-ia-comparação-direta","Scripts de shell vs habilidades de agentes de IA: comparação direta",[845,846,847,862],"table",{},[848,849,850],"thead",{},[851,852,853,856,859],"tr",{},[854,855],"th",{},[854,857,858],{},"Script",[854,860,861],{},"Habilidade",[863,864,865,877,888,899,910,921],"tbody",{},[851,866,867,871,874],{},[868,869,870],"td",{},"Intenção do usuário",[868,872,873],{},"❌ valores fixos",[868,875,876],{},"✅ adapta-se à solicitação",[851,878,879,882,885],{},[868,880,881],{},"Tomada de decisão",[868,883,884],{},"apenas com flags predefinidas",[868,886,887],{},"✅ avaliado em tempo de execução",[851,889,890,893,896],{},[868,891,892],{},"Mudanças de versão",[868,894,895],{},"reescrita manual",[868,897,898],{},"✅ verifica o estado atual",[851,900,901,904,907],{},[868,902,903],{},"Recuperação de erros",[868,905,906],{},"para a execução",[868,908,909],{},"✅ corrige e continua",[851,911,912,915,918],{},[868,913,914],{},"Validação do resultado",[868,916,917],{},"❌",[868,919,920],{},"✅ checklist final",[851,922,923,926,929],{},[868,924,925],{},"Custo de manutenção",[868,927,928],{},"proliferação de flags, atualizações de versão",[868,930,931],{},"editar Markdown, não código",[447,933,935],{"id":934},"como-instalar-habilidades-de-agentes-de-ia-com-a-cli-npx-skills","Como instalar habilidades de agentes de IA com a CLI npx skills",[429,937,938,939,944],{},"A instalação é feita em um único comando com a ",[635,940,943],{"href":941,"rel":942},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[667],"CLI de skills",":",[455,946,948],{"className":457,"code":947,"language":459,"meta":424,"style":424},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[433,949,950],{"__ignoreMap":424},[463,951,952,954,957,960,963],{"class":465,"line":466},[463,953,495],{"class":494},[463,955,956],{"class":480}," skills",[463,958,959],{"class":480}," add",[463,961,962],{"class":480}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[463,964,965],{"class":480}," -g\n",[429,967,968,969],{},"A CLI clona o repositório, localiza a habilidade e pergunta a qual dos 77 agentes suportados ela deve ser atribuída:\n",[970,971],"img",{"alt":972,"src":973},"Interface de linha de comando mostrando a instalação da habilidade de scaffolding do Nuxt usando o comando CLI npx skills add","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-add-scaffold-nuxt-installation.webp",[429,975,976,977,980,981,984,985],{},"Escolhemos o ",[442,978,979],{},"Symlink"," (o método recomendado), que instala a habilidade uma única vez em ",[433,982,983],{},"~\u002F.agents\u002Fskills"," e aponta cada agente selecionado para esta única cópia.\n",[970,986],{"alt":987,"src":988},"Tela de terminal exibindo o resumo de instalação e configuração do link simbólico para as habilidades de agentes centralizadas","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-installation-summary-details.webp",[583,990,991],{},[586,992,993],{},[994,995,996,997,1000],"em",{},"Consulte este artigo, ",[635,998,999],{"href":359},"Fim da fragmentação de habilidades de agentes usando npx skills",", sobre como centralizar habilidades de agentes em uma única fonte de verdade.",[429,1002,1003],{},"Ao abrir o Claude Code, você confirma que a habilidade foi instalada com sucesso.",[429,1005,1006],{},[970,1007],{"alt":1008,"src":1009},"Interface de linha de comando do Claude Code mostrando o comando de barra scaffold-nuxt recém-instalado, ativo e pronto para uso","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fclaude-code-scaffold-nuxt-slash-command-active.webp",[429,1011,1012],{},"A partir daí, um prompt em linguagem natural é suficiente:",[1014,1015,1016],"blockquote",{},[429,1017,1018],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"",[429,1020,1021,1022,1026],{},"A habilidade é open source; acesse o ",[635,1023,1025],{"href":665,"rel":1024},[667],"repositório no GitHub"," e experimente.",[1028,1029,1030],"style",{},"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":424,"searchDepth":473,"depth":484,"links":1032},[1033,1034,1035,1036,1037],{"id":449,"depth":473,"text":450},{"id":621,"depth":473,"text":622},{"id":658,"depth":473,"text":659},{"id":842,"depth":473,"text":843},{"id":934,"depth":473,"text":935},[1039],"ai-agents","2026-08-25","Crie apps Nuxt no Cloudflare facilmente. Descubra por que substituímos scripts frágeis por habilidades de agentes de IA e como usá-las usando npx skills.","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002FPT-How-AI-Agent-Skills-Replace-Nuxt-App-Scaffolding-Scripts.webp","Nuxt no Cloudflare: Habilidades de IA vs Scripts de Build - Comparando scripts frágeis com habilidades de agentes de IA.",{"schemaOrg":1046,"robots":1049,"sitemap":1050},[1047],{"@type":1048,"headline":423,"description":1041,"image":1043},"TechArticle","index, follow",{"lastmod":1040},{"title":1052,"description":1041,"ogTitle":423,"ogDescription":1041,"twitterTitle":423,"twitterDescription":1041},"Nuxt no Cloudflare: Habilidades de IA vs Scripts de Build","pt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",[1055,1056,1057,1058],"Nuxt","Cloudflare","AI Agent","Scaffolding",null,"oRX3uz8H_2-Dh03snCHuC6xhmBt3UnIdxirrpFcicu4",{"surround":1062,"related":3826},[1063,1883],{"id":1064,"title":1065,"author":1059,"body":1066,"category":1865,"date":1867,"description":1868,"extension":1042,"image":1869,"imageAlt":1870,"isPublished":487,"meta":1871,"minRead":571,"navigation":487,"path":245,"seo":1876,"stem":1877,"tags":1878,"updatedAt":1059,"__hash__":1882},"article\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","Criar sistema persistente de memória de IA na Cloudflare",{"type":426,"value":1067,"toc":1847},[1068,1072,1075,1078,1082,1085,1099,1103,1110,1124,1127,1130,1174,1179,1262,1266,1292,1404,1415,1419,1424,1468,1492,1496,1501,1574,1579,1583,1617,1625,1663,1667,1699,1703,1711,1716,1746,1750,1793,1797,1800,1803,1806,1810,1844],[447,1069,1071],{"id":1070},"a-importância-da-memória-persistente-de-ia-para-os-agentes","A importância da memória persistente de IA para os agentes",[429,1073,1074],{},"À medida que os assistentes de IA se tornam integrados no nosso quotidiano, deparamo-nos frequentemente com o problema do contexto em branco. As decisões tomadas na semana passada são esquecidas, exigindo que introduzamos repetidamente os mesmos detalhes de stacks tecnológicas e redefinamos as preferências do utilizador em cada nova sessão.",[429,1076,1077],{},"Em vez de começar do zero a cada interação, precisamos de construir um sistema de memória que evolua, compreenda de forma contínua as escolhas do utilizador e elimine a necessidade de repetir o contexto constantemente.",[447,1079,1081],{"id":1080},"sistemas-de-memória-de-ia-auto-hospedados-vs-integrados","Sistemas de memória de IA auto-hospedados vs. integrados",[429,1083,1084],{},"Muitos agentes de IA vêm equipados com memória integrada, mas raramente limitamos o nosso fluxo de trabalho a um único assistente. Usamos o Claude para desenhar e arquitetar um projeto; o Kimi para programar; e o ChatGPT para pesquisa geral. O contexto não é partilhado entre estes diferentes agentes; permanece isolado em cada ferramenta de forma estanque.",[429,1086,1087,1088,1093,1094,1098],{},"Do ponto de vista da engenharia de software, evitamos caixas negras. Precisamos de um sistema de memória de IA observável, auditável e totalmente sob o nosso controlo direto. O projeto de código aberto ",[635,1089,1092],{"href":1090,"rel":1091},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[667],"Second Brain",", desenvolvido como um fork de ",[635,1095,1096],{"href":1096,"rel":1097},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare",[667],", disponibiliza um sistema de memória persistente e auto-hospedado com suporte ao Model Context Protocol (MCP). Qualquer agente de IA compatível, como o Claude, ChatGPT ou Kimi Code, pode assim partilhar do mesmo contexto de memória unificado.",[447,1100,1102],{"id":1101},"como-criar-um-second-brain-de-memória-de-ia-na-cloudflare","Como criar um Second Brain de memória de IA na Cloudflare",[429,1104,1105,1106,1109],{},"O sistema de memória Second Brain é implementado sobre o ",[442,1107,1108],{},"Cloudflare Workers",", proporcionando uma infraestrutura de servidores serverless distribuída globalmente com baixíssima latência. Isto permite que as operações de pesquisa de memória e armazenamento ocorram de forma quase instantânea na lógica de raciocínio da IA.",[429,1111,1112,1113,1116,1117,1120,1121,1123],{},"O modelo de embeddings do ",[442,1114,1115],{},"Workers AI"," é usado para gerar os vetores. Estes embeddings são guardados no ",[442,1118,1119],{},"Cloudflare Vectorize",", que é uma base de dados vetorial altamente otimizada e distribuída. O ",[442,1122,1119],{}," realiza buscas de similaridade por cosseno para identificar memórias com relevância sémântica.",[429,1125,1126],{},"O Second Brain conta também com mecanismos inteligentes de desduplicação e fusão. Textos com menos de 85% de similaridade sémântica são armazenados diretamente; caso contrário, são bloqueados ou marcados como potenciais duplicados. Textos longos que excedam 1.600 caracteres são fragmentados respeitando os limites de frases ou quebras de linha, mantendo uma sobreposição (overlap) de 200 caracteres para preservar a continuidade do assunto. Cada fragmento é então vetorizado para correspondências de alta precisão.",[429,1128,1129],{},"As seguintes ferramentas são expostas como interfaces MCP para utilização direta pelos agentes de IA:",[583,1131,1132,1138,1144,1150,1156,1162,1168],{},[586,1133,1134,1137],{},[433,1135,1136],{},"remember",": Guardar ideias, decisões, preferências e contexto geral do projeto.",[586,1139,1140,1143],{},[433,1141,1142],{},"append",": Acrescentar novas informações ou atualizações a uma memória existente.",[586,1145,1146,1149],{},[433,1147,1148],{},"update",": Substituir uma memória existente por completo.",[586,1151,1152,1155],{},[433,1153,1154],{},"recall",": Localizar memórias com base no seu significado sémântico e não em palavras-chave exatas.",[586,1157,1158,1161],{},[433,1159,1160],{},"list_recent",": Listar as memórias gravadas recentemente.",[586,1163,1164,1167],{},[433,1165,1166],{},"forget",": Apagar de forma definitiva um registo de memória.",[586,1169,1170,1173],{},[433,1171,1172],{},"link\u002Fconnections",": Conectar memórias relacionadas entre si (funcionalidade de grafo v2).",[1175,1176,1178],"h3",{"id":1177},"configuração-do-second-brain-na-cloudflare","Configuração do Second Brain na Cloudflare",[673,1180,1181,1199,1206,1213,1220,1227,1238,1245,1248,1255],{},[586,1182,1183,1184,1187,1188,1193,1194,1198],{},"Clique em ",[433,1185,1186],{},"Deploy to Cloudflare"," na página do ",[635,1189,1192],{"href":1190,"rel":1191},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[667],"Github repo",". [[",[970,1195],{"alt":1196,"src":1197},"Página do GitHub com o botão Deploy to Cloudflare destacado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[586,1200,1201,1202],{},"Preencha o formulário do Cloudflare Worker apresentado.\n",[970,1203],{"alt":1204,"src":1205},"Formulário de configuração de implantação do Cloudflare Workers","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[586,1207,1208,1209],{},"Introduza '384' no campo Dimensions; selecione 'cosine' para Metric; e clique no botão Deploy.\n",[970,1210],{"alt":1211,"src":1212},"Tela de configuração de criação do banco de dados Cloudflare Vectorize","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[586,1214,1215,1216],{},"O ecrã seguinte apresenta a visão geral do seu Second Brain no Cloudflare Worker:\n",[970,1217],{"alt":1218,"src":1219},"Painel de controle geral do worker do Second Brain implantado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[586,1221,1222,1223],{},"Vá a 'Settings' (Definições) e clique no ícone de edição da variável 'AUTH_TOKEN' para criar uma chave de acesso segura:\n",[970,1224],{"alt":1225,"src":1226},"Configurações de variáveis do Cloudflare Worker destacando AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[586,1228,1229,1230,1234],{},"Clique no link 'Rotate' para poder definir o novo valor: ",[970,1231],{"alt":1232,"src":1233},"Tela de modificação e rotação da variável AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[970,1235],{"alt":1236,"src":1237},"Inserindo a string aleatória gerada no campo de valor AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[586,1239,1240,1241,1244],{},"Execute o comando ",[433,1242,1243],{},"openssl rand -base64 32"," no seu terminal macOS para gerar um valor aleatório seguro e cole-o no campo 'Value'.",[586,1246,1247],{},"Clique no botão 'Deploy' para guardar o novo valor da variável 'AUTH_TOKEN'.",[586,1249,1250,1251],{},"Abra o endereço URL do seu worker do Second Brain no seu navegador de internet.\n",[970,1252],{"alt":1253,"src":1254},"Tela de login da interface web do Second Brain com entrada de Bearer Token","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[586,1256,1257,1258,1261],{},"Introduza o 'AUTH_TOKEN' gerado no campo de input ",[433,1259,1260],{},"Bearer token"," e clique no botão 'Connect' para aceder ao painel de controlo (Web UI).",[1175,1263,1265],{"id":1264},"integração-do-claude-desktop-via-mcp","Integração do Claude Desktop via MCP",[673,1267,1268,1275,1282],{},[586,1269,1270,1271],{},"Clique em 'Customize' nas definições do Claude Desktop.\n",[970,1272],{"alt":1273,"src":1274},"Interface do Claude Desktop apontando para o botão Customize","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[586,1276,1277,1278],{},"Selecione 'Developer' para abrir e editar manualmente o ficheiro de configuração dos servidores MCP:\n",[970,1279],{"alt":1280,"src":1281},"Menu de configurações do desenvolvedor do Claude Desktop para aceder à configuração MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[586,1283,1284,1285,1288,1289,944],{},"Adicione o seguinte bloco de código à secção ",[433,1286,1287],{},"mcpServers"," no ficheiro ",[433,1290,1291],{},"claude_desktop_config.json",[455,1293,1297],{"className":1294,"code":1295,"language":1296,"meta":424,"style":424},"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",[433,1298,1299,1315,1337,1351,1363,1374,1385,1394,1399],{"__ignoreMap":424},[463,1300,1301,1304,1307,1309,1312],{"class":465,"line":466},[463,1302,1303],{"class":504},"    \"",[463,1305,1306],{"class":480},"second-brain",[463,1308,512],{"class":504},[463,1310,734],{"class":1311},"sTEyZ",[463,1313,1314],{"class":504},"{\n",[463,1316,1317,1320,1324,1326,1328,1330,1332,1334],{"class":465,"line":473},[463,1318,1319],{"class":504},"      \"",[463,1321,1323],{"class":1322},"spNyl","command",[463,1325,512],{"class":504},[463,1327,944],{"class":504},[463,1329,505],{"class":504},[463,1331,495],{"class":480},[463,1333,512],{"class":504},[463,1335,1336],{"class":504},",\n",[463,1338,1339,1341,1344,1346,1348],{"class":465,"line":484},[463,1340,1319],{"class":504},[463,1342,1343],{"class":1322},"args",[463,1345,512],{"class":504},[463,1347,944],{"class":504},[463,1349,1350],{"class":504}," [\n",[463,1352,1353,1356,1359,1361],{"class":465,"line":491},[463,1354,1355],{"class":504},"        \"",[463,1357,1358],{"class":480},"mcp-remote",[463,1360,512],{"class":504},[463,1362,1336],{"class":504},[463,1364,1365,1367,1370,1372],{"class":465,"line":536},[463,1366,1355],{"class":504},[463,1368,1369],{"class":480},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[463,1371,512],{"class":504},[463,1373,1336],{"class":504},[463,1375,1376,1378,1381,1383],{"class":465,"line":541},[463,1377,1355],{"class":504},[463,1379,1380],{"class":480},"--header",[463,1382,512],{"class":504},[463,1384,1336],{"class":504},[463,1386,1387,1389,1392],{"class":465,"line":554},[463,1388,1355],{"class":504},[463,1390,1391],{"class":480},"Authorization: Bearer \u003Cyour-token>",[463,1393,551],{"class":504},[463,1395,1396],{"class":465,"line":559},[463,1397,1398],{"class":504},"      ]\n",[463,1400,1401],{"class":465,"line":571},[463,1402,1403],{"class":504},"    }\n",[429,1405,1406,1410,1411],{},[970,1407],{"alt":1408,"src":1409},"JSON de configuração do Claude Desktop MCP contendo o servidor do Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. Reinicie a aplicação Claude Desktop e confirme a lista de 'Local MCP servers'. O estado deve indicar 'running' (em execução).\n",[970,1412],{"alt":1413,"src":1414},"Claude Desktop exibindo o status ativo para o servidor MCP do Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[1175,1416,1418],{"id":1417},"integração-do-claude-code-via-mcp","Integração do Claude Code via MCP",[583,1420,1421],{},[586,1422,1423],{},"Execute o seguinte comando no terminal para adicionar o novo servidor MCP:",[455,1425,1429],{"className":1426,"code":1427,"language":1428,"meta":424,"style":424},"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",[433,1430,1431],{"__ignoreMap":424},[463,1432,1433,1436,1439,1441,1444,1447,1450,1453,1456,1459,1462,1465],{"class":465,"line":466},[463,1434,1435],{"class":494},"claude",[463,1437,1438],{"class":480}," mcp",[463,1440,959],{"class":480},[463,1442,1443],{"class":480}," --transport",[463,1445,1446],{"class":480}," http",[463,1448,1449],{"class":480}," second-brain",[463,1451,1452],{"class":480}," https:\u002F\u002F",[463,1454,1455],{"class":504},"\u003C",[463,1457,1458],{"class":480},"your-worker-ur",[463,1460,1461],{"class":1311},"l",[463,1463,1464],{"class":504},">",[463,1466,1467],{"class":480},"\u002Fmcp\n",[583,1469,1470,1476],{},[586,1471,1472,1473,728],{},"O Claude Code irá identificar que o ponto de acesso requer OAuth e abrirá uma janela no seu navegador de internet para que possa submeter o ",[433,1474,1475],{},"AUTH_TOKEN",[586,1477,1478,1479,1482,1483,1486,1487,728],{},"Crie o ficheiro ",[433,1480,1481],{},"CLAUDE.md"," na diretoria ",[433,1484,1485],{},"~\u002F.claude"," com as instruções descritas em ",[635,1488,1491],{"href":1489,"rel":1490},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[667],"CLAUDE_INSTRUCTIONS.md",[1175,1493,1495],{"id":1494},"integração-do-gemini-cli-via-mcp","Integração do Gemini CLI via MCP",[673,1497,1498],{},[586,1499,1500],{},"Adicione a seguinte configuração de servidor MCP ao seu ficheiro '.\u002F.gemini\u002Fsettings.json':",[455,1502,1504],{"className":1294,"code":1503,"language":1296,"meta":424,"style":424},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[433,1505,1506,1518,1537,1551,1565,1570],{"__ignoreMap":424},[463,1507,1508,1510,1512,1514,1516],{"class":465,"line":466},[463,1509,1303],{"class":504},[463,1511,1306],{"class":480},[463,1513,512],{"class":504},[463,1515,734],{"class":1311},[463,1517,1314],{"class":504},[463,1519,1520,1522,1525,1527,1529,1531,1533,1535],{"class":465,"line":473},[463,1521,1319],{"class":504},[463,1523,1524],{"class":1322},"httpUrl",[463,1526,512],{"class":504},[463,1528,944],{"class":504},[463,1530,505],{"class":504},[463,1532,1369],{"class":480},[463,1534,512],{"class":504},[463,1536,1336],{"class":504},[463,1538,1539,1541,1544,1546,1548],{"class":465,"line":484},[463,1540,1319],{"class":504},[463,1542,1543],{"class":1322},"oauth",[463,1545,512],{"class":504},[463,1547,944],{"class":504},[463,1549,1550],{"class":504}," {\n",[463,1552,1553,1555,1558,1560,1562],{"class":465,"line":491},[463,1554,1355],{"class":504},[463,1556,1557],{"class":494},"enabled",[463,1559,512],{"class":504},[463,1561,944],{"class":504},[463,1563,1564],{"class":504}," true\n",[463,1566,1567],{"class":465,"line":536},[463,1568,1569],{"class":504},"      }\n",[463,1571,1572],{"class":465,"line":541},[463,1573,1403],{"class":504},[673,1575,1576],{"start":473},[586,1577,1578],{},"Inicialize o Gemini CLI.",[1175,1580,1582],{"id":1581},"testar-o-second-brain-em-agentes-de-ia","Testar o Second Brain em agentes de IA",[673,1584,1585,1596,1610],{},[586,1586,1587,1588,1591,1592],{},"Ao definir uma paleta de cores de marca básica no ",[442,1589,1590],{},"Claude Desktop",", o Second Brain não é ativado de imediato por padrão.\n",[970,1593],{"alt":1594,"src":1595},"Primeiro teste no Claude Desktop sem a camada de memória do Second Brain ativa","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[586,1597,1598,1599,1602,1603,1605,1606],{},"Ao utilizar comandos simples como 'remember', são chamadas as ferramentas integradas locais ",[433,1600,1601],{},"memory_user-edits"," do ",[442,1604,1590],{},", e não a camada de armazenamento remoto.\n",[970,1607],{"alt":1608,"src":1609},"Claude Desktop recorrendo às edições locais integradas em vez do Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[586,1611,1612,1613,1616],{},"Ao enviar o seguinte comando no ",[442,1614,1615],{},"Claude Code",", a integração com o Second Brain foi chamada com sucesso:",[455,1618,1623],{"className":1619,"code":1621,"language":1622},[1620],"language-text","Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n","text",[433,1624,1621],{"__ignoreMap":424},[429,1626,1627,1631,1632,760,1635,1639,1640,1643,1644,1646,1647,1651,1652,1655,1656,1639,1660],{},[970,1628],{"alt":1629,"src":1630},"Janela de terminal do Claude Code exibindo o acionamento bem-sucedido do Second Brain MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. Verificação das novas definições de cor armazenadas diretamente no painel do ",[442,1633,1634],{},"Second Brain na Cloudflare",[970,1636],{"alt":1637,"src":1638},"Verificando os códigos de cores da marca gravados na interface web do Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[994,1641,1642],{},"O Claude Code funcionou de forma transparente porque o ficheiro CLAUDE_INSTRUCTIONS.md do projeto continha regras que apontam para as palavras-chave do 'Second Brain'.","\n5. Para utilizar esta integração no ",[442,1645,1590],{},", é necessário especificar expressamente o termo 'Second Brain' no seu prompt para forçar a gravação ou leitura nesta camada de memória persistente.\n",[970,1648],{"alt":1649,"src":1650},"Acionando o Second Brain no Claude Desktop ao mencionar explicitamente palavras-chave","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. O mesmo se aplica ao ",[442,1653,1654],{},"Gemini CLI",", onde terá de indicar 'Second Brain' para ativar as ferramentas MCP integradas.\n",[970,1657],{"alt":1658,"src":1659},"Janela de terminal do Gemini CLI demonstrando chamadas bem-sucedidas ao Second Brain MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[994,1661,1662],{},"Adicionar regras semelhantes ao ficheiro GEMINI.md, seguindo o padrão do CLAUDE_INSTRUCTIONS.md, permitirá que o sistema use o Second Brain em segundo plano sem que tenha de escrever as palavras-chave.",[1175,1664,1666],{"id":1665},"extensões-para-navegadores-web","Extensões para navegadores web",[583,1668,1669,1672],{},[586,1670,1671],{},"Estão disponíveis extensões para os navegadores Chrome, Firefox e Microsoft Edge.",[586,1673,1674,1675],{},"As funcionalidades incluem:\n",[583,1676,1677,1683,1689],{},[586,1678,1679,1682],{},[442,1680,1681],{},"Capturar a página atual"," — guarda automaticamente o título e o endereço URL no seu Second Brain.",[586,1684,1685,1688],{},[442,1686,1687],{},"Capturar texto selecionado"," — selecione qualquer excerto de texto numa página antes de clicar no botão da extensão; o excerto será gravado em associação com o título e a URL.",[586,1690,1691,1694,1695,1698],{},[442,1692,1693],{},"Adicionar notas rápidas"," — escreva observações rápidas ou categorize com ",[433,1696,1697],{},"#hashtags"," diretamente no popup da extensão antes de gravar; os hashtags são indexados automaticamente como tags.",[1175,1700,1702],{"id":1701},"sincronização-de-conhecimento-pessoal-com-o-plugin-obsidian","Sincronização de conhecimento pessoal com o plugin Obsidian",[583,1704,1705,1708],{},[586,1706,1707],{},"Existe um plugin Obsidian para efetuar a sincronização das suas notas pessoais do Obsidian Vault diretamente com o Second Brain na Cloudflare.",[586,1709,1710],{},"Pode usar tags específicas nas notas que deseja enviar para o armazenamento persistente.",[1712,1713,1715],"h4",{"id":1714},"instalar-o-plugin-obsidian","Instalar o plugin Obsidian",[673,1717,1718,1725,1732,1739],{},[586,1719,1720,1721],{},"Abra o Obsidian → Definições → Community Plugins\n",[970,1722],{"alt":1723,"src":1724},"Painel de configurações do Obsidian navegando para a seção Community Plugins","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[586,1726,1727,1728],{},"Clique no botão 'Browse' para pesquisar plug-ins.\n",[970,1729],{"alt":1730,"src":1731},"Página de pesquisa de plug-ins do Obsidian mostrando o botão Browse","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[586,1733,1734,1735],{},"Procure por 'Second Brain Sync'.\n",[970,1736],{"alt":1737,"src":1738},"Pesquisando pelo plug-in Second Brain Sync na loja de plug-ins do Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[586,1740,1741,1742],{},"Clique no botão 'Install' (Instalar) e, em seguida, em 'Enable' (Ativar).\n",[970,1743],{"alt":1744,"src":1745},"Instalando e ativando o plug-in Second Brain Sync no Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[1712,1747,1749],{"id":1748},"configurar-o-plugin-obsidian","Configurar o plugin Obsidian",[673,1751,1752,1755,1762,1769,1776,1786],{},[586,1753,1754],{},"Aceda a Obsidian → Definições → Second Brain Sync",[586,1756,1757,1758],{},"Preencha os campos 'URL' e o 'Auth token' com os dados do seu Worker.\n",[970,1759],{"alt":1760,"src":1761},"Inserindo a URL do Worker e o Token de autorização nas configurações do Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[586,1763,1764,1765],{},"Clique em 'Test' para verificar se a ligação remota está operacional.\n",[970,1766],{"alt":1767,"src":1768},"Teste de conexão do plug-in do Obsidian exibindo verificação bem-sucedida","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[586,1770,1771,1772],{},"Defina os comportamentos de sincronização. Configure a tag de sincronização desejada em 'Sync tag' e ative 'Auto-sync on save'.\n",[970,1773],{"alt":1774,"src":1775},"Configurando a Sync Tag e ativando a sincronização automática ao salvar no Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[586,1777,1778,1779,1781,1782],{},"Crie uma nota na sua pasta do Obsidian com a tag ",[433,1780,1306],{}," (conforme definido no ecrã de configurações).\n",[970,1783],{"alt":1784,"src":1785},"Criando uma nova nota no Obsidian com a tag second-brain para sincronização","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[586,1787,1788,1789],{},"A nota é gravada e sincronizada de imediato para a sua instância de Cloudflare.\n",[970,1790],{"alt":1791,"src":1792},"Verificando a nota do Obsidian sincronizada com sucesso na interface web do Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[447,1794,1796],{"id":1795},"conclusão","Conclusão",[429,1798,1799],{},"O Second Brain oferece uma solução de código aberto inteligente para um dos maiores limites das tecnologias de IA: o esquecimento de contexto e a ausência de memória. Ao combinar este projeto com a infraestrutura escalável da Cloudflare, obtém-se uma camada de memória sémântica auto-hospedada, globalmente distribuída e de latência reduzida. Com a integração do Model Context Protocol (MCP), esta base de conhecimento torna-se totalmente portátil entre diferentes agentes de IA.",[429,1801,1802],{},"A integração com o Obsidian amplia esta arquitetura ligando a sua tomada de notas tradicional ao raciocínio lógico da IA. As suas notas e rascunhos são convertidos em dados estruturados que os agentes conseguem interpretar e interrogar a qualquer momento.",[429,1804,1805],{},"Ao unificar auto-hospedagem, pesquisa sémântica vetorial e padrões de comunicação abertos como o MCP, o Second Brain demonstra ser muito mais do que um simples repositório: é a base estrutural para construir o seu próprio ecossistema de produtividade de IA pessoal.",[447,1807,1809],{"id":1808},"referências","Referências:",[583,1811,1812,1818,1824,1831,1838],{},[586,1813,1814],{},[635,1815,1816],{"href":1816,"rel":1817},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[667],[586,1819,1820],{},[635,1821,1822],{"href":1822,"rel":1823},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[667],[586,1825,1826],{},[635,1827,1830],{"href":1828,"rel":1829},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[667],"Connect to AI Clients",[586,1832,1833],{},[635,1834,1837],{"href":1835,"rel":1836},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[667],"Second Brain Obsidian Plugin",[586,1839,1840],{},[635,1841,1842],{"href":1842,"rel":1843},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[667],[1028,1845,1846],{},"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":424,"searchDepth":473,"depth":484,"links":1848},[1849,1850,1851,1863,1864],{"id":1070,"depth":473,"text":1071},{"id":1080,"depth":473,"text":1081},{"id":1101,"depth":473,"text":1102,"children":1852},[1853,1854,1855,1856,1857,1858,1859],{"id":1177,"depth":484,"text":1178},{"id":1264,"depth":484,"text":1265},{"id":1417,"depth":484,"text":1418},{"id":1494,"depth":484,"text":1495},{"id":1581,"depth":484,"text":1582},{"id":1665,"depth":484,"text":1666},{"id":1701,"depth":484,"text":1702,"children":1860},[1861,1862],{"id":1714,"depth":491,"text":1715},{"id":1748,"depth":491,"text":1749},{"id":1795,"depth":473,"text":1796},{"id":1808,"depth":473,"text":1809},[1866,1039],"cloudflare","2026-08-07","Aprenda a criar um sistema de memória de IA persistente e auto-hospedado na Cloudflare com Second Brain e MCP. Partilhe o contexto entre Claude e Obsidian.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FPT-Use-Cloudflare-as-AI-memory.webp","Um sistema de memória de IA persistente e auto-hospedado na Cloudflare Workers e Vectorize com suporte MCP e sincronização do Obsidian.",{"schemaOrg":1872,"robots":1049,"sitemap":1875},[1873],{"@type":1048,"headline":1874,"description":1868},"Memória de IA persistente auto-hospedada: Cloudflare e MCP",{"lastmod":1867},{"title":1874,"description":1868,"ogTitle":1065,"ogDescription":1868,"twitterTitle":1065,"twitterDescription":1868},"pt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[1056,1879,1880,1092,1881],"MCP","Memória de IA","Obsidian","2A8G4GBE0gVo-TlyYCIBGp4hYUpOZtEDV7cqi45ry1s",{"id":1884,"title":1885,"author":1059,"body":1886,"category":3803,"date":3805,"description":3806,"extension":1042,"image":3807,"imageAlt":3808,"isPublished":487,"meta":3809,"minRead":3817,"navigation":487,"path":227,"seo":3818,"stem":3819,"tags":3820,"updatedAt":3824,"__hash__":3825},"article\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek.md","Aloje os seus itinerários de viagem com TREK e Docker",{"type":426,"value":1887,"toc":3762},[1888,1891,1894,1897,1901,1905,2093,2097,2105,2125,2128,2132,2237,2248,2251,2256,2259,2271,2276,2280,2283,2286,2324,2328,2331,2365,2368,2410,2413,2417,2428,2432,2439,2443,2446,2540,2544,2550,2554,2561,2565,2568,2586,2596,2600,2603,2613,2617,2621,2629,2633,2637,2640,2644,2648,2651,2656,2659,2664,2670,2674,2678,2681,2685,2699,2704,2710,2715,2719,2722,2727,2732,2735,2742,2746,2749,2752,2762,2769,2774,2780,2785,2789,2794,2799,2802,2807,2811,2817,2821,2826,2830,2833,2836,2841,2846,2851,2855,2862,2867,2872,2877,2882,2886,2891,2896,2902,2906,2909,2913,2919,2924,2929,2935,2940,2945,2950,2963,2967,2972,2993,2998,3001,3005,3008,3013,3016,3064,3068,3075,3081,3086,3092,3097,3103,3108,3114,3117,3122,3128,3133,3139,3143,3149,3154,3159,3163,3167,3170,3174,3177,3184,3188,3195,3199,3211,3220,3224,3228,3238,3246,3251,3258,3263,3270,3274,3277,3429,3435,3439,3442,3447,3450,3456,3460,3467,3471,3474,3479,3486,3491,3495,3505,3572,3588,3591,3596,3600,3604,3614,3691,3701,3704,3708,3712,3715,3719,3722,3725,3734,3736,3759],[429,1889,1890],{},"A parte mais cansativa do planejamento de uma viagem é que os PDFs de reservas de voo, as confirmações de hotéis, as conversas com os companheiros de viagem e as listas de locais a visitar ficam dispersos em múltiplos lugares. Quando chega a altura de calcular as despesas totais e dividir as contas, é necessário um esforço tremendo para analisar todo esse histórico de dados.",[429,1892,1893],{},"O TREK é um planejador de viagens de código aberto que pode ser autohospedado, integrando o seu itinerário, as suas reservas, o seu orçamento e as listas de bagagem num único local. O seu servidor MCP integrado permite que agentes de IA (como o Claude Desktop) manipulem diretamente os dados das suas viagens.",[429,1895,1896],{},"Este guia irá acompanhá-lo passo a passo, desde a implantação até à gestão completa de uma viagem real do início ao fim.",[1175,1898,1900],{"id":1899},"_1-como-implantar-o-planejador-de-viagens-trek-com-docker","1. Como implantar o planejador de viagens TREK com Docker",[1712,1902,1904],{"id":1903},"instalar-o-docker-num-vps-ubuntu","Instalar o Docker num VPS Ubuntu",[455,1906,1908],{"className":457,"code":1907,"language":459,"meta":424,"style":424},"# 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",[433,1909,1910,1915,1944,1948,1953,1996,2000,2005,2016,2020,2026,2048,2053,2059,2068,2073,2079],{"__ignoreMap":424},[463,1911,1912],{"class":465,"line":466},[463,1913,1914],{"class":469},"# Add Docker's official GPG key and set up the Docker repository\n",[463,1916,1917,1920,1923,1926,1929,1932,1935,1938,1941],{"class":465,"line":473},[463,1918,1919],{"class":494},"curl",[463,1921,1922],{"class":480}," -fsSL",[463,1924,1925],{"class":480}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[463,1927,1928],{"class":504}," |",[463,1930,1931],{"class":494}," sudo",[463,1933,1934],{"class":480}," gpg",[463,1936,1937],{"class":480}," --dearmor",[463,1939,1940],{"class":480}," -o",[463,1942,1943],{"class":480}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[463,1945,1946],{"class":465,"line":484},[463,1947,488],{"emptyLinePlaceholder":487},[463,1949,1950],{"class":465,"line":491},[463,1951,1952],{"class":469},"# Add the official Docker repository\n",[463,1954,1955,1958,1960,1963,1966,1969,1972,1975,1978,1980,1982,1984,1987,1990,1993],{"class":465,"line":536},[463,1956,1957],{"class":476},"echo",[463,1959,505],{"class":504},[463,1961,1962],{"class":480},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[463,1964,1965],{"class":504},"$(",[463,1967,1968],{"class":494},"lsb_release",[463,1970,1971],{"class":480}," -cs",[463,1973,1974],{"class":504},")",[463,1976,1977],{"class":480}," stable",[463,1979,512],{"class":504},[463,1981,1928],{"class":504},[463,1983,1931],{"class":494},[463,1985,1986],{"class":480}," tee",[463,1988,1989],{"class":480}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[463,1991,1992],{"class":504}," >",[463,1994,1995],{"class":480}," \u002Fdev\u002Fnull\n",[463,1997,1998],{"class":465,"line":541},[463,1999,488],{"emptyLinePlaceholder":487},[463,2001,2002],{"class":465,"line":554},[463,2003,2004],{"class":469},"# Update package list\n",[463,2006,2007,2010,2013],{"class":465,"line":559},[463,2008,2009],{"class":494},"sudo",[463,2011,2012],{"class":480}," apt",[463,2014,2015],{"class":480}," update\n",[463,2017,2018],{"class":465,"line":571},[463,2019,488],{"emptyLinePlaceholder":487},[463,2021,2023],{"class":465,"line":2022},10,[463,2024,2025],{"class":469},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[463,2027,2029,2031,2033,2036,2039,2042,2045],{"class":465,"line":2028},11,[463,2030,2009],{"class":494},[463,2032,2012],{"class":480},[463,2034,2035],{"class":480}," install",[463,2037,2038],{"class":480}," docker-ce",[463,2040,2041],{"class":480}," docker-ce-cli",[463,2043,2044],{"class":480}," containerd.io",[463,2046,2047],{"class":480}," -y\n",[463,2049,2051],{"class":465,"line":2050},12,[463,2052,488],{"emptyLinePlaceholder":487},[463,2054,2056],{"class":465,"line":2055},13,[463,2057,2058],{"class":469},"# Verify docker is installed\n",[463,2060,2062,2065],{"class":465,"line":2061},14,[463,2063,2064],{"class":494},"docker",[463,2066,2067],{"class":480}," --version\n",[463,2069,2071],{"class":465,"line":2070},15,[463,2072,488],{"emptyLinePlaceholder":487},[463,2074,2076],{"class":465,"line":2075},16,[463,2077,2078],{"class":469},"# Starts automatically when your system boots\n",[463,2080,2082,2084,2087,2090],{"class":465,"line":2081},17,[463,2083,2009],{"class":494},[463,2085,2086],{"class":480}," systemctl",[463,2088,2089],{"class":480}," enable",[463,2091,2092],{"class":480}," docker\n",[1712,2094,2096],{"id":2095},"gerar-a-chave-de-criptografia","Gerar a chave de criptografia",[429,2098,2099,2100,2104],{},"O TREK utiliza uma chave para criptografar dados confidenciais. Utilize o comando seguinte ou esta ",[635,2101,2103],{"href":2102},"\u002Fpt\u002Ftools\u002Fsecret-key-hex","ferramenta online"," para gerar a sua chave de criptografia:",[455,2106,2108],{"className":457,"code":2107,"language":459,"meta":424,"style":424},"openssl rand -hex 32\n",[433,2109,2110],{"__ignoreMap":424},[463,2111,2112,2115,2118,2121],{"class":465,"line":466},[463,2113,2114],{"class":494},"openssl",[463,2116,2117],{"class":480}," rand",[463,2119,2120],{"class":480}," -hex",[463,2122,2124],{"class":2123},"sbssI"," 32\n",[429,2126,2127],{},"Guarde-a num local seguro; perdê-la significa perder o acesso aos dados criptografados.",[1712,2129,2131],{"id":2130},"iniciar-o-contêiner","Iniciar o contêiner",[455,2133,2135],{"className":457,"code":2134,"language":459,"meta":424,"style":424},"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",[433,2136,2137,2150,2160,2170,2187,2203,2213,2222,2232],{"__ignoreMap":424},[463,2138,2139,2141,2144,2147],{"class":465,"line":466},[463,2140,2064],{"class":494},[463,2142,2143],{"class":480}," run",[463,2145,2146],{"class":480}," -d",[463,2148,2149],{"class":1311}," \\\n",[463,2151,2152,2155,2158],{"class":465,"line":473},[463,2153,2154],{"class":480},"  --name",[463,2156,2157],{"class":480}," trek",[463,2159,2149],{"class":1311},[463,2161,2162,2165,2168],{"class":465,"line":484},[463,2163,2164],{"class":480},"  -p",[463,2166,2167],{"class":480}," 3000:3000",[463,2169,2149],{"class":1311},[463,2171,2172,2175,2178,2180,2183,2185],{"class":465,"line":491},[463,2173,2174],{"class":480},"  -e",[463,2176,2177],{"class":480}," ENCRYPTION_KEY=",[463,2179,512],{"class":504},[463,2181,2182],{"class":480},"\u003Cgenerated_key>",[463,2184,512],{"class":504},[463,2186,2149],{"class":1311},[463,2188,2189,2191,2194,2196,2199,2201],{"class":465,"line":536},[463,2190,2174],{"class":480},[463,2192,2193],{"class":480}," APP_URL=",[463,2195,512],{"class":504},[463,2197,2198],{"class":480},"https:\u002F\u002Ftrek.pafor.me",[463,2200,512],{"class":504},[463,2202,2149],{"class":1311},[463,2204,2205,2208,2211],{"class":465,"line":541},[463,2206,2207],{"class":480},"  -v",[463,2209,2210],{"class":480}," .\u002Fdata:\u002Fapp\u002Fdata",[463,2212,2149],{"class":1311},[463,2214,2215,2217,2220],{"class":465,"line":554},[463,2216,2207],{"class":480},[463,2218,2219],{"class":480}," .\u002Fuploads:\u002Fapp\u002Fuploads",[463,2221,2149],{"class":1311},[463,2223,2224,2227,2230],{"class":465,"line":559},[463,2225,2226],{"class":480},"  --restart",[463,2228,2229],{"class":480}," unless-stopped",[463,2231,2149],{"class":1311},[463,2233,2234],{"class":465,"line":571},[463,2235,2236],{"class":480},"  mauriceboe\u002Ftrek:latest\n",[583,2238,2239],{},[586,2240,2241,2247],{},[442,2242,2243,2246],{},[433,2244,2245],{},"APP_URL"," deve estar definido corretamente"," — o fluxo de descoberta OAuth do servidor MCP depende disso. Defina o seu endereço HTTPS público final desde o início.",[429,2249,2250],{},"A primeira execução demorará um pouco para descarregar a imagem:",[970,2252],{"src":2253,"alt":2254,"style":2255},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-pull-image.webp","Logs de pull e run do Docker para o TREK","max-width: 215px; width:100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2257,2258],{},"Verifique se está em execução:",[455,2260,2262],{"className":457,"code":2261,"language":459,"meta":424,"style":424},"docker ps\n",[433,2263,2264],{"__ignoreMap":424},[463,2265,2266,2268],{"class":465,"line":466},[463,2267,2064],{"class":494},[463,2269,2270],{"class":480}," ps\n",[970,2272],{"src":2273,"alt":2274,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-ps-status.webp","Verificando o status do container em execução via docker ps","max-width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1175,2277,2279],{"id":2278},"_2-configurar-o-encaminhamento-de-domínio-e-ssl-com-o-proxy-reverso-caddy","2. Configurar o encaminhamento de domínio e SSL com o proxy reverso Caddy",[429,2281,2282],{},"O protocolo HTTPS é obrigatório para as chaves de acesso (passkeys) e OAuth para MCP. O nome de domínio é alojado na Cloudflare, que oferece um certificado SSL gratuito e proteção DDoS.",[429,2284,2285],{},"O Caddy é configurado como o servidor de proxy reverso seguro apontando para a porta 3000. Eis um exemplo de Caddyfile:",[455,2287,2289],{"className":1294,"code":2288,"language":1296,"meta":424,"style":424},"{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n",[433,2290,2291,2304,2309,2319],{"__ignoreMap":424},[463,2292,2293,2296,2299,2302],{"class":465,"line":466},[463,2294,2295],{"class":504},"{",[463,2297,2298],{"class":1311},"$TREK_DOMAIN",[463,2300,2301],{"class":504},"}",[463,2303,1550],{"class":504},[463,2305,2306],{"class":465,"line":473},[463,2307,2308],{"class":1311},"  encode zstd gzip\n",[463,2310,2311,2314,2316],{"class":465,"line":484},[463,2312,2313],{"class":1311},"  reverse_proxy host.docker.internal",[463,2315,944],{"class":504},[463,2317,2318],{"class":2123},"3000\n",[463,2320,2321],{"class":465,"line":491},[463,2322,2323],{"class":504},"}\n",[1175,2325,2327],{"id":2326},"_3-configuração-inicial-e-criação-do-administrador-seguro","3. Configuração inicial e criação do administrador seguro",[429,2329,2330],{},"Existem duas formas de criar a conta de administrador:",[583,2332,2333,2344],{},[586,2334,2335,2343],{},[442,2336,2337,436,2340],{},[433,2338,2339],{},"ADMIN_EMAIL",[433,2341,2342],{},"ADMIN_PASSWORD"," são definidos como variáveis de ambiente; esses valores são usados diretamente.",[586,2345,2346],{},[442,2347,2348,2349,2352,2353,2356,2357,2360,2361,2364],{},"O TREK cria o e-mail ",[433,2350,2351],{},"admin@trek.local",", o nome de utilizador ",[433,2354,2355],{},"admin"," e uma ",[433,2358,2359],{},"senha gerada aleatoriamente que é impressa nos logs do contêiner",". Execute ",[433,2362,2363],{},"docker logs trek"," para recuperá-la.",[429,2366,2367],{},"Se não conseguir encontrar a senha nos logs, redefina-a com o comando:",[455,2369,2371],{"className":457,"code":2370,"language":459,"meta":424,"style":424},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[433,2372,2373],{"__ignoreMap":424},[463,2374,2375,2377,2380,2383,2386,2389,2391,2394,2397,2400,2402,2404,2407],{"class":465,"line":466},[463,2376,2064],{"class":494},[463,2378,2379],{"class":480}," exec",[463,2381,2382],{"class":480}," -it",[463,2384,2385],{"class":480}," -e",[463,2387,2388],{"class":480}," RESET_ADMIN_EMAIL=admin@trek.local",[463,2390,2385],{"class":480},[463,2392,2393],{"class":480}," RESET_ADMIN_PASSWORD=",[463,2395,2396],{"class":504},"'",[463,2398,2399],{"class":480},"YourNewPassword",[463,2401,2396],{"class":504},[463,2403,2157],{"class":480},[463,2405,2406],{"class":480}," node",[463,2408,2409],{"class":480}," server\u002Freset-admin.js\n",[429,2411,2412],{},"Será solicitado que altere a senha no primeiro login.",[970,2414],{"src":2415,"alt":2416,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-initial-login-password-prompt.webp","Prompt de login inicial e redefinição de senha do administrador",[429,2418,1183,2419,2422,2423],{},[442,2420,2421],{},"Admin"," e atualize o endereço de e-mail:",[970,2424],{"src":2425,"alt":2426,"style":2427},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-email-update-panel.webp","Configurando e-mail personalizado nas configurações de administrador do TREK","max-width: 700px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2429,2431],{"id":2430},"_31-cópias-de-segurança-backups","3.1 Cópias de segurança (Backups)",[429,2433,2434,2435],{},"Configure as cópias de segurança automáticas com uma política de retenção no painel de administração:\n",[970,2436],{"src":2437,"alt":2438,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-backup-retention-policy.webp","Configurando agendamentos de backup automáticos e regras de retenção",[1712,2440,2442],{"id":2441},"_32-armazenar-ficheiros-carregados-no-cloudflare-r2","3.2 Armazenar ficheiros carregados no Cloudflare R2",[429,2444,2445],{},"Armazenar ficheiros carregados, fotos e backups no Cloudflare R2 mantém o disco do VPS limpo e leve. O TREK suporta backends compatíveis com S3, e o Cloudflare R2 encaixa-se perfeitamente nisto.",[673,2447,2448,2454,2467,2477,2488,2502,2514,2529],{},[586,2449,2450,2451,728],{},"Crie um bucket R2 chamado ",[433,2452,2453],{},"trek",[586,2455,2456,2457,2460,2461,2462],{},"Na secção ",[442,2458,2459],{},"Account Details",", encontre o ID da sua conta:","\n  ",[970,2463],{"src":2464,"alt":2465,"style":2466},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-account-details-id.webp","Localizando o ID da conta Cloudflare no portal","max-width: 325px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2468,1183,2469,944,2461,2472],{},[442,2470,2471],{},"Manage API Tokens",[970,2473],{"src":2474,"alt":2475,"style":2476},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-manage-api-tokens-button.webp","Tela de gerenciamento de tokens de API no portal Cloudflare","max-width: 282px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2478,1183,2479,2482,2461,2483],{},[442,2480,2481],{},"Create Account API token"," com permissões de leitura\u002Fescrita para o bucket:",[970,2484],{"src":2485,"alt":2486,"style":2487},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-create-token-permissions.webp","Criando token de acesso R2 com permissões de leitura e escrita","max-width: 360px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2489,1183,2490,2493,2494,944,2461,2497],{},[442,2491,2492],{},"Storage"," no painel de ",[442,2495,2496],{},"ADMINISTRATION",[970,2498],{"src":2499,"alt":2500,"style":2501},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-administration-storage-menu.webp","Navegando para as configurações de armazenamento no painel de controle do TREK","max-width: 539px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2503,2504,2505,2508,2461,2509],{},"Clique no botão ",[442,2506,2507],{},"Add Backend"," e preencha o endpoint, o bucket e as credenciais:",[970,2510],{"src":2511,"alt":2512,"style":2513},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-storage-backend-credentials.webp","Configurando o backend de armazenamento Cloudflare R2 compatível com S3","max-width: 445px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2515,1183,2516,2519,2520,2523,2461,2524],{},[442,2517,2518],{},"Apply"," e depois no botão ",[442,2521,2522],{},"Test",". Deverá ver a mensagem \"Connection OK\":",[970,2525],{"src":2526,"alt":2527,"style":2528},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-test-storage-backend-connection-ok.webp","Teste de conexão de armazenamento bem-sucedido exibindo Connection OK","max-width: 677px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2530,2531,2532,944,2461,2535],{},"Altere todas as categorias de armazenamento para Cloudflare R2 e clique em ",[442,2533,2534],{},"Save changes",[970,2536],{"src":2537,"alt":2538,"style":2539},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-switch-storage-categories-r2.webp","Roteando todas as categorias de armazenamento de arquivos para o Cloudflare R2","max-width: 653px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2541,2543],{"id":2542},"_33-login-com-chaves-de-acesso-passkeys","3.3 Login com chaves de acesso (Passkeys)",[429,2545,2546,2547,944],{},"O TREK suporta chaves de acesso, autenticação de dois fatores (2FA) e autenticação única (SSO) via OIDC. Para chaves de acesso, introduza o seu nome de domínio e as origens permitidas (allowed origins) nas definições e clique em ",[442,2548,2549],{},"Save",[970,2551],{"src":2552,"alt":2553,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-passkey-allowed-origins-settings.webp","Registrando origens permitidas para autenticação segura com Passkey",[429,2555,2556,2557,2560],{},"Sem configurar as ",[442,2558,2559],{},"allowed origins",", o registo da chave de acesso falhará.",[1712,2562,2564],{"id":2563},"_34-chave-de-api-do-google-maps","3.4 Chave de API do Google Maps",[429,2566,2567],{},"Uma chave do Google Maps enriquece a pesquisa de locais com classificações, horários de funcionamento e fotos. O TREK reverte automaticamente para o OpenStreetMap caso não seja inserida nenhuma chave, contudo as classificações e fotos não estarão disponíveis.",[429,2569,2570,2571,2576,2577,2580,2581],{},"Siga este ",[635,2572,2575],{"href":2573,"rel":2574},"https:\u002F\u002Fmapsplatform.google.com\u002Fmaps-demo-key\u002F",[667],"link"," e clique em ",[442,2578,2579],{},"Get demo key"," para solicitar uma:                                                  ",[970,2582],{"src":2583,"alt":2584,"style":2585},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgoogle-maps-get-demo-api-key.webp","Solicitando chave de API do Google Maps Platform","max-width: 176px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2587,2588,2589,2591,2592],{},"Cole a chave nas definições e clique em ",[442,2590,2522],{}," para confirmar a ligação:\n",[970,2593],{"src":2594,"alt":2595,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-key-test-connection.webp","Verificando a conectividade da chave de API do Google Maps nas configurações",[1712,2597,2599],{"id":2598},"_35-integração-de-ia","3.5 Integração de IA",[429,2601,2602],{},"O modelo de IA é utilizado para recuperar e estruturar e-mails de confirmação e PDFs de reserva em dados de reserva estruturados.",[429,2604,1183,2605,2608,2609,2612],{},[442,2606,2607],{},"Addons"," no menu esquerdo e ative ",[442,2610,2611],{},"AI Parsing",". Selecione \"OpenAI\" (ou outro fornecedor compatível) e preencha as informações do mesmo:",[970,2614],{"src":2615,"alt":2616,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-ai-parsing-openai.webp","Ativando o addon de parsing de IA com integração com a OpenAI",[1712,2618,2620],{"id":2619},"_36-acesso-mcp","3.6 Acesso MCP",[429,2622,2623,2624,2626,2627,944],{},"Sob ",[442,2625,2607],{},", ative o ",[442,2628,1879],{},[970,2630],{"src":2631,"alt":2632,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-mcp.webp","Ativando o addon do servidor MCP do Model Context Protocol",[1712,2634,2636],{"id":2635},"_37-plugins","3.7 Plugins",[429,2638,2639],{},"Os seguintes plugins são recomendados e vale a pena ativá-los:",[970,2641],{"src":2642,"alt":2643,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","Lista de plugins e addons recomendados ativos",[1712,2645,2647],{"id":2646},"_38-criar-o-seu-utilizador-para-o-dia-a-dia","3.8 Criar o seu utilizador para o dia a dia",[429,2649,2650],{},"Planeie as viagens como um utilizador normal, não como administrador. Crie um utilizador regular e inicie sessão com ele:",[970,2652],{"src":2653,"alt":2654,"style":2655},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-regular-user-form.webp","Criando uma conta de usuário comum no painel do TREK","max-width: 420px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2657,2658],{},"Depois de iniciar sessão, adicione uma chave de acesso ou configure a autenticação de dois fatores (2FA) para reforçar a segurança da conta:",[970,2660],{"src":2661,"alt":2662,"style":2663},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-user-security-passkey-2fa-setup.webp","Configurando as configurações de segurança do usuário com Passkeys e 2FA","max-width: 381px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2665,1183,2666,2669],{},[442,2667,2668],{},"+ Add a passkey",", introduza a senha atual e confirme:",[970,2671],{"src":2672,"alt":2673,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-passkey-confirm-password.webp","Confirmando a senha para registrar um novo Passkey físico",[1175,2675,2677],{"id":2676},"_4-testar-a-implantação-importar-dados-de-viagens-passadas","4. Testar a implantação: importar dados de viagens passadas",[429,2679,2680],{},"Uma excelente forma de explorar o TREK é registar o seu histórico de viagens.",[1712,2682,2684],{"id":2683},"_41-criar-a-viagem","4.1 Criar a viagem",[429,2686,1183,2687,2690,2691,2694,2695,2698],{},[442,2688,2689],{},"+ New Trip"," e configure a data de início (",[442,2692,2693],{},"Start Date",") e data de fim (",[442,2696,2697],{},"End Date",") com as datas passadas do seu passeio:",[970,2700],{"src":2701,"alt":2702,"style":2703},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-trip-details.webp","Criando uma nova viagem com intervalos de datas personalizados","max-width: 334px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2705,2706,2707,944],{},"Adicione uma foto de capa (arraste uma ou cole do seu área de transferência) e clique em ",[442,2708,2709],{},"Create New Trip",[970,2711],{"src":2712,"alt":2713,"style":2714},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-cover-image-upload.webp","Configurando uma imagem de capa de viagem de alta qualidade","max-width: 608px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2716,2718],{"id":2717},"_42-importar-as-reservas","4.2 Importar as reservas",[429,2720,2721],{},"Arraste e solte todos os ficheiros de voos, comboios e outros meios de transporte:",[970,2723],{"src":2724,"alt":2725,"style":2726},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-travel-booking-files.webp","Área de arrastar e soltar para importar PDFs de viagem e reservas","max-width: 570px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2728],{"src":2729,"alt":2730,"style":2731},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-booking-pdf-processing-status.webp","Janela de processamento de reserva enviada exibindo a extração","max-width: 377px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2733,2734],{},"Com o modelo de IA ativado, os PDFs de confirmação de reservas são analisados e estruturados automaticamente.",[429,2736,2737,2738,2741],{},"Reveja o resultado do processamento e clique em ",[442,2739,2740],{},"Add"," para registar os detalhes da reserva:",[970,2743],{"src":2744,"alt":2745,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-review-parsed-booking-details.webp","Revisando os detalhes de reserva estruturados extraídos pela IA",[429,2747,2748],{},"Se uma reserva estiver apenas num e-mail, exporte o e-mail como PDF e carregue-o — aplica-se o mesmo fluxo de extração por IA.",[429,2750,2751],{},"As capturas de ecrã seguintes mostram como as reservas são apresentadas:",[429,2753,2754,2758],{},[970,2755],{"src":2756,"alt":2757,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-bookings-timeline-view.webp","Exibição de linha do tempo abrangente das reservas de viagem",[970,2759],{"src":2760,"alt":2761,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-booking-confirmation-details.webp","Visualização detalhada de uma reserva de transporte confirmada",[429,2763,2764,2765,2768],{},"Na página ",[442,2766,2767],{},"Plan",", todos os alojamentos serão indicados no mapa:",[970,2770],{"src":2771,"alt":2772,"style":2773},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-plan-accommodations-map-display.webp","Mapa interativo plotando todas as acomodações de hotel","max-width: 546px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2775,1183,2776,2779],{},[442,2777,2778],{},"Atlas"," na barra de menu superior para aceder à lista (e mapa) de todos os países que já visitou:",[970,2781],{"src":2782,"alt":2783,"style":2784},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-atlas-countries-visited-summary.webp","Visão geral do histórico de viagens no rastreador pessoal do Atlas","max-width: 407px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2786,2788],{"id":2787},"_43-adicionar-companheiros-de-viagem","4.3 Adicionar companheiros de viagem",[429,2790,2504,2791,944],{},[442,2792,2793],{},"Share",[970,2795],{"src":2796,"alt":2797,"style":2798},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-share-options-button.webp","Abrindo o diálogo de compartilhamento de viagem no TREK","max-width: 224px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2800,2801],{},"Na parte inferior de la janela, é possível adicionar convidados:",[970,2803],{"src":2804,"alt":2805,"style":2806},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-add-companions-guests.webp","Adicionando companheiros de viagem e convidados personalizados","max-width: 635px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2808,2810],{"id":2809},"_44-registar-as-despesas","4.4 Registar as despesas",[429,2812,1183,2813,2816],{},[442,2814,2815],{},"Add expense"," para registar despesas adicionais que não sejam reservas, tais como seguro de saúde, transporte local ou cartões SIM:",[970,2818],{"src":2819,"alt":2820,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-custom-expense-form.webp","Inserindo dados detalhados de gastos no formulário de despesas",[970,2822],{"src":2823,"alt":2824,"style":2825},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-expenses-list-billing-split.webp","Divisão de despesas e livro de rastreamento de custos","max-width: 526px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2827,2829],{"id":2828},"_45-segmentos-da-viagem","4.5 Segmentos da viagem",[429,2831,2832],{},"Esta funcionalidade requer que o plugin Trip Segment esteja instalado.",[429,2834,2835],{},"As viagens longas são divididas de forma elegante em segmentos, cada etapa exibindo as suas próprias reservas, pontos turísticos e custos:",[970,2837],{"src":2838,"alt":2839,"style":2840},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-overview-display.webp","Desmembrando um itinerário complexo em segmentos de viagem","max-width: 465px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2842],{"src":2843,"alt":2844,"style":2845},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segment-itinerary-details.webp","Segmento de viagem ativo exibindo locais e programações","max-width: 596px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2847],{"src":2848,"alt":2849,"style":2850},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-interactive-map.webp","Mapeando diferentes trechos da viagem na linha do tempo","max-width: 605px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2852,2854],{"id":2853},"_46-criar-um-diário-de-viagem-journey-e-consultar-o-seu-atlas","4.6 Criar um diário de viagem (Journey) e consultar o seu atlas",[429,2856,2857,2858,2861],{},"Agrupe as suas viagens num ",[442,2859,2860],{},"Journey"," (diário de rota) e escreva relatos para partilhar as aventuras com os seus amigos:",[970,2863],{"src":2864,"alt":2865,"style":2866},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-journey-group.webp","Consolidando várias viagens em uma jornada visual (Journey)","max-width: 441px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2868],{"src":2869,"alt":2870,"style":2871},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-timeline-story-writing.webp","Escrevendo histórias visuais no painel de jornada","max-width: 443px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2873],{"src":2874,"alt":2875,"style":2876},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-gallery-media-grid.webp","Coleção de mídias e grade de galeria dentro de uma jornada","max-width: 440px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2878],{"src":2879,"alt":2880,"style":2881},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-public-share-link.webp","Gerando links públicos de compartilhamento para jornadas colaborativas","max-width: 532px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1175,2883,2885],{"id":2884},"_5-desenhar-itinerários-personalizados-e-listas-de-bagagem","5. Desenhar itinerários personalizados e listas de bagagem",[429,2887,1183,2888,2890],{},[442,2889,2689],{},", introduza um nome e configure as datas:",[970,2892],{"src":2893,"alt":2894,"style":2895},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-planning-new-trip-setup.webp","Caixa de diálogo inicial para criar uma viagem sem data","max-width: 432px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2897,2898,2901],{},[442,2899,2900],{},"Se ainda não definiu as datas do seu roteiro, deixe ambos os campos em branco."," Irá surgir um campo indicando o \"número de dias\" (até 365). Planeie primeiro, defina as datas mais tarde.",[1712,2903,2905],{"id":2904},"_51-adicionar-locais","5.1 Adicionar locais",[429,2907,2908],{},"Este costuma ser o passo mais moroso de qualquer planeamento de viagem, e o TREK tem várias formas de acelerá-lo:",[970,2910],{"src":2911,"alt":2912,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-places-methods-overview.webp","Métodos multicanais para adicionar novos locais aos itinerários",[429,2914,2915,2918],{},[442,2916,2917],{},"1. Clique com o botão direito no mapa"," para criar um local nessa posição exata (o endereço é geocodificado de forma reversa automaticamente):",[970,2920],{"src":2921,"alt":2922,"style":2923},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-map-location.webp","Clicando com o botão direito no mapa para fixar localizações","max-width: 632px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2925],{"src":2926,"alt":2927,"style":2928},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-reverse-geocode-address.webp","Geocodificação reversa automática das coordenadas selecionadas no mapa","max-width: 628px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2930,2931,2934],{},[442,2932,2933],{},"2. Clique em + Add Place\u002FActivity"," e pesquise por nome:",[970,2936],{"src":2937,"alt":2938,"style":2939},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-search-place-by-name-input.webp","Buscando locais do mundo real usando entradas de texto","max-width: 642px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2941],{"src":2942,"alt":2943,"style":2944},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-select-place-search-results-list.webp","Exibindo resultados de busca de locais com sobreposição de endereços","max-width: 594px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2946],{"src":2947,"alt":2948,"style":2949},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-place-details-rich-info-card.webp","Cartão de informações abrangente do local com avaliações e notas","max-width: 568px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2951,2952,2955,2956,703,2959,2962],{},[442,2953,2954],{},"3. Cole um URL do Google Maps"," (",[433,2957,2958],{},"maps.app.goo.gl\u002F…",[433,2960,2961],{},"maps.google.com\u002F…",") no campo de pesquisa. O TREK extrairá o nome, o endereço e as coordenadas automaticamente:",[970,2964],{"src":2965,"alt":2966,"style":2528},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-paste-google-maps-share-link.webp","Extraindo localizações diretamente de links de compartilhamento copiados do Google Maps",[970,2968],{"src":2969,"alt":2970,"style":2971},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-parsed-location.webp","Extração de coordenadas bem-sucedida a partir de URL do Maps","max-width: 543px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2973,2974,2977,2978,2981,2982,436,2985,2988,2989,2992],{},[442,2975,2976],{},"4. Importação em lote"," — o caminho mais simples. Se já tem uma lista de locais pendentes no Google Maps, exporte-a como ",[433,2979,2980],{},".gpx"," (os formatos ",[433,2983,2984],{},".kml",[433,2986,2987],{},".kmz"," também funcionam) e clique em ",[442,2990,2991],{},"Import file"," no painel direito para carregar tudo de uma só vez:",[970,2994],{"src":2995,"alt":2996,"style":2997},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-bulk-import-places-gpx-file.webp","Realizando importações em lote de locais usando arquivos GPX ou KML","max-width: 389px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2999,3000],{},"Adicione primeiro todos os pontos de interesse, independentemente de caberem ou não na agenda. Pode distribuí-los por dias específicos mais tarde.",[1712,3002,3004],{"id":3003},"_52-planos-diários-e-notas","5.2 Planos diários e notas",[429,3006,3007],{},"O plano diário organiza os locais por dias sequenciais. É uma lista desdobrável por cada dia, e tudo funciona com o recurso de arrastar e soltar:",[970,3009],{"src":3010,"alt":3011,"style":3012},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-drag-drop-ordering.webp","Personalizando rotas diárias com ações de arrastar e soltar","max-width: 496px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3014,3015],{},"Os detalhes essenciais que fazem a diferença:",[583,3017,3018,3028,3038,3048],{},[586,3019,3020,3023,3024],{},[442,3021,3022],{},"Transporte entre paragens",": o ícone de autocarro no canto superior esquerdo de um dia adiciona transportes intermédios (comboios, autocarros ou voos dentro do mesmo dia):\n",[970,3025],{"src":3026,"alt":3027,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-commuting-transport-button.webp","Registrando o transporte de deslocamento entre os segmentos do dia",[586,3029,3030,3033,3034],{},[442,3031,3032],{},"Notas do diárias",": o ícone de notas no canto inferior esquerdo adiciona notas identificadas com emojis — \"arranque matinal hoje\", \"este museu necessita de reserva prévia\":\n",[970,3035],{"src":3036,"alt":3037,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-icon-tagged-notes-button.webp","Adicionando notas personalizadas com ícones visíveis aos dias",[586,3039,3040,3043,3044],{},[442,3041,3042],{},"Horários definidos",": arraste um local do painel direito para um dia e atribua-lhe uma hora. Os locais com horário definido são ligados automaticamente no mapa:\n",[970,3045],{"src":3046,"alt":3047,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-timed-places-routing.webp","Rotas de trânsito calculadas automaticamente entre locais com horário definido",[586,3049,3050,3051,3056,3057,3060,3061,728],{},"Consulte a ",[635,3052,3055],{"href":3053,"rel":3054},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[667],"página wiki de Planos Diários e Notas"," para mais informações sobre ",[442,3058,3059],{},"Otimização de rotas"," e o ",[442,3062,3063],{},"Clima",[1712,3065,3067],{"id":3066},"_53-coleções-listas-de-locais-reutilizáveis","5.3 Coleções: listas de locais reutilizáveis",[429,3069,3070,3071,3074],{},"As Coleções permitem aos utilizadores guardar listas de locais independentemente de qualquer viagem. Podem ser partilhadas com amigos e estarem preparadas para a próxima jornada. Os locais são ",[442,3072,3073],{},"copiados"," para as viagens, pelo que a edição de um ponto num itinerário nunca altera a sua coleção original e vice-versa.",[429,3076,1183,3077,3080],{},[442,3078,3079],{},"Collections"," na barra de menu superior:",[970,3082],{"src":3083,"alt":3084,"style":3085},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-dashboard-view.webp","Acessando coleções personalizadas do usuário para locais salvos","max-width: 495px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3087,1183,3088,3091],{},[442,3089,3090],{},"+ New list"," para criar uma nova:",[970,3093],{"src":3094,"alt":3095,"style":3096},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-create-new-list.webp","Criando listas personalizadas nas coleções do usuário","max-width: 269px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3098,1183,3099,3102],{},[442,3100,3101],{},"+ Add a place"," e preencha os dados:",[970,3104],{"src":3105,"alt":3106,"style":3107},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-add-place-manually-form.webp","Entrada manual de formulário para preencher listas de coleções personalizadas","max-width: 271px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3109,3110,3113],{},[442,3111,3112],{},"Nota:"," a barra de pesquisa dentro da janela \"Add a place\" parece não funcionar, pelo que terá de inserir os detalhes manualmente.",[429,3115,3116],{},"Si as coordenadas geográficas dos locais estiverem disponíveis, estes aparecerão no mapa:",[970,3118],{"src":3119,"alt":3120,"style":3121},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-map-places-display.webp","Visualizando locais das coleções personalizadas em um mapa interativo","max-width: 592px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3123,3124,3125,944],{},"Para organizar os locais com etiquetas (labels), clique no ícone da ",[442,3126,3127],{},"caixa de seleção",[970,3129],{"src":3130,"alt":3131,"style":3132},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-select-places-tickbox.webp","Modo de seleção para etiquetagem em lote de locais salvos","max-width: 662px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3134,3135,3136,944],{},"Selecione os locais que pretende agrupar e clique em ",[442,3137,3138],{},"Assign label",[970,3140],{"src":3141,"alt":3142,"style":2971},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","Atribuindo etiquetas descritivas aos locais selecionados",[429,3144,1183,3145,3148],{},[442,3146,3147],{},"Manage labels"," para criar as etiquetas de antemão:",[970,3150],{"src":3151,"alt":3152,"style":3153},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-manage-custom-labels.webp","Criação e gerenciamento de etiquetas personalizadas","max-width: 411px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3155,3156,3157,944],{},"Selecione uma etiqueta e clique em ",[442,3158,3138],{},[970,3160],{"src":3161,"alt":3162,"style":2784},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","Aplicando etiquetas personalizadas a grupos de locais",[1712,3164,3166],{"id":3165},"_54-custos-e-orçamento","5.4 Custos e orçamento",[429,3168,3169],{},"Podemos registar outras despesas para a viagem na página 'Costs'.",[970,3171],{"src":3172,"alt":3173,"style":3012},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-budget-overall-expenses-list.webp","Tabela abrangente de despesas e livro de acerto de contas",[429,3175,3176],{},"Os pagamentos efetuados por companheiros de viagem podem ser adicionados e divididos nessa mesma página.",[429,3178,3179,3180,3183],{},"O painel de acertos executa um algoritmo voraz (greedy) para calcular o ",[442,3181,3182],{},"número mínimo de transferências"," necessárias para liquidar as despesas entre os membros.",[1175,3185,3187],{"id":3186},"_6-aproveitar-o-model-context-protocol-mcp-para-planeamento-de-viagens-com-ia","6. Aproveitar o Model Context Protocol (MCP) para Planeamento de Viagens com IA",[429,3189,3190,3191,3194],{},"O TREK possui um ",[442,3192,3193],{},"servidor MCP (Model Context Protocol) integrado",", o que permite que agentes de IA leiam e editem diretamente os seus dados de viagem — com mais de 150 ferramentas e 30 recursos para itinerários, pontos de interesse, orçamentos, bagagem, reservas e colaboração.",[1712,3196,3198],{"id":3197},"_61-cloudflare-zero-trust","6.1 Cloudflare Zero Trust",[429,3200,3201,3202,3205,3206,728],{},"Devido ao facto de o TREK correr atrás de uma rede ",[635,3203,3204],{"href":363},"Cloudflare Zero Trust",", terá de adicionar o seu domínio à lista de inclusão do Split Tunnels. Caso contrário, terá problemas com a autorização OAuth. Consulte este ticket do GitHub: ",[635,3207,3210],{"href":3208,"rel":3209},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[667],"issue do github",[3212,3213],"article-card",{"description":3214,"image":3215,"image-alt":3216,"label":3217,"min-read":3218,"title":3219,"to":363},"Aprenda a expor e acessar globalmente seu Hermes Agent de forma segura com o Cloudflare WARP e o Zero Trust, sem abrir portas de entrada em seu firewall.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FPT-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","Exposição segura do Hermes Agent em rede privada usando Cloudflare Zero Trust e túnel WARP","Guia relacionado","9","Expor o Hermes Agent em rede privada com Cloudflare WARP",[970,3221],{"src":3222,"alt":3223,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-zero-trust-split-tunnels-domain.webp","Adicionando domínios personalizados ao Split Tunnels do Cloudflare Warp",[1712,3225,3227],{"id":3226},"_62-claude-desktop","6.2 Claude Desktop",[429,3229,1183,3230,3233,3234],{},[442,3231,3232],{},"+ New Client"," para criar um novo cliente de agente de IA:\n",[970,3235],{"src":3236,"alt":3237,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-register-new-mcp-client.webp","Registrando um novo token de cliente personalizado nas configurações",[429,3239,3240,3241,2576,3243,944],{},"Selecione o separador ",[442,3242,1590],{},[442,3244,3245],{},"Register Client",[970,3247],{"src":3248,"alt":3249,"style":3250},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-claude-desktop-client-credentials.webp","Gerando credenciais de cliente para o Claude Desktop","max-width: 354px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3252,3253,3254,3257],{},"É apresentado um ID de cliente e segredo de cliente. Guarde-os num local seguro. De seguida, clique em ",[442,3255,3256],{},"Client Configuration"," para mostrar as definições do MCP:",[970,3259],{"src":3260,"alt":3261,"style":3262},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-client-configuration-block.webp","Obtendo o bloco de configuração pré-formatado do servidor MCP","max-width: 508px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3264,3265,3266,3269],{},"No Claude Desktop, clique em ",[442,3267,3268],{},"Edit Config"," para abrir o ficheiro local de configuração dos servidores MCP:",[970,3271],{"src":3272,"alt":3273,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-config-json.webp","Editando o arquivo JSON de configuração local do MCP do Claude Desktop",[429,3275,3276],{},"Cole a configuração do TREK, substituindo os marcadores de posição pelas suas credenciais:",[455,3278,3280],{"className":1294,"code":3279,"language":1296,"meta":424,"style":424},"  \"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",[433,3281,3282,3295,3307,3325,3337,3347,3358,3369,3414,3418,3422],{"__ignoreMap":424},[463,3283,3284,3287,3289,3291,3293],{"class":465,"line":466},[463,3285,3286],{"class":504},"  \"",[463,3288,1287],{"class":480},[463,3290,512],{"class":504},[463,3292,734],{"class":1311},[463,3294,1314],{"class":504},[463,3296,3297,3299,3301,3303,3305],{"class":465,"line":473},[463,3298,1303],{"class":504},[463,3300,2453],{"class":1322},[463,3302,512],{"class":504},[463,3304,944],{"class":504},[463,3306,1550],{"class":504},[463,3308,3309,3311,3313,3315,3317,3319,3321,3323],{"class":465,"line":484},[463,3310,1319],{"class":504},[463,3312,1323],{"class":494},[463,3314,512],{"class":504},[463,3316,944],{"class":504},[463,3318,505],{"class":504},[463,3320,495],{"class":480},[463,3322,512],{"class":504},[463,3324,1336],{"class":504},[463,3326,3327,3329,3331,3333,3335],{"class":465,"line":491},[463,3328,1319],{"class":504},[463,3330,1343],{"class":494},[463,3332,512],{"class":504},[463,3334,944],{"class":504},[463,3336,1350],{"class":504},[463,3338,3339,3341,3343,3345],{"class":465,"line":536},[463,3340,1355],{"class":504},[463,3342,1358],{"class":480},[463,3344,512],{"class":504},[463,3346,1336],{"class":504},[463,3348,3349,3351,3354,3356],{"class":465,"line":541},[463,3350,1355],{"class":504},[463,3352,3353],{"class":480},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[463,3355,512],{"class":504},[463,3357,1336],{"class":504},[463,3359,3360,3362,3365,3367],{"class":465,"line":554},[463,3361,1355],{"class":504},[463,3363,3364],{"class":480},"--static-oauth-client-info",[463,3366,512],{"class":504},[463,3368,1336],{"class":504},[463,3370,3371,3373,3375,3378,3381,3383,3385,3387,3390,3392,3394,3396,3399,3401,3403,3405,3408,3410,3412],{"class":465,"line":559},[463,3372,1355],{"class":504},[463,3374,2295],{"class":480},[463,3376,3377],{"class":1311},"\\\"",[463,3379,3380],{"class":480},"client_id",[463,3382,3377],{"class":1311},[463,3384,734],{"class":480},[463,3386,3377],{"class":1311},[463,3388,3389],{"class":480},"\u003Cyour_client_id>",[463,3391,3377],{"class":1311},[463,3393,741],{"class":480},[463,3395,3377],{"class":1311},[463,3397,3398],{"class":480},"client_secret",[463,3400,3377],{"class":1311},[463,3402,734],{"class":480},[463,3404,3377],{"class":1311},[463,3406,3407],{"class":480},"\u003Cyour_client_secret>",[463,3409,3377],{"class":1311},[463,3411,2301],{"class":480},[463,3413,551],{"class":504},[463,3415,3416],{"class":465,"line":571},[463,3417,1398],{"class":504},[463,3419,3420],{"class":465,"line":2022},[463,3421,1403],{"class":504},[463,3423,3424,3427],{"class":465,"line":2028},[463,3425,3426],{"class":504},"  }",[463,3428,1336],{"class":1311},[429,3430,3431,3432,944],{},"Reinicie o Claude Desktop, e o servidor do TREK passará a ser exibido como ligado em ",[442,3433,3434],{},"Local MCP servers",[970,3436],{"src":3437,"alt":3438,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-trek-server-connected.webp","Verificando o status de conexão ativa do TREK dentro da interface do Claude",[429,3440,3441],{},"Agora envie uma instrução (prompt):",[970,3443],{"src":3444,"alt":3445,"style":3446},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-natural-language-prompt.webp","Instruindo o Claude em linguagem natural para manipular dados de viagem","max-width: 550px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3448,3449],{},"Vamos adicionar uma despesa usando linguagem natural:",[455,3451,3454],{"className":3452,"code":3453,"language":1622,"meta":424},[1620],"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",[433,3455,3453],{"__ignoreMap":424},[970,3457],{"src":3458,"alt":3459,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-expense-response.webp","Claude utilizando ferramentas para registrar uma despesa automaticamente",[429,3461,3462,3463,3466],{},"Ao verificar a página ",[442,3464,3465],{},"Costs",", a despesa surge criada com a indicação \"Ninguém pagou ainda\", uma vez que nenhum pagador foi mencionado na ordem:",[970,3468],{"src":3469,"alt":3470,"style":2427},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-page-mcp-parsed-expense.webp","Confirmando a despesa de IA recém-analisada na visualização de custos",[429,3472,3473],{},"Adicionar elementos à lista de bagagem funciona exatamente da mesma maneira:",[970,3475],{"src":3476,"alt":3477,"style":3478},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-packing-items.webp","Claude adicionando itens de bagagem usando instruções em linguagem natural","max-width: 631px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3480,3481,3482,3485],{},"Atualize a página ",[442,3483,3484],{},"Packing List"," e verá os três elementos adicionados:",[970,3487],{"src":3488,"alt":3489,"style":3490},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-packing-list-mcp-parsed-items.webp","Confirmando os itens de bagagem recém-analisados na página de lista de bagagem","max-width: 312px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,3492,3494],{"id":3493},"_63-gemini-cli-registo-dinâmico","6.3 Gemini CLI (registo dinâmico)",[429,3496,3497,3498,3501,3502,944],{},"A Gemini CLI suporta ",[442,3499,3500],{},"registo dinâmico",", pelo que não necessita de um cliente pré-criado. Adicione isto a ",[433,3503,3504],{},".gemini\u002Fsettings.json",[455,3506,3508],{"className":1294,"code":3507,"language":1296,"meta":424,"style":424},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[433,3509,3510,3522,3540,3552,3564,3568],{"__ignoreMap":424},[463,3511,3512,3514,3516,3518,3520],{"class":465,"line":466},[463,3513,1303],{"class":504},[463,3515,2453],{"class":480},[463,3517,512],{"class":504},[463,3519,734],{"class":1311},[463,3521,1314],{"class":504},[463,3523,3524,3526,3528,3530,3532,3534,3536,3538],{"class":465,"line":473},[463,3525,1319],{"class":504},[463,3527,1524],{"class":1322},[463,3529,512],{"class":504},[463,3531,944],{"class":504},[463,3533,505],{"class":504},[463,3535,3353],{"class":480},[463,3537,512],{"class":504},[463,3539,1336],{"class":504},[463,3541,3542,3544,3546,3548,3550],{"class":465,"line":484},[463,3543,1319],{"class":504},[463,3545,1543],{"class":1322},[463,3547,512],{"class":504},[463,3549,944],{"class":504},[463,3551,1550],{"class":504},[463,3553,3554,3556,3558,3560,3562],{"class":465,"line":491},[463,3555,1355],{"class":504},[463,3557,1557],{"class":494},[463,3559,512],{"class":504},[463,3561,944],{"class":504},[463,3563,1564],{"class":504},[463,3565,3566],{"class":465,"line":536},[463,3567,1569],{"class":504},[463,3569,3570],{"class":465,"line":541},[463,3571,1403],{"class":504},[429,3573,3574,3575,3578,3579,3582,3583],{},"Execute ",[433,3576,3577],{},"gemini"," no terminal e clique em ",[442,3580,3581],{},"Approve"," quando a janela de autorização surgir:\n",[970,3584],{"src":3585,"alt":3586,"style":3587},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fmcp-client-oauth-authorization-prompt.webp","Aprovando acesso OAuth para o servidor MCP do TREK","max-width: 488px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3589,3590],{},"De seguida, comece com uma instrução simples:",[970,3592],{"src":3593,"alt":3594,"style":3595},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-prompt-itinerary.webp","Instruindo a CLI do Gemini para buscar itinerários de viagem","max-width: 415px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,3597],{"src":3598,"alt":3599,"style":2876},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-display-itinerary.webp","CLI do Gemini exibindo com sucesso informações estruturadas de viagem",[1712,3601,3603],{"id":3602},"_64-kimi-cli-registo-dinâmico","6.4 Kimi CLI (registo dinâmico)",[429,3605,3606,3607,3610,3611,944],{},"A mesma abordagem — adicione ao ficheiro ",[433,3608,3609],{},"mcp.json"," na pasta ",[433,3612,3613],{},"\u002FUsers\u002F\u003Cuser>\u002F.kimi\u002F",[455,3615,3617],{"className":1294,"code":3616,"language":1296,"meta":424,"style":424},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[433,3618,3619,3631,3651,3670,3687],{"__ignoreMap":424},[463,3620,3621,3623,3625,3627,3629],{"class":465,"line":466},[463,3622,1303],{"class":504},[463,3624,2453],{"class":480},[463,3626,512],{"class":504},[463,3628,734],{"class":1311},[463,3630,1314],{"class":504},[463,3632,3633,3635,3638,3640,3642,3644,3647,3649],{"class":465,"line":473},[463,3634,1319],{"class":504},[463,3636,3637],{"class":1322},"type",[463,3639,512],{"class":504},[463,3641,944],{"class":504},[463,3643,505],{"class":504},[463,3645,3646],{"class":480},"http",[463,3648,512],{"class":504},[463,3650,1336],{"class":504},[463,3652,3653,3655,3658,3660,3662,3664,3666,3668],{"class":465,"line":484},[463,3654,1319],{"class":504},[463,3656,3657],{"class":1322},"url",[463,3659,512],{"class":504},[463,3661,944],{"class":504},[463,3663,505],{"class":504},[463,3665,3353],{"class":480},[463,3667,512],{"class":504},[463,3669,1336],{"class":504},[463,3671,3672,3674,3677,3679,3681,3683,3685],{"class":465,"line":491},[463,3673,1319],{"class":504},[463,3675,3676],{"class":1322},"auth",[463,3678,512],{"class":504},[463,3680,944],{"class":504},[463,3682,505],{"class":504},[463,3684,1543],{"class":480},[463,3686,551],{"class":504},[463,3688,3689],{"class":465,"line":536},[463,3690,1403],{"class":504},[429,3692,3574,3693,3578,3696,760,3698],{},[433,3694,3695],{},"kimi mcp auth trek",[442,3697,3581],{},[970,3699],{"src":3585,"alt":3586,"style":3700},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3702,3703],{},"Uma vez autorizado, as ferramentas disponíveis são listadas:",[970,3705],{"src":3706,"alt":3707,"style":2275},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fkimi-cli-mcp-authorized-tools-list.webp","CLI do Kimi exibindo as ferramentas disponíveis após autorização bem-sucedida",[1175,3709,3711],{"id":3710},"_7-experiência-móvel","7. Experiência móvel",[429,3713,3714],{},"O TREK é uma PWA (progressive web app) em dispositivos móveis. Um service worker guarda em cache os mapas e os dados das APIs, para que o seu itinerário continue legível mesmo sem ligação à Internet. No entanto, as notificações push podem apresentar alguma latência em comparação com uma aplicação nativa.",[1175,3716,3718],{"id":3717},"considerações-finais","Considerações finais",[429,3720,3721],{},"Ligar agentes de IA através de MCP poupa grande parte do cansativo trabalho de inserção manual de reservas de voos e hotéis. Além disso, os agentes podem sugerir pontos de interesse com base nas datas e na época do ano em que viaja. Uma única conversa com um agente de IA pode cobrir todo o processo, desde a pesquisa e criação do itinerario até ao controlo de orçamento e à preparação da bagagem.",[429,3723,3724],{},"Há alguns pequenos pormenores técnicos por ajustar. Por exemplo, ao importar reservas a partir de ficheiros PDF, a moeda assume por omissão a moeda base da viagem em vez da moeda efetivamente paga. Além disso, ao criar uma nova lista em Coleções, qualquer imagem de capa associada durante a criação desaparece ao guardar, embora possa ser readicionada manualmente na edição posterior.",[429,3726,3727,3728,3733],{},"Existe uma ligeira barreira técnica, pois necessita de alojar o sistema no seu próprio servidor. O TREK foi concebido principalmente para pessoas que viajam com frequência e têm elevadas expectativas sobre a organização dos seus dados de viagem. Sugerimos que experimente a demonstração oficial em ",[635,3729,3732],{"href":3730,"rel":3731},"https:\u002F\u002Fdemo.liketrek.com\u002F",[667],"demo.liketrek.com"," antes de equacionar o autohospedamento.",[1175,3735,1809],{"id":1808},[583,3737,3738,3745,3752],{},[586,3739,3740],{},[635,3741,3744],{"href":3742,"rel":3743},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[667],"Início rápido do TREK",[586,3746,3747],{},[635,3748,3751],{"href":3749,"rel":3750},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[667],"Resolução de problemas do TREK",[586,3753,3754],{},[635,3755,3758],{"href":3756,"rel":3757},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[667],"Escopos MCP do TREK",[1028,3760,3761],{},"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":424,"searchDepth":473,"depth":484,"links":3763},[3764,3769,3770,3780,3788,3794,3800,3801,3802],{"id":1899,"depth":484,"text":1900,"children":3765},[3766,3767,3768],{"id":1903,"depth":491,"text":1904},{"id":2095,"depth":491,"text":2096},{"id":2130,"depth":491,"text":2131},{"id":2278,"depth":484,"text":2279},{"id":2326,"depth":484,"text":2327,"children":3771},[3772,3773,3774,3775,3776,3777,3778,3779],{"id":2430,"depth":491,"text":2431},{"id":2441,"depth":491,"text":2442},{"id":2542,"depth":491,"text":2543},{"id":2563,"depth":491,"text":2564},{"id":2598,"depth":491,"text":2599},{"id":2619,"depth":491,"text":2620},{"id":2635,"depth":491,"text":2636},{"id":2646,"depth":491,"text":2647},{"id":2676,"depth":484,"text":2677,"children":3781},[3782,3783,3784,3785,3786,3787],{"id":2683,"depth":491,"text":2684},{"id":2717,"depth":491,"text":2718},{"id":2787,"depth":491,"text":2788},{"id":2809,"depth":491,"text":2810},{"id":2828,"depth":491,"text":2829},{"id":2853,"depth":491,"text":2854},{"id":2884,"depth":484,"text":2885,"children":3789},[3790,3791,3792,3793],{"id":2904,"depth":491,"text":2905},{"id":3003,"depth":491,"text":3004},{"id":3066,"depth":491,"text":3067},{"id":3165,"depth":491,"text":3166},{"id":3186,"depth":484,"text":3187,"children":3795},[3796,3797,3798,3799],{"id":3197,"depth":491,"text":3198},{"id":3226,"depth":491,"text":3227},{"id":3493,"depth":491,"text":3494},{"id":3602,"depth":491,"text":3603},{"id":3710,"depth":484,"text":3711},{"id":3717,"depth":484,"text":3718},{"id":1808,"depth":484,"text":1809},[3804,1039],"travel","2026-09-01","Aprenda a implantar o TREK usando Docker, a protegê-lo com Cloudflare R2 e Caddy, e a usar agentes de IA via MCP para planejar todas as viagens sem esforço.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002FPT-Self-hosted-travel-planner-TREK.webp","Uma ilustração 3D minimalista e sofisticada do painel do planeador de viagens autohospedado TREK num fundo de pergaminho quente.",{"schemaOrg":3810,"robots":1049,"sitemap":3816},[3811,3813],{"@type":3812,"headline":1885,"description":3806},"HowTo",{"@type":3814,"headline":3815,"description":3806},"Article","Como alojar o TREK: O melhor planeador de viagens com IA",{"lastmod":3805},25,{"title":3815,"description":3806,"ogTitle":1885,"ogDescription":3806,"twitterTitle":1885,"twitterDescription":3806},"pt\u002Farticle\u002Fself-hosted-travel-planner-trek",[3821,3822,3823,1056,1879],"Docker","TREK","Caddy","2026-09-03","uBWL-fAL0Rz92WLnscPitCwqC44q4YSJbJuVmgQMof4",[3827,5983,5984],{"id":3828,"title":3829,"author":424,"body":3830,"category":5949,"date":5951,"description":5952,"extension":1042,"image":5953,"imageAlt":5954,"isPublished":487,"meta":5955,"minRead":4245,"navigation":487,"path":383,"seo":5977,"stem":5979,"tags":5980,"updatedAt":1059,"__hash__":5982},"article\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md","Como auto-hospedar o Buzz do Block: Espaço para agentes de IA",{"type":426,"value":3831,"toc":5919},[3832,3835,3841,3848,3852,3855,3893,3897,3903,3941,3945,3949,3963,3969,3974,3978,3982,3995,4001,4049,4075,4079,4088,4094,4098,4101,4285,4289,4333,4340,4347,4353,4401,4407,4434,4438,4442,4469,4497,4502,4544,4552,4831,4835,4880,4885,4892,4897,4901,4924,4927,4933,4936,4940,4948,4954,4957,4963,4966,4994,5000,5006,5009,5015,5019,5022,5025,5028,5034,5037,5043,5049,5055,5060,5064,5075,5082,5088,5091,5097,5101,5108,5114,5121,5125,5131,5194,5207,5261,5264,5333,5336,5352,5358,5362,5408,5414,5417,5423,5426,5432,5436,5452,5468,5474,5571,5574,5580,5591,5640,5646,5652,5664,5680,5683,5689,5693,5700,5722,5731,5829,5840,5846,5853,5859,5862,5868,5871,5877,5880,5883,5886,5916],[429,3833,3834],{},"A fragmentação de contexto é um obstáculo frustrante ao trabalhar com múltiplos agentes de IA. Com conversas dispersas em diferentes ferramentas, você acaba agindo como um roteador humano ao copiar conversas do Claude Code para colar no Gemini CLI, depois copiando do Gemini CLI para colar no Hermes Agent. Essa fricção aumenta quando colegas humanos estão na mesma equipe.",[429,3836,3837],{},[970,3838],{"alt":3839,"src":3840},"A interface de usuário do espaço de trabalho colaborativo Buzz mostrando canais de chat e agentes de IA ativos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[429,3842,3843,3844,3847],{},"O ",[442,3845,3846],{},"Buzz",", um espaço de trabalho colaborativo de código aberto, reúne equipes humanas e agentes de IA em um ambiente único e unificado. Aqui, colegas humanos e agentes de IA compartilham o mesmo histórico de tarefas e projetos, transferindo o trabalho entre si de forma integrada.",[447,3849,3851],{"id":3850},"o-que-é-o-buzz-do-block-o-espaço-de-trabalho-colaborativo-para-agentes-de-ia","O que é o Buzz do Block? O espaço de trabalho colaborativo para agentes de IA",[429,3853,3854],{},"O Buzz é um espaço de trabalho colaborativo de código aberto da Block (empresa de Jack Dorsey) onde humanos e agentes de IA compartilham os mesmos canais e projetos. Ele oferece os seguintes recursos principais:",[583,3856,3857,3863,3869,3875,3881,3887],{},[586,3858,3859,3862],{},[442,3860,3861],{},"Contexto compartilhado:"," Os canais são onde os humanos e agentes colaboram entre si. Todo o histórico de conversas e projetos está contido no canal.",[586,3864,3865,3868],{},[442,3866,3867],{},"Comunicação agente a agente:"," Os agentes podem se comunicar entre si, mesmo em máquinas diferentes. Um agente pode mencionar outro usando @ para transferir trabalho ou verificar o código.",[586,3870,3871,3874],{},[442,3872,3873],{},"Ativação baseada em menção:"," Os agentes só agem quando mencionados com @, caso contrário, permanecem silenciosos. Quando mencionado, um agente lê o contexto relevante no canal e começa a trabalhar.",[586,3876,3877,3880],{},[442,3878,3879],{},"Sistema de identidade unificado:"," Humanos e agentes usam o mesmo sistema de identidade, autenticado por meio de chaves criptográficas.",[586,3882,3883,3886],{},[442,3884,3885],{},"Comandos delegados:"," Você pode conceder a colegas humanos permissão para comandar seus agentes, permitindo que toda a equipe instrua e aproveite os assistentes digitais uns dos outros.",[586,3888,3889,3892],{},[442,3890,3891],{},"Servidores auto-hospedados:"," Como você hospeda o servidor, seus dados permanecem totalmente sob seu controle. Você escolhe quem entra e define suas próprias regras operacionais.",[447,3894,3896],{"id":3895},"a-arquitetura-criptográfica-baseada-em-nostr-do-buzz","A arquitetura criptográfica baseada em Nostr do Buzz",[429,3898,3899],{},[970,3900],{"alt":3901,"src":3902},"Diagrama arquitetônico criptográfico baseado em Nostr do espaço de trabalho de colaboração Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[583,3904,3905,3911,3917,3923,3929,3935],{},[586,3906,3907,3910],{},[442,3908,3909],{},"O relay Nostr atua como o servidor:"," Mensagens, fluxos de trabalho, repositórios e outros eventos são assinados criptograficamente, verificados e armazenados em um servidor relay Nostr. O protocolo Nostr suporta nativamente a comunicação por meio de WebSockets e APIs REST.",[586,3912,3913,3916],{},[442,3914,3915],{},"Identidade criptográfica unificada:"," Tanto os humanos quanto os agentes se autenticam usando suas próprias chaves criptográficas. Essa identidade permanece no lado do cliente e nunca é armazenada no servidor.",[586,3918,3919,3922],{},[442,3920,3921],{},"Membro agente de primeira classe:"," Cada agente possui sua própria identidade, associações de canais e trilha de auditoria. Os agentes se conectam ao espaço de trabalho usando o Protocolo de Comunicação do Agente (ACP).",[586,3924,3925,3928],{},[442,3926,3927],{},"Repositórios Git descentralizados:"," Os repositórios de código são armazenados em armazenamento de objetos compatível com S3, enquanto tarefas, pull requests e revisões de código são rastreados no log de eventos Nostr. Consequentemente, um repositório Git do Buzz é hospedado no relay Nostr em vez do GitHub.",[586,3930,3931,3934],{},[442,3932,3933],{},"O aplicativo Buzz é um cliente Nostr:"," O Buzz é separado do relay Nostr; é um aplicativo cliente para desktop\u002Fdispositivos móveis que se conecta à URL do relay.",[586,3936,3937,3940],{},[442,3938,3939],{},"Pilha de infraestrutura:"," Um banco de dados PostgreSQL gerencia o armazenamento de eventos e a busca em texto completo, o Redis gerencia o envio\u002Frecebimento de mensagens (pub\u002Fsub), e o MinIO compatível com S3 é usado para armazenamento de mídia.",[447,3942,3944],{"id":3943},"como-auto-hospedar-o-relay-buzz-do-block-em-um-vps-linux","Como auto-hospedar o relay Buzz do Block em um VPS Linux",[1175,3946,3948],{"id":3947},"_0-pré-requisitos","0. Pré-requisitos",[583,3950,3951,3954,3957,3960],{},[586,3952,3953],{},"Um VPS Linux",[586,3955,3956],{},"Um domínio que aponte para o seu servidor",[586,3958,3959],{},"Docker e o plugin Docker Compose",[586,3961,3962],{},"Conta da Cloudflare (plano gratuito)",[429,3964,3965,3966,3968],{},"Neste guia, executaremos o relay Nostr em um VPS Ubuntu por trás de uma rede privada ",[635,3967,3219],{"href":363},". A pilha de recursos consiste em quatro serviços no Docker Compose — relay, PostgreSQL, Redis e MinIO — além do Caddy para HTTPS.",[3212,3970],{"description":3971,"image":3215,"image-alt":3972,"label":3217,"min-read":3973,"title":3219,"to":363},"Aprenda a expor e acessar o seu Hermes Agent com segurança globalmente usando Cloudflare WARP e Zero Trust sem abrir portas de entrada no firewall.","Exposição segura do Hermes Agent a uma rede privada usando Cloudflare Zero Trust e túnel WARP","8",[1175,3975,3977],{"id":3976},"_1-dns-da-cloudflare-e-api-token","1. DNS da Cloudflare e API Token",[1712,3979,3981],{"id":3980},"criar-um-api-token-da-cloudflare","Criar um API Token da Cloudflare",[673,3983,3984,3990],{},[586,3985,2504,3986,3989],{},[442,3987,3988],{},"Profile"," no canto superior direito no menu suspenso do ícone do usuário.",[586,3991,1183,3992,728],{},[442,3993,3994],{},"API Tokens",[429,3996,3997],{},[970,3998],{"alt":3999,"src":4000},"Página de perfil do usuário da Cloudflare mostrando o menu de criação de tokens de API","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[673,4002,4003,4008,4014,4034,4039,4043,4046],{"start":484},[586,4004,1183,4005,728],{},[442,4006,4007],{},"Create Token",[586,4009,4010,4011,728],{},"Use o modelo ",[442,4012,4013],{},"Edit zone DNS",[586,4015,4016,4017],{},"Configure o modelo da seguinte maneira:\n",[583,4018,4019,4025],{},[586,4020,4021,4024],{},[442,4022,4023],{},"Permissions",": Zone — DNS — Edit",[586,4026,4027,4030,4031],{},[442,4028,4029],{},"Zone Resources",": Include — Specific zone — ",[433,4032,4033],{},"example.com",[586,4035,1183,4036,728],{},[442,4037,4038],{},"Continue to summary",[586,4040,1183,4041,728],{},[442,4042,4007],{},[586,4044,4045],{},"Copie o token gerado, pois ele não será exibido novamente após fechar a página.",[586,4047,4048],{},"Teste o token gerado no seu terminal para se certificar de que funciona corretamente:",[455,4050,4052],{"className":457,"code":4051,"language":459,"meta":424,"style":424},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[433,4053,4054],{"__ignoreMap":424},[463,4055,4056,4058,4060,4063,4065,4068,4070,4073],{"class":465,"line":466},[463,4057,1919],{"class":494},[463,4059,505],{"class":504},[463,4061,4062],{"class":480},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[463,4064,512],{"class":504},[463,4066,4067],{"class":480}," -H",[463,4069,505],{"class":504},[463,4071,4072],{"class":480},"Authorization: Bearer YOUR_TOKEN_HERE",[463,4074,551],{"class":504},[1712,4076,4078],{"id":4077},"registros-dns","Registros DNS",[583,4080,4081],{},[586,4082,4083,4084,4087],{},"Crie um registro A e configure-o como ",[442,4085,4086],{},"Apenas DNS"," (DNS only).",[429,4089,4090],{},[970,4091],{"alt":4092,"src":4093},"Configurando um registro DNS A para o domínio do Buzz no painel da Cloudflare com status de proxy configurado como apenas DNS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[1175,4095,4097],{"id":4096},"_2-instalar-o-docker-no-ubuntu","2. Instalar o Docker no Ubuntu",[429,4099,4100],{},"Execute os seguintes comandos para instalar o Docker no Ubuntu:",[455,4102,4104],{"className":457,"code":4103,"language":459,"meta":424,"style":424},"# 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",[433,4105,4106,4110,4130,4134,4138,4170,4174,4178,4186,4190,4194,4210,4214,4219,4229,4233,4237,4243,4248,4263,4268,4274],{"__ignoreMap":424},[463,4107,4108],{"class":465,"line":466},[463,4109,1914],{"class":469},[463,4111,4112,4114,4116,4118,4120,4122,4124,4126,4128],{"class":465,"line":473},[463,4113,1919],{"class":494},[463,4115,1922],{"class":480},[463,4117,1925],{"class":480},[463,4119,1928],{"class":504},[463,4121,1931],{"class":494},[463,4123,1934],{"class":480},[463,4125,1937],{"class":480},[463,4127,1940],{"class":480},[463,4129,1943],{"class":480},[463,4131,4132],{"class":465,"line":484},[463,4133,488],{"emptyLinePlaceholder":487},[463,4135,4136],{"class":465,"line":491},[463,4137,1952],{"class":469},[463,4139,4140,4142,4144,4146,4148,4150,4152,4154,4156,4158,4160,4162,4164,4166,4168],{"class":465,"line":536},[463,4141,1957],{"class":476},[463,4143,505],{"class":504},[463,4145,1962],{"class":480},[463,4147,1965],{"class":504},[463,4149,1968],{"class":494},[463,4151,1971],{"class":480},[463,4153,1974],{"class":504},[463,4155,1977],{"class":480},[463,4157,512],{"class":504},[463,4159,1928],{"class":504},[463,4161,1931],{"class":494},[463,4163,1986],{"class":480},[463,4165,1989],{"class":480},[463,4167,1992],{"class":504},[463,4169,1995],{"class":480},[463,4171,4172],{"class":465,"line":541},[463,4173,488],{"emptyLinePlaceholder":487},[463,4175,4176],{"class":465,"line":554},[463,4177,2004],{"class":469},[463,4179,4180,4182,4184],{"class":465,"line":559},[463,4181,2009],{"class":494},[463,4183,2012],{"class":480},[463,4185,2015],{"class":480},[463,4187,4188],{"class":465,"line":571},[463,4189,488],{"emptyLinePlaceholder":487},[463,4191,4192],{"class":465,"line":2022},[463,4193,2025],{"class":469},[463,4195,4196,4198,4200,4202,4204,4206,4208],{"class":465,"line":2028},[463,4197,2009],{"class":494},[463,4199,2012],{"class":480},[463,4201,2035],{"class":480},[463,4203,2038],{"class":480},[463,4205,2041],{"class":480},[463,4207,2044],{"class":480},[463,4209,2047],{"class":480},[463,4211,4212],{"class":465,"line":2050},[463,4213,488],{"emptyLinePlaceholder":487},[463,4215,4216],{"class":465,"line":2055},[463,4217,4218],{"class":469},"# Start automatically when the system boots\n",[463,4220,4221,4223,4225,4227],{"class":465,"line":2061},[463,4222,2009],{"class":494},[463,4224,2086],{"class":480},[463,4226,2089],{"class":480},[463,4228,2092],{"class":480},[463,4230,4231],{"class":465,"line":2070},[463,4232,488],{"emptyLinePlaceholder":487},[463,4234,4235],{"class":465,"line":2075},[463,4236,2058],{"class":469},[463,4238,4239,4241],{"class":465,"line":2081},[463,4240,2064],{"class":494},[463,4242,2067],{"class":480},[463,4244,4246],{"class":465,"line":4245},18,[463,4247,488],{"emptyLinePlaceholder":487},[463,4249,4251,4253,4255,4257,4260],{"class":465,"line":4250},19,[463,4252,2009],{"class":494},[463,4254,2012],{"class":480},[463,4256,2035],{"class":480},[463,4258,4259],{"class":480}," -y",[463,4261,4262],{"class":480}," docker-compose-plugin\n",[463,4264,4266],{"class":465,"line":4265},20,[463,4267,488],{"emptyLinePlaceholder":487},[463,4269,4271],{"class":465,"line":4270},21,[463,4272,4273],{"class":469},"# Verify the compose plugin is installed\n",[463,4275,4277,4279,4282],{"class":465,"line":4276},22,[463,4278,2064],{"class":494},[463,4280,4281],{"class":480}," compose",[463,4283,4284],{"class":480}," version\n",[1175,4286,4288],{"id":4287},"_3-clonar-e-configurar","3. Clonar e configurar",[455,4290,4292],{"className":457,"code":4291,"language":459,"meta":424,"style":424},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[433,4293,4294,4305,4309,4316,4326],{"__ignoreMap":424},[463,4295,4296,4299,4302],{"class":465,"line":466},[463,4297,4298],{"class":494},"git",[463,4300,4301],{"class":480}," clone",[463,4303,4304],{"class":480}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[463,4306,4307],{"class":465,"line":473},[463,4308,488],{"emptyLinePlaceholder":487},[463,4310,4311,4313],{"class":465,"line":484},[463,4312,544],{"class":476},[463,4314,4315],{"class":480}," buzz\u002Fdeploy\u002Fcompose\n",[463,4317,4318,4320,4323],{"class":465,"line":491},[463,4319,562],{"class":494},[463,4321,4322],{"class":480}," .env.example",[463,4324,4325],{"class":480}," .env\n",[463,4327,4328,4331],{"class":465,"line":536},[463,4329,4330],{"class":494},"nano",[463,4332,4325],{"class":480},[429,4334,4335,4336,4339],{},"Modifique ",[433,4337,4338],{},".env"," em grupos:",[583,4341,4342],{},[586,4343,4344],{},[442,4345,4346],{},"Domínio:",[455,4348,4351],{"className":4349,"code":4350,"language":1622},[1620],"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",[433,4352,4350],{"__ignoreMap":424},[583,4354,4355,4365],{},[586,4356,4357,4360,4361,4364],{},[442,4358,4359],{},"Chave do proprietário:"," ",[433,4362,4363],{},"RELAY_OWNER_PUBKEY"," requer sua chave pública hexadecimal de 64 caracteres. Gere uma identidade no aplicativo de desktop primeiro ('Create a new identity key' → copie seu ID público, que está no formato npub), depois converta-o para hexadecimal.",[586,4366,4367,4370],{},[442,4368,4369],{},"Segredos (Secrets):",[583,4371,4372,4382,4395],{},[586,4373,4374,4375,4377,4378,4381],{},"Gere segredos usando esta ",[635,4376,2103],{"href":2102}," ou com ",[433,4379,4380],{},"openssl rand -hex 32"," (execute sete vezes)",[586,4383,4384,4385,734,4388,741,4391,4394],{},"Substitua cada marcador ",[433,4386,4387],{},"CHANGE_ME",[433,4389,4390],{},"BUZZ_RELAY_PRIVATE_KEY",[433,4392,4393],{},"BUZZ_GIT_HOOK_HMAC_SECRET",", as senhas do Postgres\u002FRedis\u002FTypesense e as chaves secretas\u002Facesso do S3.",[586,4396,4397,4398,728],{},"Marcadores restantes são a causa mais comum de loops de reinicialização de contêineres; verifique os seus com ",[433,4399,4400],{},"grep CHANGE_ME .env",[455,4402,4405],{"className":4403,"code":4404,"language":1622},[1620],"    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",[433,4406,4404],{"__ignoreMap":424},[583,4408,4409],{},[586,4410,4411,4414],{},[442,4412,4413],{},"Outros:",[583,4415,4416,4423],{},[586,4417,4418,4419,4422],{},"Adicione ",[433,4420,4421],{},"CLOUDFLARE_API_TOKEN"," como uma variável de ambiente e atribua o token de API gerado anteriormente. Isso é obrigatório para o Caddy.",[586,4424,4425,4426,741,4428,436,4431,728],{},"Buzz é fornecido com padrões abertos — qualquer pessoa que conheça a URL do seu relay pode se autenticar e participar. Defina ",[433,4427,4363],{},[433,4429,4430],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[433,4432,4433],{},"BUZZ_REQUIRE_AUTH_TOKEN=true",[1175,4435,4437],{"id":4436},"_4-habilitar-https-com-caddy","4. Habilitar HTTPS com Caddy",[1712,4439,4441],{"id":4440},"construir-uma-imagem-personalizada-do-caddy-com-o-módulo-dns-da-cloudflare","Construir uma imagem personalizada do Caddy com o módulo DNS da Cloudflare",[583,4443,4444,4455,4466],{},[586,4445,4446,4447,4450,4451,4454],{},"Configuramos o DNS-01 com a Cloudflare para o Caddy. DNS-01 funciona fazendo com que o plug-in grave um registro TXT ",[433,4448,4449],{},"_acme-challenge.buzz.pafor.me"," no ",[442,4452,4453],{},"DNS público",";",[586,4456,4457,4458,4461,4462,4465],{},"Let's Encrypt então consulta o registro na internet pública para verificar o controle do domínio. Isso significa que ",[433,4459,4460],{},"pafor.me"," deve ser uma zona pública em sua conta da Cloudflare — não apenas um nome de host privado que existe apenas no DNS privado do Zero Trust \u002F WARP. Se o ",[433,4463,4464],{},"buzz.pafor.me"," for resolvido apenas de forma privada e não houver uma zona pública, o DNS-01 falhará, exigindo uma abordagem diferente.",[586,4467,4468],{},"Adicione o seguinte ao Caddyfile:",[455,4470,4474],{"className":4471,"code":4472,"language":4473,"meta":424,"style":424},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n","yml",[433,4475,4476,4480,4493],{"__ignoreMap":424},[463,4477,4478],{"class":465,"line":466},[463,4479,1314],{"class":504},[463,4481,4482,4485,4488,4491],{"class":465,"line":473},[463,4483,4484],{"class":480},"  acme_dns cloudflare",[463,4486,4487],{"class":504}," {",[463,4489,4490],{"class":480},"env.CLOUDFLARE_API_TOKEN",[463,4492,2323],{"class":504},[463,4494,4495],{"class":465,"line":484},[463,4496,2323],{"class":504},[583,4498,4499],{},[586,4500,4501],{},"Crie um Dockerfile.caddy com o seguinte conteúdo, que é exigido pelo compose.caddy.yml:",[455,4503,4505],{"className":4471,"code":4504,"language":4473,"meta":424,"style":424},"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",[433,4506,4507,4512,4516,4521,4526,4530,4535,4539],{"__ignoreMap":424},[463,4508,4509],{"class":465,"line":466},[463,4510,4511],{"class":480},"FROM caddy:2-builder AS builder\n",[463,4513,4514],{"class":465,"line":473},[463,4515,488],{"emptyLinePlaceholder":487},[463,4517,4518],{"class":465,"line":484},[463,4519,4520],{"class":480},"RUN xcaddy build \\\n",[463,4522,4523],{"class":465,"line":491},[463,4524,4525],{"class":480},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[463,4527,4528],{"class":465,"line":536},[463,4529,488],{"emptyLinePlaceholder":487},[463,4531,4532],{"class":465,"line":541},[463,4533,4534],{"class":480},"FROM caddy:2-alpine\n",[463,4536,4537],{"class":465,"line":554},[463,4538,488],{"emptyLinePlaceholder":487},[463,4540,4541],{"class":465,"line":559},[463,4542,4543],{"class":480},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[583,4545,4546],{},[586,4547,4335,4548,4551],{},[433,4549,4550],{},"compose.caddy.yml"," para usar a imagem com o módulo da Cloudflare e passar o token de API da Cloudflare:",[455,4553,4555],{"className":4471,"code":4554,"language":4473,"meta":424,"style":424},"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",[433,4556,4557,4565,4572,4585,4589,4596,4603,4612,4622,4632,4639,4646,4656,4663,4673,4683,4689,4701,4712,4719,4726,4733,4740,4751,4759,4766,4771,4779,4787,4795,4806,4814,4821],{"__ignoreMap":424},[463,4558,4559,4563],{"class":465,"line":466},[463,4560,4562],{"class":4561},"swJcz","services",[463,4564,760],{"class":504},[463,4566,4567,4570],{"class":465,"line":473},[463,4568,4569],{"class":4561},"  relay",[463,4571,760],{"class":504},[463,4573,4574,4577,4579,4582],{"class":465,"line":484},[463,4575,4576],{"class":4561},"    ports",[463,4578,944],{"class":504},[463,4580,4581],{"class":1322}," !reset",[463,4583,4584],{"class":504}," []\n",[463,4586,4587],{"class":465,"line":491},[463,4588,488],{"emptyLinePlaceholder":487},[463,4590,4591,4594],{"class":465,"line":536},[463,4592,4593],{"class":4561},"  caddy",[463,4595,760],{"class":504},[463,4597,4598,4601],{"class":465,"line":541},[463,4599,4600],{"class":4561},"    build",[463,4602,760],{"class":504},[463,4604,4605,4608,4610],{"class":465,"line":554},[463,4606,4607],{"class":4561},"      context",[463,4609,944],{"class":504},[463,4611,568],{"class":2123},[463,4613,4614,4617,4619],{"class":465,"line":559},[463,4615,4616],{"class":4561},"      dockerfile",[463,4618,944],{"class":504},[463,4620,4621],{"class":480}," Dockerfile.caddy\n",[463,4623,4624,4627,4629],{"class":465,"line":571},[463,4625,4626],{"class":4561},"    image",[463,4628,944],{"class":504},[463,4630,4631],{"class":480}," buzz-caddy:cloudflare\n",[463,4633,4634,4637],{"class":465,"line":2022},[463,4635,4636],{"class":4561},"    depends_on",[463,4638,760],{"class":504},[463,4640,4641,4644],{"class":465,"line":2028},[463,4642,4643],{"class":4561},"      relay",[463,4645,760],{"class":504},[463,4647,4648,4651,4653],{"class":465,"line":2050},[463,4649,4650],{"class":4561},"        condition",[463,4652,944],{"class":504},[463,4654,4655],{"class":480}," service_healthy\n",[463,4657,4658,4661],{"class":465,"line":2055},[463,4659,4660],{"class":4561},"    environment",[463,4662,760],{"class":504},[463,4664,4665,4668,4670],{"class":465,"line":2061},[463,4666,4667],{"class":4561},"      BUZZ_DOMAIN",[463,4669,944],{"class":504},[463,4671,4672],{"class":480}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[463,4674,4675,4678,4680],{"class":465,"line":2070},[463,4676,4677],{"class":4561},"      CLOUDFLARE_API_TOKEN",[463,4679,944],{"class":504},[463,4681,4682],{"class":480}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[463,4684,4685,4687],{"class":465,"line":2075},[463,4686,4576],{"class":4561},[463,4688,760],{"class":504},[463,4690,4691,4694,4696,4699],{"class":465,"line":2081},[463,4692,4693],{"class":504},"      -",[463,4695,505],{"class":504},[463,4697,4698],{"class":480},"${CADDY_HTTP_PORT:-80}:80",[463,4700,551],{"class":504},[463,4702,4703,4705,4707,4710],{"class":465,"line":4245},[463,4704,4693],{"class":504},[463,4706,505],{"class":504},[463,4708,4709],{"class":480},"${CADDY_HTTPS_PORT:-443}:443",[463,4711,551],{"class":504},[463,4713,4714,4717],{"class":465,"line":4250},[463,4715,4716],{"class":4561},"    volumes",[463,4718,760],{"class":504},[463,4720,4721,4723],{"class":465,"line":4265},[463,4722,4693],{"class":504},[463,4724,4725],{"class":480}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[463,4727,4728,4730],{"class":465,"line":4270},[463,4729,4693],{"class":504},[463,4731,4732],{"class":480}," buzz-caddy-data:\u002Fdata\n",[463,4734,4735,4737],{"class":465,"line":4276},[463,4736,4693],{"class":504},[463,4738,4739],{"class":480}," buzz-caddy-config:\u002Fconfig\n",[463,4741,4743,4746,4748],{"class":465,"line":4742},23,[463,4744,4745],{"class":4561},"    restart",[463,4747,944],{"class":504},[463,4749,4750],{"class":480}," unless-stopped\n",[463,4752,4754,4757],{"class":465,"line":4753},24,[463,4755,4756],{"class":4561},"    networks",[463,4758,760],{"class":504},[463,4760,4761,4763],{"class":465,"line":3817},[463,4762,4693],{"class":504},[463,4764,4765],{"class":480}," buzz-net\n",[463,4767,4769],{"class":465,"line":4768},26,[463,4770,488],{"emptyLinePlaceholder":487},[463,4772,4774,4777],{"class":465,"line":4773},27,[463,4775,4776],{"class":4561},"volumes",[463,4778,760],{"class":504},[463,4780,4782,4785],{"class":465,"line":4781},28,[463,4783,4784],{"class":4561},"  buzz-caddy-data",[463,4786,760],{"class":504},[463,4788,4790,4793],{"class":465,"line":4789},29,[463,4791,4792],{"class":4561},"    labels",[463,4794,760],{"class":504},[463,4796,4798,4801,4803],{"class":465,"line":4797},30,[463,4799,4800],{"class":4561},"      com.buzz.volume",[463,4802,944],{"class":504},[463,4804,4805],{"class":480}," caddy-data\n",[463,4807,4809,4812],{"class":465,"line":4808},31,[463,4810,4811],{"class":4561},"  buzz-caddy-config",[463,4813,760],{"class":504},[463,4815,4817,4819],{"class":465,"line":4816},32,[463,4818,4792],{"class":4561},[463,4820,760],{"class":504},[463,4822,4824,4826,4828],{"class":465,"line":4823},33,[463,4825,4800],{"class":4561},[463,4827,944],{"class":504},[463,4829,4830],{"class":480}," caddy-config\n",[1712,4832,4834],{"id":4833},"iniciar-os-contêineres-docker","Iniciar os contêineres Docker",[455,4836,4838],{"className":457,"code":4837,"language":459,"meta":424,"style":424},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[433,4839,4840,4863,4867,4872],{"__ignoreMap":424},[463,4841,4842,4844,4846,4849,4852,4854,4857,4860],{"class":465,"line":466},[463,4843,2064],{"class":494},[463,4845,4281],{"class":480},[463,4847,4848],{"class":480}," -f",[463,4850,4851],{"class":480}," compose.yml",[463,4853,4848],{"class":480},[463,4855,4856],{"class":480}," compose.caddy.yml",[463,4858,4859],{"class":480}," up",[463,4861,4862],{"class":480}," -d\n",[463,4864,4865],{"class":465,"line":473},[463,4866,488],{"emptyLinePlaceholder":487},[463,4868,4869],{"class":465,"line":484},[463,4870,4871],{"class":469},"#Check the Docker status\n",[463,4873,4874,4876,4878],{"class":465,"line":491},[463,4875,2064],{"class":494},[463,4877,4281],{"class":480},[463,4879,2270],{"class":480},[970,4881],{"src":4882,"alt":4883,"style":4884},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","Janela de terminal exibindo contêineres em execução para os serviços do Buzz via docker compose ps","max-width: 700px; width: 100%; height: auto;",[429,4886,4887,4888,4891],{},"Abra o seu navegador e navegue até ",[433,4889,4890],{},"http:\u002F\u002Fbuzz.pafor.me"," para verificar se o relay está funcionando.",[970,4893],{"src":4894,"alt":4895,"style":4896},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","Verificação no navegador mostrando resposta bem-sucedida do relay auto-hospedado do Buzz do Block","max-width: 500px; width: 100%; height: auto;",[1175,4898,4900],{"id":4899},"passo-5-backups-desde-o-primeiro-dia","Passo 5: Backups desde o primeiro dia",[455,4902,4904],{"className":457,"code":4903,"language":459,"meta":424,"style":424},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[433,4905,4906,4917],{"__ignoreMap":424},[463,4907,4908,4911,4914],{"class":465,"line":466},[463,4909,4910],{"class":494},"mkdir",[463,4912,4913],{"class":480}," -p",[463,4915,4916],{"class":480}," \u002Fbuzz_backups\n",[463,4918,4919,4922],{"class":465,"line":473},[463,4920,4921],{"class":494},"crontab",[463,4923,481],{"class":480},[429,4925,4926],{},"Adicione um trabalho cron de backup noturno do banco de dados:",[455,4928,4931],{"className":4929,"code":4930,"language":1622},[1620],"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",[433,4932,4930],{"__ignoreMap":424},[429,4934,4935],{},"Nota: Trate BUZZ_RELAY_PRIVATE_KEY como permanente. Os eventos assinados por ela falharão na verificação se a chave for alterada; um banco de dados restaurado emparejado com uma nova chave não será tratado como o mesmo relay.",[447,4937,4939],{"id":4938},"configurando-o-cliente-desktop-buzz-e-as-identidades-nostr","Configurando o cliente desktop Buzz e as identidades Nostr",[429,4941,4942,4943,4947],{},"Baixe o aplicativo desktop do Buzz em ",[635,4944,4945],{"href":4945,"rel":4946},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[667]," e inicie-o. Preencha as informações do perfil até chegar à página \"Join or create a community\".",[429,4949,4950],{},[970,4951],{"alt":4952,"src":4953},"Tela de configuração inicial do cliente desktop Buzz para participar ou criar uma comunidade","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[429,4955,4956],{},"Clique em \"Join a community\" e copie a sua chave pública.",[429,4958,4959],{},[970,4960],{"alt":4961,"src":4962},"Exibição do cliente Buzz mostrando a identidade da chave pública antes de participar da comunidade","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",[429,4964,4965],{},"Execute o seguinte comando no VPS para se adicionar como o primeiro membro:",[455,4967,4969],{"className":457,"code":4968,"language":459,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[433,4970,4971],{"__ignoreMap":424},[463,4972,4973,4975,4977,4979,4982,4985,4988,4991],{"class":465,"line":466},[463,4974,2064],{"class":494},[463,4976,4281],{"class":480},[463,4978,2379],{"class":480},[463,4980,4981],{"class":480}," relay",[463,4983,4984],{"class":480}," buzz-admin",[463,4986,4987],{"class":480}," add-member",[463,4989,4990],{"class":480}," --pubkey",[463,4992,4993],{"class":480}," npub1yourkeyhere\n",[429,4995,4418,4996,4999],{},[433,4997,4998],{},"wss:\u002F\u002Fbuzz.pafor.me"," como a URL da comunidade e clique em \"Next\".",[429,5001,5002],{},[970,5003],{"alt":5004,"src":5005},"Inserindo a URL do relay da comunidade auto-hospedada no aplicativo desktop Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[429,5007,5008],{},"Digite um nome e clique no botão Next.",[429,5010,5011],{},[970,5012],{"alt":5013,"src":5014},"Tela de configuração de perfil no aplicativo Buzz para inserir o nome de exibição","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-profile-name-input.webp",[1175,5016,5018],{"id":5017},"canais-channels-e-agentes","Canais (Channels) e Agentes",[429,5020,5021],{},"Canais são grupos de tarefas ou projetos. Crie um canal por tarefa ou projeto e inclua os humanos e agentes.",[429,5023,5024],{},"Tudo dentro de um canal é compartilhado automaticamente, eliminando a necessidade de instruir cada membro individualmente. Cada agente pode ser mencionado usando @ e lê as mensagens relevantes. Além disso, os agentes podem se mencionar usando @ entre si.",[429,5026,5027],{},"Vamos enviar uma mensagem direta (DM) para um agente pré-configurado",[429,5029,5030],{},[970,5031],{"alt":5032,"src":5033},"Enviando mensagem direta para um agente de IA no cliente desktop colaborativo Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[429,5035,5036],{},"Vamos criar um canal e adicionar alguns agentes a ele",[429,5038,5039],{},[970,5040],{"alt":5041,"src":5042},"Criando um novo canal de tarefa ou projeto no aplicativo desktop 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",[429,5044,5045],{},[970,5046],{"alt":5047,"src":5048},"Adicionando membro humano e agentes de IA ao canal recém-criado","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",[429,5050,5051],{},[970,5052],{"alt":5053,"src":5054},"Visualização do canal ativo exibindo histórico de chat consolidado e tarefas do projeto","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[970,5056],{"src":5057,"alt":5058,"style":5059},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-active-agents.webp","Visualização detalhada dos agentes de IA ativos integrados no canal do projeto colaborativo","max-width: 367px; width: 100%; height: auto;",[1175,5061,5063],{"id":5062},"habilitar-runtimes-de-agentes","Habilitar runtimes de agentes",[429,5065,5066,5067,5070,5071,5074],{},"Os runtimes predefinidos dependem da descoberta automática que detecta os binários de inicialização (como ",[433,5068,5069],{},"hermes-acp",") em diretórios padrão como ",[433,5072,5073],{},"~\u002F.local\u002Fbin",". Se uma ferramenta foi instalada em um local não padrão, o Buzz não poderá resolvê-la.",[429,5076,5077,5078,5081],{},"Para o Kimi Code, o ID do agente é kimi, e o Buzz procura o seu binario em ",[433,5079,5080],{},"~\u002F.local\u002Fbin\u002Fkimi",". Um link simbólico resolve o problema:",[455,5083,5086],{"className":5084,"code":5085,"language":1622},[1620],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[433,5087,5085],{"__ignoreMap":424},[429,5089,5090],{},"O Kimi Code agora aparece em runtimes de agentes.",[429,5092,5093],{},[970,5094],{"alt":5095,"src":5096},"Configurações do aplicativo Buzz exibindo runtimes de agentes de IA configurados, incluindo Kimi","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[1175,5098,5100],{"id":5099},"projetos-e-repositórios","Projetos e Repositórios",[429,5102,5103,5104,5107],{},"Primeiro, ative o recurso '",[442,5105,5106],{},"Projects","' em Settings → Experiments:",[429,5109,5110],{},[970,5111],{"alt":5112,"src":5113},"Habilitando o recurso experimental Projects na guia de configurações do Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[429,5115,5116,5117,5120],{},"Atualmente, um projeto deve ser criado usando o ",[433,5118,5119],{},"buzz-cli"," (embora a criação direta de projetos a partir da interface do usuário esteja planejada para uma versão futura).",[1712,5122,5124],{"id":5123},"instalar-buzz-cli","Instalar buzz-cli",[429,5126,5127,5128,5130],{},"Execute os seguintes comandos para instalar o ",[433,5129,5119],{}," no VPS:",[455,5132,5134],{"className":457,"code":5133,"language":459,"meta":424,"style":424},"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",[433,5135,5136,5147,5154,5167],{"__ignoreMap":424},[463,5137,5138,5140,5142,5144],{"class":465,"line":466},[463,5139,2009],{"class":494},[463,5141,2012],{"class":480},[463,5143,2035],{"class":480},[463,5145,5146],{"class":480}," cargo\n",[463,5148,5149,5151],{"class":465,"line":473},[463,5150,544],{"class":476},[463,5152,5153],{"class":480}," ~\u002Fbuzz\n",[463,5155,5156,5159,5161,5164],{"class":465,"line":484},[463,5157,5158],{"class":494},"cargo",[463,5160,2035],{"class":480},[463,5162,5163],{"class":480}," --path",[463,5165,5166],{"class":480}," crates\u002Fbuzz-cli\n",[463,5168,5169,5171,5174,5177,5179,5182,5185,5188,5191],{"class":465,"line":491},[463,5170,1957],{"class":476},[463,5172,5173],{"class":504}," '",[463,5175,5176],{"class":480},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[463,5178,2396],{"class":504},[463,5180,5181],{"class":504}," >>",[463,5183,5184],{"class":480}," ~\u002F.bashrc",[463,5186,5187],{"class":504}," &&",[463,5189,5190],{"class":476}," source",[463,5192,5193],{"class":480}," ~\u002F.bashrc\n",[429,5195,5196,5197,5200,5201,5203,5204,5206],{},"Gere um par de chaves privada e pública usando a ",[635,5198,2103],{"href":5199},"\u002Fpt\u002Ftools\u002Fnostr-key-generator"," ou o ",[433,5202,5119],{},". Este par constitui a identidade do ",[433,5205,5119],{}," no relay Nostr.",[455,5208,5210],{"className":457,"code":5209,"language":459,"meta":424,"style":424},"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",[433,5211,5212,5233,5237,5242],{"__ignoreMap":424},[463,5213,5214,5216,5218,5221,5224,5227,5230],{"class":465,"line":466},[463,5215,2064],{"class":494},[463,5217,2143],{"class":480},[463,5219,5220],{"class":480}," --rm",[463,5222,5223],{"class":480}," --entrypoint",[463,5225,5226],{"class":480}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[463,5228,5229],{"class":480}," ghcr.io\u002Fblock\u002Fbuzz:main",[463,5231,5232],{"class":480}," generate-key\n",[463,5234,5235],{"class":465,"line":473},[463,5236,488],{"emptyLinePlaceholder":487},[463,5238,5239],{"class":465,"line":484},[463,5240,5241],{"class":469},"# Use the generated Public Key\n",[463,5243,5244,5246,5248,5250,5252,5254,5256,5258],{"class":465,"line":491},[463,5245,2064],{"class":494},[463,5247,4281],{"class":480},[463,5249,2379],{"class":480},[463,5251,4981],{"class":480},[463,5253,4984],{"class":480},[463,5255,4987],{"class":480},[463,5257,4990],{"class":480},[463,5259,5260],{"class":480}," generated_Public_key\n",[429,5262,5263],{},"Configurar a CLI:",[455,5265,5267],{"className":457,"code":5266,"language":459,"meta":424,"style":424},"# 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",[433,5268,5269,5274,5304,5308],{"__ignoreMap":424},[463,5270,5271],{"class":465,"line":466},[463,5272,5273],{"class":469},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[463,5275,5276,5278,5280,5283,5285,5288,5291,5293,5296,5299,5301],{"class":465,"line":473},[463,5277,1957],{"class":476},[463,5279,5173],{"class":504},[463,5281,5282],{"class":480},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[463,5284,2396],{"class":504},[463,5286,5287],{"class":504},"  >>",[463,5289,5290],{"class":480}," \u002Fhome\u002F",[463,5292,1455],{"class":504},[463,5294,5295],{"class":480},"use",[463,5297,5298],{"class":1311},"r",[463,5300,1464],{"class":504},[463,5302,5303],{"class":480},"\u002F.bashrc\n",[463,5305,5306],{"class":465,"line":484},[463,5307,488],{"emptyLinePlaceholder":487},[463,5309,5310,5312,5314,5317,5319,5321,5323,5325,5327,5329,5331],{"class":465,"line":491},[463,5311,1957],{"class":476},[463,5313,5173],{"class":504},[463,5315,5316],{"class":480},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[463,5318,2396],{"class":504},[463,5320,5287],{"class":504},[463,5322,5290],{"class":480},[463,5324,1455],{"class":504},[463,5326,5295],{"class":480},[463,5328,5298],{"class":1311},[463,5330,1464],{"class":504},[463,5332,5303],{"class":480},[429,5334,5335],{},"Execute o seguinte comando para verificar se o buzz-cli está configurado corretamente:",[455,5337,5339],{"className":457,"code":5338,"language":459,"meta":424,"style":424},"buzz channels list\n",[433,5340,5341],{"__ignoreMap":424},[463,5342,5343,5346,5349],{"class":465,"line":466},[463,5344,5345],{"class":494},"buzz",[463,5347,5348],{"class":480}," channels",[463,5350,5351],{"class":480}," list\n",[429,5353,5354],{},[970,5355],{"alt":5356,"src":5357},"Execução de comando no terminal verificando a configuração do buzz-cli ao listar canais ativos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-cli-channels-list-terminal.webp",[1712,5359,5361],{"id":5360},"criar-um-projeto-com-o-buzz-cli","Criar um projeto com o buzz-cli",[455,5363,5365],{"className":457,"code":5364,"language":459,"meta":424,"style":424},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[433,5366,5367,5372],{"__ignoreMap":424},[463,5368,5369],{"class":465,"line":466},[463,5370,5371],{"class":469},"# --channel refers to the UUID of the channel\n",[463,5373,5374,5376,5379,5382,5385,5388,5391,5393,5396,5398,5401,5403,5406],{"class":465,"line":473},[463,5375,5345],{"class":494},[463,5377,5378],{"class":480}," repos",[463,5380,5381],{"class":480}," create",[463,5383,5384],{"class":480}," --id",[463,5386,5387],{"class":480}," TestKOA",[463,5389,5390],{"class":480}," --name",[463,5392,5173],{"class":504},[463,5394,5395],{"class":480},"Display Name",[463,5397,2396],{"class":504},[463,5399,5400],{"class":480}," --channel",[463,5402,505],{"class":504},[463,5404,5405],{"class":480},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[463,5407,551],{"class":504},[429,5409,5410,5411,5413],{},"Um projeto só pode ser removido por seu proprietário. Como o projeto \"Display Name\" foi criado pelo ",[433,5412,5119],{},", que carece de um comando de remoção, ele não pode ser excluído dessa maneira.",[429,5415,5416],{},"Consulte o aplicativo desktop Buzz para verificar se o projeto foi criado.",[429,5418,5419],{},[970,5420],{"alt":5421,"src":5422},"Visualização de projetos do aplicativo Buzz confirmando a criação bem-sucedida do projeto","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[429,5424,5425],{},"Assim que um projeto estiver disponível em Projects, mais projetos poderão ser adicionados usando o botão \"+\" no canto superior direito.",[429,5427,5428],{},[970,5429],{"alt":5430,"src":5431},"Adicionando novos projetos de desenvolvedor usando o ícone de adição no cliente 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",[1712,5433,5435],{"id":5434},"vincular-repositórios-git-existentes","Vincular repositórios Git existentes",[429,5437,5438,5439,5442,5443,5446,5447,944],{},"Instale o ",[433,5440,5441],{},"git-credential-nostr"," na máquina onde os repositórios git estão instalados. Ele requer o ",[442,5444,5445],{},"git 2.46+"," e a toolchain Rust. Consulte este ",[635,5448,5451],{"href":5449,"rel":5450},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[667],"Readme",[455,5453,5455],{"className":457,"code":5454,"language":459,"meta":424,"style":424},"cargo install --path crates\u002Fgit-credential-nostr\n",[433,5456,5457],{"__ignoreMap":424},[463,5458,5459,5461,5463,5465],{"class":465,"line":466},[463,5460,5158],{"class":494},[463,5462,2035],{"class":480},[463,5464,5163],{"class":480},[463,5466,5467],{"class":480}," crates\u002Fgit-credential-nostr\n",[429,5469,5470,5471,5473],{},"Configure o ",[433,5472,5441],{}," para autorização do relay Buzz:",[455,5475,5477],{"className":457,"code":5476,"language":459,"meta":424,"style":424},"# 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",[433,5478,5479,5484,5500,5513,5517,5522,5531,5558],{"__ignoreMap":424},[463,5480,5481],{"class":465,"line":466},[463,5482,5483],{"class":469},"# 1. Register the helper and enable per-path credentials.\n",[463,5485,5486,5488,5491,5494,5497],{"class":465,"line":473},[463,5487,4298],{"class":494},[463,5489,5490],{"class":480}," config",[463,5492,5493],{"class":480}," --global",[463,5495,5496],{"class":480}," credential.helper",[463,5498,5499],{"class":480}," nostr\n",[463,5501,5502,5504,5506,5508,5511],{"class":465,"line":484},[463,5503,4298],{"class":494},[463,5505,5490],{"class":480},[463,5507,5493],{"class":480},[463,5509,5510],{"class":480}," credential.useHttpPath",[463,5512,1564],{"class":504},[463,5514,5515],{"class":465,"line":491},[463,5516,488],{"emptyLinePlaceholder":487},[463,5518,5519],{"class":465,"line":536},[463,5520,5521],{"class":469},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[463,5523,5524,5526,5528],{"class":465,"line":541},[463,5525,4910],{"class":494},[463,5527,4913],{"class":480},[463,5529,5530],{"class":480}," ~\u002F.nostr\n",[463,5532,5533,5535,5537,5540,5542,5544,5547,5549,5552,5555],{"class":465,"line":554},[463,5534,1957],{"class":476},[463,5536,505],{"class":504},[463,5538,5539],{"class":480},"nsec1...",[463,5541,512],{"class":504},[463,5543,1992],{"class":504},[463,5545,5546],{"class":480}," ~\u002F.nostr\u002Fkey",[463,5548,5187],{"class":504},[463,5550,5551],{"class":494}," chmod",[463,5553,5554],{"class":2123}," 600",[463,5556,5557],{"class":480}," ~\u002F.nostr\u002Fkey\n",[463,5559,5560,5562,5564,5566,5569],{"class":465,"line":559},[463,5561,4298],{"class":494},[463,5563,5490],{"class":480},[463,5565,5493],{"class":480},[463,5567,5568],{"class":480}," nostr.keyfile",[463,5570,5557],{"class":480},[429,5572,5573],{},"Crie um repositório no relay Buzz:",[455,5575,5578],{"className":5576,"code":5577,"language":1622},[1620],"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",[433,5579,5577],{"__ignoreMap":424},[429,5581,5582,5583,5586,5587,5590],{},"No seu primeiro ",[433,5584,5585],{},"git push",", você encontrará um erro ",[433,5588,5589],{},"remote: missing Authorization header",". Para resolver isso, você precisa vincular o ID do repositório a um canal Buzz, pois a associação ao canal dita as permissões de gravação do Git (ACLs):",[455,5592,5594],{"className":457,"code":5593,"language":459,"meta":424,"style":424},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[433,5595,5596,5624,5628,5633],{"__ignoreMap":424},[463,5597,5598,5600,5602,5605,5607,5610,5612,5615,5618,5621],{"class":465,"line":466},[463,5599,5345],{"class":494},[463,5601,5378],{"class":480},[463,5603,5604],{"class":480}," bind",[463,5606,5384],{"class":480},[463,5608,5609],{"class":480}," koa-email-routing",[463,5611,5400],{"class":480},[463,5613,5614],{"class":504}," \u003C",[463,5616,5617],{"class":480},"CHANNEL_UUI",[463,5619,5620],{"class":1311},"D",[463,5622,5623],{"class":504},">\n",[463,5625,5626],{"class":465,"line":473},[463,5627,488],{"emptyLinePlaceholder":487},[463,5629,5630],{"class":465,"line":484},[463,5631,5632],{"class":469},"# push the code again\n",[463,5634,5635,5637],{"class":465,"line":491},[463,5636,4298],{"class":494},[463,5638,5639],{"class":480}," push\n",[429,5641,5642,5643,5645],{},"A verificação do projeto no aplicativo Buzz desktop mostra o seguinte, porque o aplicativo precisa do ",[442,5644,5445],{}," — iniciar o aplicativo diretamente pode carregar uma versão mais antiga do Git:",[429,5647,5648],{},[970,5649],{"alt":5650,"src":5651},"O cliente Buzz exibindo erro de carregamento do Git devido a versão local do Git desatualizada inferior a 2.46","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[429,5653,5654,5655,5658,5659,728],{},"Exporte o PATH por meio de ",[433,5656,5657],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\""," no perfil do shell e inicie o aplicativo Buzz no shell. Consulte este ",[635,5660,5663],{"href":5661,"rel":5662},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[667],"problema",[455,5665,5667],{"className":457,"code":5666,"language":459,"meta":424,"style":424},"open -a Buzz\n",[433,5668,5669],{"__ignoreMap":424},[463,5670,5671,5674,5677],{"class":465,"line":466},[463,5672,5673],{"class":494},"open",[463,5675,5676],{"class":480}," -a",[463,5678,5679],{"class":480}," Buzz\n",[429,5681,5682],{},"Consulte novamente os Projetos no aplicativo Buzz, os detalhes do repositório agora estão carregados.",[429,5684,5685],{},[970,5686],{"alt":5687,"src":5688},"Interface de desktop do Buzz com detalhes do repositório Git e logs de commit carregados com sucesso","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-repository-details-loaded.webp",[447,5690,5692],{"id":5691},"sincronizando-agentes-de-ia-com-o-buzz-mobile-app-via-código-qr","Sincronizando agentes de IA com o Buzz Mobile App via código QR",[429,5694,5695,5696,5699],{},"O emparelhamento do aplicativo móvel Buzz só aceita o protocolo HTTPS e o ",[433,5697,5698],{},"buzz-pair-relay"," não é iniciado por padrão no VPS.",[455,5701,5703],{"className":457,"code":5702,"language":459,"meta":424,"style":424},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[433,5704,5705,5711],{"__ignoreMap":424},[463,5706,5707,5709],{"class":465,"line":466},[463,5708,544],{"class":476},[463,5710,5153],{"class":480},[463,5712,5713,5715,5717,5719],{"class":465,"line":473},[463,5714,5158],{"class":494},[463,5716,2035],{"class":480},[463,5718,5163],{"class":480},[463,5720,5721],{"class":480}," crates\u002Fbuzz-pair-relay\n",[429,5723,5724,5725,5728,5729,944],{},"Adicione o seguinte ao ",[433,5726,5727],{},"compose.yml"," para iniciar o serviço ",[433,5730,5698],{},[455,5732,5734],{"className":4471,"code":5733,"language":4473,"meta":424,"style":424},"  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",[433,5735,5736,5743,5752,5772,5778,5788,5794,5805,5813,5819],{"__ignoreMap":424},[463,5737,5738,5741],{"class":465,"line":466},[463,5739,5740],{"class":4561},"  pair",[463,5742,760],{"class":504},[463,5744,5745,5747,5749],{"class":465,"line":473},[463,5746,4626],{"class":4561},[463,5748,944],{"class":504},[463,5750,5751],{"class":480}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[463,5753,5754,5757,5759,5762,5764,5767,5769],{"class":465,"line":484},[463,5755,5756],{"class":4561},"    entrypoint",[463,5758,944],{"class":504},[463,5760,5761],{"class":504}," [",[463,5763,512],{"class":504},[463,5765,5766],{"class":480},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[463,5768,512],{"class":504},[463,5770,5771],{"class":504},"]\n",[463,5773,5774,5776],{"class":465,"line":491},[463,5775,4660],{"class":4561},[463,5777,760],{"class":504},[463,5779,5780,5783,5785],{"class":465,"line":536},[463,5781,5782],{"class":4561},"      BUZZ_PAIR_RELAY_BIND_ADDR",[463,5784,944],{"class":504},[463,5786,5787],{"class":480}," 0.0.0.0:5000\n",[463,5789,5790,5792],{"class":465,"line":541},[463,5791,4576],{"class":4561},[463,5793,760],{"class":504},[463,5795,5796,5798,5800,5803],{"class":465,"line":554},[463,5797,4693],{"class":504},[463,5799,505],{"class":504},[463,5801,5802],{"class":480},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[463,5804,551],{"class":504},[463,5806,5807,5809,5811],{"class":465,"line":559},[463,5808,4745],{"class":4561},[463,5810,944],{"class":504},[463,5812,4750],{"class":480},[463,5814,5815,5817],{"class":465,"line":571},[463,5816,4756],{"class":4561},[463,5818,760],{"class":504},[463,5820,5821,5824,5827],{"class":465,"line":2022},[463,5822,5823],{"class":504},"      [",[463,5825,5826],{"class":480},"buzz-net",[463,5828,5771],{"class":504},[429,5830,4418,5831,436,5834,5837,5838,944],{},[433,5832,5833],{},"BUZZ_PAIRING_RELAY_URL",[433,5835,5836],{},"BUZZ_PAIR_RELAY_PORT"," ao arquivo ",[433,5839,4338],{},[455,5841,5844],{"className":5842,"code":5843,"language":1622},[1620],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[433,5845,5843],{"__ignoreMap":424},[429,5847,5848,5849,5852],{},"Vá para '",[442,5850,5851],{},"Mobile","' nas configurações da versão desktop do Buzz:",[429,5854,5855],{},[970,5856],{"alt":5857,"src":5858},"Caixa de diálogo de configurações no aplicativo Buzz mostrando a guia de configuração de dispositivos móveis","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[429,5860,5861],{},"Clique em \"Start pairing\" — um código QR é gerado; escaneie esse código QR com o aplicativo Buzz no dispositivo móvel. Ele será emparelhado depois que você clicar em \"Code Match\".",[429,5863,5864],{},[970,5865],{"alt":5866,"src":5867},"Gerando código QR de emparelhamento seguro no cliente de desktop para sincronização móvel do Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[429,5869,5870],{},"Os agentes no aplicativo móvel Buzz só estão disponíveis se estiverem sendo executados no aplicativo de dektop Buzz. O computador desktop deve estar ligado para que os agentes funcionem.",[429,5872,5873],{},[970,5874],{"alt":5875,"src":5876},"Interface do aplicativo móvel do Buzz apresentando os agentes de IA ativos sincronizados","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[447,5878,5879],{"id":3717},"Considerações Finais",[429,5881,5882],{},"Embora o Buzz ainda esteja em estágio muito inicial para ambientes de produção em larga escala, apresentando vários bugs e limitações de interface de usuário, é uma experiência empolgante para pequenas equipes e desenvolvedores individuais. Ele oferece uma prévia de como é realmente um espaço de trabalho colaborativo focado primeiramente em IA.",[447,5884,5885],{"id":1808},"Referências",[583,5887,5888,5895,5902,5909],{},[586,5889,5890],{},[635,5891,5894],{"href":5892,"rel":5893},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[667],"Buzz releases",[586,5896,5897],{},[635,5898,5901],{"href":5899,"rel":5900},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[667],"Introducing Buzz",[586,5903,5904],{},[635,5905,5908],{"href":5906,"rel":5907},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[667],"What is buzz",[586,5910,5911],{},[635,5912,5915],{"href":5913,"rel":5914},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[667],"How to self-host Buzz (Miget)",[1028,5917,5918],{},"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":424,"searchDepth":473,"depth":484,"links":5920},[5921,5922,5923,5937,5946,5947,5948],{"id":3850,"depth":473,"text":3851},{"id":3895,"depth":473,"text":3896},{"id":3943,"depth":473,"text":3944,"children":5924},[5925,5926,5930,5931,5932,5936],{"id":3947,"depth":484,"text":3948},{"id":3976,"depth":484,"text":3977,"children":5927},[5928,5929],{"id":3980,"depth":491,"text":3981},{"id":4077,"depth":491,"text":4078},{"id":4096,"depth":484,"text":4097},{"id":4287,"depth":484,"text":4288},{"id":4436,"depth":484,"text":4437,"children":5933},[5934,5935],{"id":4440,"depth":491,"text":4441},{"id":4833,"depth":491,"text":4834},{"id":4899,"depth":484,"text":4900},{"id":4938,"depth":473,"text":4939,"children":5938},[5939,5940,5941],{"id":5017,"depth":484,"text":5018},{"id":5062,"depth":484,"text":5063},{"id":5099,"depth":484,"text":5100,"children":5942},[5943,5944,5945],{"id":5123,"depth":491,"text":5124},{"id":5360,"depth":491,"text":5361},{"id":5434,"depth":491,"text":5435},{"id":5691,"depth":473,"text":5692},{"id":3717,"depth":473,"text":5879},{"id":1808,"depth":473,"text":5885},[5950,1039,5345],"collaboration","2026-09-08","Aprenda a auto-hospedar o relay Buzz da Block em um VPS Linux com Cloudflare. Crie um espaço de trabalho seguro baseado em Nostr para humanos e agentes IA.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FPT-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","Um cartão tecnológico premium de 16:9 com detalhes em azul profundo e laranja ilustrando como auto-hospedar o relay Buzz do Block em um VPS Ubuntu, apresentando um painel glassmorphic limpo com tipografia centrada.",{"schemaOrg":5956,"robots":1049,"sitemap":5976},[5957,5958],{"@type":1048,"headline":3829,"description":5952,"image":5953},{"@type":3812,"name":3829,"description":5952,"image":5953,"step":5959},[5960,5964,5967,5970,5973],{"@type":5961,"name":5962,"text":5963},"HowToStep","Fase 1: Configuração da Cloudflare","Criar um token de API da Cloudflare e configurar as definições de DNS.",{"@type":5961,"name":5965,"text":5966},"Fase 2: Instalar o Docker","Configurar e instalar o Docker Engine no VPS Ubuntu.",{"@type":5961,"name":5968,"text":5969},"Fase 3: Clonar e configurar","Clonar o repositório e configurar as variáveis do compose.",{"@type":5961,"name":5971,"text":5972},"Fase 4: Integração do Caddy","Compilar um Caddy personalizado com o módulo de desafio DNS da Cloudflare.",{"@type":5961,"name":5974,"text":5975},"Fase 5: Backup automatizado","Configurar uma tarefa cron para fazer backup automático do PostgreSQL.",{"lastmod":3824},{"title":5978,"description":5952,"ogTitle":3829,"ogDescription":5952,"twitterTitle":3829,"twitterDescription":5952},"Como instalar e auto-hospedar o relay Buzz em VPS Ubuntu","pt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[5981,3821,3846,3823,1056],"Nostr","d81fxoKo6iAaIp8OwbrHCSaUSob7w9HyKP0oH38Exq0",{"id":1884,"title":1885,"author":1059,"body":1886,"category":3803,"date":3805,"description":3806,"extension":1042,"image":3807,"imageAlt":3808,"isPublished":487,"meta":3809,"minRead":3817,"navigation":487,"path":379,"seo":3818,"stem":3819,"tags":3820,"updatedAt":3824,"__hash__":3825},{"id":1064,"title":1065,"author":1059,"body":1066,"category":1865,"date":1867,"description":1868,"extension":1042,"image":1869,"imageAlt":1870,"isPublished":487,"meta":1871,"minRead":571,"navigation":487,"path":415,"seo":1876,"stem":1877,"tags":1878,"updatedAt":1059,"__hash__":1882},1792489983695]