[{"data":1,"prerenderedAt":14205},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"category-articles-pt-travel":421},[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",[422,1704,2620,4071,6221,8104,8677,9458,9990,10388,11012,11471,11681,11904,12242,12937,13369,13621],{"id":423,"title":424,"author":425,"body":426,"category":1658,"date":1662,"description":1663,"extension":1664,"image":1665,"imageAlt":1666,"isPublished":1064,"meta":1667,"minRead":1695,"navigation":1064,"path":215,"seo":1696,"stem":1698,"tags":1699,"updatedAt":1702,"__hash__":1703},"article\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md","Conectar DeepSeek Harness ao Buzz: O Gateway de Nostr","",{"type":427,"value":428,"toc":1642},"minimark",[429,437,462,470,473,478,484,529,532,592,596,603,871,874,878,883,890,894,908,912,922,975,982,986,989,1021,1025,1030,1081,1089,1095,1104,1110,1141,1154,1158,1167,1198,1220,1268,1275,1280,1286,1293,1299,1304,1311,1325,1331,1340,1380,1383,1389,1396,1402,1406,1409,1560,1564,1598,1602,1608,1612,1638],[430,431,432],"p",{},[433,434],"img",{"alt":435,"src":436},"Visão geral do gateway de mensagens DeepSeek Harness conectado a um canal do Block Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-nostr-gateway-overview.webp",[430,438,439,440,450,451,456,457,461],{},"O plugin do DeepSeek Harness (DSH), ",[441,442,443],"strong",{},[444,445,449],"a",{"href":446,"rel":447},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway",[448],"nofollow","dsh-message-gateway",", estende o assistente DeepSeek Harness a múltiplas plataformas de mensagens, como Discord, Telegram e WeChat. O repositório do plugin foi bifurcado e estendido para adicionar a plataforma ",[441,452,453],{},[444,454,455],{"href":383},"Como auto-hospedar o Buzz do Block: Espaço para agentes de IA"," à lista. O repositório bifurcado está disponível no GitHub em ",[444,458,459],{"href":459,"rel":460},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway",[448],".",[463,464],"article-card",{"description":465,"image":466,"image-alt":467,"label":468,"min-read":469,"title":455,"to":383},"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.","Guia de pré-requisitos","12",[430,471,472],{},"O assistente DSH ingressa em um relay do Buzz como membro, recebe mensagens diretas (DMs) e mensagens de canal onde é @mencionado, e responde pelo mesmo pipeline de agentes por chat utilizado na interface Web.",[474,475,477],"h2",{"id":476},"arquitetura-do-plugin-dsh-message-gateway","Arquitetura do plugin dsh-message-gateway",[430,479,480,481,483],{},"A arquitetura do plugin ",[441,482,449],{}," é dividida em duas camadas principais:",[485,486,487,519],"ul",{},[488,489,490,493,494,498,499,502,503,506,507,510,511,514,515,518],"li",{},[441,491,492],{},"Host"," (Node): ",[495,496,497],"code",{},"gateway-store"," (credenciais em ",[495,500,501],{},"~\u002F.dsh\u002Fgateway.json","), ",[495,504,505],{},"platforms.ts"," (definições de plataformas e testes de conexão), ",[495,508,509],{},"routes.ts"," (endpoints ",[495,512,513],{},"\u002Fgateway\u002F*",") e ",[495,516,517],{},"bridge-manager.ts"," (as pontes residentes: sessões de agentes independentes por chat e respostas em streaming).",[488,520,521,524,525,528],{},[441,522,523],{},"Cliente"," (navegador): a página \"",[441,526,527],{},"Message platforms","\" na barra lateral, onde você salva credenciais, testa conexões e monitora o status do serviço.",[430,530,531],{},"Adicionar uma nova plataforma envolve as seguintes etapas:",[533,534,535,552,566],"ol",{},[488,536,537,540,541,544,545,548,549,461],{},[441,538,539],{},"Uma classe de ponte (bridge)",": implementando os métodos ",[495,542,543],{},"start\u002Fstop\u002Fstatus"," e o callback ",[495,546,547],{},"onText(text, frame)",", espelhando o padrão de ",[495,550,551],{},"wecom-bridge.ts",[488,553,554,557,558,561,562,565],{},[441,555,556],{},"Integração no bridge-manager",": reaproveitar o pipeline existente por conversa (",[495,559,560],{},"ensureAgentForKey"," + ",[495,563,564],{},"pendingMap",") e conectar o coletor de respostas da plataforma.",[488,567,568,571,572,575,576,579,580,583,584,587,588,591],{},[441,569,570],{},"Persistência e rotas",": em ",[495,573,574],{},"\u002Fgateway\u002Fsave"," e ",[495,577,578],{},"\u002Fgateway\u002Fdelete",": ",[441,581,582],{},"salvar credenciais inicia a ponte, excluí-las a encerra"," — complementado por uma flag ",[495,585,586],{},"autoStartXxx"," para que o ",[495,589,590],{},"dsh web"," reconecte automaticamente no boot.",[474,593,595],{"id":594},"implementação-da-ponte-do-buzz-protocolo-nostr-e-ciclo-de-vida-de-eventos","Implementação da ponte do Buzz: Protocolo Nostr e ciclo de vida de eventos",[430,597,598,599,602],{},"O ",[441,600,601],{},"DeepSeek Harness"," foi utilizado para implementar a ponte do Buzz. A implementação atende rigorosamente às seguintes especificações do protocolo Nostr:",[604,605,606,632],"table",{},[607,608,609],"thead",{},[610,611,612,618],"tr",{},[613,614,615],"th",{},[441,616,617],{},"Transporte",[613,619,620,621,624,625,628,629],{},"Um único WebSocket autenticado via NIP-42; padrão ",[495,622,623],{},"ws:\u002F\u002Flocalhost:3000","; ",[495,626,627],{},"http(s):\u002F\u002F"," é normalizado para ",[495,630,631],{},"ws(s):\u002F\u002F",[633,634,635,654,682,699,722,746,771,784,797,816,833,847],"tbody",{},[610,636,637,643],{},[638,639,640],"td",{},[441,641,642],{},"Autenticação",[638,644,645,646,649,650,653],{},"Evento AUTH ",[495,647,648],{},"kind 22242",", tags ",[495,651,652],{},"[[\"relay\", url], [\"challenge\", challenge]]",", conteúdo vazio, assinado com a chave do agente",[610,655,656,661],{},[638,657,658],{},[441,659,660],{},"Inscrições",[638,662,663,579,666,669,670,673,674,677,678,681],{},[441,664,665],{},"Por canal",[495,667,668],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}"," — um REQ por canal. Um REQ global ",[495,671,672],{},"kinds:[9]"," recebe EOSE mas nunca distribui eventos; filtro ",[495,675,676],{},"#h"," multivalorado ",[441,679,680],{},"não"," funciona",[610,683,684,689],{},[638,685,686],{},[441,687,688],{},"Descoberta",[638,690,691,694,695,698],{},[495,692,693],{},"REQ {kinds:[39000]}"," histórico para metadados de canal (",[495,696,697],{},"type == \"dm\""," marca canal de mensagem direta)",[610,700,701,706],{},[638,702,703],{},[441,704,705],{},"Associação",[638,707,708,711,712,714,715,718,719],{},[495,709,710],{},"REQ {kinds:[44100,44101], \"#p\":[nossa pubkey], since: now-60s}"," ao vivo — 44100 = adição, 44101 = remoção, com ",[495,713,430],{},"+",[495,716,717],{},"h","; atualiza inscrições ",[441,720,721],{},"sem reconectar",[610,723,724,729],{},[638,725,726],{},[441,727,728],{},"Eventos de chat",[638,730,731,734,735,738,739,742,743],{},[495,732,733],{},"kind 9"," com tags ",[495,736,737],{},"[\"h\", canal]",", opcional ",[495,740,741],{},"[\"e\", replyTo]",", ",[495,744,745],{},"[\"p\", menção]",[610,747,748,753],{},[638,749,750],{},[441,751,752],{},"Edições in-place",[638,754,755,758,759,561,761,764,765,767,768,770],{},[495,756,757],{},"kind 40003"," com ",[495,760,717],{},[495,762,763],{},"e","→alvo; substituição de conteúdo; limite do relay de 64 KB → manter payloads ≤ 60.000 B; respostas longas são fragmentadas — chunk 0 na edição, o restante adicionado como mensagens ",[495,766,733],{}," encadeadas (",[495,769,763],{},"→raiz)",[610,772,773,778],{},[638,774,775],{},[441,776,777],{},"Quadros CLOSED",[638,779,780,783],{},[495,781,782],{},"auth-required"," antes de AUTH é normal durante o bootstrap (completar AUTH e reabrir inscrições); após AUTH → retentativa delimitada (3 tentativas, backoff 0\u002F1\u002F2 s); reconexão reconstrói tudo",[610,785,786,791],{},[638,787,788],{},[441,789,790],{},"Limites do relay",[638,792,793,794],{},"≤ 2000 eventos históricos por inscrição, ordenados do mais recente para o mais antigo, mesmo utilizando ",[495,795,796],{},"since",[610,798,799,804],{},[638,800,801],{},[441,802,803],{},"Filtro de menções",[638,805,806,807,809,810,812,813,815],{},"Processa ",[495,808,733],{}," de entrada apenas quando: (a) tag ",[495,811,430],{}," inclui nossa pubkey, (b) o canal é DM, ou (c) a raiz ",[495,814,763],{}," pertence ao nosso agente. Ignora a própria pubkey (anti-loop)",[610,817,818,823],{},[638,819,820],{},[441,821,822],{},"Menções de saída",[638,824,825,826,829,830,832],{},"Texto publicado sem alterações — o relay não valida tokens ",[495,827,828],{},"@","; tags ",[495,831,430],{}," incluem o autor de origem mais até 7 outras pubkeys mencionadas (máx. 8)",[610,834,835,840],{},[638,836,837],{},[441,838,839],{},"Mensagens diretas",[638,841,842,843,846],{},"Canais de texto simples no escopo do relay (metadados ",[495,844,845],{},"type: \"dm\"",") — sem criptografia NIP-04\u002F44 nesta ponte",[610,848,849,854],{},[638,850,851],{},[441,852,853],{},"Anexos (entrada)",[638,855,856,857,860,861,742,864,742,867,870],{},"NIP-92 ",[495,858,859],{},"imeta"," (",[495,862,863],{},"url",[495,865,866],{},"sha256",[495,868,869],{},"m",") → download http(s), verificação de SHA-256, limite de 20 MB, máx. 4 por mensagem; imagens de saída não suportadas",[430,872,873],{},"O diagrama abaixo ilustra o fluxo de inicialização (bootstrap) da ponte do Buzz:",[433,875],{"src":876,"alt":877},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-bootstrap.webp","Diagrama de sequência ilustrando o processo de bootstrap e autenticação NIP-42 da ponte Buzz",[879,880,882],"h3",{"id":881},"streaming-em-tempo-real-via-edições-in-place-do-nostr-kind-40003","Streaming em tempo real via edições in-place do Nostr (Kind 40003)",[430,884,885,886,889],{},"Como o Nostr não possui indicador nativo de digitação e seus eventos são estritamente cumulativos (append-only), a ponte do Buzz ",[441,887,888],{},"simula streaming por meio de edições in-place",":",[433,891],{"src":892,"alt":893},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-reply.webp","Diagrama do fluxo de edição in-place simulando respostas em streaming com eventos kind 40003",[485,895,896],{},[488,897,898],{},[899,900,901,902,904,905,907],"em",{},"A ponte do Buzz publica primeiro um evento placeholder ",[495,903,733],{},", depois o reescreve progressivamente com edições in-place ",[495,906,757],{}," com taxa controlada e grava a edição final quando o agente conclui a resposta. Esse mecanismo segue o mesmo padrão consagrado das pontes do Telegram e Discord.",[879,909,911],{"id":910},"conexão-de-workspaces-do-deepseek-harness-via-comandos-de-chat","Conexão de workspaces do DeepSeek Harness via comandos de chat",[430,913,914,915,860,918,921],{},"O recurso de \"Workspaces\" na interface Web do DSH é gerenciado pelo serviço ",[495,916,917],{},"workspaceRegistry",[495,919,920],{},"@deepseek-ai\u002Fdsh-workspace","):",[923,924,928],"pre",{"className":925,"code":926,"language":927,"meta":425,"style":425},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const existing = await ctx.workspaceRegistry.resolveByPath(request.path);\n","typescript",[495,929,930],{"__ignoreMap":425},[931,932,935,939,943,947,951,954,956,958,960,964,967,969,972],"span",{"class":933,"line":934},"line",1,[931,936,938],{"class":937},"spNyl","const",[931,940,942],{"class":941},"sTEyZ"," existing ",[931,944,946],{"class":945},"sMK4o","=",[931,948,950],{"class":949},"s7zQu"," await",[931,952,953],{"class":941}," ctx",[931,955,461],{"class":945},[931,957,917],{"class":941},[931,959,461],{"class":945},[931,961,963],{"class":962},"s2Zo4","resolveByPath",[931,965,966],{"class":941},"(request",[931,968,461],{"class":945},[931,970,971],{"class":941},"path)",[931,973,974],{"class":945},";\n",[430,976,977,978,981],{},"A ponte do Buzz disponibiliza o comando de chat ",[495,979,980],{},"\u002Fworkspace \u003Cpasta>",", que registra uma pasta existente no DSH. Qualquer nova sessão criada pelo gateway é anexada a essa pasta e exibida na interface Web.",[433,983],{"src":984,"alt":985},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace.webp","Arquitetura do registro de espaços de trabalho do DeepSeek Harness a partir de comandos de chat",[430,987,988],{},"Três regras de projeto essenciais:",[485,990,991,1001,1011],{},[488,992,993,996,997,1000],{},[441,994,995],{},"Mudar de pasta = nova sessão."," O valor de ",[495,998,999],{},"cwd"," é gravado no cabeçalho da sessão no momento da criação e não pode ser alterado posteriormente.",[488,1002,1003,1006,1007,1010],{},[441,1004,1005],{},"A pasta deve existir previamente."," O método ",[495,1008,1009],{},"create"," rejeita caminhos inexistentes.",[488,1012,1013,1016,1017,1020],{},[441,1014,1015],{},"Comando com sensibilidade de segurança."," Toda sessão opera sob uma política de ",[441,1018,1019],{},"auto-aprovação",", concedendo acesso aos arquivos da pasta de destino.",[474,1022,1024],{"id":1023},"guia-passo-a-passo-de-instalação-e-configuração","Guia passo a passo de instalação e configuração",[533,1026,1027],{},[488,1028,1029],{},"Execute os seguintes comandos no terminal:",[923,1031,1035],{"className":1032,"code":1033,"language":1034,"meta":425,"style":425},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dsh plugin --profile web add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n\n# Start DSH web\ndsh web\n","bash",[495,1036,1037,1059,1066,1073],{"__ignoreMap":425},[931,1038,1039,1043,1047,1050,1053,1056],{"class":933,"line":934},[931,1040,1042],{"class":1041},"sBMFI","dsh",[931,1044,1046],{"class":1045},"sfazB"," plugin",[931,1048,1049],{"class":1045}," --profile",[931,1051,1052],{"class":1045}," web",[931,1054,1055],{"class":1045}," add",[931,1057,1058],{"class":1045}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[931,1060,1062],{"class":933,"line":1061},2,[931,1063,1065],{"emptyLinePlaceholder":1064},true,"\n",[931,1067,1069],{"class":933,"line":1068},3,[931,1070,1072],{"class":1071},"sHwdD","# Start DSH web\n",[931,1074,1076,1078],{"class":933,"line":1075},4,[931,1077,1042],{"class":1041},[931,1079,1080],{"class":1045}," web\n",[533,1082,1083],{"start":1061},[488,1084,1085,1086,1088],{},"Assim que a interface Web do DSH abrir no navegador, clique no ícone \"",[441,1087,527],{},"\":",[430,1090,1091],{},[433,1092],{"alt":1093,"src":1094},"Barra lateral da interface Web do DeepSeek Harness destacando o menu Message platforms","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-message-platforms-sidebar-icon.webp",[533,1096,1097],{"start":1068},[488,1098,1099,1100,1103],{},"Selecione \"",[441,1101,1102],{},"Buzz","\" no painel esquerdo:",[430,1105,1106],{},[433,1107],{"alt":1108,"src":1109},"Painel de configurações da ponte Buzz no gateway de mensagens do DeepSeek Harness","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-message-gateway-buzz-config-panel.webp",[533,1111,1112,1123,1134],{"start":1075},[488,1113,1114,1115,1118,1119,1122],{},"Clique em \"",[441,1116,1117],{},"Generate keypair","\" para gerar o par de chaves Nostr. Guarde a chave pública ",[495,1120,1121],{},"npub"," em local seguro.",[488,1124,1125,1126,1129,1130,1133],{},"Preencha a ",[441,1127,1128],{},"Relay URL"," e os ",[441,1131,1132],{},"Channels"," (a lista autorizada de UUIDs dos canais que serão assinados).",[488,1135,1136,1137,1140],{},"Clique no botão \"",[441,1138,1139],{},"Save","\".",[430,1142,1143,1144,1147,1148,1151,1152,461],{},"Ao salvar o formulário, as credenciais são armazenadas e ",[441,1145,1146],{},"a ponte é iniciada",". A chave privada ",[495,1149,1150],{},"nsec"," é protegida como segredo e gravada exclusivamente em ",[495,1153,501],{},[879,1155,1157],{"id":1156},"registro-do-par-de-chaves-do-agente-no-relay-nostr-do-buzz","Registro do par de chaves do agente no relay Nostr do Buzz",[430,1159,1160,1163,1164,1166],{},[441,1161,1162],{},"Adicione o assistente DSH ao relay como membro."," Utilize a chave ",[495,1165,1121],{}," gerada na etapa anterior:",[923,1168,1170],{"className":1032,"code":1169,"language":1034,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[495,1171,1172],{"__ignoreMap":425},[931,1173,1174,1177,1180,1183,1186,1189,1192,1195],{"class":933,"line":934},[931,1175,1176],{"class":1041},"docker",[931,1178,1179],{"class":1045}," compose",[931,1181,1182],{"class":1045}," exec",[931,1184,1185],{"class":1045}," relay",[931,1187,1188],{"class":1045}," buzz-admin",[931,1190,1191],{"class":1045}," add-member",[931,1193,1194],{"class":1045}," --pubkey",[931,1196,1197],{"class":1045}," npub123123123\n",[430,1199,1200,1203,1204,1207,1208,1211,1212,1215,1216,1219],{},[441,1201,1202],{},"Adicione o assistente a um canal específico."," Apenas registrar o membro no relay não o torna visível nem pesquisável nos canais. Para adicioná-lo via ",[495,1205,1206],{},"buzz-cli",", lembre-se de que o parâmetro ",[495,1209,1210],{},"--pubkey"," deve estar no formato ",[441,1213,1214],{},"HEX",", e não npub (o comando ",[495,1217,1218],{},"buzz-admin add-member"," exibe a chave HEX correspondente):",[923,1221,1223],{"className":1032,"code":1222,"language":1034,"meta":425,"style":425},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[495,1224,1225],{"__ignoreMap":425},[931,1226,1227,1230,1233,1235,1238,1241,1244,1247,1250,1252,1254,1257,1260,1262,1265],{"class":933,"line":934},[931,1228,1229],{"class":1041},"buzz",[931,1231,1232],{"class":1045}," channels",[931,1234,1191],{"class":1045},[931,1236,1237],{"class":1045}," --channel",[931,1239,1240],{"class":945}," \u003C",[931,1242,1243],{"class":1045},"CHANNEL_UUI",[931,1245,1246],{"class":941},"D",[931,1248,1249],{"class":945},">",[931,1251,1194],{"class":1045},[931,1253,1240],{"class":945},[931,1255,1256],{"class":1045},"AGENT_HE",[931,1258,1259],{"class":941},"X",[931,1261,1249],{"class":945},[931,1263,1264],{"class":1045}," --role",[931,1266,1267],{"class":1045}," member\n",[463,1269],{"description":1270,"image":466,"image-alt":467,"label":1271,"min-read":1272,"title":1273,"to":1274},"Instruções passo a passo para instalar e configurar o buzz-cli para gerir canais Nostr, chaves de membros e permissões de agentes de IA.","Guia da CLI","5","Como instalar e usar o buzz-cli","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#install-buzz-cli",[430,1276,1277,1278,889],{},"Atualize o perfil do assistente no relay Nostr definindo um nome amigável com o ",[495,1279,1206],{},[430,1281,1282],{},[433,1283],{"alt":1284,"src":1285},"Atualização do nome do assistente DeepSeek Harness no relay Nostr usando buzz-cli","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-assistant-buzz-cli-profile-update.webp",[430,1287,1288,1289,1292],{},"Envie uma saudação ",[441,1290,1291],{},"Wave"," (a saudação padrão de DM do Buzz) para o assistente. O retorno confirma a operação:",[430,1294,1295],{},[433,1296],{"alt":1297,"src":1298},"Teste de conexão enviando uma saudação Wave por DM para o assistente DeepSeek Harness no Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-dm-wave-greeting-reply.webp",[430,1300,1301],{},[899,1302,1303],{},"Enviando uma Wave por mensagem direta para o assistente DSH — a ponte está ativa.",[879,1305,1307,1308],{"id":1306},"habilitando-o-acesso-a-pastas-locais-com-workspace","Habilitando o acesso a pastas locais com ",[495,1309,1310],{},"\u002Fworkspace",[430,1312,1313,1314,1317,1318,1321,1322,1324],{},"Como a configuração ",[495,1315,1316],{},"allowWorkspace"," vem desativada (",[495,1319,1320],{},"false",") por padrão, o comando ",[495,1323,1310],{}," será inicialmente recusado:",[430,1326,1327],{},[433,1328],{"alt":1329,"src":1330},"Notificação de erro mostrando a rejeição do comando workspace com allowWorkspace desativado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-rejected-error.webp",[430,1332,1333,1334,1337,1338,889],{},"Ative a funcionalidade em ",[495,1335,1336],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml"," e reinicie o ",[495,1339,590],{},[923,1341,1345],{"className":1342,"code":1343,"language":1344,"meta":425,"style":425},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- id: ui-message-gateway\n  config:\n    allowWorkspace: true\n","yml",[495,1346,1347,1361,1369],{"__ignoreMap":425},[931,1348,1349,1352,1356,1358],{"class":933,"line":934},[931,1350,1351],{"class":945},"-",[931,1353,1355],{"class":1354},"swJcz"," id",[931,1357,889],{"class":945},[931,1359,1360],{"class":1045}," ui-message-gateway\n",[931,1362,1363,1366],{"class":933,"line":1061},[931,1364,1365],{"class":1354},"  config",[931,1367,1368],{"class":945},":\n",[931,1370,1371,1374,1376],{"class":933,"line":1068},[931,1372,1373],{"class":1354},"    allowWorkspace",[931,1375,889],{"class":945},[931,1377,1379],{"class":1378},"sfNiH"," true\n",[430,1381,1382],{},"Após reiniciar:",[430,1384,1385],{},[433,1386],{"alt":1387,"src":1388},"Mensagem de confirmação de sucesso após executar o comando de registro de workspace no Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-success-confirmation.webp",[430,1390,1391,1392,1395],{},"Dica importante: o sistema presume que a pasta do workspace (",[495,1393,1394],{},"TechVoyage"," nas capturas) esteja no diretório padrão do usuário. Caso contrário, informe o caminho absoluto. Qualquer nova sessão criada sob este workspace pelo Buzz também aparecerá na interface Web do DeepSeek Harness.",[430,1397,1398],{},[433,1399],{"alt":1400,"src":1401},"Interface Web do DeepSeek Harness exibindo a sessão de workspace sincronizada do Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-synced-workspace-session.webp",[879,1403,1405],{"id":1404},"comandos-disponíveis-no-buzz","Comandos disponíveis no Buzz",[430,1407,1408],{},"Todos os comandos disponíveis nas demais plataformas suportadas funcionam normalmente no Buzz:",[604,1410,1411,1421],{},[607,1412,1413],{},[610,1414,1415,1418],{},[613,1416,1417],{},"Comando",[613,1419,1420],{},"O que faz",[633,1422,1423,1433,1443,1453,1463,1473,1483,1493,1503,1523,1543],{},[610,1424,1425,1430],{},[638,1426,1427],{},[495,1428,1429],{},"\u002Fworkspace \u003Cfolder>",[638,1431,1432],{},"Registra uma pasta existente como o workspace da conversa (requer habilitação nas configurações)",[610,1434,1435,1440],{},[638,1436,1437],{},[495,1438,1439],{},"\u002Fhelp",[638,1441,1442],{},"Lista os comandos disponíveis",[610,1444,1445,1450],{},[638,1446,1447],{},[495,1448,1449],{},"\u002Ftime",[638,1451,1452],{},"Mostra a hora atual do sistema",[610,1454,1455,1460],{},[638,1456,1457],{},[495,1458,1459],{},"\u002Fnew",[638,1461,1462],{},"Inicia uma nova sessão de conversa limpa",[610,1464,1465,1470],{},[638,1466,1467],{},[495,1468,1469],{},"\u002Fclear",[638,1471,1472],{},"Limpa o histórico da conversa atual",[610,1474,1475,1480],{},[638,1476,1477],{},[495,1478,1479],{},"\u002Fstatus",[638,1481,1482],{},"Exibe o status operacional da ponte",[610,1484,1485,1490],{},[638,1486,1487],{},[495,1488,1489],{},"\u002Fstats",[638,1491,1492],{},"Mostra a contagem de conversas e linhas de status por ponte (todas as plataformas, incluindo Buzz)",[610,1494,1495,1500],{},[638,1496,1497],{},[495,1498,1499],{},"\u002Fcommands",[638,1501,1502],{},"Lista descritiva com todos os comandos",[610,1504,1505,1510],{},[638,1506,1507],{},[495,1508,1509],{},"@path\u002Fto\u002Ffile",[638,1511,1512,1513,742,1515,1518,1519,1522],{},"Funciona exatamente como menções de arquivos na Web: o modelo lê o arquivo relativo ao workspace; ",[495,1514,828],{},[495,1516,1517],{},"@prefixo"," ou ",[495,1520,1521],{},"\u002Ffiles \u003Cprefixo>"," retornam arquivos e pastas correspondentes",[610,1524,1525,1530],{},[638,1526,1527],{},[495,1528,1529],{},"\u002Fmodel",[638,1531,1532,1535,1536,1538,1539,1542],{},[495,1533,1534],{},"[provider model effort]"," — valida contra o catálogo ativo de LLMs; ",[495,1537,1529],{}," lista as opções disponíveis e ",[495,1540,1541],{},"\u002Fmodel reset"," restaura os padrões",[610,1544,1545,1550],{},[638,1546,1547],{},[495,1548,1549],{},"\u002Feffort",[638,1551,1552,1555,1556,1559],{},[495,1553,1554],{},"\u003Cid>"," ajusta apenas o esforço de raciocínio do modelo; ",[495,1557,1558],{},"\u002Feffort reset"," restaura o valor padrão",[879,1561,1563],{"id":1562},"resumo-das-medidas-de-segurança","Resumo das medidas de segurança",[485,1565,1566,1579,1589],{},[488,1567,1568,1569,1571,1572,1574,1575,1578],{},"A chave privada ",[441,1570,1150],{}," reside unicamente em ",[495,1573,501],{}," (permissões 0600, gravação atômica) — nunca sendo exposta em ",[495,1576,1577],{},"\u002Fgateway\u002Flist"," nem em logs.",[488,1580,1581,1582,860,1585,1588],{},"Todo evento de entrada passa por ",[441,1583,1584],{},"validação de assinatura criptográfica",[495,1586,1587],{},"verifyEvent","), desduplicação, filtro de mensagens próprias e controle de menções antes de alcançar o agente.",[488,1590,1591,860,1594,1597],{},[441,1592,1593],{},"O registro de workspaces é bloqueado por configuração",[495,1595,1596],{},"allowWorkspace: false"," por padrão), garantindo controle total contra acesso indevido aos arquivos da máquina.",[474,1599,1601],{"id":1600},"conclusão-colaboração-com-agentes-de-ia-descentralizados-no-buzz","Conclusão: Colaboração com agentes de IA descentralizados no Buzz",[430,1603,1604,1605,1607],{},"O maior desafio ao incorporar o Buzz ao ",[495,1606,449],{}," esteve na conformidade com o protocolo Nostr. Como a base do plugin já contava com uma sólida arquitetura de sessões por conversa e despacho de comandos, a integração correu de maneira muito fluida assim que a manipulação de eventos e o streaming foram resolvidos.",[474,1609,1611],{"id":1610},"referências","Referências:",[485,1613,1614,1622,1630],{},[488,1615,1616,1621],{},[444,1617,1620],{"href":1618,"rel":1619},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[448],"dsh-message-gateway architecture guide"," — guia de arquitetura, receitas de extensão e notas de segurança",[488,1623,1624,1629],{},[444,1625,1628],{"href":1626,"rel":1627},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[448],"nostr-tools"," — biblioteca Nostr utilizada sob o capô",[488,1631,1632,1637],{},[444,1633,1636],{"href":1634,"rel":1635},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[448],"deer-flow IM channel connections"," — referências para arquiteturas de conexão em canais de mensageria",[1639,1640,1641],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}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 .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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":425,"searchDepth":1061,"depth":1068,"links":1643},[1644,1645,1649,1656,1657],{"id":476,"depth":1061,"text":477},{"id":594,"depth":1061,"text":595,"children":1646},[1647,1648],{"id":881,"depth":1068,"text":882},{"id":910,"depth":1068,"text":911},{"id":1023,"depth":1061,"text":1024,"children":1650},[1651,1652,1654,1655],{"id":1156,"depth":1068,"text":1157},{"id":1306,"depth":1068,"text":1653},"Habilitando o acesso a pastas locais com \u002Fworkspace",{"id":1404,"depth":1068,"text":1405},{"id":1562,"depth":1068,"text":1563},{"id":1600,"depth":1061,"text":1601},{"id":1610,"depth":1061,"text":1611},[1659,1660,1229,1661],"ai-agents","collaboration","deepseek-harness","2026-09-30","Integre o DeepSeek Harness ao Block Buzz com uma ponte Nostr. Configure auth NIP-42, streaming de mensagens in-place e espaços de trabalho de agentes de IA.","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002FPT-Bringing-Buzz-to-DeepSeek-Harness.webp","Um cartão tecnológico premium de 16:9 com detalhes em índigo profundo e âmbar ilustrando como conectar o DeepSeek Harness ao Block Buzz com uma ponte Nostr, apresentando um painel glassmorphic limpo e tipografia centrada.",{"schemaOrg":1668,"robots":1693,"sitemap":1694},[1669,1671],{"@type":1670,"headline":424,"description":1663,"image":1665},"TechArticle",{"@type":1672,"name":424,"description":1663,"image":1665,"step":1673},"HowTo",[1674,1678,1681,1684,1687,1690],{"@type":1675,"name":1676,"text":1677},"HowToStep","Fase 1: Instalar o plugin de gateway","Instale o plugin dsh-message-gateway e inicie o serviço dsh web.",{"@type":1675,"name":1679,"text":1680},"Fase 2: Acessar Message platforms","Abra a interface Web do DSH e navegue até as configurações de Message platforms.",{"@type":1675,"name":1682,"text":1683},"Fase 3: Configurar a ponte Buzz","Gere um par de chaves Nostr, insira a URL do relay e os canais.",{"@type":1675,"name":1685,"text":1686},"Fase 4: Registrar o agente no relay","Adicione o assistente DSH ao relay Nostr do Buzz usando buzz-admin.",{"@type":1675,"name":1688,"text":1689},"Fase 5: Adicionar o agente ao canal","Vincule a chave HEX do agente aos canais usando buzz-cli.",{"@type":1675,"name":1691,"text":1692},"Fase 6: Habilitar acesso a workspaces","Configure allowWorkspace em cordis.patch.yml para permitir comandos de pastas locais.","index, follow",{"lastmod":1662},11,{"title":1697,"description":1663,"ogTitle":424,"ogDescription":1663,"twitterTitle":424,"twitterDescription":1663},"Plugin Buzz para DeepSeek Harness: Criar Ponte Nostr","pt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",[601,1102,1700,1701,449],"Nostr","Agentes IA",null,"c3DZPaQeg7cLpNEOnZ4JMkgdCZ3xrLJOL0NosdV2XnI",{"id":1705,"title":1706,"author":425,"body":1707,"category":2601,"date":2603,"description":2604,"extension":1664,"image":2605,"imageAlt":2606,"isPublished":1064,"meta":2607,"minRead":2281,"navigation":1064,"path":219,"seo":2612,"stem":2614,"tags":2615,"updatedAt":2611,"__hash__":2619},"article\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md","Expor o Hermes Agent em rede privada com Cloudflare WARP",{"type":427,"value":1708,"toc":2583},[1709,1724,1734,1738,1741,1753,1757,1765,1769,1773,1822,1826,1963,1967,2001,2005,2008,2074,2077,2113,2116,2143,2147,2157,2162,2200,2289,2293,2298,2315,2324,2403,2408,2454,2458,2503,2518,2522,2566,2570,2580],[430,1710,1711,1712,1715,1716,1719,1720,1723],{},"Um desafio comum surge quando você deseja acessar seu ",[441,1713,1714],{},"Hermes Agent"," de outros dispositivos, como notebooks, tablets ou telefones, sem expô-lo à internet pública. Utilizar o ",[441,1717,1718],{},"Cloudflare WARP"," com o ",[441,1721,1722],{},"Cloudflare Zero Trust"," permite que você exponha o Hermes Agent globalmente sem abrir uma única porta de entrada no seu firewall.",[430,1725,1726,1727,1730,1731,1733],{},"Se você seguiu nosso guia anterior, '",[444,1728,1729],{"href":375},"Como instalar e configurar o Hermes Agent em um VPS Linux","', um Hermes Agent já está instalado e funcionando 24 horas por dia. Em vez de lidar com a complexidade das VPNs tradicionais, usaremos o cliente ",[441,1732,1718],{}," para expor o Hermes Agent a uma rede privada pela internet.",[474,1735,1737],{"id":1736},"entendendo-a-arquitetura","Entendendo a Arquitetura",[430,1739,1740],{},"Os componentes em ação:",[533,1742,1743,1748],{},[488,1744,1745,1747],{},[441,1746,1722],{},": O painel de controle da Cloudflare onde você define regras de roteamento e políticas de acesso.",[488,1749,1750,1752],{},[441,1751,1718],{},": O aplicativo cliente instalado em seus dispositivos (VPS, notebooks, telefones). Ele intercepta o tráfego destinado à sua rede privada e o roteia com segurança.",[879,1754,1756],{"id":1755},"pré-requisitos","Pré-requisitos",[485,1758,1759,1762],{},[488,1760,1761],{},"Um Hermes Agent em execução no seu VPS.",[488,1763,1764],{},"Uma conta gratuita da Cloudflare.",[474,1766,1768],{"id":1767},"guia-passo-a-passo","Guia Passo a Passo",[879,1770,1772],{"id":1771},"passo-1-configurar-o-cloudflare-zero-trust","Passo 1: Configurar o Cloudflare Zero Trust",[533,1774,1775,1783,1790,1801,1808,1815],{},[488,1776,1777,1778,461],{},"Faça login no seu ",[444,1779,1782],{"href":1780,"rel":1781},"https:\u002F\u002Fdash.cloudflare.com\u002F",[448],"Painel da Cloudflare",[488,1784,1785,1786],{},"Clique em 'Zero Trust' no menu à esquerda.\n",[433,1787],{"alt":1788,"src":1789},"Menu de navegação lateral esquerdo do painel Cloudflare com a opção Zero Trust","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[488,1791,1792,1793,1796,1797],{},"Se esta for sua primeira vez, você será solicitado a escolher um plano (o nível Gratuito atende perfeitamente a essa configuração) e dar um nome à sua equipe (ex., ",[495,1794,1795],{},"ai-team",").\n",[433,1798],{"alt":1799,"src":1800},"Configuração inicial da conta Cloudflare Zero Trust e definição do nome da equipe","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[488,1802,1803,1804],{},"Clique em 'Access' e depois em 'Policies' para criar uma política de acesso definindo quem tem acesso à rede.\n",[433,1805],{"alt":1806,"src":1807},"Página de políticas de acesso do Cloudflare Zero Trust mostrando as regras de acesso configuradas","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[488,1809,1810,1811],{},"Clique em 'Create new policy'.\n",[433,1812],{"alt":1813,"src":1814},"Cloudflare Access policies page showing no policies added and a button to create a new policy.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.png",[488,1816,1817,1818],{},"Selecione 'Emails' e insira seu e-mail em 'Policy rules'.\n",[433,1819],{"alt":1820,"src":1821},"Cloudflare Access policy rule configuration screen with an email address specified as the inclusion criteria.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.png",[879,1823,1825],{"id":1824},"passo-2-configurar-o-cliente-cloudflare-warp-no-vps","Passo 2: Configurar o cliente Cloudflare WARP no VPS",[533,1827,1828,1838,1844,1851,1854,1869,1872,1956],{},[488,1829,1830,1831,575,1834,1837],{},"Execute ",[495,1832,1833],{},"sudo apt update",[495,1835,1836],{},"sudo apt install cloudflare-warp"," no terminal do seu VPS.",[488,1839,1830,1840,1843],{},[495,1841,1842],{},"warp-cli registration new \u003CTEAM-NAME>"," no terminal do seu VPS, o que exibirá um URL.",[488,1845,1846,1847,1850],{},"Copie o URL gerado, que será parecido com ",[495,1848,1849],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp",", e cole-o no seu navegador para autenticação.",[488,1852,1853],{},"Como a autenticação por e-mail foi definida na configuração da política acima, insira seu e-mail para autenticar.",[488,1855,1856,1857,1860,1861,1864,1865,1868],{},"Na página de '",[441,1858,1859],{},"Success","' (Colaboração bem-sucedida) no navegador, clique com o botão direito e selecione '",[441,1862,1863],{},"Inspect","' (Inspecionar) no botão azul '",[441,1866,1867],{},"Open Cloudflare WARP","'.",[488,1870,1871],{},"Copie o token longo que aparece no link do botão.",[488,1873,1830,1874,1877,1878,1881,1882],{},[495,1875,1876],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\""," no terminal do seu VPS para conectá-lo ao Cloudflare Zero Trust.",[1879,1880],"br",{},"Se encontrar o 'Error: Failed to communicate with the WARP API' no Ubuntu 26, execute os seguintes comandos:",[923,1883,1885],{"className":1032,"code":1884,"language":1034,"meta":425,"style":425},"sudo systemctl restart warp-svc.service\n\n# Check status\nsudo systemctl status warp-svc.service\n\n# Run the warp-cli registration token again\nwarp-cli --accept-tos registration token   \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"\n",[495,1886,1887,1901,1905,1910,1921,1926,1932],{"__ignoreMap":425},[931,1888,1889,1892,1895,1898],{"class":933,"line":934},[931,1890,1891],{"class":1041},"sudo",[931,1893,1894],{"class":1045}," systemctl",[931,1896,1897],{"class":1045}," restart",[931,1899,1900],{"class":1045}," warp-svc.service\n",[931,1902,1903],{"class":933,"line":1061},[931,1904,1065],{"emptyLinePlaceholder":1064},[931,1906,1907],{"class":933,"line":1068},[931,1908,1909],{"class":1071},"# Check status\n",[931,1911,1912,1914,1916,1919],{"class":933,"line":1075},[931,1913,1891],{"class":1041},[931,1915,1894],{"class":1045},[931,1917,1918],{"class":1045}," status",[931,1920,1900],{"class":1045},[931,1922,1924],{"class":933,"line":1923},5,[931,1925,1065],{"emptyLinePlaceholder":1064},[931,1927,1929],{"class":933,"line":1928},6,[931,1930,1931],{"class":1071},"# Run the warp-cli registration token again\n",[931,1933,1935,1938,1941,1944,1947,1950,1953],{"class":933,"line":1934},7,[931,1936,1937],{"class":1041},"warp-cli",[931,1939,1940],{"class":1045}," --accept-tos",[931,1942,1943],{"class":1045}," registration",[931,1945,1946],{"class":1045}," token",[931,1948,1949],{"class":945},"   \"",[931,1951,1952],{"class":1045},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[931,1954,1955],{"class":945},"\"\n",[488,1957,1958,1959],{},"Volte ao painel do Cloudflare Zero Trust e clique em 'Devices' (Dispositivos). O dispositivo do seu VPS deve ser exibido agora.\n",[433,1960],{"alt":1961,"src":1962},"Painel de dispositivos Zero Trust confirmando que o VPS Linux está conectado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-devices-vps-connected.webp",[879,1964,1966],{"id":1965},"passo-3-configurar-o-roteamento-de-tráfego","Passo 3: Configurar o roteamento de tráfego",[533,1968,1969,1976,1983,1990],{},[488,1970,1971,1972],{},"Clique no perfil do seu VPS no painel de Dispositivos.\n",[433,1973],{"alt":1974,"src":1975},"Acesso aos detalhes e configurações de Split Tunnels para o VPS registrado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[488,1977,1978,1979],{},"Role para baixo até a seção 'Split Tunnels' (Túneis divididos).\n",[433,1980],{"alt":1981,"src":1982},"Seção Split Tunnels sob as configurações de perfil do VPS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-split-tunnels-section.webp",[488,1984,1985,1986],{},"Clique no botão 'Manage' (Gerenciar) e defina as configurações conforme mostrado abaixo. Substitua o endereço IP, se necessário.\n",[433,1987],{"alt":1988,"src":1989},"Gerenciamento de exclusões de IP e host nos Split Tunnels das configurações Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[488,1991,1992,1993,1996,1997,2000],{},"Expor o ",[495,1994,1995],{},"address"," (endereço) e o ",[495,1998,1999],{},"host"," roteará o tráfego para seus serviços pela mesma rede privada.",[879,2002,2004],{"id":2003},"passo-4-configurar-o-firewall-no-vps","Passo 4: Configurar o Firewall no VPS",[430,2006,2007],{},"Habilite o firewall para permitir apenas a sub-rede '100.96.0.0\u002F12', bloqueando qualquer outro acesso público de entrada.",[923,2009,2011],{"className":1032,"code":2010,"language":1034,"meta":425,"style":425},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[495,2012,2013,2026,2043,2057],{"__ignoreMap":425},[931,2014,2015,2017,2020,2023],{"class":933,"line":934},[931,2016,1891],{"class":1041},[931,2018,2019],{"class":1045}," ufw",[931,2021,2022],{"class":1045}," enable",[931,2024,2025],{"class":941}," \n",[931,2027,2028,2030,2032,2035,2038,2041],{"class":933,"line":1061},[931,2029,1891],{"class":1041},[931,2031,2019],{"class":1045},[931,2033,2034],{"class":1045}," default",[931,2036,2037],{"class":1045}," allow",[931,2039,2040],{"class":1045}," outgoing",[931,2042,2025],{"class":941},[931,2044,2045,2047,2049,2051,2054],{"class":933,"line":1068},[931,2046,1891],{"class":1041},[931,2048,2019],{"class":1045},[931,2050,2034],{"class":1045},[931,2052,2053],{"class":1045}," deny",[931,2055,2056],{"class":1045}," incoming\n",[931,2058,2059,2061,2063,2065,2068,2071],{"class":933,"line":1075},[931,2060,1891],{"class":1041},[931,2062,2019],{"class":1045},[931,2064,2037],{"class":1045},[931,2066,2067],{"class":1045}," in",[931,2069,2070],{"class":1045}," from",[931,2072,2073],{"class":1045}," 100.96.0.0\u002F12\n",[430,2075,2076],{},"Permita o tráfego de loopback para evitar a interrupção de serviços locais:",[923,2078,2080],{"className":1032,"code":2079,"language":1034,"meta":425,"style":425},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[495,2081,2082,2098],{"__ignoreMap":425},[931,2083,2084,2086,2088,2090,2092,2095],{"class":933,"line":934},[931,2085,1891],{"class":1041},[931,2087,2019],{"class":1045},[931,2089,2037],{"class":1045},[931,2091,2067],{"class":1045},[931,2093,2094],{"class":1045}," on",[931,2096,2097],{"class":1045}," lo\n",[931,2099,2100,2102,2104,2106,2109,2111],{"class":933,"line":1061},[931,2101,1891],{"class":1041},[931,2103,2019],{"class":1045},[931,2105,2037],{"class":1045},[931,2107,2108],{"class":1045}," out",[931,2110,2094],{"class":1045},[931,2112,2097],{"class":1045},[430,2114,2115],{},"Recarregue o firewall e verifique o status:",[923,2117,2119],{"className":1032,"code":2118,"language":1034,"meta":425,"style":425},"sudo ufw reload \nsudo ufw status verbose\n",[495,2120,2121,2132],{"__ignoreMap":425},[931,2122,2123,2125,2127,2130],{"class":933,"line":934},[931,2124,1891],{"class":1041},[931,2126,2019],{"class":1045},[931,2128,2129],{"class":1045}," reload",[931,2131,2025],{"class":941},[931,2133,2134,2136,2138,2140],{"class":933,"line":1061},[931,2135,1891],{"class":1041},[931,2137,2019],{"class":1045},[931,2139,1918],{"class":1045},[931,2141,2142],{"class":1045}," verbose\n",[879,2144,2146],{"id":2145},"passo-5-expor-o-hermes-agent-à-rede-privada","Passo 5: Expor o Hermes Agent à Rede Privada",[430,2148,2149,2150,2153,2154,461],{},"Vamos expor o ",[441,2151,2152],{},"Hermes Agent Web Dashboard"," à nossa rede privada e usar o provedor de autenticação padrão, ",[441,2155,2156],{},"Nous Research",[2158,2159,2161],"h4",{"id":2160},"configurar-o-provedor-de-autenticação","Configurar o provedor de autenticação",[533,2163,2164,2173,2180,2187,2194],{},[488,2165,2166,2167,2172],{},"Vá até ",[444,2168,2171],{"href":2169,"rel":2170},"https:\u002F\u002Fportal.nousresearch.com",[448],"portal.nousresearch.com"," para registrar uma conta.",[488,2174,2175,2176],{},"Selecione 'Local Dashboards' (Painéis locais).\n",[433,2177],{"alt":2178,"src":2179},"Seleção da opção Local Dashboards no portal da Nous Research","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-local-dashboards-selection.webp",[488,2181,2182,2183],{},"Clique em 'Register Dashboard' (Registrar painel).\n",[433,2184],{"alt":2185,"src":2186},"Clique no botão Registrar painel para criar uma nova entrada de painel","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[488,2188,2189,2190],{},"Insira o endereço IP da rede privada do seu VPS como a 'Dashboard redirect URI' (URI de redirecionamento do painel) e clique em 'Save' (Salvar).\n",[433,2191],{"alt":2192,"src":2193},"Registro do endereço IP de rede privada do VPS como URI de redirecionamento no portal Nous Research","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-redirect-uri.webp",[488,2195,2196,2197,889],{},"Copie o 'OAuth client ID' e cole-o em seu arquivo ",[495,2198,2199],{},"config.yaml",[923,2201,2205],{"className":2202,"code":2203,"language":2204,"meta":425,"style":425},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dashboard:\n  theme: default\n  show_token_analytics: false\n  oauth:\n    client_id: agent:cmq02x7ha0002jk0ba3kfnb\n    portal_url: https:\u002F\u002Fportal.nousresearch.com\n  basic_auth:\n    username: ''\n    password_hash: ''\n","yaml",[495,2206,2207,2214,2224,2234,2241,2251,2261,2268,2279],{"__ignoreMap":425},[931,2208,2209,2212],{"class":933,"line":934},[931,2210,2211],{"class":1354},"dashboard",[931,2213,1368],{"class":945},[931,2215,2216,2219,2221],{"class":933,"line":1061},[931,2217,2218],{"class":1354},"  theme",[931,2220,889],{"class":945},[931,2222,2223],{"class":1045}," default\n",[931,2225,2226,2229,2231],{"class":933,"line":1068},[931,2227,2228],{"class":1354},"  show_token_analytics",[931,2230,889],{"class":945},[931,2232,2233],{"class":1378}," false\n",[931,2235,2236,2239],{"class":933,"line":1075},[931,2237,2238],{"class":1354},"  oauth",[931,2240,1368],{"class":945},[931,2242,2243,2246,2248],{"class":933,"line":1923},[931,2244,2245],{"class":1354},"    client_id",[931,2247,889],{"class":945},[931,2249,2250],{"class":1045}," agent:cmq02x7ha0002jk0ba3kfnb\n",[931,2252,2253,2256,2258],{"class":933,"line":1928},[931,2254,2255],{"class":1354},"    portal_url",[931,2257,889],{"class":945},[931,2259,2260],{"class":1045}," https:\u002F\u002Fportal.nousresearch.com\n",[931,2262,2263,2266],{"class":933,"line":1934},[931,2264,2265],{"class":1354},"  basic_auth",[931,2267,1368],{"class":945},[931,2269,2271,2274,2276],{"class":933,"line":2270},8,[931,2272,2273],{"class":1354},"    username",[931,2275,889],{"class":945},[931,2277,2278],{"class":945}," ''\n",[931,2280,2282,2285,2287],{"class":933,"line":2281},9,[931,2283,2284],{"class":1354},"    password_hash",[931,2286,889],{"class":945},[931,2288,2278],{"class":945},[2158,2290,2292],{"id":2291},"configurar-o-systemd-para-iniciar-automaticamente-o-painel-do-hermes","Configurar o Systemd para Iniciar Automaticamente o Painel do Hermes",[533,2294,2295],{},[488,2296,2297],{},"Crie um arquivo de serviço:",[923,2299,2303],{"className":2300,"code":2301,"language":2302,"meta":425,"style":425},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[495,2304,2305],{"__ignoreMap":425},[931,2306,2307,2309,2312],{"class":933,"line":934},[931,2308,1891],{"class":1041},[931,2310,2311],{"class":1045}," nano",[931,2313,2314],{"class":1045}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[533,2316,2317],{"start":1061},[488,2318,2319,2320,2323],{},"Cole a seguinte configuração, garantindo que ",[495,2321,2322],{},"--host 0.0.0.0"," faça parte do comando:",[923,2325,2329],{"className":2326,"code":2327,"language":2328,"meta":425,"style":425},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Hermes Dashboard\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n","ini",[495,2330,2331,2336,2341,2346,2350,2355,2360,2365,2370,2375,2381,2386,2391,2397],{"__ignoreMap":425},[931,2332,2333],{"class":933,"line":934},[931,2334,2335],{},"[Unit]\n",[931,2337,2338],{"class":933,"line":1061},[931,2339,2340],{},"Description=Hermes Dashboard\n",[931,2342,2343],{"class":933,"line":1068},[931,2344,2345],{},"After=network.target\n",[931,2347,2348],{"class":933,"line":1075},[931,2349,1065],{"emptyLinePlaceholder":1064},[931,2351,2352],{"class":933,"line":1923},[931,2353,2354],{},"[Service]\n",[931,2356,2357],{"class":933,"line":1928},[931,2358,2359],{},"User=hermes\n",[931,2361,2362],{"class":933,"line":1934},[931,2363,2364],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[931,2366,2367],{"class":933,"line":2270},[931,2368,2369],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[931,2371,2372],{"class":933,"line":2281},[931,2373,2374],{},"Restart=always\n",[931,2376,2378],{"class":933,"line":2377},10,[931,2379,2380],{},"RestartSec=10\n",[931,2382,2383],{"class":933,"line":1695},[931,2384,2385],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[931,2387,2389],{"class":933,"line":2388},12,[931,2390,1065],{"emptyLinePlaceholder":1064},[931,2392,2394],{"class":933,"line":2393},13,[931,2395,2396],{},"[Install]\n",[931,2398,2400],{"class":933,"line":2399},14,[931,2401,2402],{},"WantedBy=multi-user.target\n",[533,2404,2405],{"start":1068},[488,2406,2407],{},"Habilite e inicie o serviço:",[923,2409,2411],{"className":2300,"code":2410,"language":2302,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[495,2412,2413,2422,2433,2444],{"__ignoreMap":425},[931,2414,2415,2417,2419],{"class":933,"line":934},[931,2416,1891],{"class":1041},[931,2418,1894],{"class":1045},[931,2420,2421],{"class":1045}," daemon-reload\n",[931,2423,2424,2426,2428,2430],{"class":933,"line":1061},[931,2425,1891],{"class":1041},[931,2427,1894],{"class":1045},[931,2429,2022],{"class":1045},[931,2431,2432],{"class":1045}," hermes-dashboard\n",[931,2434,2435,2437,2439,2442],{"class":933,"line":1068},[931,2436,1891],{"class":1041},[931,2438,1894],{"class":1045},[931,2440,2441],{"class":1045}," start",[931,2443,2432],{"class":1045},[931,2445,2446,2448,2450,2452],{"class":933,"line":1075},[931,2447,1891],{"class":1041},[931,2449,1894],{"class":1045},[931,2451,1918],{"class":1045},[931,2453,2432],{"class":1045},[879,2455,2457],{"id":2456},"passo-6-instalar-o-cliente-cloudflare-warp-no-desktop","Passo 6: Instalar o cliente Cloudflare WARP no Desktop",[533,2459,2460,2468,2471,2478,2485,2492],{},[488,2461,2462,2463,461],{},"Baixe o cliente Cloudflare WARP pelo ",[444,2464,2467],{"href":2465,"rel":2466},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[448],"portal da Cloudflare",[488,2469,2470],{},"Abra e inicie o cliente Cloudflare WARP após a instalação.",[488,2472,2473,2474],{},"Faça login quando solicitado.\n",[433,2475],{"alt":2476,"src":2477},"Tela de login do cliente Cloudflare WARP em computador desktop","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[488,2479,2480,2481],{},"Uma página de 'Success' (Sucesso) será exibida após o login.\n",[433,2482],{"alt":2483,"src":2484},"Página de sucesso na autenticação após fazer login no Cloudflare Zero Trust no desktop","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[488,2486,2487,2488],{},"O cliente WARP agora deve mostrar que está conectado à sua equipe do Zero Trust.\n",[433,2489],{"alt":2490,"src":2491},"Cliente Cloudflare WARP desktop confirmando conexão ativa com a rede privada Zero Trust","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-client-connected.webp",[488,2493,2494,2495,2498,2499],{},"Navegue até o seu navegador e insira o seu IP privado (ex., ",[495,2496,2497],{},"100.96.0.3","). O Hermes Web Dashboard deve ser carregado com sucesso.\n",[433,2500],{"alt":2501,"src":2502},"Acesso ao painel web privado do Hermes Agent no navegador do desktop","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[2504,2505,2506],"blockquote",{},[430,2507,2508,2511,2512,2517],{},[441,2509,2510],{},"Dica de profissional para usuários do macOS:"," Se você estiver usando o cliente WARP para acessar várias contas da Cloudflare, confira nosso guia rápido sobre ",[441,2513,2514],{},[444,2515,2516],{"href":399},"Alternar entre múltiplos perfis do Cloudflare WARP no macOS"," para alternar entre as contas sem problemas.",[879,2519,2521],{"id":2520},"passo-7-instalar-o-cliente-cloudflare-warp-em-dispositivos-ios","Passo 7: Instalar o cliente Cloudflare WARP em Dispositivos iOS",[533,2523,2524,2531,2539,2547,2555],{},[488,2525,2526,2527,2530],{},"Instale o ",[441,2528,2529],{},"Cloudflare One"," através da App Store.",[488,2532,2533,2534],{},"Abra o aplicativo Cloudflare One e insira o nome da sua equipe quando solicitado.\n",[433,2535],{"alt":2536,"src":2537,"width":2538},"Inserção do nome da equipe Cloudflare Zero Trust no aplicativo Cloudflare One no iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-team-name-prompt.webp",239,[488,2540,2541,2542],{},"Faça login usando o mesmo endereço de e-mail que foi configurado na regra de política acima.\n",[433,2543],{"alt":2544,"src":2545,"width":2546},"Tela de autenticação por e-mail para o Cloudflare Zero Trust no iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-email-login.webp",229,[488,2548,2549,2550],{},"Assim que estiver conectado, a tela deve ficar parecida com isto:\n",[433,2551],{"alt":2552,"src":2553,"width":2554},"Aplicativo Cloudflare One exibindo status conectado no dispositivo móvel iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-client-connected.webp",322,[488,2556,2557,2558,2560,2561],{},"Navegue até o seu navegador e insira o IP privado ",[495,2559,2497],{}," para acessar o Hermes Web Dashboard no seu dispositivo móvel.\n",[433,2562],{"alt":2563,"src":2564,"width":2565},"Acesso à interface do painel web do Hermes Agent no navegador do celular","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[474,2567,2569],{"id":2568},"conclusão","Conclusão",[430,2571,2572,2573,2575,2576,2579],{},"Com o ",[441,2574,1722],{}," gerenciando as políticas de identidade e o cliente ",[441,2577,2578],{},"WARP"," roteando o tráfego por um túnel criptografado, o seu Hermes Agent estará acessível de forma segura a partir dos seus dispositivos no mundo todo. Esta configuração estabelece uma base segura e robusta para criar e acessar uma infraestrutura de IA privada totalmente remota.",[1639,2581,2582],{},"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":425,"searchDepth":1061,"depth":1068,"links":2584},[2585,2588,2600],{"id":1736,"depth":1061,"text":1737,"children":2586},[2587],{"id":1755,"depth":1068,"text":1756},{"id":1767,"depth":1061,"text":1768,"children":2589},[2590,2591,2592,2593,2594,2598,2599],{"id":1771,"depth":1068,"text":1772},{"id":1824,"depth":1068,"text":1825},{"id":1965,"depth":1068,"text":1966},{"id":2003,"depth":1068,"text":2004},{"id":2145,"depth":1068,"text":2146,"children":2595},[2596,2597],{"id":2160,"depth":1075,"text":2161},{"id":2291,"depth":1075,"text":2292},{"id":2456,"depth":1068,"text":2457},{"id":2520,"depth":1068,"text":2521},{"id":2568,"depth":1061,"text":2569},[1659,2602],"security","2026-07-09","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",{"schemaOrg":2608,"robots":1693,"sitemap":2610},[2609],{"@type":1672,"headline":1706,"description":2604,"name":1706,"image":2605},{"lastmod":2611},"2026-09-28",{"title":2613,"description":2604,"ogTitle":1706,"ogDescription":2604,"twitterTitle":1706,"twitterDescription":2604},"Acesso seguro ao Hermes Agent com Cloudflare Zero Trust","pt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[1718,2616,1714,2617,2618],"Zero Trust","Rede privada","Tutorial","YSMA4-lqPipX1pmOP069tbQJepC0q97hwEJOym2fqzI",{"id":2621,"title":2622,"author":425,"body":2623,"category":4050,"date":4052,"description":4053,"extension":1664,"image":4054,"imageAlt":4055,"isPublished":1064,"meta":4056,"minRead":3326,"navigation":1064,"path":239,"seo":4063,"stem":4065,"tags":4066,"updatedAt":1702,"__hash__":4070},"article\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices.md","Sincronizar cofres do Obsidian entre dispositivos",{"type":427,"value":2624,"toc":4028},[2625,2628,2633,2642,2651,2669,2674,2682,2686,2691,2705,2721,2724,2728,2732,2739,2744,2748,2753,2810,2817,2849,2853,2860,2866,2873,2935,2938,2955,2962,2974,2978,2982,2993,2998,3008,3030,3035,3049,3054,3060,3065,3080,3083,3088,3091,3096,3100,3105,3120,3124,3138,3148,3152,3157,3160,3170,3203,3207,3214,3356,3390,3395,3416,3427,3432,3436,3446,3517,3521,3527,3562,3693,3700,3706,3712,3718,3721,3727,3733,3747,3758,3765,3771,3778,3907,3913,3918,3921,3926,3929,3933,3938,3943,3949,3960,3970,3974,3985,3990,3996,3999,4002,4025],[430,2626,2627],{},"O Obsidian é uma aplicação de gestão de conhecimento que prioriza o armazenamento local (local-first). Cada nota é um ficheiro markdown no seu dispositivo e permanece inteiramente sob o seu controlo. No entanto, muitas vezes pretendemos ter o mesmo cofre (vault) no portátil, no telemóvel e noutros dispositivos, ou poder aceder-lhe remotamente através de um navegador web.",[433,2629],{"src":2630,"alt":2631,"style":2632},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-multi-device-sync-illustration.webp","Ilustração do cofre do Obsidian sincronizado em vários dispositivos","max-width: 667px; width: 100%; height: auto;",[430,2634,2635,2636,2641],{},"Existem várias soluções de sincronização disponíveis para o Obsidian, mas todas elas implicam cedências no que toca à gestão de conflitos, encriptação ou soberania dos dados. O ",[444,2637,2640],{"href":2638,"rel":2639},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[448],"Synch"," é uma aplicação de código aberto que sincroniza o seu cofre do Obsidian com encriptação de ponta a ponta e gestão automática de conflitos num servidor auto-hospedado.",[430,2643,2644,2645,2650],{},"Embora a abordagem local-first do Obsidian funcione perfeitamente na maior parte do tempo, podemos ainda necessitar de aceder ao nosso cofre remotamente através de um navegador web em certas ocasiões. O ",[444,2646,2649],{"href":2647,"rel":2648},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[448],"Ignis"," é uma aplicação de código aberto que executa o Obsidian dentro de um navegador web num formato muito próximo do nativo, permitindo-lhe ler e editar o seu cofre a partir de qualquer lugar.",[430,2652,2653,2654,2656,2657,2659,2660,2663,2664,2668],{},"Neste guia, iremos configurar o ",[441,2655,2640],{}," e o ",[441,2658,2649],{}," num ",[441,2661,2662],{},"VPS"," (Servidor Privado Virtual), alojando-os de forma segura dentro de uma rede privada ",[441,2665,2666],{},[444,2667,1722],{"href":363},", em vez de os expor à internet aberta.",[433,2670],{"src":2671,"alt":2672,"style":2673},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-sync-cloudflare-zero-trust-architecture.webp","Diagrama de arquitetura da sincronização do Obsidian usando Cloudflare Zero Trust","max-width: 671px; width: 100%; height: auto;",[463,2675],{"description":2676,"image":2677,"image-alt":2678,"label":2679,"min-read":2680,"title":2681,"to":363},"Saiba como expor e aceder ao seu Hermes Agent globalmente de forma segura usando o Cloudflare WARP e Zero Trust sem abrir portas de entrada no firewall.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FEN-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","Exposição segura do Hermes Agent a uma rede privada usando o túnel Cloudflare Zero Trust e WARP","Guia relacionado","8","Como expor o Hermes Agent de forma privada com o Cloudflare WARP",[474,2683,2685],{"id":2684},"sincronização-segura-de-cofres-do-obsidian-com-o-synch","Sincronização segura de cofres do Obsidian com o Synch",[430,2687,598,2688,2690],{},[441,2689,2640],{}," oferece as seguintes funcionalidades:",[485,2692,2693,2696,2699,2702],{},[488,2694,2695],{},"Sincroniza o seu cofre assim que são detetadas alterações",[488,2697,2698],{},"Encripta os dados do cofre antes do carregamento",[488,2700,2701],{},"Permite a restauração a partir do histórico de versões",[488,2703,2704],{},"Inclui gestão automática de conflitos",[430,2706,598,2707,2709,2710,2713,2714,2717,2718,2720],{},[441,2708,2640],{}," gera uma ",[441,2711,2712],{},"chave de cofre"," aleatória de 32 bytes no seu dispositivo, que é utilizada para encriptar os dados do cofre. Quando cria um cofre remoto, escolhe uma ",[441,2715,2716],{},"palavra-passe do cofre","; esta palavra-passe é utilizada para proteger a ",[441,2719,2712],{},", permitindo que esta seja armazenada de forma segura no servidor e desbloqueada noutros dispositivos.",[430,2722,2723],{},"Note que a resolução de conflitos é gerida nos seus dispositivos de cliente e não no servidor. Se dois dispositivos editarem a mesma nota simultaneamente, o servidor mantém a versão que chegar primeiro e marca o outro dispositivo como desatualizado. O dispositivo desatualizado junta automaticamente a versão mais recente com as suas alterações locais antes de enviar a nota final combinada.",[879,2725,2727],{"id":2726},"configurar-o-synch-no-seu-vps","Configurar o Synch no seu VPS",[2158,2729,2731],{"id":2730},"criar-um-nome-de-domínio","Criar um nome de domínio",[430,2733,2734,2735,2738],{},"Crie um registo A no Cloudflare e defina o estado do proxy para ",[441,2736,2737],{},"Apenas DNS"," (ignorando o CDN do Cloudflare).",[433,2740],{"src":2741,"alt":2742,"style":2743},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-synch-server.webp","Configurando um registro A de DNS para o servidor Synch no Cloudflare","max-width: 538px; width: 100%; height: auto;",[2158,2745,2747],{"id":2746},"instalar-o-synch-com-docker-no-ubuntu","Instalar o Synch com Docker no Ubuntu",[2749,2750,2752],"h5",{"id":2751},"clonar-o-repositório","Clonar o repositório",[923,2754,2756],{"className":1032,"code":2755,"language":1034,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git       \n        \n# Navegar para a pasta da API\ncd synch\u002Fapps\u002Fapi\n        \n# Copiar o ficheiro de ambiente de exemplo:\ncp .env.example .env\n",[495,2757,2758,2772,2777,2782,2790,2794,2799],{"__ignoreMap":425},[931,2759,2760,2763,2766,2769],{"class":933,"line":934},[931,2761,2762],{"class":1041},"git",[931,2764,2765],{"class":1045}," clone",[931,2767,2768],{"class":1045}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[931,2770,2771],{"class":941},"       \n",[931,2773,2774],{"class":933,"line":1061},[931,2775,2776],{"class":941},"        \n",[931,2778,2779],{"class":933,"line":1068},[931,2780,2781],{"class":1071},"# Navegar para a pasta da API\n",[931,2783,2784,2787],{"class":933,"line":1075},[931,2785,2786],{"class":962},"cd",[931,2788,2789],{"class":1045}," synch\u002Fapps\u002Fapi\n",[931,2791,2792],{"class":933,"line":1923},[931,2793,2776],{"class":941},[931,2795,2796],{"class":933,"line":1928},[931,2797,2798],{"class":1071},"# Copiar o ficheiro de ambiente de exemplo:\n",[931,2800,2801,2804,2807],{"class":933,"line":1934},[931,2802,2803],{"class":1041},"cp",[931,2805,2806],{"class":1045}," .env.example",[931,2808,2809],{"class":1045}," .env\n",[2749,2811,2813,2814],{"id":2812},"editar-os-valores-do-env","Editar os valores do ",[495,2815,2816],{},".env",[485,2818,2819,2825,2843],{},[488,2820,2821,2824],{},[495,2822,2823],{},"PUBLIC_URL=synch.pafor.me",": Introduza o nome de domínio público do seu servidor Synch (o nome de domínio criado no passo anterior).",[488,2826,2827,575,2830,2833,2834,2838,2839,2842],{},[495,2828,2829],{},"BETTER_AUTH_SECRET",[495,2831,2832],{},"SYNC_TOKEN_SECRET",": Gere chaves seguras utilizando esta ",[444,2835,2837],{"href":2836},"\u002Fpt\u002Ftools\u002Fsecret-key-hex","ferramenta online de chaves secretas"," ou executando ",[495,2840,2841],{},"openssl rand -hex 32"," duas vezes no seu terminal.",[488,2844,2845,2848],{},[495,2846,2847],{},"AUTH_ALLOWED_EMAILS",": Uma lista separada por vírgulas dos endereços de e-mail autorizados a registar-se e criar contas.",[2749,2850,2852],{"id":2851},"adicionar-o-domínio-ao-caddyfile","Adicionar o domínio ao Caddyfile",[430,2854,2855,2856,461],{},"Os detalhes sobre como o módulo DNS do Cloudflare é integrado com o Caddy e iniciado num contentor podem ser consultados no nosso ",[444,2857,2859],{"href":2858},"\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#_4-enable-https-with-caddy","artigo sobre a auto-hospedagem do Buzz",[463,2861],{"description":2862,"image":2863,"image-alt":2864,"label":2865,"min-read":469,"title":455,"to":2858},"Saiba como configurar o Caddy para fornecer automaticamente certificados SSL\u002FTLS utilizando desafios DNS do Cloudflare em contentores Docker.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FEN-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","Configuração do Caddy com token de API do Cloudflare DNS para geração automática de certificados SSL\u002FTLS num espaço de trabalho auto-hospedado","Guia de auto-hospedagem",[430,2867,2868,2869,2872],{},"Inclua a diretiva ",[495,2870,2871],{},"SYNCH_DOMAIN"," no seu Caddyfile, apontando para a porta 8787 (a porta utilizada pelo contentor do Synch):",[923,2874,2878],{"className":2875,"code":2876,"language":2877,"meta":425,"style":425},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n\n{$SYNCH_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:8787\n}\n","json",[495,2879,2880,2885,2893,2897,2901,2915,2920,2931],{"__ignoreMap":425},[931,2881,2882],{"class":933,"line":934},[931,2883,2884],{"class":945},"{\n",[931,2886,2887,2890],{"class":933,"line":1061},[931,2888,2889],{"class":941},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[931,2891,2892],{"class":945},"}\n",[931,2894,2895],{"class":933,"line":1068},[931,2896,2892],{"class":941},[931,2898,2899],{"class":933,"line":1075},[931,2900,1065],{"emptyLinePlaceholder":1064},[931,2902,2903,2906,2909,2912],{"class":933,"line":1923},[931,2904,2905],{"class":945},"{",[931,2907,2908],{"class":941},"$SYNCH_DOMAIN",[931,2910,2911],{"class":945},"}",[931,2913,2914],{"class":945}," {\n",[931,2916,2917],{"class":933,"line":1928},[931,2918,2919],{"class":941},"  encode zstd gzip\n",[931,2921,2922,2925,2927],{"class":933,"line":1934},[931,2923,2924],{"class":941},"  reverse_proxy host.docker.internal",[931,2926,889],{"class":945},[931,2928,2930],{"class":2929},"sbssI","8787\n",[931,2932,2933],{"class":933,"line":2270},[931,2934,2892],{"class":945},[430,2936,2937],{},"Inicie o contentor:",[923,2939,2941],{"className":1032,"code":2940,"language":1034,"meta":425,"style":425},"docker compose up -d\n",[495,2942,2943],{"__ignoreMap":425},[931,2944,2945,2947,2949,2952],{"class":933,"line":934},[931,2946,1176],{"class":1041},[931,2948,1179],{"class":1045},[931,2950,2951],{"class":1045}," up",[931,2953,2954],{"class":1045}," -d\n",[430,2956,2957,2958,2961],{},"Execute o seguinte comando ",[495,2959,2960],{},"curl"," para verificar a sua disponibilidade:",[923,2963,2965],{"className":1032,"code":2964,"language":1034,"meta":425,"style":425},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[495,2966,2967],{"__ignoreMap":425},[931,2968,2969,2971],{"class":933,"line":934},[931,2970,2960],{"class":1041},[931,2972,2973],{"class":1045}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[879,2975,2977],{"id":2976},"ligar-o-obsidian-ao-seu-servidor-synch","Ligar o Obsidian ao seu servidor Synch",[2158,2979,2981],{"id":2980},"instalar-o-plug-in-synch-no-obsidian","Instalar o plug-in Synch no Obsidian",[430,2983,2984,2985,2988,2989,2992],{},"Abra as Definições do Obsidian, navegue para ",[441,2986,2987],{},"Community plugins"," (Plug-ins da comunidade) e clique no botão ",[441,2990,2991],{},"'Browse'"," (Procurar):",[433,2994],{"src":2995,"alt":2996,"style":2997},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-community-plugins-browse.webp","Explorando plugins da comunidade nas configurações do Obsidian","max-width: 523px; width: 100%; height: auto;",[430,2999,3000,3001,1368,3004],{},"Procure e instale ",[441,3002,3003],{},"'Synchrun'",[433,3005],{"src":3006,"alt":3007,"style":2743},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","Instalando o plugin Synchrun no Obsidian",[430,3009,3010,3011,3013,3014,3017,3018,3021,3022,3025,3026,3029],{},"Assim que o ",[441,3012,3003],{}," estiver instalado, abra as definições do plug-in e ative ",[441,3015,3016],{},"'Use a self-hosted server'"," (Utilizar um servidor auto-hospedado). Em seguida, introduza ",[495,3019,3020],{},"https:\u002F\u002Fsynch.pafor.me"," no campo ",[441,3023,3024],{},"'Server URL'"," (URL do Servidor) e clique em ",[441,3027,3028],{},"'Save'"," (Guardar).",[433,3031],{"src":3032,"alt":3033,"style":3034},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-plugin-settings-self-hosted.webp","Configurando a URL do servidor auto-hospedado no Synchrun","max-width: 525px; width: 100%; height: auto;",[430,3036,3037,3038,3041,3042,3045,3046,3048],{},"Clique no botão ",[441,3039,3040],{},"'Sign in on this device'"," (Iniciar sessão neste dispositivo) sob ",[441,3043,3044],{},"'Account'"," (Conta). A seguir, registe-se para obter uma conta utilizando o endereço de e-mail especificado na sua lista ",[495,3047,2847],{},"; será então redirecionado para a seguinte página de autorização:",[433,3050],{"src":3051,"alt":3052,"style":3053},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-account-authorization-page.webp","Página de autorização de conta para o Synchrun","max-width: 494px; width: 100%; height: auto;",[430,3055,3037,3056,3059],{},[441,3057,3058],{},"'Allow Obsidian sign-in'"," (Permitir início de sessão no Obsidian):",[433,3061],{"src":3062,"alt":3063,"style":3064},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-allow-obsidian-signin.webp","Permitindo o login do Obsidian para o Synch","max-width: 498px; width: 100%; height: auto;",[430,3066,3037,3067,3070,3071,3074,3075],{},[441,3068,3069],{},"'Return to Obsidian'"," (Voltar ao Obsidian) e, em seguida, clique em ",[441,3072,3073],{},"'Create vault'"," (Criar cofre):\n",[433,3076],{"src":3077,"alt":3078,"style":3079},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-create-remote-vault.webp","Criando um novo cofre remoto no Synchrun","max-width: 496px; width: 100%; height: auto;",[430,3081,3082],{},"Introduza um nome e uma palavra-passe segura para criar o seu cofre remoto.",[433,3084],{"src":3085,"alt":3086,"style":3087},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-vault-password-setup.webp","Configurando uma senha segura para o cofre remoto do Obsidian","max-width: 500px; width: 100%; height: auto;",[430,3089,3090],{},"O processo de sincronização será iniciado de imediato e poderá demorar algum tempo, dependendo do tamanho do seu cofre. Uma vez concluído, será exibida a sua utilização total de armazenamento.",[433,3092],{"src":3093,"alt":3094,"style":3095},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-sync-completed-storage.webp","Sincronização concluída no Synchrun mostrando o armazenamento total utilizado","max-width: 508px; width: 100%; height: auto;",[474,3097,3099],{"id":3098},"acesso-ao-obsidian-no-navegador-com-o-ignis","Acesso ao Obsidian no navegador com o Ignis",[430,3101,598,3102,3104],{},[441,3103,2649],{}," substitui as APIs Electron do Obsidian por APIs Web, o que permite que o código JavaScript do Obsidian seja executado diretamente num navegador web normal. Todos os seus ficheiros markdown e anexos são guardados diretamente no sistema de ficheiros do servidor anfitrião.",[430,3106,3107,3108,3113,3114,3119],{},"Contudo, existem algumas limitações em comparação com a aplicação nativa de ambiente de trabalho do Obsidian. Algumas funcionalidades ou plug-ins que requerem APIs do Electron ou Node.js (que não têm equivalente direto num ambiente de navegador) não irão funcionar. Consulte os guias de ",[444,3109,3112],{"href":3110,"rel":3111},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[448],"Limitações"," e de ",[444,3115,3118],{"href":3116,"rel":3117},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[448],"Compatibilidade de plug-ins"," do Ignis para obter listagens detalhadas de compatibilidade.",[879,3121,3123],{"id":3122},"configuração-do-ignis","Configuração do Ignis",[430,3125,3126,3127,3129,3130,3133,3134,3137],{},"Iremos instalar o ",[441,3128,2649],{}," no nosso VPS utilizando o Docker, montando-o na pasta local ",[495,3131,3132],{},".\u002Fvaults",". Este diretório do cofre será sincronizado utilizando a ",[441,3135,3136],{},"Synch CLI"," para descarregar as atualizações das notas a partir do cofre remoto que configurámos anteriormente.",[430,3139,3140,3141,3143,3144,461],{},"Como o ",[441,3142,2649],{}," não possui autenticação integrada, deve ser protegido por trás de uma rede privada ",[441,3145,3146],{},[444,3147,1722],{"href":363},[2158,3149,3151],{"id":3150},"criar-registo-dns","Criar registo DNS",[433,3153],{"src":3154,"alt":3155,"style":3156},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-ignis.webp","Configurando um registro A de DNS para o cliente web Ignis no Cloudflare","max-width: 552px; width: 100%; height: auto;",[2158,3158,2852],{"id":3159},"adicionar-o-domínio-ao-caddyfile-1",[430,3161,3162,3163,3166,3167,889],{},"Adicione ",[495,3164,3165],{},"obsidian.pafor.me"," ao seu Caddyfile da mesma forma que ",[495,3168,3169],{},"synch.pafor.me",[923,3171,3173],{"className":2875,"code":3172,"language":2877,"meta":425,"style":425},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[495,3174,3175,3186,3190,3199],{"__ignoreMap":425},[931,3176,3177,3179,3182,3184],{"class":933,"line":934},[931,3178,2905],{"class":945},[931,3180,3181],{"class":941},"$OBSIDIAN_DOMAIN",[931,3183,2911],{"class":945},[931,3185,2914],{"class":945},[931,3187,3188],{"class":933,"line":1061},[931,3189,2919],{"class":941},[931,3191,3192,3194,3196],{"class":933,"line":1068},[931,3193,2924],{"class":941},[931,3195,889],{"class":945},[931,3197,3198],{"class":2929},"9898\n",[931,3200,3201],{"class":933,"line":1075},[931,3202,2892],{"class":945},[2158,3204,3206],{"id":3205},"iniciar-o-ignis-utilizando-o-docker","Iniciar o Ignis utilizando o Docker",[430,3208,3209,3210,3213],{},"Guarde o seguinte ficheiro docker compose yml como ",[495,3211,3212],{},"ignis-docker-compose.yml"," no VPS:",[923,3215,3217],{"className":1342,"code":3216,"language":1344,"meta":425,"style":425},"services:\n  ignis:\n    image: nobbe\u002Fignis:latest\n    ports:\n      - \"9898:8080\"\n    environment:\n      # coincidir com o utilizador do seu host (executar: id)\n      - PUID=1000\n      - PGID=1000\n      - WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n    volumes:\n      - .\u002Fvaults:\u002Fvaults\n      - .\u002Fdata:\u002Fapp\u002Fdata\n      - obsidian-app:\u002Fapp\u002Fobsidian-app\n    restart: unless-stopped\n\nvolumes:\n  obsidian-app:\n",[495,3218,3219,3226,3233,3243,3250,3263,3270,3275,3282,3289,3296,3303,3310,3317,3324,3335,3340,3348],{"__ignoreMap":425},[931,3220,3221,3224],{"class":933,"line":934},[931,3222,3223],{"class":1354},"services",[931,3225,1368],{"class":945},[931,3227,3228,3231],{"class":933,"line":1061},[931,3229,3230],{"class":1354},"  ignis",[931,3232,1368],{"class":945},[931,3234,3235,3238,3240],{"class":933,"line":1068},[931,3236,3237],{"class":1354},"    image",[931,3239,889],{"class":945},[931,3241,3242],{"class":1045}," nobbe\u002Fignis:latest\n",[931,3244,3245,3248],{"class":933,"line":1075},[931,3246,3247],{"class":1354},"    ports",[931,3249,1368],{"class":945},[931,3251,3252,3255,3258,3261],{"class":933,"line":1923},[931,3253,3254],{"class":945},"      -",[931,3256,3257],{"class":945}," \"",[931,3259,3260],{"class":1045},"9898:8080",[931,3262,1955],{"class":945},[931,3264,3265,3268],{"class":933,"line":1928},[931,3266,3267],{"class":1354},"    environment",[931,3269,1368],{"class":945},[931,3271,3272],{"class":933,"line":1934},[931,3273,3274],{"class":1071},"      # coincidir com o utilizador do seu host (executar: id)\n",[931,3276,3277,3279],{"class":933,"line":2270},[931,3278,3254],{"class":945},[931,3280,3281],{"class":1045}," PUID=1000\n",[931,3283,3284,3286],{"class":933,"line":2281},[931,3285,3254],{"class":945},[931,3287,3288],{"class":1045}," PGID=1000\n",[931,3290,3291,3293],{"class":933,"line":2377},[931,3292,3254],{"class":945},[931,3294,3295],{"class":1045}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[931,3297,3298,3301],{"class":933,"line":1695},[931,3299,3300],{"class":1354},"    volumes",[931,3302,1368],{"class":945},[931,3304,3305,3307],{"class":933,"line":2388},[931,3306,3254],{"class":945},[931,3308,3309],{"class":1045}," .\u002Fvaults:\u002Fvaults\n",[931,3311,3312,3314],{"class":933,"line":2393},[931,3313,3254],{"class":945},[931,3315,3316],{"class":1045}," .\u002Fdata:\u002Fapp\u002Fdata\n",[931,3318,3319,3321],{"class":933,"line":2399},[931,3320,3254],{"class":945},[931,3322,3323],{"class":1045}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[931,3325,3327,3330,3332],{"class":933,"line":3326},15,[931,3328,3329],{"class":1354},"    restart",[931,3331,889],{"class":945},[931,3333,3334],{"class":1045}," unless-stopped\n",[931,3336,3338],{"class":933,"line":3337},16,[931,3339,1065],{"emptyLinePlaceholder":1064},[931,3341,3343,3346],{"class":933,"line":3342},17,[931,3344,3345],{"class":1354},"volumes",[931,3347,1368],{"class":945},[931,3349,3351,3354],{"class":933,"line":3350},18,[931,3352,3353],{"class":1354},"  obsidian-app",[931,3355,1368],{"class":945},[485,3357,3358,3369,3383],{},[488,3359,3360,3361,3364,3365,3368],{},"Utilize a porta ",[495,3362,3363],{},"9898"," no host, visto que a ",[495,3366,3367],{},"8080"," é habitualmente utilizada por outros serviços.",[488,3370,3371,3372,3375,3376,2656,3379,3382],{},"Execute o comando ",[495,3373,3374],{},"id"," no seu VPS para verificar o ",[495,3377,3378],{},"UID",[495,3380,3381],{},"GID"," do utilizador do seu host para garantir as permissões corretas do sistema de ficheiros.",[488,3384,3385,3386,3389],{},"Defina ",[495,3387,3388],{},"WS_ORIGINS"," para permitir apenas ligações WebSocket originárias do seu nome de domínio específico.",[430,3391,3392,3393,889],{},"Inicie o Docker do ",[441,3394,2649],{},[923,3396,3398],{"className":1032,"code":3397,"language":1034,"meta":425,"style":425},"docker compose -f ignis-docker-compose.yml up -d\n",[495,3399,3400],{"__ignoreMap":425},[931,3401,3402,3404,3406,3409,3412,3414],{"class":933,"line":934},[931,3403,1176],{"class":1041},[931,3405,1179],{"class":1045},[931,3407,3408],{"class":1045}," -f",[931,3410,3411],{"class":1045}," ignis-docker-compose.yml",[931,3413,2951],{"class":1045},[931,3415,2954],{"class":1045},[430,3417,3418,3419,3422,3423,3426],{},"Ao aceder ao seu domínio num navegador web, surgirá o ",[441,3420,3421],{},"'Vault Manager'"," (Gestor de Cofres). Estará vazio, uma vez que ainda não configurou nenhum cofre. Iremos configurar a ",[441,3424,3425],{},"'Synch CLI'"," na próxima secção para sincronizar os conteúdos do nosso cofre remoto.",[433,3428],{"src":3429,"alt":3430,"style":3431},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-vault-manager-empty.webp","Interface vazia do Gerenciador de Cofres no cliente web Ignis","max-width: 466px; width: 100%; height: auto;",[2158,3433,3435],{"id":3434},"questão-de-firewall","Questão de Firewall",[430,3437,3438,3439,3442,3443,889],{},"Por predefinição, o Docker insere automaticamente as suas próprias regras DNAT e FORWARD, que encaminham o tráfego público diretamente para os contentores ativos. Isto contorna a cadeia ",[495,3440,3441],{},"INPUT"," padrão do Ubuntu UFW\u002Fiptables. Para bloquear o tráfego público externo e manter os contentores privados, adicione manualmente as seguintes regras ao ",[495,3444,3445],{},"iptables",[923,3447,3449],{"className":1032,"code":3448,"language":1034,"meta":425,"style":425},"# Bloquear todo o tráfego público externo\nsudo iptables -I DOCKER-USER -i ext_if -j DROP \n\n# Permitir tráfego apenas do IP privado do seu cliente Cloudflare WARP\nsudo iptables -I DOCKER-USER -i ext_if -s 100.96.0.10 -j ACCEPT\n",[495,3450,3451,3456,3483,3487,3492],{"__ignoreMap":425},[931,3452,3453],{"class":933,"line":934},[931,3454,3455],{"class":1071},"# Bloquear todo o tráfego público externo\n",[931,3457,3458,3460,3463,3466,3469,3472,3475,3478,3481],{"class":933,"line":1061},[931,3459,1891],{"class":1041},[931,3461,3462],{"class":1045}," iptables",[931,3464,3465],{"class":1045}," -I",[931,3467,3468],{"class":1045}," DOCKER-USER",[931,3470,3471],{"class":1045}," -i",[931,3473,3474],{"class":1045}," ext_if",[931,3476,3477],{"class":1045}," -j",[931,3479,3480],{"class":1045}," DROP",[931,3482,2025],{"class":941},[931,3484,3485],{"class":933,"line":1068},[931,3486,1065],{"emptyLinePlaceholder":1064},[931,3488,3489],{"class":933,"line":1075},[931,3490,3491],{"class":1071},"# Permitir tráfego apenas do IP privado do seu cliente Cloudflare WARP\n",[931,3493,3494,3496,3498,3500,3502,3504,3506,3509,3512,3514],{"class":933,"line":1923},[931,3495,1891],{"class":1041},[931,3497,3462],{"class":1045},[931,3499,3465],{"class":1045},[931,3501,3468],{"class":1045},[931,3503,3471],{"class":1045},[931,3505,3474],{"class":1045},[931,3507,3508],{"class":1045}," -s",[931,3510,3511],{"class":2929}," 100.96.0.10",[931,3513,3477],{"class":1045},[931,3515,3516],{"class":1045}," ACCEPT\n",[2158,3518,3520],{"id":3519},"configuração-da-synch-cli","Configuração da Synch CLI",[430,3522,3523,3524,3526],{},"A ",[441,3525,3136],{}," é uma ferramenta sem interface gráfica (headless) que permite sincronizar o diretório de um cofre do Obsidian diretamente em servidores remotos, sem exigir a instalação da aplicação de ambiente de trabalho completa.",[430,3528,3529,3530,3532,3533,3536,3537,3540,3541,3544,3545,742,3548,575,3551,3554,3555,3558,3559,921],{},"Compile a ",[441,3531,3136],{}," a partir do seu repositório ",[495,3534,3535],{},"synch"," clonado. A compilação requer o ",[441,3538,3539],{},"Node.js >= 22.5"," (pois a CLI depende do ",[495,3542,3543],{},"node:sqlite"," e de APIs globais do navegador como ",[495,3546,3547],{},"fetch",[495,3549,3550],{},"WebSocket",[495,3552,3553],{},"WebCrypto",") e o ",[441,3556,3557],{},"pnpm"," (dado que o repositório está estruturado como um espaço de trabalho de pnpm utilizando a versão ",[495,3560,3561],{},"10.33.0",[923,3563,3565],{"className":1032,"code":3564,"language":1034,"meta":425,"style":425},"# Verificar versões\nnode --version   # deve ser >= 22.5\npnpm --version\n\n# Na raiz do repositório\npnpm install\n\n# Compilar o pacote da CLI\npnpm -C apps\u002Fcli build\n\n# Após uma compilação bem-sucedida, terá o ficheiro `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Torne-o executável e coloque-o no seu PATH\nchmod +x apps\u002Fcli\u002Fdist\u002Fsynch.js\nln -sf \"$PWD\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js\" \"$HOME\u002F.local\u002Fbin\u002Fsynch\"\n\n# Verificação\nsynch --help\n",[495,3566,3567,3572,3583,3590,3594,3599,3606,3610,3615,3628,3632,3637,3648,3677,3681,3686],{"__ignoreMap":425},[931,3568,3569],{"class":933,"line":934},[931,3570,3571],{"class":1071},"# Verificar versões\n",[931,3573,3574,3577,3580],{"class":933,"line":1061},[931,3575,3576],{"class":1041},"node",[931,3578,3579],{"class":1045}," --version",[931,3581,3582],{"class":1071},"   # deve ser >= 22.5\n",[931,3584,3585,3587],{"class":933,"line":1068},[931,3586,3557],{"class":1041},[931,3588,3589],{"class":1045}," --version\n",[931,3591,3592],{"class":933,"line":1075},[931,3593,1065],{"emptyLinePlaceholder":1064},[931,3595,3596],{"class":933,"line":1923},[931,3597,3598],{"class":1071},"# Na raiz do repositório\n",[931,3600,3601,3603],{"class":933,"line":1928},[931,3602,3557],{"class":1041},[931,3604,3605],{"class":1045}," install\n",[931,3607,3608],{"class":933,"line":1934},[931,3609,1065],{"emptyLinePlaceholder":1064},[931,3611,3612],{"class":933,"line":2270},[931,3613,3614],{"class":1071},"# Compilar o pacote da CLI\n",[931,3616,3617,3619,3622,3625],{"class":933,"line":2281},[931,3618,3557],{"class":1041},[931,3620,3621],{"class":1045}," -C",[931,3623,3624],{"class":1045}," apps\u002Fcli",[931,3626,3627],{"class":1045}," build\n",[931,3629,3630],{"class":933,"line":2377},[931,3631,1065],{"emptyLinePlaceholder":1064},[931,3633,3634],{"class":933,"line":1695},[931,3635,3636],{"class":1071},"# Após uma compilação bem-sucedida, terá o ficheiro `apps\u002Fcli\u002Fdist\u002Fsynch.js`. Torne-o executável e coloque-o no seu PATH\n",[931,3638,3639,3642,3645],{"class":933,"line":2388},[931,3640,3641],{"class":1041},"chmod",[931,3643,3644],{"class":1045}," +x",[931,3646,3647],{"class":1045}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[931,3649,3650,3653,3656,3658,3661,3664,3667,3669,3672,3675],{"class":933,"line":2393},[931,3651,3652],{"class":1041},"ln",[931,3654,3655],{"class":1045}," -sf",[931,3657,3257],{"class":945},[931,3659,3660],{"class":941},"$PWD",[931,3662,3663],{"class":1045},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[931,3665,3666],{"class":945},"\"",[931,3668,3257],{"class":945},[931,3670,3671],{"class":941},"$HOME",[931,3673,3674],{"class":1045},"\u002F.local\u002Fbin\u002Fsynch",[931,3676,1955],{"class":945},[931,3678,3679],{"class":933,"line":2399},[931,3680,1065],{"emptyLinePlaceholder":1064},[931,3682,3683],{"class":933,"line":3326},[931,3684,3685],{"class":1071},"# Verificação\n",[931,3687,3688,3690],{"class":933,"line":3337},[931,3689,3535],{"class":1041},[931,3691,3692],{"class":1045}," --help\n",[430,3694,3695,3696,3699],{},"Visto que a Synch CLI é executada no mesmo VPS que o seu cofre remoto do Synch, esta pode ligar-se diretamente ao servidor local da API. Se estiver a configurar um servidor diferente, execute ",[495,3697,3698],{},"synch login --api-url \u003Curl-da-api-synch-remota>"," para definir o seu endpoint de destino da API.",[430,3701,3702],{},[433,3703],{"alt":3704,"src":3705},"Executando o synch login com URL de API personalizada no terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-api-url-terminal.webp",[430,3707,1830,3708,3711],{},[495,3709,3710],{},"synch login"," no seu terminal e receberá um URL de autenticação:",[430,3713,3714],{},[433,3715],{"alt":3716,"src":3717},"Saída do terminal mostrando a URL de autenticação para o Synch CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-auth-url-terminal.webp",[430,3719,3720],{},"Inicie sessão através da página web utilizando o mesmo endereço de e-mail registado com o plug-in Synchrun do seu Obsidian desktop.",[430,3722,3723],{},[433,3724],{"alt":3725,"src":3726},"Login web bem-sucedido para autorização do Synch CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-web-login-success.webp",[430,3728,1830,3729,3732],{},[495,3730,3731],{},"synch vault connect --vault ~\u002Fvaults\u002F\u003Cnome_do_cofre> --vault-id asadqe-7b29-4677-fsad-234asdafasd"," para ligar o seu diretório de cofre local no VPS ao cofre remoto.",[430,3734,3735,3736,3739,3740,3743,3744,921],{},"O ID do cofre remoto pode ser encontrado nas definições do plug-in ",[441,3737,3738],{},"Synchrun",", clicando em ",[441,3741,3742],{},"'Manage remote vaults'"," (Gerir cofres remotos). Isto irá exibir uma página web com a lista dos seus cofres remotos, cada um identificado por um GUID exclusivo (por exemplo, ",[495,3745,3746],{},"123e4567-e89b-12d3-a456-426614174000",[430,3748,3749,3754],{},[433,3750],{"src":3751,"alt":3752,"style":3753},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-manage-remote-vaults.webp","Gerenciando cofres remotos no plugin Synchrun","max-width: 582px; width: 100%; height: auto;",[433,3755],{"alt":3756,"src":3757},"Localizando o ID exclusivo do cofre remoto no Synchrun","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[430,3759,3760,3761,3764],{},"Introduza a palavra-passe do seu cofre quando solicitado para estabelecer a ligação. Assim que estiver ligado, execute ",[495,3762,3763],{},"synch sync --vault ~\u002Fvaults\u002F\u003Cnome-do-cofre>"," para efetuar a sua sincronização inicial. Esta primeira execução poderá demorar algum tempo, dependendo do tamanho do seu cofre.",[430,3766,3767],{},[433,3768],{"alt":3769,"src":3770},"Progresso inicial de sincronização do cofre no Synch CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-cli-initial-sync-progress.webp",[430,3772,3773,3774,3777],{},"Para automatizar este processo, configure e ative um serviço systemd para executar o ",[495,3775,3776],{},"synch watch"," continuamente, garantindo que as alterações sejam sincronizadas instantaneamente no arranque:",[923,3779,3781],{"className":1032,"code":3780,"language":1034,"meta":425,"style":425},"sudo tee \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service \u003C\u003C'EOF'\n[Unit]\nDescription=Synch vault watcher\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=\u003Cusername>\nExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\nWorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\nEnvironment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\nEnvironment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF\nsudo systemctl daemon-reload\nsudo systemctl enable --now synch-watch.service\n",[495,3782,3783,3799,3803,3808,3813,3818,3822,3826,3831,3836,3841,3846,3851,3856,3860,3865,3869,3873,3877,3883,3892],{"__ignoreMap":425},[931,3784,3785,3787,3790,3793,3796],{"class":933,"line":934},[931,3786,1891],{"class":1041},[931,3788,3789],{"class":1045}," tee",[931,3791,3792],{"class":1045}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[931,3794,3795],{"class":945}," \u003C\u003C",[931,3797,3798],{"class":945},"'EOF'\n",[931,3800,3801],{"class":933,"line":1061},[931,3802,2335],{"class":1045},[931,3804,3805],{"class":933,"line":1068},[931,3806,3807],{"class":1045},"Description=Synch vault watcher\n",[931,3809,3810],{"class":933,"line":1075},[931,3811,3812],{"class":1045},"After=network-online.target\n",[931,3814,3815],{"class":933,"line":1923},[931,3816,3817],{"class":1045},"Wants=network-online.target\n",[931,3819,3820],{"class":933,"line":1928},[931,3821,1065],{"emptyLinePlaceholder":1064},[931,3823,3824],{"class":933,"line":1934},[931,3825,2354],{"class":1045},[931,3827,3828],{"class":933,"line":2270},[931,3829,3830],{"class":1045},"Type=simple\n",[931,3832,3833],{"class":933,"line":2281},[931,3834,3835],{"class":1045},"User=\u003Cusername>\n",[931,3837,3838],{"class":933,"line":2377},[931,3839,3840],{"class":1045},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[931,3842,3843],{"class":933,"line":1695},[931,3844,3845],{"class":1045},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[931,3847,3848],{"class":933,"line":2388},[931,3849,3850],{"class":1045},"Environment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\n",[931,3852,3853],{"class":933,"line":2393},[931,3854,3855],{"class":1045},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[931,3857,3858],{"class":933,"line":2399},[931,3859,2374],{"class":1045},[931,3861,3862],{"class":933,"line":3326},[931,3863,3864],{"class":1045},"RestartSec=5\n",[931,3866,3867],{"class":933,"line":3337},[931,3868,1065],{"emptyLinePlaceholder":1064},[931,3870,3871],{"class":933,"line":3342},[931,3872,2396],{"class":1045},[931,3874,3875],{"class":933,"line":3350},[931,3876,2402],{"class":1045},[931,3878,3880],{"class":933,"line":3879},19,[931,3881,3882],{"class":945},"EOF\n",[931,3884,3886,3888,3890],{"class":933,"line":3885},20,[931,3887,1891],{"class":1041},[931,3889,1894],{"class":1045},[931,3891,2421],{"class":1045},[931,3893,3895,3897,3899,3901,3904],{"class":933,"line":3894},21,[931,3896,1891],{"class":1041},[931,3898,1894],{"class":1045},[931,3900,2022],{"class":1045},[931,3902,3903],{"class":1045}," --now",[931,3905,3906],{"class":1045}," synch-watch.service\n",[430,3908,3909,3910,3912],{},"Abra ",[495,3911,3165],{}," no seu navegador web. Irá constatar que a interface do utilizador e o layout são praticamente idênticos aos da aplicação de ambiente de trabalho:",[433,3914],{"src":3915,"alt":3916,"style":3917},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-web-interface-desktop-view.webp","Interface web do Ignis exibindo o cofre do Obsidian no desktop","max-width: 593px; width: 100%; height: auto;",[430,3919,3920],{},"Clicar no ícone de definições revela que quase todas as configurações essenciais se mantêm intactas, embora seja necessário reinstalar os seus plug-ins da comunidade:",[433,3922],{"src":3923,"alt":3924,"style":3925},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-settings-community-plugins.webp","Configurações de plugins da comunidade na interface web do Ignis","max-width: 597px; width: 100%; height: auto;",[430,3927,3928],{},"Para testar a configuração, pode adicionar uma nova nota através da interface web:",[433,3930],{"src":3931,"alt":3932,"style":3925},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-create-new-note-web.webp","Criando uma nova nota markdown através da interface web do Ignis",[430,3934,3935,3936,461],{},"A nota é sincronizada imediatamente de volta para a sua aplicação de ambiente de trabalho do Obsidian. Note que as pastas vazias não aparecem no ",[441,3937,2649],{},[433,3939],{"src":3940,"alt":3941,"style":3942},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-desktop-synced-note.webp","Nova nota criada e sincronizada com sucesso no aplicativo de desktop do Obsidian","max-width: 502px; width: 100%; height: auto;",[430,3944,3945,3946,3948],{},"Visualizar o ",[495,3947,3165],{}," num navegador web móvel:",[430,3950,3951,3956],{},[433,3952],{"src":3953,"alt":3954,"style":3955},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-sidebar.webp","Navegação da barra lateral do cliente web Ignis em um dispositivo móvel","max-width: 269px; width: 100%; height: auto;",[433,3957],{"src":3958,"alt":3959,"style":3955},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-editor.webp","Editor de notas markdown do cliente web Ignis em um dispositivo móvel",[430,3961,3962,3963,3965,3966,3969],{},"Quando elimina uma nota no ",[441,3964,2649],{},", esta é movida em segurança para a pasta ",[495,3967,3968],{},"~\u002Fvaults\u002F\u003Cnome-do-cofre>\u002F.trash"," do seu cofre local.",[474,3971,3973],{"id":3972},"considerações-finais-sobre-cofres-auto-hospedados","Considerações finais sobre cofres auto-hospedados",[430,3975,3976,3977,2656,3979,3981,3982,3984],{},"Juntos, o ",[441,3978,2640],{},[441,3980,2649],{}," disponibilizam o seu cofre principal do Obsidian de forma fluida em todos os seus dispositivos, inteiramente alojado numa infraestrutura sob o seu controlo direto. Posicionar estes serviços no interior de uma rede privada ",[441,3983,1722],{}," garante que as suas notas pessoais fiquem completamente protegidas da internet pública.",[430,3986,598,3987,3989],{},[441,3988,2649],{}," não se destina a substituir na totalidade a aplicação nativa de ambiente de trabalho do Obsidian. Em vez disso, atua como um cliente web leve e temporário para aceder e editar o seu cofre quando se encontra afastado do seu computador principal. Para a escrita diária e gestão detalhada do cofre, a aplicação nativa do Obsidian continua a ser a escolha mais confortável.",[430,3991,3992,3993,3995],{},"Como o Synch utiliza encriptação de ponta a ponta, a palavra-passe do seu cofre remoto tem de ser extremamente segura para proteger contra ataques de adivinhação por força bruta. É crítico que nunca perca esta palavra-passe — o servidor não armazena a ",[441,3994,2712],{}," desencriptada e, se a esquecer, os seus dados serão totalmente irrecuperáveis. Adicionalmente, certifique-se de que a sua instância de VPS, a par de quaisquer instantâneos ou cópias de segurança automatizadas, é devidamente mantida e mantida em segurança.",[430,3997,3998],{},"Embora o histórico de versões encriptado do Synch e as ferramentas de recuperação de ficheiros eliminados previnam a maioria das perdas acidentais, a manutenção de uma cópia de segurança independente e separada do seu cofre do Obsidian continua a ser fortemente recomendada.",[474,4000,4001],{"id":1610},"Referências",[485,4003,4004,4011,4018],{},[488,4005,4006],{},[444,4007,4010],{"href":4008,"rel":4009},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[448],"Implementação do Synch com Docker Compose",[488,4012,4013],{},[444,4014,4017],{"href":4015,"rel":4016},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[448],"Implementação do Ignis com Docker",[488,4019,4020],{},[444,4021,4024],{"href":4022,"rel":4023},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[448],"Como funciona a encriptação de ponta a ponta no Synch?",[1639,4026,4027],{},"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":425,"searchDepth":1061,"depth":1068,"links":4029},[4030,4039,4048,4049],{"id":2684,"depth":1061,"text":2685,"children":4031},[4032,4036],{"id":2726,"depth":1068,"text":2727,"children":4033},[4034,4035],{"id":2730,"depth":1075,"text":2731},{"id":2746,"depth":1075,"text":2747},{"id":2976,"depth":1068,"text":2977,"children":4037},[4038],{"id":2980,"depth":1075,"text":2981},{"id":3098,"depth":1061,"text":3099,"children":4040},[4041],{"id":3122,"depth":1068,"text":3123,"children":4042},[4043,4044,4045,4046,4047],{"id":3150,"depth":1075,"text":3151},{"id":3159,"depth":1075,"text":2852},{"id":3205,"depth":1075,"text":3206},{"id":3434,"depth":1075,"text":3435},{"id":3519,"depth":1075,"text":3520},{"id":3972,"depth":1061,"text":3973},{"id":1610,"depth":1061,"text":4001},[4051],"productivity","2026-09-15","Sincronize cofres do Obsidian entre dispositivos e aceda às notas na web usando Synch e Ignis auto-hospedados com o Cloudflare Zero Trust de forma segura.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002FPT-Sync-Obsidian-Across-Devices.webp","Sincronização segura de cofres do Obsidian entre múltiplos dispositivos usando as ferramentas auto-hospedadas Synch e Ignis no Cloudflare Zero Trust",{"schemaOrg":4057,"robots":1693,"sitemap":4061},[4058,4060],{"@type":4059,"headline":2622,"description":4053,"image":4054},"Article",{"@type":1672,"name":2622,"description":4053,"image":4054},{"lastmod":4062},"2026-09-16",{"title":4064,"description":4053,"ogTitle":2622,"ogDescription":4053,"twitterTitle":2622,"twitterDescription":4053},"Sincronização segura do Obsidian com Synch e Ignis","pt\u002Farticle\u002Fsync-obsidian-across-devices",[4067,4068,4069,2616],"Self-hosting","Obsidian","Sync","w9q-i3XBW-a7XzDtUq653w4_WENAorcI_0Z65GRHL2g",{"id":4072,"title":455,"author":425,"body":4073,"category":6189,"date":6190,"description":465,"extension":1664,"image":466,"imageAlt":467,"isPublished":1064,"meta":6191,"minRead":3350,"navigation":1064,"path":229,"seo":6213,"stem":6215,"tags":6216,"updatedAt":1702,"__hash__":6220},"article\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":427,"value":4074,"toc":6159},[4075,4078,4084,4089,4093,4096,4134,4138,4144,4182,4186,4190,4204,4210,4214,4218,4222,4236,4242,4290,4316,4320,4328,4334,4338,4341,4551,4555,4595,4601,4608,4616,4664,4670,4696,4700,4704,4731,4757,4762,4804,4812,5083,5087,5130,5135,5142,5146,5150,5174,5177,5183,5186,5190,5198,5204,5207,5213,5216,5240,5246,5252,5255,5261,5265,5268,5271,5274,5280,5283,5289,5295,5301,5306,5310,5321,5328,5334,5337,5343,5347,5354,5360,5366,5370,5375,5439,5452,5507,5510,5580,5583,5597,5603,5607,5652,5658,5661,5667,5670,5676,5680,5695,5711,5717,5814,5817,5823,5834,5880,5886,5892,5904,5920,5923,5929,5933,5940,5962,5971,6069,6080,6086,6093,6099,6102,6108,6111,6117,6121,6124,6126,6156],[430,4076,4077],{},"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.",[430,4079,4080],{},[433,4081],{"alt":4082,"src":4083},"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",[430,4085,598,4086,4088],{},[441,4087,1102],{},", 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.",[474,4090,4092],{"id":4091},"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",[430,4094,4095],{},"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:",[485,4097,4098,4104,4110,4116,4122,4128],{},[488,4099,4100,4103],{},[441,4101,4102],{},"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.",[488,4105,4106,4109],{},[441,4107,4108],{},"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.",[488,4111,4112,4115],{},[441,4113,4114],{},"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.",[488,4117,4118,4121],{},[441,4119,4120],{},"Sistema de identidade unificado:"," Humanos e agentes usam o mesmo sistema de identidade, autenticado por meio de chaves criptográficas.",[488,4123,4124,4127],{},[441,4125,4126],{},"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.",[488,4129,4130,4133],{},[441,4131,4132],{},"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.",[474,4135,4137],{"id":4136},"a-arquitetura-criptográfica-baseada-em-nostr-do-buzz","A arquitetura criptográfica baseada em Nostr do Buzz",[430,4139,4140],{},[433,4141],{"alt":4142,"src":4143},"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",[485,4145,4146,4152,4158,4164,4170,4176],{},[488,4147,4148,4151],{},[441,4149,4150],{},"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.",[488,4153,4154,4157],{},[441,4155,4156],{},"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.",[488,4159,4160,4163],{},[441,4161,4162],{},"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).",[488,4165,4166,4169],{},[441,4167,4168],{},"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.",[488,4171,4172,4175],{},[441,4173,4174],{},"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.",[488,4177,4178,4181],{},[441,4179,4180],{},"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.",[474,4183,4185],{"id":4184},"como-auto-hospedar-o-relay-buzz-do-block-em-um-vps-linux","Como auto-hospedar o relay Buzz do Block em um VPS Linux",[879,4187,4189],{"id":4188},"_0-pré-requisitos","0. Pré-requisitos",[485,4191,4192,4195,4198,4201],{},[488,4193,4194],{},"Um VPS Linux",[488,4196,4197],{},"Um domínio que aponte para o seu servidor",[488,4199,4200],{},"Docker e o plugin Docker Compose",[488,4202,4203],{},"Conta da Cloudflare (plano gratuito)",[430,4205,4206,4207,4209],{},"Neste guia, executaremos o relay Nostr em um VPS Ubuntu por trás de uma rede privada ",[444,4208,1706],{"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.",[463,4211],{"description":4212,"image":2605,"image-alt":4213,"label":2679,"min-read":2680,"title":1706,"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",[879,4215,4217],{"id":4216},"_1-dns-da-cloudflare-e-api-token","1. DNS da Cloudflare e API Token",[2158,4219,4221],{"id":4220},"criar-um-api-token-da-cloudflare","Criar um API Token da Cloudflare",[533,4223,4224,4230],{},[488,4225,3037,4226,4229],{},[441,4227,4228],{},"Profile"," no canto superior direito no menu suspenso do ícone do usuário.",[488,4231,4232,4233,461],{},"Clique em ",[441,4234,4235],{},"API Tokens",[430,4237,4238],{},[433,4239],{"alt":4240,"src":4241},"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",[533,4243,4244,4249,4255,4275,4280,4284,4287],{"start":1068},[488,4245,4232,4246,461],{},[441,4247,4248],{},"Create Token",[488,4250,4251,4252,461],{},"Use o modelo ",[441,4253,4254],{},"Edit zone DNS",[488,4256,4257,4258],{},"Configure o modelo da seguinte maneira:\n",[485,4259,4260,4266],{},[488,4261,4262,4265],{},[441,4263,4264],{},"Permissions",": Zone — DNS — Edit",[488,4267,4268,4271,4272],{},[441,4269,4270],{},"Zone Resources",": Include — Specific zone — ",[495,4273,4274],{},"example.com",[488,4276,4232,4277,461],{},[441,4278,4279],{},"Continue to summary",[488,4281,4232,4282,461],{},[441,4283,4248],{},[488,4285,4286],{},"Copie o token gerado, pois ele não será exibido novamente após fechar a página.",[488,4288,4289],{},"Teste o token gerado no seu terminal para se certificar de que funciona corretamente:",[923,4291,4293],{"className":1032,"code":4292,"language":1034,"meta":425,"style":425},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[495,4294,4295],{"__ignoreMap":425},[931,4296,4297,4299,4301,4304,4306,4309,4311,4314],{"class":933,"line":934},[931,4298,2960],{"class":1041},[931,4300,3257],{"class":945},[931,4302,4303],{"class":1045},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[931,4305,3666],{"class":945},[931,4307,4308],{"class":1045}," -H",[931,4310,3257],{"class":945},[931,4312,4313],{"class":1045},"Authorization: Bearer YOUR_TOKEN_HERE",[931,4315,1955],{"class":945},[2158,4317,4319],{"id":4318},"registros-dns","Registros DNS",[485,4321,4322],{},[488,4323,4324,4325,4327],{},"Crie um registro A e configure-o como ",[441,4326,2737],{}," (DNS only).",[430,4329,4330],{},[433,4331],{"alt":4332,"src":4333},"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",[879,4335,4337],{"id":4336},"_2-instalar-o-docker-no-ubuntu","2. Instalar o Docker no Ubuntu",[430,4339,4340],{},"Execute os seguintes comandos para instalar o Docker no Ubuntu:",[923,4342,4344],{"className":1032,"code":4343,"language":1034,"meta":425,"style":425},"# 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",[495,4345,4346,4351,4379,4383,4388,4430,4434,4439,4449,4453,4458,4479,4483,4488,4499,4503,4508,4514,4518,4532,4536,4541],{"__ignoreMap":425},[931,4347,4348],{"class":933,"line":934},[931,4349,4350],{"class":1071},"# Add Docker's official GPG key and set up the Docker repository\n",[931,4352,4353,4355,4358,4361,4364,4367,4370,4373,4376],{"class":933,"line":1061},[931,4354,2960],{"class":1041},[931,4356,4357],{"class":1045}," -fsSL",[931,4359,4360],{"class":1045}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[931,4362,4363],{"class":945}," |",[931,4365,4366],{"class":1041}," sudo",[931,4368,4369],{"class":1045}," gpg",[931,4371,4372],{"class":1045}," --dearmor",[931,4374,4375],{"class":1045}," -o",[931,4377,4378],{"class":1045}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[931,4380,4381],{"class":933,"line":1068},[931,4382,1065],{"emptyLinePlaceholder":1064},[931,4384,4385],{"class":933,"line":1075},[931,4386,4387],{"class":1071},"# Add the official Docker repository\n",[931,4389,4390,4393,4395,4398,4401,4404,4407,4410,4413,4415,4417,4419,4421,4424,4427],{"class":933,"line":1923},[931,4391,4392],{"class":962},"echo",[931,4394,3257],{"class":945},[931,4396,4397],{"class":1045},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[931,4399,4400],{"class":945},"$(",[931,4402,4403],{"class":1041},"lsb_release",[931,4405,4406],{"class":1045}," -cs",[931,4408,4409],{"class":945},")",[931,4411,4412],{"class":1045}," stable",[931,4414,3666],{"class":945},[931,4416,4363],{"class":945},[931,4418,4366],{"class":1041},[931,4420,3789],{"class":1045},[931,4422,4423],{"class":1045}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[931,4425,4426],{"class":945}," >",[931,4428,4429],{"class":1045}," \u002Fdev\u002Fnull\n",[931,4431,4432],{"class":933,"line":1928},[931,4433,1065],{"emptyLinePlaceholder":1064},[931,4435,4436],{"class":933,"line":1934},[931,4437,4438],{"class":1071},"# Update package list\n",[931,4440,4441,4443,4446],{"class":933,"line":2270},[931,4442,1891],{"class":1041},[931,4444,4445],{"class":1045}," apt",[931,4447,4448],{"class":1045}," update\n",[931,4450,4451],{"class":933,"line":2281},[931,4452,1065],{"emptyLinePlaceholder":1064},[931,4454,4455],{"class":933,"line":2377},[931,4456,4457],{"class":1071},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[931,4459,4460,4462,4464,4467,4470,4473,4476],{"class":933,"line":1695},[931,4461,1891],{"class":1041},[931,4463,4445],{"class":1045},[931,4465,4466],{"class":1045}," install",[931,4468,4469],{"class":1045}," docker-ce",[931,4471,4472],{"class":1045}," docker-ce-cli",[931,4474,4475],{"class":1045}," containerd.io",[931,4477,4478],{"class":1045}," -y\n",[931,4480,4481],{"class":933,"line":2388},[931,4482,1065],{"emptyLinePlaceholder":1064},[931,4484,4485],{"class":933,"line":2393},[931,4486,4487],{"class":1071},"# Start automatically when the system boots\n",[931,4489,4490,4492,4494,4496],{"class":933,"line":2399},[931,4491,1891],{"class":1041},[931,4493,1894],{"class":1045},[931,4495,2022],{"class":1045},[931,4497,4498],{"class":1045}," docker\n",[931,4500,4501],{"class":933,"line":3326},[931,4502,1065],{"emptyLinePlaceholder":1064},[931,4504,4505],{"class":933,"line":3337},[931,4506,4507],{"class":1071},"# Verify docker is installed\n",[931,4509,4510,4512],{"class":933,"line":3342},[931,4511,1176],{"class":1041},[931,4513,3589],{"class":1045},[931,4515,4516],{"class":933,"line":3350},[931,4517,1065],{"emptyLinePlaceholder":1064},[931,4519,4520,4522,4524,4526,4529],{"class":933,"line":3879},[931,4521,1891],{"class":1041},[931,4523,4445],{"class":1045},[931,4525,4466],{"class":1045},[931,4527,4528],{"class":1045}," -y",[931,4530,4531],{"class":1045}," docker-compose-plugin\n",[931,4533,4534],{"class":933,"line":3885},[931,4535,1065],{"emptyLinePlaceholder":1064},[931,4537,4538],{"class":933,"line":3894},[931,4539,4540],{"class":1071},"# Verify the compose plugin is installed\n",[931,4542,4544,4546,4548],{"class":933,"line":4543},22,[931,4545,1176],{"class":1041},[931,4547,1179],{"class":1045},[931,4549,4550],{"class":1045}," version\n",[879,4552,4554],{"id":4553},"_3-clonar-e-configurar","3. Clonar e configurar",[923,4556,4558],{"className":1032,"code":4557,"language":1034,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[495,4559,4560,4569,4573,4580,4588],{"__ignoreMap":425},[931,4561,4562,4564,4566],{"class":933,"line":934},[931,4563,2762],{"class":1041},[931,4565,2765],{"class":1045},[931,4567,4568],{"class":1045}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[931,4570,4571],{"class":933,"line":1061},[931,4572,1065],{"emptyLinePlaceholder":1064},[931,4574,4575,4577],{"class":933,"line":1068},[931,4576,2786],{"class":962},[931,4578,4579],{"class":1045}," buzz\u002Fdeploy\u002Fcompose\n",[931,4581,4582,4584,4586],{"class":933,"line":1075},[931,4583,2803],{"class":1041},[931,4585,2806],{"class":1045},[931,4587,2809],{"class":1045},[931,4589,4590,4593],{"class":933,"line":1923},[931,4591,4592],{"class":1041},"nano",[931,4594,2809],{"class":1045},[430,4596,4597,4598,4600],{},"Modifique ",[495,4599,2816],{}," em grupos:",[485,4602,4603],{},[488,4604,4605],{},[441,4606,4607],{},"Domínio:",[923,4609,4614],{"className":4610,"code":4612,"language":4613},[4611],"language-text","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","text",[495,4615,4612],{"__ignoreMap":425},[485,4617,4618,4628],{},[488,4619,4620,4623,4624,4627],{},[441,4621,4622],{},"Chave do proprietário:"," ",[495,4625,4626],{},"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.",[488,4629,4630,4633],{},[441,4631,4632],{},"Segredos (Secrets):",[485,4634,4635,4645,4658],{},[488,4636,4637,4638,4641,4642,4644],{},"Gere segredos usando esta ",[444,4639,4640],{"href":2836},"ferramenta online"," ou com ",[495,4643,2841],{}," (execute sete vezes)",[488,4646,4647,4648,579,4651,742,4654,4657],{},"Substitua cada marcador ",[495,4649,4650],{},"CHANGE_ME",[495,4652,4653],{},"BUZZ_RELAY_PRIVATE_KEY",[495,4655,4656],{},"BUZZ_GIT_HOOK_HMAC_SECRET",", as senhas do Postgres\u002FRedis\u002FTypesense e as chaves secretas\u002Facesso do S3.",[488,4659,4660,4661,461],{},"Marcadores restantes são a causa mais comum de loops de reinicialização de contêineres; verifique os seus com ",[495,4662,4663],{},"grep CHANGE_ME .env",[923,4665,4668],{"className":4666,"code":4667,"language":4613},[4611],"    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",[495,4669,4667],{"__ignoreMap":425},[485,4671,4672],{},[488,4673,4674,4677],{},[441,4675,4676],{},"Outros:",[485,4678,4679,4685],{},[488,4680,3162,4681,4684],{},[495,4682,4683],{},"CLOUDFLARE_API_TOKEN"," como uma variável de ambiente e atribua o token de API gerado anteriormente. Isso é obrigatório para o Caddy.",[488,4686,4687,4688,742,4690,575,4693,461],{},"Buzz é fornecido com padrões abertos — qualquer pessoa que conheça a URL do seu relay pode se autenticar e participar. Defina ",[495,4689,4626],{},[495,4691,4692],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[495,4694,4695],{},"BUZZ_REQUIRE_AUTH_TOKEN=true",[879,4697,4699],{"id":4698},"_4-habilitar-https-com-caddy","4. Habilitar HTTPS com Caddy",[2158,4701,4703],{"id":4702},"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",[485,4705,4706,4717,4728],{},[488,4707,4708,4709,4712,4713,4716],{},"Configuramos o DNS-01 com a Cloudflare para o Caddy. DNS-01 funciona fazendo com que o plug-in grave um registro TXT ",[495,4710,4711],{},"_acme-challenge.buzz.pafor.me"," no ",[441,4714,4715],{},"DNS público",";",[488,4718,4719,4720,4723,4724,4727],{},"Let's Encrypt então consulta o registro na internet pública para verificar o controle do domínio. Isso significa que ",[495,4721,4722],{},"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 ",[495,4725,4726],{},"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.",[488,4729,4730],{},"Adicione o seguinte ao Caddyfile:",[923,4732,4734],{"className":1342,"code":4733,"language":1344,"meta":425,"style":425},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[495,4735,4736,4740,4753],{"__ignoreMap":425},[931,4737,4738],{"class":933,"line":934},[931,4739,2884],{"class":945},[931,4741,4742,4745,4748,4751],{"class":933,"line":1061},[931,4743,4744],{"class":1045},"  acme_dns cloudflare",[931,4746,4747],{"class":945}," {",[931,4749,4750],{"class":1045},"env.CLOUDFLARE_API_TOKEN",[931,4752,2892],{"class":945},[931,4754,4755],{"class":933,"line":1068},[931,4756,2892],{"class":945},[485,4758,4759],{},[488,4760,4761],{},"Crie um Dockerfile.caddy com o seguinte conteúdo, que é exigido pelo compose.caddy.yml:",[923,4763,4765],{"className":1342,"code":4764,"language":1344,"meta":425,"style":425},"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",[495,4766,4767,4772,4776,4781,4786,4790,4795,4799],{"__ignoreMap":425},[931,4768,4769],{"class":933,"line":934},[931,4770,4771],{"class":1045},"FROM caddy:2-builder AS builder\n",[931,4773,4774],{"class":933,"line":1061},[931,4775,1065],{"emptyLinePlaceholder":1064},[931,4777,4778],{"class":933,"line":1068},[931,4779,4780],{"class":1045},"RUN xcaddy build \\\n",[931,4782,4783],{"class":933,"line":1075},[931,4784,4785],{"class":1045},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[931,4787,4788],{"class":933,"line":1923},[931,4789,1065],{"emptyLinePlaceholder":1064},[931,4791,4792],{"class":933,"line":1928},[931,4793,4794],{"class":1045},"FROM caddy:2-alpine\n",[931,4796,4797],{"class":933,"line":1934},[931,4798,1065],{"emptyLinePlaceholder":1064},[931,4800,4801],{"class":933,"line":2270},[931,4802,4803],{"class":1045},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[485,4805,4806],{},[488,4807,4597,4808,4811],{},[495,4809,4810],{},"compose.caddy.yml"," para usar a imagem com o módulo da Cloudflare e passar o token de API da Cloudflare:",[923,4813,4815],{"className":1342,"code":4814,"language":1344,"meta":425,"style":425},"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",[495,4816,4817,4823,4830,4842,4846,4853,4860,4870,4880,4889,4896,4903,4913,4919,4929,4939,4945,4956,4967,4973,4980,4987,4994,5003,5011,5019,5024,5031,5039,5047,5058,5066,5073],{"__ignoreMap":425},[931,4818,4819,4821],{"class":933,"line":934},[931,4820,3223],{"class":1354},[931,4822,1368],{"class":945},[931,4824,4825,4828],{"class":933,"line":1061},[931,4826,4827],{"class":1354},"  relay",[931,4829,1368],{"class":945},[931,4831,4832,4834,4836,4839],{"class":933,"line":1068},[931,4833,3247],{"class":1354},[931,4835,889],{"class":945},[931,4837,4838],{"class":937}," !reset",[931,4840,4841],{"class":945}," []\n",[931,4843,4844],{"class":933,"line":1075},[931,4845,1065],{"emptyLinePlaceholder":1064},[931,4847,4848,4851],{"class":933,"line":1923},[931,4849,4850],{"class":1354},"  caddy",[931,4852,1368],{"class":945},[931,4854,4855,4858],{"class":933,"line":1928},[931,4856,4857],{"class":1354},"    build",[931,4859,1368],{"class":945},[931,4861,4862,4865,4867],{"class":933,"line":1934},[931,4863,4864],{"class":1354},"      context",[931,4866,889],{"class":945},[931,4868,4869],{"class":2929}," .\n",[931,4871,4872,4875,4877],{"class":933,"line":2270},[931,4873,4874],{"class":1354},"      dockerfile",[931,4876,889],{"class":945},[931,4878,4879],{"class":1045}," Dockerfile.caddy\n",[931,4881,4882,4884,4886],{"class":933,"line":2281},[931,4883,3237],{"class":1354},[931,4885,889],{"class":945},[931,4887,4888],{"class":1045}," buzz-caddy:cloudflare\n",[931,4890,4891,4894],{"class":933,"line":2377},[931,4892,4893],{"class":1354},"    depends_on",[931,4895,1368],{"class":945},[931,4897,4898,4901],{"class":933,"line":1695},[931,4899,4900],{"class":1354},"      relay",[931,4902,1368],{"class":945},[931,4904,4905,4908,4910],{"class":933,"line":2388},[931,4906,4907],{"class":1354},"        condition",[931,4909,889],{"class":945},[931,4911,4912],{"class":1045}," service_healthy\n",[931,4914,4915,4917],{"class":933,"line":2393},[931,4916,3267],{"class":1354},[931,4918,1368],{"class":945},[931,4920,4921,4924,4926],{"class":933,"line":2399},[931,4922,4923],{"class":1354},"      BUZZ_DOMAIN",[931,4925,889],{"class":945},[931,4927,4928],{"class":1045}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[931,4930,4931,4934,4936],{"class":933,"line":3326},[931,4932,4933],{"class":1354},"      CLOUDFLARE_API_TOKEN",[931,4935,889],{"class":945},[931,4937,4938],{"class":1045}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[931,4940,4941,4943],{"class":933,"line":3337},[931,4942,3247],{"class":1354},[931,4944,1368],{"class":945},[931,4946,4947,4949,4951,4954],{"class":933,"line":3342},[931,4948,3254],{"class":945},[931,4950,3257],{"class":945},[931,4952,4953],{"class":1045},"${CADDY_HTTP_PORT:-80}:80",[931,4955,1955],{"class":945},[931,4957,4958,4960,4962,4965],{"class":933,"line":3350},[931,4959,3254],{"class":945},[931,4961,3257],{"class":945},[931,4963,4964],{"class":1045},"${CADDY_HTTPS_PORT:-443}:443",[931,4966,1955],{"class":945},[931,4968,4969,4971],{"class":933,"line":3879},[931,4970,3300],{"class":1354},[931,4972,1368],{"class":945},[931,4974,4975,4977],{"class":933,"line":3885},[931,4976,3254],{"class":945},[931,4978,4979],{"class":1045}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[931,4981,4982,4984],{"class":933,"line":3894},[931,4983,3254],{"class":945},[931,4985,4986],{"class":1045}," buzz-caddy-data:\u002Fdata\n",[931,4988,4989,4991],{"class":933,"line":4543},[931,4990,3254],{"class":945},[931,4992,4993],{"class":1045}," buzz-caddy-config:\u002Fconfig\n",[931,4995,4997,4999,5001],{"class":933,"line":4996},23,[931,4998,3329],{"class":1354},[931,5000,889],{"class":945},[931,5002,3334],{"class":1045},[931,5004,5006,5009],{"class":933,"line":5005},24,[931,5007,5008],{"class":1354},"    networks",[931,5010,1368],{"class":945},[931,5012,5014,5016],{"class":933,"line":5013},25,[931,5015,3254],{"class":945},[931,5017,5018],{"class":1045}," buzz-net\n",[931,5020,5022],{"class":933,"line":5021},26,[931,5023,1065],{"emptyLinePlaceholder":1064},[931,5025,5027,5029],{"class":933,"line":5026},27,[931,5028,3345],{"class":1354},[931,5030,1368],{"class":945},[931,5032,5034,5037],{"class":933,"line":5033},28,[931,5035,5036],{"class":1354},"  buzz-caddy-data",[931,5038,1368],{"class":945},[931,5040,5042,5045],{"class":933,"line":5041},29,[931,5043,5044],{"class":1354},"    labels",[931,5046,1368],{"class":945},[931,5048,5050,5053,5055],{"class":933,"line":5049},30,[931,5051,5052],{"class":1354},"      com.buzz.volume",[931,5054,889],{"class":945},[931,5056,5057],{"class":1045}," caddy-data\n",[931,5059,5061,5064],{"class":933,"line":5060},31,[931,5062,5063],{"class":1354},"  buzz-caddy-config",[931,5065,1368],{"class":945},[931,5067,5069,5071],{"class":933,"line":5068},32,[931,5070,5044],{"class":1354},[931,5072,1368],{"class":945},[931,5074,5076,5078,5080],{"class":933,"line":5075},33,[931,5077,5052],{"class":1354},[931,5079,889],{"class":945},[931,5081,5082],{"class":1045}," caddy-config\n",[2158,5084,5086],{"id":5085},"iniciar-os-contêineres-docker","Iniciar os contêineres Docker",[923,5088,5090],{"className":1032,"code":5089,"language":1034,"meta":425,"style":425},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[495,5091,5092,5112,5116,5121],{"__ignoreMap":425},[931,5093,5094,5096,5098,5100,5103,5105,5108,5110],{"class":933,"line":934},[931,5095,1176],{"class":1041},[931,5097,1179],{"class":1045},[931,5099,3408],{"class":1045},[931,5101,5102],{"class":1045}," compose.yml",[931,5104,3408],{"class":1045},[931,5106,5107],{"class":1045}," compose.caddy.yml",[931,5109,2951],{"class":1045},[931,5111,2954],{"class":1045},[931,5113,5114],{"class":933,"line":1061},[931,5115,1065],{"emptyLinePlaceholder":1064},[931,5117,5118],{"class":933,"line":1068},[931,5119,5120],{"class":1071},"#Check the Docker status\n",[931,5122,5123,5125,5127],{"class":933,"line":1075},[931,5124,1176],{"class":1041},[931,5126,1179],{"class":1045},[931,5128,5129],{"class":1045}," ps\n",[433,5131],{"src":5132,"alt":5133,"style":5134},"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;",[430,5136,5137,5138,5141],{},"Abra o seu navegador e navegue até ",[495,5139,5140],{},"http:\u002F\u002Fbuzz.pafor.me"," para verificar se o relay está funcionando.",[433,5143],{"src":5144,"alt":5145,"style":3087},"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",[879,5147,5149],{"id":5148},"passo-5-backups-desde-o-primeiro-dia","Passo 5: Backups desde o primeiro dia",[923,5151,5153],{"className":1032,"code":5152,"language":1034,"meta":425,"style":425},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[495,5154,5155,5166],{"__ignoreMap":425},[931,5156,5157,5160,5163],{"class":933,"line":934},[931,5158,5159],{"class":1041},"mkdir",[931,5161,5162],{"class":1045}," -p",[931,5164,5165],{"class":1045}," \u002Fbuzz_backups\n",[931,5167,5168,5171],{"class":933,"line":1061},[931,5169,5170],{"class":1041},"crontab",[931,5172,5173],{"class":1045}," -e\n",[430,5175,5176],{},"Adicione um trabalho cron de backup noturno do banco de dados:",[923,5178,5181],{"className":5179,"code":5180,"language":4613},[4611],"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",[495,5182,5180],{"__ignoreMap":425},[430,5184,5185],{},"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.",[474,5187,5189],{"id":5188},"configurando-o-cliente-desktop-buzz-e-as-identidades-nostr","Configurando o cliente desktop Buzz e as identidades Nostr",[430,5191,5192,5193,5197],{},"Baixe o aplicativo desktop do Buzz em ",[444,5194,5195],{"href":5195,"rel":5196},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[448]," e inicie-o. Preencha as informações do perfil até chegar à página \"Join or create a community\".",[430,5199,5200],{},[433,5201],{"alt":5202,"src":5203},"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",[430,5205,5206],{},"Clique em \"Join a community\" e copie a sua chave pública.",[430,5208,5209],{},[433,5210],{"alt":5211,"src":5212},"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",[430,5214,5215],{},"Execute o seguinte comando no VPS para se adicionar como o primeiro membro:",[923,5217,5219],{"className":1032,"code":5218,"language":1034,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[495,5220,5221],{"__ignoreMap":425},[931,5222,5223,5225,5227,5229,5231,5233,5235,5237],{"class":933,"line":934},[931,5224,1176],{"class":1041},[931,5226,1179],{"class":1045},[931,5228,1182],{"class":1045},[931,5230,1185],{"class":1045},[931,5232,1188],{"class":1045},[931,5234,1191],{"class":1045},[931,5236,1194],{"class":1045},[931,5238,5239],{"class":1045}," npub1yourkeyhere\n",[430,5241,3162,5242,5245],{},[495,5243,5244],{},"wss:\u002F\u002Fbuzz.pafor.me"," como a URL da comunidade e clique em \"Next\".",[430,5247,5248],{},[433,5249],{"alt":5250,"src":5251},"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",[430,5253,5254],{},"Digite um nome e clique no botão Next.",[430,5256,5257],{},[433,5258],{"alt":5259,"src":5260},"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",[879,5262,5264],{"id":5263},"canais-channels-e-agentes","Canais (Channels) e Agentes",[430,5266,5267],{},"Canais são grupos de tarefas ou projetos. Crie um canal por tarefa ou projeto e inclua os humanos e agentes.",[430,5269,5270],{},"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.",[430,5272,5273],{},"Vamos enviar uma mensagem direta (DM) para um agente pré-configurado",[430,5275,5276],{},[433,5277],{"alt":5278,"src":5279},"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",[430,5281,5282],{},"Vamos criar um canal e adicionar alguns agentes a ele",[430,5284,5285],{},[433,5286],{"alt":5287,"src":5288},"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",[430,5290,5291],{},[433,5292],{"alt":5293,"src":5294},"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",[430,5296,5297],{},[433,5298],{"alt":5299,"src":5300},"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",[433,5302],{"src":5303,"alt":5304,"style":5305},"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;",[879,5307,5309],{"id":5308},"habilitar-runtimes-de-agentes","Habilitar runtimes de agentes",[430,5311,5312,5313,5316,5317,5320],{},"Os runtimes predefinidos dependem da descoberta automática que detecta os binários de inicialização (como ",[495,5314,5315],{},"hermes-acp",") em diretórios padrão como ",[495,5318,5319],{},"~\u002F.local\u002Fbin",". Se uma ferramenta foi instalada em um local não padrão, o Buzz não poderá resolvê-la.",[430,5322,5323,5324,5327],{},"Para o Kimi Code, o ID do agente é kimi, e o Buzz procura o seu binario em ",[495,5325,5326],{},"~\u002F.local\u002Fbin\u002Fkimi",". Um link simbólico resolve o problema:",[923,5329,5332],{"className":5330,"code":5331,"language":4613},[4611],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[495,5333,5331],{"__ignoreMap":425},[430,5335,5336],{},"O Kimi Code agora aparece em runtimes de agentes.",[430,5338,5339],{},[433,5340],{"alt":5341,"src":5342},"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",[879,5344,5346],{"id":5345},"projetos-e-repositórios","Projetos e Repositórios",[430,5348,5349,5350,5353],{},"Primeiro, ative o recurso '",[441,5351,5352],{},"Projects","' em Settings → Experiments:",[430,5355,5356],{},[433,5357],{"alt":5358,"src":5359},"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",[430,5361,5362,5363,5365],{},"Atualmente, um projeto deve ser criado usando o ",[495,5364,1206],{}," (embora a criação direta de projetos a partir da interface do usuário esteja planejada para uma versão futura).",[2158,5367,5369],{"id":5368},"instalar-buzz-cli","Instalar buzz-cli",[430,5371,5372,5373,3213],{},"Execute os seguintes comandos para instalar o ",[495,5374,1206],{},[923,5376,5378],{"className":1032,"code":5377,"language":1034,"meta":425,"style":425},"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",[495,5379,5380,5391,5398,5411],{"__ignoreMap":425},[931,5381,5382,5384,5386,5388],{"class":933,"line":934},[931,5383,1891],{"class":1041},[931,5385,4445],{"class":1045},[931,5387,4466],{"class":1045},[931,5389,5390],{"class":1045}," cargo\n",[931,5392,5393,5395],{"class":933,"line":1061},[931,5394,2786],{"class":962},[931,5396,5397],{"class":1045}," ~\u002Fbuzz\n",[931,5399,5400,5403,5405,5408],{"class":933,"line":1068},[931,5401,5402],{"class":1041},"cargo",[931,5404,4466],{"class":1045},[931,5406,5407],{"class":1045}," --path",[931,5409,5410],{"class":1045}," crates\u002Fbuzz-cli\n",[931,5412,5413,5415,5418,5421,5424,5427,5430,5433,5436],{"class":933,"line":1075},[931,5414,4392],{"class":962},[931,5416,5417],{"class":945}," '",[931,5419,5420],{"class":1045},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[931,5422,5423],{"class":945},"'",[931,5425,5426],{"class":945}," >>",[931,5428,5429],{"class":1045}," ~\u002F.bashrc",[931,5431,5432],{"class":945}," &&",[931,5434,5435],{"class":962}," source",[931,5437,5438],{"class":1045}," ~\u002F.bashrc\n",[430,5440,5441,5442,5445,5446,5448,5449,5451],{},"Gere um par de chaves privada e pública usando a ",[444,5443,4640],{"href":5444},"\u002Fpt\u002Ftools\u002Fnostr-key-generator"," ou o ",[495,5447,1206],{},". Este par constitui a identidade do ",[495,5450,1206],{}," no relay Nostr.",[923,5453,5455],{"className":1032,"code":5454,"language":1034,"meta":425,"style":425},"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",[495,5456,5457,5479,5483,5488],{"__ignoreMap":425},[931,5458,5459,5461,5464,5467,5470,5473,5476],{"class":933,"line":934},[931,5460,1176],{"class":1041},[931,5462,5463],{"class":1045}," run",[931,5465,5466],{"class":1045}," --rm",[931,5468,5469],{"class":1045}," --entrypoint",[931,5471,5472],{"class":1045}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[931,5474,5475],{"class":1045}," ghcr.io\u002Fblock\u002Fbuzz:main",[931,5477,5478],{"class":1045}," generate-key\n",[931,5480,5481],{"class":933,"line":1061},[931,5482,1065],{"emptyLinePlaceholder":1064},[931,5484,5485],{"class":933,"line":1068},[931,5486,5487],{"class":1071},"# Use the generated Public Key\n",[931,5489,5490,5492,5494,5496,5498,5500,5502,5504],{"class":933,"line":1075},[931,5491,1176],{"class":1041},[931,5493,1179],{"class":1045},[931,5495,1182],{"class":1045},[931,5497,1185],{"class":1045},[931,5499,1188],{"class":1045},[931,5501,1191],{"class":1045},[931,5503,1194],{"class":1045},[931,5505,5506],{"class":1045}," generated_Public_key\n",[430,5508,5509],{},"Configurar a CLI:",[923,5511,5513],{"className":1032,"code":5512,"language":1034,"meta":425,"style":425},"# 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",[495,5514,5515,5520,5551,5555],{"__ignoreMap":425},[931,5516,5517],{"class":933,"line":934},[931,5518,5519],{"class":1071},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[931,5521,5522,5524,5526,5529,5531,5534,5537,5540,5543,5546,5548],{"class":933,"line":1061},[931,5523,4392],{"class":962},[931,5525,5417],{"class":945},[931,5527,5528],{"class":1045},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[931,5530,5423],{"class":945},[931,5532,5533],{"class":945},"  >>",[931,5535,5536],{"class":1045}," \u002Fhome\u002F",[931,5538,5539],{"class":945},"\u003C",[931,5541,5542],{"class":1045},"use",[931,5544,5545],{"class":941},"r",[931,5547,1249],{"class":945},[931,5549,5550],{"class":1045},"\u002F.bashrc\n",[931,5552,5553],{"class":933,"line":1068},[931,5554,1065],{"emptyLinePlaceholder":1064},[931,5556,5557,5559,5561,5564,5566,5568,5570,5572,5574,5576,5578],{"class":933,"line":1075},[931,5558,4392],{"class":962},[931,5560,5417],{"class":945},[931,5562,5563],{"class":1045},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[931,5565,5423],{"class":945},[931,5567,5533],{"class":945},[931,5569,5536],{"class":1045},[931,5571,5539],{"class":945},[931,5573,5542],{"class":1045},[931,5575,5545],{"class":941},[931,5577,1249],{"class":945},[931,5579,5550],{"class":1045},[430,5581,5582],{},"Execute o seguinte comando para verificar se o buzz-cli está configurado corretamente:",[923,5584,5586],{"className":1032,"code":5585,"language":1034,"meta":425,"style":425},"buzz channels list\n",[495,5587,5588],{"__ignoreMap":425},[931,5589,5590,5592,5594],{"class":933,"line":934},[931,5591,1229],{"class":1041},[931,5593,1232],{"class":1045},[931,5595,5596],{"class":1045}," list\n",[430,5598,5599],{},[433,5600],{"alt":5601,"src":5602},"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",[2158,5604,5606],{"id":5605},"criar-um-projeto-com-o-buzz-cli","Criar um projeto com o buzz-cli",[923,5608,5610],{"className":1032,"code":5609,"language":1034,"meta":425,"style":425},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[495,5611,5612,5617],{"__ignoreMap":425},[931,5613,5614],{"class":933,"line":934},[931,5615,5616],{"class":1071},"# --channel refers to the UUID of the channel\n",[931,5618,5619,5621,5624,5627,5630,5633,5636,5638,5641,5643,5645,5647,5650],{"class":933,"line":1061},[931,5620,1229],{"class":1041},[931,5622,5623],{"class":1045}," repos",[931,5625,5626],{"class":1045}," create",[931,5628,5629],{"class":1045}," --id",[931,5631,5632],{"class":1045}," TestKOA",[931,5634,5635],{"class":1045}," --name",[931,5637,5417],{"class":945},[931,5639,5640],{"class":1045},"Display Name",[931,5642,5423],{"class":945},[931,5644,1237],{"class":1045},[931,5646,3257],{"class":945},[931,5648,5649],{"class":1045},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[931,5651,1955],{"class":945},[430,5653,5654,5655,5657],{},"Um projeto só pode ser removido por seu proprietário. Como o projeto \"Display Name\" foi criado pelo ",[495,5656,1206],{},", que carece de um comando de remoção, ele não pode ser excluído dessa maneira.",[430,5659,5660],{},"Consulte o aplicativo desktop Buzz para verificar se o projeto foi criado.",[430,5662,5663],{},[433,5664],{"alt":5665,"src":5666},"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",[430,5668,5669],{},"Assim que um projeto estiver disponível em Projects, mais projetos poderão ser adicionados usando o botão \"+\" no canto superior direito.",[430,5671,5672],{},[433,5673],{"alt":5674,"src":5675},"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",[2158,5677,5679],{"id":5678},"vincular-repositórios-git-existentes","Vincular repositórios Git existentes",[430,5681,2526,5682,5685,5686,5689,5690,889],{},[495,5683,5684],{},"git-credential-nostr"," na máquina onde os repositórios git estão instalados. Ele requer o ",[441,5687,5688],{},"git 2.46+"," e a toolchain Rust. Consulte este ",[444,5691,5694],{"href":5692,"rel":5693},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[448],"Readme",[923,5696,5698],{"className":1032,"code":5697,"language":1034,"meta":425,"style":425},"cargo install --path crates\u002Fgit-credential-nostr\n",[495,5699,5700],{"__ignoreMap":425},[931,5701,5702,5704,5706,5708],{"class":933,"line":934},[931,5703,5402],{"class":1041},[931,5705,4466],{"class":1045},[931,5707,5407],{"class":1045},[931,5709,5710],{"class":1045}," crates\u002Fgit-credential-nostr\n",[430,5712,5713,5714,5716],{},"Configure o ",[495,5715,5684],{}," para autorização do relay Buzz:",[923,5718,5720],{"className":1032,"code":5719,"language":1034,"meta":425,"style":425},"# 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",[495,5721,5722,5727,5743,5756,5760,5765,5774,5801],{"__ignoreMap":425},[931,5723,5724],{"class":933,"line":934},[931,5725,5726],{"class":1071},"# 1. Register the helper and enable per-path credentials.\n",[931,5728,5729,5731,5734,5737,5740],{"class":933,"line":1061},[931,5730,2762],{"class":1041},[931,5732,5733],{"class":1045}," config",[931,5735,5736],{"class":1045}," --global",[931,5738,5739],{"class":1045}," credential.helper",[931,5741,5742],{"class":1045}," nostr\n",[931,5744,5745,5747,5749,5751,5754],{"class":933,"line":1068},[931,5746,2762],{"class":1041},[931,5748,5733],{"class":1045},[931,5750,5736],{"class":1045},[931,5752,5753],{"class":1045}," credential.useHttpPath",[931,5755,1379],{"class":945},[931,5757,5758],{"class":933,"line":1075},[931,5759,1065],{"emptyLinePlaceholder":1064},[931,5761,5762],{"class":933,"line":1923},[931,5763,5764],{"class":1071},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[931,5766,5767,5769,5771],{"class":933,"line":1928},[931,5768,5159],{"class":1041},[931,5770,5162],{"class":1045},[931,5772,5773],{"class":1045}," ~\u002F.nostr\n",[931,5775,5776,5778,5780,5783,5785,5787,5790,5792,5795,5798],{"class":933,"line":1934},[931,5777,4392],{"class":962},[931,5779,3257],{"class":945},[931,5781,5782],{"class":1045},"nsec1...",[931,5784,3666],{"class":945},[931,5786,4426],{"class":945},[931,5788,5789],{"class":1045}," ~\u002F.nostr\u002Fkey",[931,5791,5432],{"class":945},[931,5793,5794],{"class":1041}," chmod",[931,5796,5797],{"class":2929}," 600",[931,5799,5800],{"class":1045}," ~\u002F.nostr\u002Fkey\n",[931,5802,5803,5805,5807,5809,5812],{"class":933,"line":2270},[931,5804,2762],{"class":1041},[931,5806,5733],{"class":1045},[931,5808,5736],{"class":1045},[931,5810,5811],{"class":1045}," nostr.keyfile",[931,5813,5800],{"class":1045},[430,5815,5816],{},"Crie um repositório no relay Buzz:",[923,5818,5821],{"className":5819,"code":5820,"language":4613},[4611],"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",[495,5822,5820],{"__ignoreMap":425},[430,5824,5825,5826,5829,5830,5833],{},"No seu primeiro ",[495,5827,5828],{},"git push",", você encontrará um erro ",[495,5831,5832],{},"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):",[923,5835,5837],{"className":1032,"code":5836,"language":1034,"meta":425,"style":425},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[495,5838,5839,5864,5868,5873],{"__ignoreMap":425},[931,5840,5841,5843,5845,5848,5850,5853,5855,5857,5859,5861],{"class":933,"line":934},[931,5842,1229],{"class":1041},[931,5844,5623],{"class":1045},[931,5846,5847],{"class":1045}," bind",[931,5849,5629],{"class":1045},[931,5851,5852],{"class":1045}," koa-email-routing",[931,5854,1237],{"class":1045},[931,5856,1240],{"class":945},[931,5858,1243],{"class":1045},[931,5860,1246],{"class":941},[931,5862,5863],{"class":945},">\n",[931,5865,5866],{"class":933,"line":1061},[931,5867,1065],{"emptyLinePlaceholder":1064},[931,5869,5870],{"class":933,"line":1068},[931,5871,5872],{"class":1071},"# push the code again\n",[931,5874,5875,5877],{"class":933,"line":1075},[931,5876,2762],{"class":1041},[931,5878,5879],{"class":1045}," push\n",[430,5881,5882,5883,5885],{},"A verificação do projeto no aplicativo Buzz desktop mostra o seguinte, porque o aplicativo precisa do ",[441,5884,5688],{}," — iniciar o aplicativo diretamente pode carregar uma versão mais antiga do Git:",[430,5887,5888],{},[433,5889],{"alt":5890,"src":5891},"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",[430,5893,5894,5895,5898,5899,461],{},"Exporte o PATH por meio de ",[495,5896,5897],{},"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 ",[444,5900,5903],{"href":5901,"rel":5902},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[448],"problema",[923,5905,5907],{"className":1032,"code":5906,"language":1034,"meta":425,"style":425},"open -a Buzz\n",[495,5908,5909],{"__ignoreMap":425},[931,5910,5911,5914,5917],{"class":933,"line":934},[931,5912,5913],{"class":1041},"open",[931,5915,5916],{"class":1045}," -a",[931,5918,5919],{"class":1045}," Buzz\n",[430,5921,5922],{},"Consulte novamente os Projetos no aplicativo Buzz, os detalhes do repositório agora estão carregados.",[430,5924,5925],{},[433,5926],{"alt":5927,"src":5928},"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",[474,5930,5932],{"id":5931},"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",[430,5934,5935,5936,5939],{},"O emparelhamento do aplicativo móvel Buzz só aceita o protocolo HTTPS e o ",[495,5937,5938],{},"buzz-pair-relay"," não é iniciado por padrão no VPS.",[923,5941,5943],{"className":1032,"code":5942,"language":1034,"meta":425,"style":425},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[495,5944,5945,5951],{"__ignoreMap":425},[931,5946,5947,5949],{"class":933,"line":934},[931,5948,2786],{"class":962},[931,5950,5397],{"class":1045},[931,5952,5953,5955,5957,5959],{"class":933,"line":1061},[931,5954,5402],{"class":1041},[931,5956,4466],{"class":1045},[931,5958,5407],{"class":1045},[931,5960,5961],{"class":1045}," crates\u002Fbuzz-pair-relay\n",[430,5963,5964,5965,5968,5969,889],{},"Adicione o seguinte ao ",[495,5966,5967],{},"compose.yml"," para iniciar o serviço ",[495,5970,5938],{},[923,5972,5974],{"className":1342,"code":5973,"language":1344,"meta":425,"style":425},"  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",[495,5975,5976,5983,5992,6012,6018,6028,6034,6045,6053,6059],{"__ignoreMap":425},[931,5977,5978,5981],{"class":933,"line":934},[931,5979,5980],{"class":1354},"  pair",[931,5982,1368],{"class":945},[931,5984,5985,5987,5989],{"class":933,"line":1061},[931,5986,3237],{"class":1354},[931,5988,889],{"class":945},[931,5990,5991],{"class":1045}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[931,5993,5994,5997,5999,6002,6004,6007,6009],{"class":933,"line":1068},[931,5995,5996],{"class":1354},"    entrypoint",[931,5998,889],{"class":945},[931,6000,6001],{"class":945}," [",[931,6003,3666],{"class":945},[931,6005,6006],{"class":1045},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[931,6008,3666],{"class":945},[931,6010,6011],{"class":945},"]\n",[931,6013,6014,6016],{"class":933,"line":1075},[931,6015,3267],{"class":1354},[931,6017,1368],{"class":945},[931,6019,6020,6023,6025],{"class":933,"line":1923},[931,6021,6022],{"class":1354},"      BUZZ_PAIR_RELAY_BIND_ADDR",[931,6024,889],{"class":945},[931,6026,6027],{"class":1045}," 0.0.0.0:5000\n",[931,6029,6030,6032],{"class":933,"line":1928},[931,6031,3247],{"class":1354},[931,6033,1368],{"class":945},[931,6035,6036,6038,6040,6043],{"class":933,"line":1934},[931,6037,3254],{"class":945},[931,6039,3257],{"class":945},[931,6041,6042],{"class":1045},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[931,6044,1955],{"class":945},[931,6046,6047,6049,6051],{"class":933,"line":2270},[931,6048,3329],{"class":1354},[931,6050,889],{"class":945},[931,6052,3334],{"class":1045},[931,6054,6055,6057],{"class":933,"line":2281},[931,6056,5008],{"class":1354},[931,6058,1368],{"class":945},[931,6060,6061,6064,6067],{"class":933,"line":2377},[931,6062,6063],{"class":945},"      [",[931,6065,6066],{"class":1045},"buzz-net",[931,6068,6011],{"class":945},[430,6070,3162,6071,575,6074,6077,6078,889],{},[495,6072,6073],{},"BUZZ_PAIRING_RELAY_URL",[495,6075,6076],{},"BUZZ_PAIR_RELAY_PORT"," ao arquivo ",[495,6079,2816],{},[923,6081,6084],{"className":6082,"code":6083,"language":4613},[4611],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[495,6085,6083],{"__ignoreMap":425},[430,6087,6088,6089,6092],{},"Vá para '",[441,6090,6091],{},"Mobile","' nas configurações da versão desktop do Buzz:",[430,6094,6095],{},[433,6096],{"alt":6097,"src":6098},"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",[430,6100,6101],{},"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\".",[430,6103,6104],{},[433,6105],{"alt":6106,"src":6107},"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",[430,6109,6110],{},"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.",[430,6112,6113],{},[433,6114],{"alt":6115,"src":6116},"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",[474,6118,6120],{"id":6119},"considerações-finais","Considerações Finais",[430,6122,6123],{},"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.",[474,6125,4001],{"id":1610},[485,6127,6128,6135,6142,6149],{},[488,6129,6130],{},[444,6131,6134],{"href":6132,"rel":6133},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[448],"Buzz releases",[488,6136,6137],{},[444,6138,6141],{"href":6139,"rel":6140},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[448],"Introducing Buzz",[488,6143,6144],{},[444,6145,6148],{"href":6146,"rel":6147},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[448],"What is buzz",[488,6150,6151],{},[444,6152,6155],{"href":6153,"rel":6154},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[448],"How to self-host Buzz (Miget)",[1639,6157,6158],{},"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":425,"searchDepth":1061,"depth":1068,"links":6160},[6161,6162,6163,6177,6186,6187,6188],{"id":4091,"depth":1061,"text":4092},{"id":4136,"depth":1061,"text":4137},{"id":4184,"depth":1061,"text":4185,"children":6164},[6165,6166,6170,6171,6172,6176],{"id":4188,"depth":1068,"text":4189},{"id":4216,"depth":1068,"text":4217,"children":6167},[6168,6169],{"id":4220,"depth":1075,"text":4221},{"id":4318,"depth":1075,"text":4319},{"id":4336,"depth":1068,"text":4337},{"id":4553,"depth":1068,"text":4554},{"id":4698,"depth":1068,"text":4699,"children":6173},[6174,6175],{"id":4702,"depth":1075,"text":4703},{"id":5085,"depth":1075,"text":5086},{"id":5148,"depth":1068,"text":5149},{"id":5188,"depth":1061,"text":5189,"children":6178},[6179,6180,6181],{"id":5263,"depth":1068,"text":5264},{"id":5308,"depth":1068,"text":5309},{"id":5345,"depth":1068,"text":5346,"children":6182},[6183,6184,6185],{"id":5368,"depth":1075,"text":5369},{"id":5605,"depth":1075,"text":5606},{"id":5678,"depth":1075,"text":5679},{"id":5931,"depth":1061,"text":5932},{"id":6119,"depth":1061,"text":6120},{"id":1610,"depth":1061,"text":4001},[1660,1659,1229],"2026-09-08",{"schemaOrg":6192,"robots":1693,"sitemap":6211},[6193,6194],{"@type":1670,"headline":455,"description":465,"image":466},{"@type":1672,"name":455,"description":465,"image":466,"step":6195},[6196,6199,6202,6205,6208],{"@type":1675,"name":6197,"text":6198},"Fase 1: Configuração da Cloudflare","Criar um token de API da Cloudflare e configurar as definições de DNS.",{"@type":1675,"name":6200,"text":6201},"Fase 2: Instalar o Docker","Configurar e instalar o Docker Engine no VPS Ubuntu.",{"@type":1675,"name":6203,"text":6204},"Fase 3: Clonar e configurar","Clonar o repositório e configurar as variáveis do compose.",{"@type":1675,"name":6206,"text":6207},"Fase 4: Integração do Caddy","Compilar um Caddy personalizado com o módulo de desafio DNS da Cloudflare.",{"@type":1675,"name":6209,"text":6210},"Fase 5: Backup automatizado","Configurar uma tarefa cron para fazer backup automático do PostgreSQL.",{"lastmod":6212},"2026-09-03",{"title":6214,"description":465,"ogTitle":455,"ogDescription":465,"twitterTitle":455,"twitterDescription":465},"Como instalar e auto-hospedar o relay Buzz em VPS Ubuntu","pt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[1700,6217,1102,6218,6219],"Docker","Caddy","Cloudflare","d81fxoKo6iAaIp8OwbrHCSaUSob7w9HyKP0oH38Exq0",{"id":6222,"title":6223,"author":1702,"body":6224,"category":8087,"date":8089,"description":8090,"extension":1664,"image":8091,"imageAlt":8092,"isPublished":1064,"meta":8093,"minRead":5013,"navigation":1064,"path":227,"seo":8099,"stem":8100,"tags":8101,"updatedAt":6212,"__hash__":8103},"article\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek.md","Aloje os seus itinerários de viagem com TREK e Docker",{"type":427,"value":6225,"toc":8046},[6226,6229,6232,6235,6239,6243,6385,6389,6395,6414,6417,6421,6525,6536,6539,6544,6547,6558,6563,6567,6570,6573,6606,6610,6613,6647,6650,6690,6693,6697,6708,6712,6719,6723,6726,6819,6823,6828,6832,6839,6843,6846,6864,6874,6878,6881,6891,6895,6899,6908,6912,6916,6919,6923,6927,6930,6935,6938,6943,6949,6953,6957,6960,6964,6978,6983,6989,6994,6998,7001,7006,7011,7014,7021,7025,7028,7031,7041,7048,7053,7059,7064,7068,7073,7078,7081,7086,7090,7096,7100,7105,7109,7112,7115,7120,7125,7130,7134,7141,7146,7151,7156,7161,7165,7170,7175,7181,7185,7188,7192,7198,7203,7208,7214,7219,7224,7229,7241,7245,7250,7271,7276,7279,7283,7286,7291,7294,7341,7345,7352,7358,7363,7369,7374,7380,7385,7391,7394,7399,7405,7410,7416,7420,7426,7431,7436,7440,7444,7447,7451,7454,7461,7465,7472,7476,7487,7490,7494,7498,7508,7517,7522,7529,7534,7541,7545,7548,7712,7718,7722,7725,7730,7733,7739,7743,7750,7754,7757,7762,7769,7774,7778,7788,7859,7874,7877,7882,7886,7890,7900,7976,7986,7989,7993,7997,8000,8003,8006,8009,8018,8020,8043],[430,6227,6228],{},"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.",[430,6230,6231],{},"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.",[430,6233,6234],{},"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.",[879,6236,6238],{"id":6237},"_1-como-implantar-o-planejador-de-viagens-trek-com-docker","1. Como implantar o planejador de viagens TREK com Docker",[2158,6240,6242],{"id":6241},"instalar-o-docker-num-vps-ubuntu","Instalar o Docker num VPS Ubuntu",[923,6244,6246],{"className":1032,"code":6245,"language":1034,"meta":425,"style":425},"# 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",[495,6247,6248,6252,6272,6276,6280,6312,6316,6320,6328,6332,6336,6352,6356,6360,6366,6370,6375],{"__ignoreMap":425},[931,6249,6250],{"class":933,"line":934},[931,6251,4350],{"class":1071},[931,6253,6254,6256,6258,6260,6262,6264,6266,6268,6270],{"class":933,"line":1061},[931,6255,2960],{"class":1041},[931,6257,4357],{"class":1045},[931,6259,4360],{"class":1045},[931,6261,4363],{"class":945},[931,6263,4366],{"class":1041},[931,6265,4369],{"class":1045},[931,6267,4372],{"class":1045},[931,6269,4375],{"class":1045},[931,6271,4378],{"class":1045},[931,6273,6274],{"class":933,"line":1068},[931,6275,1065],{"emptyLinePlaceholder":1064},[931,6277,6278],{"class":933,"line":1075},[931,6279,4387],{"class":1071},[931,6281,6282,6284,6286,6288,6290,6292,6294,6296,6298,6300,6302,6304,6306,6308,6310],{"class":933,"line":1923},[931,6283,4392],{"class":962},[931,6285,3257],{"class":945},[931,6287,4397],{"class":1045},[931,6289,4400],{"class":945},[931,6291,4403],{"class":1041},[931,6293,4406],{"class":1045},[931,6295,4409],{"class":945},[931,6297,4412],{"class":1045},[931,6299,3666],{"class":945},[931,6301,4363],{"class":945},[931,6303,4366],{"class":1041},[931,6305,3789],{"class":1045},[931,6307,4423],{"class":1045},[931,6309,4426],{"class":945},[931,6311,4429],{"class":1045},[931,6313,6314],{"class":933,"line":1928},[931,6315,1065],{"emptyLinePlaceholder":1064},[931,6317,6318],{"class":933,"line":1934},[931,6319,4438],{"class":1071},[931,6321,6322,6324,6326],{"class":933,"line":2270},[931,6323,1891],{"class":1041},[931,6325,4445],{"class":1045},[931,6327,4448],{"class":1045},[931,6329,6330],{"class":933,"line":2281},[931,6331,1065],{"emptyLinePlaceholder":1064},[931,6333,6334],{"class":933,"line":2377},[931,6335,4457],{"class":1071},[931,6337,6338,6340,6342,6344,6346,6348,6350],{"class":933,"line":1695},[931,6339,1891],{"class":1041},[931,6341,4445],{"class":1045},[931,6343,4466],{"class":1045},[931,6345,4469],{"class":1045},[931,6347,4472],{"class":1045},[931,6349,4475],{"class":1045},[931,6351,4478],{"class":1045},[931,6353,6354],{"class":933,"line":2388},[931,6355,1065],{"emptyLinePlaceholder":1064},[931,6357,6358],{"class":933,"line":2393},[931,6359,4507],{"class":1071},[931,6361,6362,6364],{"class":933,"line":2399},[931,6363,1176],{"class":1041},[931,6365,3589],{"class":1045},[931,6367,6368],{"class":933,"line":3326},[931,6369,1065],{"emptyLinePlaceholder":1064},[931,6371,6372],{"class":933,"line":3337},[931,6373,6374],{"class":1071},"# Starts automatically when your system boots\n",[931,6376,6377,6379,6381,6383],{"class":933,"line":3342},[931,6378,1891],{"class":1041},[931,6380,1894],{"class":1045},[931,6382,2022],{"class":1045},[931,6384,4498],{"class":1045},[2158,6386,6388],{"id":6387},"gerar-a-chave-de-criptografia","Gerar a chave de criptografia",[430,6390,6391,6392,6394],{},"O TREK utiliza uma chave para criptografar dados confidenciais. Utilize o comando seguinte ou esta ",[444,6393,4640],{"href":2836}," para gerar a sua chave de criptografia:",[923,6396,6398],{"className":1032,"code":6397,"language":1034,"meta":425,"style":425},"openssl rand -hex 32\n",[495,6399,6400],{"__ignoreMap":425},[931,6401,6402,6405,6408,6411],{"class":933,"line":934},[931,6403,6404],{"class":1041},"openssl",[931,6406,6407],{"class":1045}," rand",[931,6409,6410],{"class":1045}," -hex",[931,6412,6413],{"class":2929}," 32\n",[430,6415,6416],{},"Guarde-a num local seguro; perdê-la significa perder o acesso aos dados criptografados.",[2158,6418,6420],{"id":6419},"iniciar-o-contêiner","Iniciar o contêiner",[923,6422,6424],{"className":1032,"code":6423,"language":1034,"meta":425,"style":425},"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",[495,6425,6426,6438,6448,6458,6475,6491,6501,6510,6520],{"__ignoreMap":425},[931,6427,6428,6430,6432,6435],{"class":933,"line":934},[931,6429,1176],{"class":1041},[931,6431,5463],{"class":1045},[931,6433,6434],{"class":1045}," -d",[931,6436,6437],{"class":941}," \\\n",[931,6439,6440,6443,6446],{"class":933,"line":1061},[931,6441,6442],{"class":1045},"  --name",[931,6444,6445],{"class":1045}," trek",[931,6447,6437],{"class":941},[931,6449,6450,6453,6456],{"class":933,"line":1068},[931,6451,6452],{"class":1045},"  -p",[931,6454,6455],{"class":1045}," 3000:3000",[931,6457,6437],{"class":941},[931,6459,6460,6463,6466,6468,6471,6473],{"class":933,"line":1075},[931,6461,6462],{"class":1045},"  -e",[931,6464,6465],{"class":1045}," ENCRYPTION_KEY=",[931,6467,3666],{"class":945},[931,6469,6470],{"class":1045},"\u003Cgenerated_key>",[931,6472,3666],{"class":945},[931,6474,6437],{"class":941},[931,6476,6477,6479,6482,6484,6487,6489],{"class":933,"line":1923},[931,6478,6462],{"class":1045},[931,6480,6481],{"class":1045}," APP_URL=",[931,6483,3666],{"class":945},[931,6485,6486],{"class":1045},"https:\u002F\u002Ftrek.pafor.me",[931,6488,3666],{"class":945},[931,6490,6437],{"class":941},[931,6492,6493,6496,6499],{"class":933,"line":1928},[931,6494,6495],{"class":1045},"  -v",[931,6497,6498],{"class":1045}," .\u002Fdata:\u002Fapp\u002Fdata",[931,6500,6437],{"class":941},[931,6502,6503,6505,6508],{"class":933,"line":1934},[931,6504,6495],{"class":1045},[931,6506,6507],{"class":1045}," .\u002Fuploads:\u002Fapp\u002Fuploads",[931,6509,6437],{"class":941},[931,6511,6512,6515,6518],{"class":933,"line":2270},[931,6513,6514],{"class":1045},"  --restart",[931,6516,6517],{"class":1045}," unless-stopped",[931,6519,6437],{"class":941},[931,6521,6522],{"class":933,"line":2281},[931,6523,6524],{"class":1045},"  mauriceboe\u002Ftrek:latest\n",[485,6526,6527],{},[488,6528,6529,6535],{},[441,6530,6531,6534],{},[495,6532,6533],{},"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.",[430,6537,6538],{},"A primeira execução demorará um pouco para descarregar a imagem:",[433,6540],{"src":6541,"alt":6542,"style":6543},"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;",[430,6545,6546],{},"Verifique se está em execução:",[923,6548,6550],{"className":1032,"code":6549,"language":1034,"meta":425,"style":425},"docker ps\n",[495,6551,6552],{"__ignoreMap":425},[931,6553,6554,6556],{"class":933,"line":934},[931,6555,1176],{"class":1041},[931,6557,5129],{"class":1045},[433,6559],{"src":6560,"alt":6561,"style":6562},"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;",[879,6564,6566],{"id":6565},"_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",[430,6568,6569],{},"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.",[430,6571,6572],{},"O Caddy é configurado como o servidor de proxy reverso seguro apontando para a porta 3000. Eis um exemplo de Caddyfile:",[923,6574,6576],{"className":2875,"code":6575,"language":2877,"meta":425,"style":425},"{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n",[495,6577,6578,6589,6593,6602],{"__ignoreMap":425},[931,6579,6580,6582,6585,6587],{"class":933,"line":934},[931,6581,2905],{"class":945},[931,6583,6584],{"class":941},"$TREK_DOMAIN",[931,6586,2911],{"class":945},[931,6588,2914],{"class":945},[931,6590,6591],{"class":933,"line":1061},[931,6592,2919],{"class":941},[931,6594,6595,6597,6599],{"class":933,"line":1068},[931,6596,2924],{"class":941},[931,6598,889],{"class":945},[931,6600,6601],{"class":2929},"3000\n",[931,6603,6604],{"class":933,"line":1075},[931,6605,2892],{"class":945},[879,6607,6609],{"id":6608},"_3-configuração-inicial-e-criação-do-administrador-seguro","3. Configuração inicial e criação do administrador seguro",[430,6611,6612],{},"Existem duas formas de criar a conta de administrador:",[485,6614,6615,6626],{},[488,6616,6617,6625],{},[441,6618,6619,575,6622],{},[495,6620,6621],{},"ADMIN_EMAIL",[495,6623,6624],{},"ADMIN_PASSWORD"," são definidos como variáveis de ambiente; esses valores são usados diretamente.",[488,6627,6628],{},[441,6629,6630,6631,6634,6635,6638,6639,6642,6643,6646],{},"O TREK cria o e-mail ",[495,6632,6633],{},"admin@trek.local",", o nome de utilizador ",[495,6636,6637],{},"admin"," e uma ",[495,6640,6641],{},"senha gerada aleatoriamente que é impressa nos logs do contêiner",". Execute ",[495,6644,6645],{},"docker logs trek"," para recuperá-la.",[430,6648,6649],{},"Se não conseguir encontrar a senha nos logs, redefina-a com o comando:",[923,6651,6653],{"className":1032,"code":6652,"language":1034,"meta":425,"style":425},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[495,6654,6655],{"__ignoreMap":425},[931,6656,6657,6659,6661,6664,6667,6670,6672,6675,6677,6680,6682,6684,6687],{"class":933,"line":934},[931,6658,1176],{"class":1041},[931,6660,1182],{"class":1045},[931,6662,6663],{"class":1045}," -it",[931,6665,6666],{"class":1045}," -e",[931,6668,6669],{"class":1045}," RESET_ADMIN_EMAIL=admin@trek.local",[931,6671,6666],{"class":1045},[931,6673,6674],{"class":1045}," RESET_ADMIN_PASSWORD=",[931,6676,5423],{"class":945},[931,6678,6679],{"class":1045},"YourNewPassword",[931,6681,5423],{"class":945},[931,6683,6445],{"class":1045},[931,6685,6686],{"class":1045}," node",[931,6688,6689],{"class":1045}," server\u002Freset-admin.js\n",[430,6691,6692],{},"Será solicitado que altere a senha no primeiro login.",[433,6694],{"src":6695,"alt":6696,"style":6562},"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",[430,6698,4232,6699,6702,6703],{},[441,6700,6701],{},"Admin"," e atualize o endereço de e-mail:",[433,6704],{"src":6705,"alt":6706,"style":6707},"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;",[2158,6709,6711],{"id":6710},"_31-cópias-de-segurança-backups","3.1 Cópias de segurança (Backups)",[430,6713,6714,6715],{},"Configure as cópias de segurança automáticas com uma política de retenção no painel de administração:\n",[433,6716],{"src":6717,"alt":6718,"style":6562},"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",[2158,6720,6722],{"id":6721},"_32-armazenar-ficheiros-carregados-no-cloudflare-r2","3.2 Armazenar ficheiros carregados no Cloudflare R2",[430,6724,6725],{},"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.",[533,6727,6728,6734,6747,6757,6768,6782,6793,6808],{},[488,6729,6730,6731,461],{},"Crie um bucket R2 chamado ",[495,6732,6733],{},"trek",[488,6735,6736,6737,6740,6741,6742],{},"Na secção ",[441,6738,6739],{},"Account Details",", encontre o ID da sua conta:","\n  ",[433,6743],{"src":6744,"alt":6745,"style":6746},"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;",[488,6748,4232,6749,889,6741,6752],{},[441,6750,6751],{},"Manage API Tokens",[433,6753],{"src":6754,"alt":6755,"style":6756},"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;",[488,6758,4232,6759,6762,6741,6763],{},[441,6760,6761],{},"Create Account API token"," com permissões de leitura\u002Fescrita para o bucket:",[433,6764],{"src":6765,"alt":6766,"style":6767},"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;",[488,6769,4232,6770,6773,6774,889,6741,6777],{},[441,6771,6772],{},"Storage"," no painel de ",[441,6775,6776],{},"ADMINISTRATION",[433,6778],{"src":6779,"alt":6780,"style":6781},"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;",[488,6783,3037,6784,6787,6741,6788],{},[441,6785,6786],{},"Add Backend"," e preencha o endpoint, o bucket e as credenciais:",[433,6789],{"src":6790,"alt":6791,"style":6792},"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;",[488,6794,4232,6795,6798,6799,6802,6741,6803],{},[441,6796,6797],{},"Apply"," e depois no botão ",[441,6800,6801],{},"Test",". Deverá ver a mensagem \"Connection OK\":",[433,6804],{"src":6805,"alt":6806,"style":6807},"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;",[488,6809,6810,6811,889,6741,6814],{},"Altere todas as categorias de armazenamento para Cloudflare R2 e clique em ",[441,6812,6813],{},"Save changes",[433,6815],{"src":6816,"alt":6817,"style":6818},"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;",[2158,6820,6822],{"id":6821},"_33-login-com-chaves-de-acesso-passkeys","3.3 Login com chaves de acesso (Passkeys)",[430,6824,6825,6826,889],{},"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 ",[441,6827,1139],{},[433,6829],{"src":6830,"alt":6831,"style":6562},"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",[430,6833,6834,6835,6838],{},"Sem configurar as ",[441,6836,6837],{},"allowed origins",", o registo da chave de acesso falhará.",[2158,6840,6842],{"id":6841},"_34-chave-de-api-do-google-maps","3.4 Chave de API do Google Maps",[430,6844,6845],{},"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.",[430,6847,6848,6849,6854,6855,6858,6859],{},"Siga este ",[444,6850,6853],{"href":6851,"rel":6852},"https:\u002F\u002Fmapsplatform.google.com\u002Fmaps-demo-key\u002F",[448],"link"," e clique em ",[441,6856,6857],{},"Get demo key"," para solicitar uma:                                                  ",[433,6860],{"src":6861,"alt":6862,"style":6863},"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;",[430,6865,6866,6867,6869,6870],{},"Cole a chave nas definições e clique em ",[441,6868,6801],{}," para confirmar a ligação:\n",[433,6871],{"src":6872,"alt":6873,"style":6562},"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",[2158,6875,6877],{"id":6876},"_35-integração-de-ia","3.5 Integração de IA",[430,6879,6880],{},"O modelo de IA é utilizado para recuperar e estruturar e-mails de confirmação e PDFs de reserva em dados de reserva estruturados.",[430,6882,4232,6883,6886,6887,6890],{},[441,6884,6885],{},"Addons"," no menu esquerdo e ative ",[441,6888,6889],{},"AI Parsing",". Selecione \"OpenAI\" (ou outro fornecedor compatível) e preencha as informações do mesmo:",[433,6892],{"src":6893,"alt":6894,"style":6562},"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",[2158,6896,6898],{"id":6897},"_36-acesso-mcp","3.6 Acesso MCP",[430,6900,6901,6902,6904,6905,889],{},"Sob ",[441,6903,6885],{},", ative o ",[441,6906,6907],{},"MCP",[433,6909],{"src":6910,"alt":6911,"style":6562},"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",[2158,6913,6915],{"id":6914},"_37-plugins","3.7 Plugins",[430,6917,6918],{},"Os seguintes plugins são recomendados e vale a pena ativá-los:",[433,6920],{"src":6921,"alt":6922,"style":6562},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","Lista de plugins e addons recomendados ativos",[2158,6924,6926],{"id":6925},"_38-criar-o-seu-utilizador-para-o-dia-a-dia","3.8 Criar o seu utilizador para o dia a dia",[430,6928,6929],{},"Planeie as viagens como um utilizador normal, não como administrador. Crie um utilizador regular e inicie sessão com ele:",[433,6931],{"src":6932,"alt":6933,"style":6934},"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;",[430,6936,6937],{},"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:",[433,6939],{"src":6940,"alt":6941,"style":6942},"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;",[430,6944,4232,6945,6948],{},[441,6946,6947],{},"+ Add a passkey",", introduza a senha atual e confirme:",[433,6950],{"src":6951,"alt":6952,"style":6562},"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",[879,6954,6956],{"id":6955},"_4-testar-a-implantação-importar-dados-de-viagens-passadas","4. Testar a implantação: importar dados de viagens passadas",[430,6958,6959],{},"Uma excelente forma de explorar o TREK é registar o seu histórico de viagens.",[2158,6961,6963],{"id":6962},"_41-criar-a-viagem","4.1 Criar a viagem",[430,6965,4232,6966,6969,6970,6973,6974,6977],{},[441,6967,6968],{},"+ New Trip"," e configure a data de início (",[441,6971,6972],{},"Start Date",") e data de fim (",[441,6975,6976],{},"End Date",") com as datas passadas do seu passeio:",[433,6979],{"src":6980,"alt":6981,"style":6982},"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;",[430,6984,6985,6986,889],{},"Adicione uma foto de capa (arraste uma ou cole do seu área de transferência) e clique em ",[441,6987,6988],{},"Create New Trip",[433,6990],{"src":6991,"alt":6992,"style":6993},"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;",[2158,6995,6997],{"id":6996},"_42-importar-as-reservas","4.2 Importar as reservas",[430,6999,7000],{},"Arraste e solte todos os ficheiros de voos, comboios e outros meios de transporte:",[433,7002],{"src":7003,"alt":7004,"style":7005},"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;",[433,7007],{"src":7008,"alt":7009,"style":7010},"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;",[430,7012,7013],{},"Com o modelo de IA ativado, os PDFs de confirmação de reservas são analisados e estruturados automaticamente.",[430,7015,7016,7017,7020],{},"Reveja o resultado do processamento e clique em ",[441,7018,7019],{},"Add"," para registar os detalhes da reserva:",[433,7022],{"src":7023,"alt":7024,"style":6562},"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",[430,7026,7027],{},"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.",[430,7029,7030],{},"As capturas de ecrã seguintes mostram como as reservas são apresentadas:",[430,7032,7033,7037],{},[433,7034],{"src":7035,"alt":7036,"style":6562},"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",[433,7038],{"src":7039,"alt":7040,"style":6562},"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",[430,7042,7043,7044,7047],{},"Na página ",[441,7045,7046],{},"Plan",", todos os alojamentos serão indicados no mapa:",[433,7049],{"src":7050,"alt":7051,"style":7052},"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;",[430,7054,4232,7055,7058],{},[441,7056,7057],{},"Atlas"," na barra de menu superior para aceder à lista (e mapa) de todos os países que já visitou:",[433,7060],{"src":7061,"alt":7062,"style":7063},"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;",[2158,7065,7067],{"id":7066},"_43-adicionar-companheiros-de-viagem","4.3 Adicionar companheiros de viagem",[430,7069,3037,7070,889],{},[441,7071,7072],{},"Share",[433,7074],{"src":7075,"alt":7076,"style":7077},"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;",[430,7079,7080],{},"Na parte inferior de la janela, é possível adicionar convidados:",[433,7082],{"src":7083,"alt":7084,"style":7085},"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;",[2158,7087,7089],{"id":7088},"_44-registar-as-despesas","4.4 Registar as despesas",[430,7091,4232,7092,7095],{},[441,7093,7094],{},"Add expense"," para registar despesas adicionais que não sejam reservas, tais como seguro de saúde, transporte local ou cartões SIM:",[433,7097],{"src":7098,"alt":7099,"style":6562},"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",[433,7101],{"src":7102,"alt":7103,"style":7104},"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;",[2158,7106,7108],{"id":7107},"_45-segmentos-da-viagem","4.5 Segmentos da viagem",[430,7110,7111],{},"Esta funcionalidade requer que o plugin Trip Segment esteja instalado.",[430,7113,7114],{},"As viagens longas são divididas de forma elegante em segmentos, cada etapa exibindo as suas próprias reservas, pontos turísticos e custos:",[433,7116],{"src":7117,"alt":7118,"style":7119},"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;",[433,7121],{"src":7122,"alt":7123,"style":7124},"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;",[433,7126],{"src":7127,"alt":7128,"style":7129},"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;",[2158,7131,7133],{"id":7132},"_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",[430,7135,7136,7137,7140],{},"Agrupe as suas viagens num ",[441,7138,7139],{},"Journey"," (diário de rota) e escreva relatos para partilhar as aventuras com os seus amigos:",[433,7142],{"src":7143,"alt":7144,"style":7145},"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;",[433,7147],{"src":7148,"alt":7149,"style":7150},"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;",[433,7152],{"src":7153,"alt":7154,"style":7155},"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;",[433,7157],{"src":7158,"alt":7159,"style":7160},"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;",[879,7162,7164],{"id":7163},"_5-desenhar-itinerários-personalizados-e-listas-de-bagagem","5. Desenhar itinerários personalizados e listas de bagagem",[430,7166,4232,7167,7169],{},[441,7168,6968],{},", introduza um nome e configure as datas:",[433,7171],{"src":7172,"alt":7173,"style":7174},"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;",[430,7176,7177,7180],{},[441,7178,7179],{},"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.",[2158,7182,7184],{"id":7183},"_51-adicionar-locais","5.1 Adicionar locais",[430,7186,7187],{},"Este costuma ser o passo mais moroso de qualquer planeamento de viagem, e o TREK tem várias formas de acelerá-lo:",[433,7189],{"src":7190,"alt":7191,"style":6562},"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",[430,7193,7194,7197],{},[441,7195,7196],{},"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):",[433,7199],{"src":7200,"alt":7201,"style":7202},"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;",[433,7204],{"src":7205,"alt":7206,"style":7207},"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;",[430,7209,7210,7213],{},[441,7211,7212],{},"2. Clique em + Add Place\u002FActivity"," e pesquise por nome:",[433,7215],{"src":7216,"alt":7217,"style":7218},"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;",[433,7220],{"src":7221,"alt":7222,"style":7223},"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;",[433,7225],{"src":7226,"alt":7227,"style":7228},"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;",[430,7230,7231,860,7234,1518,7237,7240],{},[441,7232,7233],{},"3. Cole um URL do Google Maps",[495,7235,7236],{},"maps.app.goo.gl\u002F…",[495,7238,7239],{},"maps.google.com\u002F…",") no campo de pesquisa. O TREK extrairá o nome, o endereço e as coordenadas automaticamente:",[433,7242],{"src":7243,"alt":7244,"style":6807},"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",[433,7246],{"src":7247,"alt":7248,"style":7249},"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;",[430,7251,7252,7255,7256,7259,7260,575,7263,7266,7267,7270],{},[441,7253,7254],{},"4. Importação em lote"," — o caminho mais simples. Se já tem uma lista de locais pendentes no Google Maps, exporte-a como ",[495,7257,7258],{},".gpx"," (os formatos ",[495,7261,7262],{},".kml",[495,7264,7265],{},".kmz"," também funcionam) e clique em ",[441,7268,7269],{},"Import file"," no painel direito para carregar tudo de uma só vez:",[433,7272],{"src":7273,"alt":7274,"style":7275},"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;",[430,7277,7278],{},"Adicione primeiro todos os pontos de interesse, independentemente de caberem ou não na agenda. Pode distribuí-los por dias específicos mais tarde.",[2158,7280,7282],{"id":7281},"_52-planos-diários-e-notas","5.2 Planos diários e notas",[430,7284,7285],{},"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:",[433,7287],{"src":7288,"alt":7289,"style":7290},"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;",[430,7292,7293],{},"Os detalhes essenciais que fazem a diferença:",[485,7295,7296,7306,7316,7326],{},[488,7297,7298,7301,7302],{},[441,7299,7300],{},"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",[433,7303],{"src":7304,"alt":7305,"style":6562},"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",[488,7307,7308,7311,7312],{},[441,7309,7310],{},"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",[433,7313],{"src":7314,"alt":7315,"style":6562},"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",[488,7317,7318,7321,7322],{},[441,7319,7320],{},"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",[433,7323],{"src":7324,"alt":7325,"style":6562},"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",[488,7327,7328,7329,7334,7335,2656,7338,461],{},"Consulte a ",[444,7330,7333],{"href":7331,"rel":7332},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[448],"página wiki de Planos Diários e Notas"," para mais informações sobre ",[441,7336,7337],{},"Otimização de rotas",[441,7339,7340],{},"Clima",[2158,7342,7344],{"id":7343},"_53-coleções-listas-de-locais-reutilizáveis","5.3 Coleções: listas de locais reutilizáveis",[430,7346,7347,7348,7351],{},"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 ",[441,7349,7350],{},"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.",[430,7353,4232,7354,7357],{},[441,7355,7356],{},"Collections"," na barra de menu superior:",[433,7359],{"src":7360,"alt":7361,"style":7362},"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;",[430,7364,4232,7365,7368],{},[441,7366,7367],{},"+ New list"," para criar uma nova:",[433,7370],{"src":7371,"alt":7372,"style":7373},"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;",[430,7375,4232,7376,7379],{},[441,7377,7378],{},"+ Add a place"," e preencha os dados:",[433,7381],{"src":7382,"alt":7383,"style":7384},"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;",[430,7386,7387,7390],{},[441,7388,7389],{},"Nota:"," a barra de pesquisa dentro da janela \"Add a place\" parece não funcionar, pelo que terá de inserir os detalhes manualmente.",[430,7392,7393],{},"Si as coordenadas geográficas dos locais estiverem disponíveis, estes aparecerão no mapa:",[433,7395],{"src":7396,"alt":7397,"style":7398},"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;",[430,7400,7401,7402,889],{},"Para organizar os locais com etiquetas (labels), clique no ícone da ",[441,7403,7404],{},"caixa de seleção",[433,7406],{"src":7407,"alt":7408,"style":7409},"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;",[430,7411,7412,7413,889],{},"Selecione os locais que pretende agrupar e clique em ",[441,7414,7415],{},"Assign label",[433,7417],{"src":7418,"alt":7419,"style":7249},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","Atribuindo etiquetas descritivas aos locais selecionados",[430,7421,4232,7422,7425],{},[441,7423,7424],{},"Manage labels"," para criar as etiquetas de antemão:",[433,7427],{"src":7428,"alt":7429,"style":7430},"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;",[430,7432,7433,7434,889],{},"Selecione uma etiqueta e clique em ",[441,7435,7415],{},[433,7437],{"src":7438,"alt":7439,"style":7063},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","Aplicando etiquetas personalizadas a grupos de locais",[2158,7441,7443],{"id":7442},"_54-custos-e-orçamento","5.4 Custos e orçamento",[430,7445,7446],{},"Podemos registar outras despesas para a viagem na página 'Costs'.",[433,7448],{"src":7449,"alt":7450,"style":7290},"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",[430,7452,7453],{},"Os pagamentos efetuados por companheiros de viagem podem ser adicionados e divididos nessa mesma página.",[430,7455,7456,7457,7460],{},"O painel de acertos executa um algoritmo voraz (greedy) para calcular o ",[441,7458,7459],{},"número mínimo de transferências"," necessárias para liquidar as despesas entre os membros.",[879,7462,7464],{"id":7463},"_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",[430,7466,7467,7468,7471],{},"O TREK possui um ",[441,7469,7470],{},"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.",[2158,7473,7475],{"id":7474},"_61-cloudflare-zero-trust","6.1 Cloudflare Zero Trust",[430,7477,7478,7479,7481,7482,461],{},"Devido ao facto de o TREK correr atrás de uma rede ",[444,7480,1722],{"href":363},", 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: ",[444,7483,7486],{"href":7484,"rel":7485},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[448],"issue do github",[463,7488],{"description":2604,"image":2605,"image-alt":2606,"label":2679,"min-read":7489,"title":1706,"to":363},"9",[433,7491],{"src":7492,"alt":7493,"style":6562},"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",[2158,7495,7497],{"id":7496},"_62-claude-desktop","6.2 Claude Desktop",[430,7499,4232,7500,7503,7504],{},[441,7501,7502],{},"+ New Client"," para criar um novo cliente de agente de IA:\n",[433,7505],{"src":7506,"alt":7507,"style":6562},"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",[430,7509,7510,7511,6854,7514,889],{},"Selecione o separador ",[441,7512,7513],{},"Claude Desktop",[441,7515,7516],{},"Register Client",[433,7518],{"src":7519,"alt":7520,"style":7521},"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;",[430,7523,7524,7525,7528],{},"É apresentado um ID de cliente e segredo de cliente. Guarde-os num local seguro. De seguida, clique em ",[441,7526,7527],{},"Client Configuration"," para mostrar as definições do MCP:",[433,7530],{"src":7531,"alt":7532,"style":7533},"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;",[430,7535,7536,7537,7540],{},"No Claude Desktop, clique em ",[441,7538,7539],{},"Edit Config"," para abrir o ficheiro local de configuração dos servidores MCP:",[433,7542],{"src":7543,"alt":7544,"style":6562},"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",[430,7546,7547],{},"Cole a configuração do TREK, substituindo os marcadores de posição pelas suas credenciais:",[923,7549,7551],{"className":2875,"code":7550,"language":2877,"meta":425,"style":425},"  \"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",[495,7552,7553,7567,7580,7602,7616,7628,7639,7650,7695,7700,7705],{"__ignoreMap":425},[931,7554,7555,7558,7561,7563,7565],{"class":933,"line":934},[931,7556,7557],{"class":945},"  \"",[931,7559,7560],{"class":1045},"mcpServers",[931,7562,3666],{"class":945},[931,7564,579],{"class":941},[931,7566,2884],{"class":945},[931,7568,7569,7572,7574,7576,7578],{"class":933,"line":1061},[931,7570,7571],{"class":945},"    \"",[931,7573,6733],{"class":937},[931,7575,3666],{"class":945},[931,7577,889],{"class":945},[931,7579,2914],{"class":945},[931,7581,7582,7585,7588,7590,7592,7594,7597,7599],{"class":933,"line":1068},[931,7583,7584],{"class":945},"      \"",[931,7586,7587],{"class":1041},"command",[931,7589,3666],{"class":945},[931,7591,889],{"class":945},[931,7593,3257],{"class":945},[931,7595,7596],{"class":1045},"npx",[931,7598,3666],{"class":945},[931,7600,7601],{"class":945},",\n",[931,7603,7604,7606,7609,7611,7613],{"class":933,"line":1075},[931,7605,7584],{"class":945},[931,7607,7608],{"class":1041},"args",[931,7610,3666],{"class":945},[931,7612,889],{"class":945},[931,7614,7615],{"class":945}," [\n",[931,7617,7618,7621,7624,7626],{"class":933,"line":1923},[931,7619,7620],{"class":945},"        \"",[931,7622,7623],{"class":1045},"mcp-remote",[931,7625,3666],{"class":945},[931,7627,7601],{"class":945},[931,7629,7630,7632,7635,7637],{"class":933,"line":1928},[931,7631,7620],{"class":945},[931,7633,7634],{"class":1045},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[931,7636,3666],{"class":945},[931,7638,7601],{"class":945},[931,7640,7641,7643,7646,7648],{"class":933,"line":1934},[931,7642,7620],{"class":945},[931,7644,7645],{"class":1045},"--static-oauth-client-info",[931,7647,3666],{"class":945},[931,7649,7601],{"class":945},[931,7651,7652,7654,7656,7659,7662,7664,7666,7668,7671,7673,7675,7677,7680,7682,7684,7686,7689,7691,7693],{"class":933,"line":2270},[931,7653,7620],{"class":945},[931,7655,2905],{"class":1045},[931,7657,7658],{"class":941},"\\\"",[931,7660,7661],{"class":1045},"client_id",[931,7663,7658],{"class":941},[931,7665,579],{"class":1045},[931,7667,7658],{"class":941},[931,7669,7670],{"class":1045},"\u003Cyour_client_id>",[931,7672,7658],{"class":941},[931,7674,742],{"class":1045},[931,7676,7658],{"class":941},[931,7678,7679],{"class":1045},"client_secret",[931,7681,7658],{"class":941},[931,7683,579],{"class":1045},[931,7685,7658],{"class":941},[931,7687,7688],{"class":1045},"\u003Cyour_client_secret>",[931,7690,7658],{"class":941},[931,7692,2911],{"class":1045},[931,7694,1955],{"class":945},[931,7696,7697],{"class":933,"line":2281},[931,7698,7699],{"class":945},"      ]\n",[931,7701,7702],{"class":933,"line":2377},[931,7703,7704],{"class":945},"    }\n",[931,7706,7707,7710],{"class":933,"line":1695},[931,7708,7709],{"class":945},"  }",[931,7711,7601],{"class":941},[430,7713,7714,7715,889],{},"Reinicie o Claude Desktop, e o servidor do TREK passará a ser exibido como ligado em ",[441,7716,7717],{},"Local MCP servers",[433,7719],{"src":7720,"alt":7721,"style":6562},"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",[430,7723,7724],{},"Agora envie uma instrução (prompt):",[433,7726],{"src":7727,"alt":7728,"style":7729},"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;",[430,7731,7732],{},"Vamos adicionar uma despesa usando linguagem natural:",[923,7734,7737],{"className":7735,"code":7736,"language":4613,"meta":425},[4611],"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",[495,7738,7736],{"__ignoreMap":425},[433,7740],{"src":7741,"alt":7742,"style":6562},"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",[430,7744,7745,7746,7749],{},"Ao verificar a página ",[441,7747,7748],{},"Costs",", a despesa surge criada com a indicação \"Ninguém pagou ainda\", uma vez que nenhum pagador foi mencionado na ordem:",[433,7751],{"src":7752,"alt":7753,"style":6707},"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",[430,7755,7756],{},"Adicionar elementos à lista de bagagem funciona exatamente da mesma maneira:",[433,7758],{"src":7759,"alt":7760,"style":7761},"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;",[430,7763,7764,7765,7768],{},"Atualize a página ",[441,7766,7767],{},"Packing List"," e verá os três elementos adicionados:",[433,7770],{"src":7771,"alt":7772,"style":7773},"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;",[2158,7775,7777],{"id":7776},"_63-gemini-cli-registo-dinâmico","6.3 Gemini CLI (registo dinâmico)",[430,7779,7780,7781,7784,7785,889],{},"A Gemini CLI suporta ",[441,7782,7783],{},"registo dinâmico",", pelo que não necessita de um cliente pré-criado. Adicione isto a ",[495,7786,7787],{},".gemini\u002Fsettings.json",[923,7789,7791],{"className":2875,"code":7790,"language":2877,"meta":425,"style":425},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[495,7792,7793,7805,7824,7837,7850,7855],{"__ignoreMap":425},[931,7794,7795,7797,7799,7801,7803],{"class":933,"line":934},[931,7796,7571],{"class":945},[931,7798,6733],{"class":1045},[931,7800,3666],{"class":945},[931,7802,579],{"class":941},[931,7804,2884],{"class":945},[931,7806,7807,7809,7812,7814,7816,7818,7820,7822],{"class":933,"line":1061},[931,7808,7584],{"class":945},[931,7810,7811],{"class":937},"httpUrl",[931,7813,3666],{"class":945},[931,7815,889],{"class":945},[931,7817,3257],{"class":945},[931,7819,7634],{"class":1045},[931,7821,3666],{"class":945},[931,7823,7601],{"class":945},[931,7825,7826,7828,7831,7833,7835],{"class":933,"line":1068},[931,7827,7584],{"class":945},[931,7829,7830],{"class":937},"oauth",[931,7832,3666],{"class":945},[931,7834,889],{"class":945},[931,7836,2914],{"class":945},[931,7838,7839,7841,7844,7846,7848],{"class":933,"line":1075},[931,7840,7620],{"class":945},[931,7842,7843],{"class":1041},"enabled",[931,7845,3666],{"class":945},[931,7847,889],{"class":945},[931,7849,1379],{"class":945},[931,7851,7852],{"class":933,"line":1923},[931,7853,7854],{"class":945},"      }\n",[931,7856,7857],{"class":933,"line":1928},[931,7858,7704],{"class":945},[430,7860,1830,7861,7864,7865,7868,7869],{},[495,7862,7863],{},"gemini"," no terminal e clique em ",[441,7866,7867],{},"Approve"," quando a janela de autorização surgir:\n",[433,7870],{"src":7871,"alt":7872,"style":7873},"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;",[430,7875,7876],{},"De seguida, comece com uma instrução simples:",[433,7878],{"src":7879,"alt":7880,"style":7881},"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;",[433,7883],{"src":7884,"alt":7885,"style":7155},"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",[2158,7887,7889],{"id":7888},"_64-kimi-cli-registo-dinâmico","6.4 Kimi CLI (registo dinâmico)",[430,7891,7892,7893,7896,7897,889],{},"A mesma abordagem — adicione ao ficheiro ",[495,7894,7895],{},"mcp.json"," na pasta ",[495,7898,7899],{},"\u002FUsers\u002F\u003Cuser>\u002F.kimi\u002F",[923,7901,7903],{"className":2875,"code":7902,"language":2877,"meta":425,"style":425},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[495,7904,7905,7917,7937,7955,7972],{"__ignoreMap":425},[931,7906,7907,7909,7911,7913,7915],{"class":933,"line":934},[931,7908,7571],{"class":945},[931,7910,6733],{"class":1045},[931,7912,3666],{"class":945},[931,7914,579],{"class":941},[931,7916,2884],{"class":945},[931,7918,7919,7921,7924,7926,7928,7930,7933,7935],{"class":933,"line":1061},[931,7920,7584],{"class":945},[931,7922,7923],{"class":937},"type",[931,7925,3666],{"class":945},[931,7927,889],{"class":945},[931,7929,3257],{"class":945},[931,7931,7932],{"class":1045},"http",[931,7934,3666],{"class":945},[931,7936,7601],{"class":945},[931,7938,7939,7941,7943,7945,7947,7949,7951,7953],{"class":933,"line":1068},[931,7940,7584],{"class":945},[931,7942,863],{"class":937},[931,7944,3666],{"class":945},[931,7946,889],{"class":945},[931,7948,3257],{"class":945},[931,7950,7634],{"class":1045},[931,7952,3666],{"class":945},[931,7954,7601],{"class":945},[931,7956,7957,7959,7962,7964,7966,7968,7970],{"class":933,"line":1075},[931,7958,7584],{"class":945},[931,7960,7961],{"class":937},"auth",[931,7963,3666],{"class":945},[931,7965,889],{"class":945},[931,7967,3257],{"class":945},[931,7969,7830],{"class":1045},[931,7971,1955],{"class":945},[931,7973,7974],{"class":933,"line":1923},[931,7975,7704],{"class":945},[430,7977,1830,7978,7864,7981,1368,7983],{},[495,7979,7980],{},"kimi mcp auth trek",[441,7982,7867],{},[433,7984],{"src":7871,"alt":7872,"style":7985},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7987,7988],{},"Uma vez autorizado, as ferramentas disponíveis são listadas:",[433,7990],{"src":7991,"alt":7992,"style":6562},"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",[879,7994,7996],{"id":7995},"_7-experiência-móvel","7. Experiência móvel",[430,7998,7999],{},"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.",[879,8001,8002],{"id":6119},"Considerações finais",[430,8004,8005],{},"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.",[430,8007,8008],{},"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.",[430,8010,8011,8012,8017],{},"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 ",[444,8013,8016],{"href":8014,"rel":8015},"https:\u002F\u002Fdemo.liketrek.com\u002F",[448],"demo.liketrek.com"," antes de equacionar o autohospedamento.",[879,8019,1611],{"id":1610},[485,8021,8022,8029,8036],{},[488,8023,8024],{},[444,8025,8028],{"href":8026,"rel":8027},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[448],"Início rápido do TREK",[488,8030,8031],{},[444,8032,8035],{"href":8033,"rel":8034},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[448],"Resolução de problemas do TREK",[488,8037,8038],{},[444,8039,8042],{"href":8040,"rel":8041},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[448],"Escopos MCP do TREK",[1639,8044,8045],{},"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":425,"searchDepth":1061,"depth":1068,"links":8047},[8048,8053,8054,8064,8072,8078,8084,8085,8086],{"id":6237,"depth":1068,"text":6238,"children":8049},[8050,8051,8052],{"id":6241,"depth":1075,"text":6242},{"id":6387,"depth":1075,"text":6388},{"id":6419,"depth":1075,"text":6420},{"id":6565,"depth":1068,"text":6566},{"id":6608,"depth":1068,"text":6609,"children":8055},[8056,8057,8058,8059,8060,8061,8062,8063],{"id":6710,"depth":1075,"text":6711},{"id":6721,"depth":1075,"text":6722},{"id":6821,"depth":1075,"text":6822},{"id":6841,"depth":1075,"text":6842},{"id":6876,"depth":1075,"text":6877},{"id":6897,"depth":1075,"text":6898},{"id":6914,"depth":1075,"text":6915},{"id":6925,"depth":1075,"text":6926},{"id":6955,"depth":1068,"text":6956,"children":8065},[8066,8067,8068,8069,8070,8071],{"id":6962,"depth":1075,"text":6963},{"id":6996,"depth":1075,"text":6997},{"id":7066,"depth":1075,"text":7067},{"id":7088,"depth":1075,"text":7089},{"id":7107,"depth":1075,"text":7108},{"id":7132,"depth":1075,"text":7133},{"id":7163,"depth":1068,"text":7164,"children":8073},[8074,8075,8076,8077],{"id":7183,"depth":1075,"text":7184},{"id":7281,"depth":1075,"text":7282},{"id":7343,"depth":1075,"text":7344},{"id":7442,"depth":1075,"text":7443},{"id":7463,"depth":1068,"text":7464,"children":8079},[8080,8081,8082,8083],{"id":7474,"depth":1075,"text":7475},{"id":7496,"depth":1075,"text":7497},{"id":7776,"depth":1075,"text":7777},{"id":7888,"depth":1075,"text":7889},{"id":7995,"depth":1068,"text":7996},{"id":6119,"depth":1068,"text":8002},{"id":1610,"depth":1068,"text":1611},[8088,1659],"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":8094,"robots":1693,"sitemap":8098},[8095,8096],{"@type":1672,"headline":6223,"description":8090},{"@type":4059,"headline":8097,"description":8090},"Como alojar o TREK: O melhor planeador de viagens com IA",{"lastmod":8089},{"title":8097,"description":8090,"ogTitle":6223,"ogDescription":8090,"twitterTitle":6223,"twitterDescription":8090},"pt\u002Farticle\u002Fself-hosted-travel-planner-trek",[6217,8102,6218,6219,6907],"TREK","uBWL-fAL0Rz92WLnscPitCwqC44q4YSJbJuVmgQMof4",{"id":8105,"title":8106,"author":425,"body":8107,"category":8660,"date":8661,"description":8662,"extension":1664,"image":8663,"imageAlt":8664,"isPublished":1064,"meta":8665,"minRead":1923,"navigation":1064,"path":221,"seo":8669,"stem":8671,"tags":8672,"updatedAt":1702,"__hash__":8676},"article\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md","Como habilidades de agentes de IA substituem scripts Nuxt",{"type":427,"value":8108,"toc":8653},[8109,8123,8127,8130,8226,8229,8257,8263,8267,8282,8299,8303,8314,8474,8478,8560,8564,8572,8592,8599,8614,8625,8628,8634,8637,8642,8650],[430,8110,8111,8112,575,8115,8118,8119,8122],{},"Quando iniciamos uma nova aplicação usando o framework Nuxt, temos que passar por etapas tediosas como instalar módulos e configurar arquivos como ",[495,8113,8114],{},"nuxt.config.ts",[495,8116,8117],{},"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 ",[441,8120,8121],{},"habilidade de agente"," (agent skill).",[474,8124,8126],{"id":8125},"no-que-os-scripts-de-shell-tradicionais-são-bons","No que os scripts de shell tradicionais são bons",[430,8128,8129],{},"Um script é excelente para executar um conjunto fixo de instruções em sequência com decisões predefinidas no próprio código.",[923,8131,8133],{"className":1032,"code":8132,"language":1034,"meta":425,"style":425},"#!\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",[495,8134,8135,8140,8147,8151,8190,8194,8204,8208,8217],{"__ignoreMap":425},[931,8136,8137],{"class":933,"line":934},[931,8138,8139],{"class":1071},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[931,8141,8142,8145],{"class":933,"line":1061},[931,8143,8144],{"class":962},"set",[931,8146,5173],{"class":1045},[931,8148,8149],{"class":933,"line":1068},[931,8150,1065],{"emptyLinePlaceholder":1064},[931,8152,8153,8155,8158,8161,8163,8167,8169,8172,8175,8178,8181,8184,8187],{"class":933,"line":1075},[931,8154,7596],{"class":1041},[931,8156,8157],{"class":1045}," nuxi@latest",[931,8159,8160],{"class":1045}," init",[931,8162,3257],{"class":945},[931,8164,8166],{"class":8165},"sHdIc","$1",[931,8168,3666],{"class":945},[931,8170,8171],{"class":1045}," --template",[931,8173,8174],{"class":1045}," minimal",[931,8176,8177],{"class":1045}," --packageManager",[931,8179,8180],{"class":1045}," pnpm",[931,8182,8183],{"class":1045}," --no-gitInit",[931,8185,8186],{"class":1045}," -M",[931,8188,8189],{"class":1045}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[931,8191,8192],{"class":933,"line":1923},[931,8193,1065],{"emptyLinePlaceholder":1064},[931,8195,8196,8198,8200,8202],{"class":933,"line":1928},[931,8197,2786],{"class":962},[931,8199,3257],{"class":945},[931,8201,8166],{"class":8165},[931,8203,1955],{"class":945},[931,8205,8206],{"class":933,"line":1934},[931,8207,1065],{"emptyLinePlaceholder":1064},[931,8209,8210,8212,8215],{"class":933,"line":2270},[931,8211,2803],{"class":1041},[931,8213,8214],{"class":1045}," ~\u002Ftemplates\u002Fnuxt.config.ts",[931,8216,4869],{"class":1045},[931,8218,8219,8221,8224],{"class":933,"line":2281},[931,8220,2803],{"class":1041},[931,8222,8223],{"class":1045}," ~\u002Ftemplates\u002Fwrangler.jsonc",[931,8225,4869],{"class":1045},[430,8227,8228],{},"Este script funciona até que aconteça o seguinte:",[485,8230,8231,8237,8247],{},[488,8232,8233,8236],{},[441,8234,8235],{},"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.",[488,8238,8239,8242,8243,8246],{},[441,8240,8241],{},"Não consegue ler a intenção do usuário."," \"Crie um blog\" precisa do ",[495,8244,8245],{},"@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.",[488,8248,8249,8252,8253,8256],{},[441,8250,8251],{},"Fica desatualizado silenciosamente."," As convenções do Nuxt mudam entre versões principais. O Nuxt 4 mudou o diretório de origem para ",[495,8254,8255],{},"app\u002F",". Um script escrito para o Nuxt 3 criará o scaffolding da estrutura errada sem nunca alertar o usuário.",[430,8258,3523,8259,8262],{},[441,8260,8261],{},"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.",[474,8264,8266],{"id":8265},"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?",[430,8268,8269,8270,8273,8274,8277,8278,8281],{},"Uma habilidade de agente (agent skill) não é um bloco de código que simplesmente executa, mas um ",[441,8271,8272],{},"conjunto de conhecimentos que o agente de IA segue",". Ela contém um arquivo ",[495,8275,8276],{},"SKILL.md"," e pode agrupar quaisquer outros arquivos que a tarefa exigir (como documentos de referência, modelos e scripts executáveis). O artigo ",[444,8279,8280],{"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:",[485,8283,8284,8287,8290,8293,8296],{},[488,8285,8286],{},"Deduz a intenção do usuário para determinar se o aplicativo precisa de um banco de dados.",[488,8288,8289],{},"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.",[488,8291,8292],{},"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.",[488,8294,8295],{},"Recupera-se quando uma etapa falha.",[488,8297,8298],{},"Valida o projeto por meio de um checklist final antes de entregá-lo.",[474,8300,8302],{"id":8301},"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",[430,8304,8305,8306,8313],{},"A habilidade, ",[444,8307,8310],{"href":8308,"rel":8309},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[448],[495,8311,8312],{},"scaffold-nuxt-cloudflare-app-skill",", guia você por um scaffolding voltado para produção:",[533,8315,8316,8347,8366,8390,8419,8454,8460],{},[488,8317,8318,8321,8322],{},[441,8319,8320],{},"Esclarece qualquer detalhe"," que não possa ser deduzido:\n",[485,8323,8324,8335,8338],{},[488,8325,8326,8327,8330,8331,8334],{},"O kit de UI (",[441,8328,8329],{},"Nuxt UI"," por padrão ou ",[441,8332,8333],{},"Antdv Next",");",[488,8336,8337],{},"Se um banco de dados é necessário (como Cloudflare D1);",[488,8339,8340,8341,1518,8344,8346],{},"Módulos extras como ",[495,8342,8343],{},"@nuxtjs\u002Fi18n",[495,8345,8245],{}," para recursos de CMS.",[488,8348,8349,758,8352,8355,8356,8358,8359,8362,8363,461],{},[441,8350,8351],{},"Inicializa o aplicativo base",[495,8353,8354],{},"pnpm dlx nuxi@latest init"," para obter a versão mais recente do framework Nuxt com o ",[495,8357,3557],{}," 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 ",[495,8360,8361],{},"better-sqlite3","\u002F",[495,8364,8365],{},"sharp",[488,8367,8368,579,8371,1518,8374,742,8377,742,8380,742,8383,742,8386,8389],{},[441,8369,8370],{},"Instala os módulos a partir de uma tabela de decisão",[495,8372,8373],{},"@nuxt\u002Fui",[495,8375,8376],{},"@antdv-next\u002Fnuxt",[495,8378,8379],{},"@nuxt\u002Fimage",[495,8381,8382],{},"@nuxtjs\u002Fseo",[495,8384,8385],{},"@nuxthub\u002Fcore",[495,8387,8388],{},"@vueuse\u002Fnuxt",", além de Drizzle\u002FD1, Nuxt Content e i18n apenas se forem selecionados.",[488,8391,8392,1368,8395],{},[441,8393,8394],{},"Organiza a estrutura de diretórios",[485,8396,8397,8401,8406,8411,8416],{},[488,8398,8399],{},[495,8400,8255],{},[488,8402,8403],{},[495,8404,8405],{},"server\u002F",[488,8407,8408],{},[495,8409,8410],{},"shared\u002F",[488,8412,8413],{},[495,8414,8415],{},"tests\u002F",[488,8417,8418],{},"arquivos de configuração na raiz.",[488,8420,8421,1368,8426],{},[441,8422,8423,8424],{},"Configura o ",[495,8425,8114],{},[485,8427,8428,8437,8444,8449],{},[488,8429,8430,8362,8433,8436],{},[495,8431,8432],{},"site.url",[495,8434,8435],{},"site.name"," para SEO",[488,8438,8439,8440,8443],{},"Bloco ",[495,8441,8442],{},"hub"," do NuxtHub para o Cloudflare",[488,8445,8446],{},[495,8447,8448],{},"routeRules",[488,8450,8451],{},[495,8452,8453],{},"compatibilityDate",[488,8455,8456],{},[441,8457,8423,8458],{},[495,8459,8117],{},[488,8461,8462,8465,8466,8469,8470,8473],{},[441,8463,8464],{},"Configura o Vitest e o ESLint",", em seguida executa um ",[441,8467,8468],{},"checklist final"," incluindo ",[495,8471,8472],{},"pnpm install && pnpm dev"," antes de dar o trabalho por encerrado.",[474,8475,8477],{"id":8476},"scripts-de-shell-vs-habilidades-de-agentes-de-ia-comparação-direta","Scripts de shell vs habilidades de agentes de IA: comparação direta",[604,8479,8480,8492],{},[607,8481,8482],{},[610,8483,8484,8486,8489],{},[613,8485],{},[613,8487,8488],{},"Script",[613,8490,8491],{},"Habilidade",[633,8493,8494,8505,8516,8527,8538,8549],{},[610,8495,8496,8499,8502],{},[638,8497,8498],{},"Intenção do usuário",[638,8500,8501],{},"❌ valores fixos",[638,8503,8504],{},"✅ adapta-se à solicitação",[610,8506,8507,8510,8513],{},[638,8508,8509],{},"Tomada de decisão",[638,8511,8512],{},"apenas com flags predefinidas",[638,8514,8515],{},"✅ avaliado em tempo de execução",[610,8517,8518,8521,8524],{},[638,8519,8520],{},"Mudanças de versão",[638,8522,8523],{},"reescrita manual",[638,8525,8526],{},"✅ verifica o estado atual",[610,8528,8529,8532,8535],{},[638,8530,8531],{},"Recuperação de erros",[638,8533,8534],{},"para a execução",[638,8536,8537],{},"✅ corrige e continua",[610,8539,8540,8543,8546],{},[638,8541,8542],{},"Validação do resultado",[638,8544,8545],{},"❌",[638,8547,8548],{},"✅ checklist final",[610,8550,8551,8554,8557],{},[638,8552,8553],{},"Custo de manutenção",[638,8555,8556],{},"proliferação de flags, atualizações de versão",[638,8558,8559],{},"editar Markdown, não código",[474,8561,8563],{"id":8562},"como-instalar-habilidades-de-agentes-de-ia-com-a-cli-npx-skills","Como instalar habilidades de agentes de IA com a CLI npx skills",[430,8565,8566,8567,889],{},"A instalação é feita em um único comando com a ",[444,8568,8571],{"href":8569,"rel":8570},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[448],"CLI de skills",[923,8573,8575],{"className":1032,"code":8574,"language":1034,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[495,8576,8577],{"__ignoreMap":425},[931,8578,8579,8581,8584,8586,8589],{"class":933,"line":934},[931,8580,7596],{"class":1041},[931,8582,8583],{"class":1045}," skills",[931,8585,1055],{"class":1045},[931,8587,8588],{"class":1045}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[931,8590,8591],{"class":1045}," -g\n",[430,8593,8594,8595],{},"A CLI clona o repositório, localiza a habilidade e pergunta a qual dos 77 agentes suportados ela deve ser atribuída:\n",[433,8596],{"alt":8597,"src":8598},"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",[430,8600,8601,8602,8605,8606,8609,8610],{},"Escolhemos o ",[441,8603,8604],{},"Symlink"," (o método recomendado), que instala a habilidade uma única vez em ",[495,8607,8608],{},"~\u002F.agents\u002Fskills"," e aponta cada agente selecionado para esta única cópia.\n",[433,8611],{"alt":8612,"src":8613},"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",[485,8615,8616],{},[488,8617,8618],{},[899,8619,8620,8621,8624],{},"Consulte este artigo, ",[444,8622,8623],{"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.",[430,8626,8627],{},"Ao abrir o Claude Code, você confirma que a habilidade foi instalada com sucesso.",[430,8629,8630],{},[433,8631],{"alt":8632,"src":8633},"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",[430,8635,8636],{},"A partir daí, um prompt em linguagem natural é suficiente:",[2504,8638,8639],{},[430,8640,8641],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"",[430,8643,8644,8645,8649],{},"A habilidade é open source; acesse o ",[444,8646,8648],{"href":8308,"rel":8647},[448],"repositório no GitHub"," e experimente.",[1639,8651,8652],{},"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":425,"searchDepth":1061,"depth":1068,"links":8654},[8655,8656,8657,8658,8659],{"id":8125,"depth":1061,"text":8126},{"id":8265,"depth":1061,"text":8266},{"id":8301,"depth":1061,"text":8302},{"id":8476,"depth":1061,"text":8477},{"id":8562,"depth":1061,"text":8563},[1659],"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.","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":8666,"robots":1693,"sitemap":8668},[8667],{"@type":1670,"headline":8106,"description":8662,"image":8663},{"lastmod":8661},{"title":8670,"description":8662,"ogTitle":8106,"ogDescription":8662,"twitterTitle":8106,"twitterDescription":8662},"Nuxt no Cloudflare: Habilidades de IA vs Scripts de Build","pt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",[8673,6219,8674,8675],"Nuxt","AI Agent","Scaffolding","oRX3uz8H_2-Dh03snCHuC6xhmBt3UnIdxirrpFcicu4",{"id":8678,"title":8679,"author":1702,"body":8680,"category":9442,"date":9444,"description":9445,"extension":1664,"image":9446,"imageAlt":9447,"isPublished":1064,"meta":9448,"minRead":2281,"navigation":1064,"path":245,"seo":9453,"stem":9454,"tags":9455,"updatedAt":1702,"__hash__":9457},"article\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","Criar sistema persistente de memória de IA na Cloudflare",{"type":427,"value":8681,"toc":9424},[8682,8686,8689,8692,8696,8699,8713,8717,8724,8738,8741,8744,8788,8792,8873,8877,8902,8999,9010,9014,9019,9059,9083,9087,9092,9159,9164,9168,9201,9207,9245,9249,9281,9285,9293,9297,9327,9331,9374,9376,9379,9382,9385,9387,9421],[474,8683,8685],{"id":8684},"a-importância-da-memória-persistente-de-ia-para-os-agentes","A importância da memória persistente de IA para os agentes",[430,8687,8688],{},"À 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.",[430,8690,8691],{},"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.",[474,8693,8695],{"id":8694},"sistemas-de-memória-de-ia-auto-hospedados-vs-integrados","Sistemas de memória de IA auto-hospedados vs. integrados",[430,8697,8698],{},"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.",[430,8700,8701,8702,8707,8708,8712],{},"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 ",[444,8703,8706],{"href":8704,"rel":8705},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[448],"Second Brain",", desenvolvido como um fork de ",[444,8709,8710],{"href":8710,"rel":8711},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare",[448],", 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.",[474,8714,8716],{"id":8715},"como-criar-um-second-brain-de-memória-de-ia-na-cloudflare","Como criar um Second Brain de memória de IA na Cloudflare",[430,8718,8719,8720,8723],{},"O sistema de memória Second Brain é implementado sobre o ",[441,8721,8722],{},"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.",[430,8725,8726,8727,8730,8731,8734,8735,8737],{},"O modelo de embeddings do ",[441,8728,8729],{},"Workers AI"," é usado para gerar os vetores. Estes embeddings são guardados no ",[441,8732,8733],{},"Cloudflare Vectorize",", que é uma base de dados vetorial altamente otimizada e distribuída. O ",[441,8736,8733],{}," realiza buscas de similaridade por cosseno para identificar memórias com relevância sémântica.",[430,8739,8740],{},"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.",[430,8742,8743],{},"As seguintes ferramentas são expostas como interfaces MCP para utilização direta pelos agentes de IA:",[485,8745,8746,8752,8758,8764,8770,8776,8782],{},[488,8747,8748,8751],{},[495,8749,8750],{},"remember",": Guardar ideias, decisões, preferências e contexto geral do projeto.",[488,8753,8754,8757],{},[495,8755,8756],{},"append",": Acrescentar novas informações ou atualizações a uma memória existente.",[488,8759,8760,8763],{},[495,8761,8762],{},"update",": Substituir uma memória existente por completo.",[488,8765,8766,8769],{},[495,8767,8768],{},"recall",": Localizar memórias com base no seu significado sémântico e não em palavras-chave exatas.",[488,8771,8772,8775],{},[495,8773,8774],{},"list_recent",": Listar as memórias gravadas recentemente.",[488,8777,8778,8781],{},[495,8779,8780],{},"forget",": Apagar de forma definitiva um registo de memória.",[488,8783,8784,8787],{},[495,8785,8786],{},"link\u002Fconnections",": Conectar memórias relacionadas entre si (funcionalidade de grafo v2).",[879,8789,8791],{"id":8790},"configuração-do-second-brain-na-cloudflare","Configuração do Second Brain na Cloudflare",[533,8793,8794,8811,8818,8825,8832,8839,8850,8856,8859,8866],{},[488,8795,4232,8796,8799,8800,8805,8806,8810],{},[495,8797,8798],{},"Deploy to Cloudflare"," na página do ",[444,8801,8804],{"href":8802,"rel":8803},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[448],"Github repo",". [[",[433,8807],{"alt":8808,"src":8809},"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","]]",[488,8812,8813,8814],{},"Preencha o formulário do Cloudflare Worker apresentado.\n",[433,8815],{"alt":8816,"src":8817},"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",[488,8819,8820,8821],{},"Introduza '384' no campo Dimensions; selecione 'cosine' para Metric; e clique no botão Deploy.\n",[433,8822],{"alt":8823,"src":8824},"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",[488,8826,8827,8828],{},"O ecrã seguinte apresenta a visão geral do seu Second Brain no Cloudflare Worker:\n",[433,8829],{"alt":8830,"src":8831},"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",[488,8833,8834,8835],{},"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",[433,8836],{"alt":8837,"src":8838},"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",[488,8840,8841,8842,8846],{},"Clique no link 'Rotate' para poder definir o novo valor: ",[433,8843],{"alt":8844,"src":8845},"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",[433,8847],{"alt":8848,"src":8849},"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",[488,8851,3371,8852,8855],{},[495,8853,8854],{},"openssl rand -base64 32"," no seu terminal macOS para gerar um valor aleatório seguro e cole-o no campo 'Value'.",[488,8857,8858],{},"Clique no botão 'Deploy' para guardar o novo valor da variável 'AUTH_TOKEN'.",[488,8860,8861,8862],{},"Abra o endereço URL do seu worker do Second Brain no seu navegador de internet.\n",[433,8863],{"alt":8864,"src":8865},"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",[488,8867,8868,8869,8872],{},"Introduza o 'AUTH_TOKEN' gerado no campo de input ",[495,8870,8871],{},"Bearer token"," e clique no botão 'Connect' para aceder ao painel de controlo (Web UI).",[879,8874,8876],{"id":8875},"integração-do-claude-desktop-via-mcp","Integração do Claude Desktop via MCP",[533,8878,8879,8886,8893],{},[488,8880,8881,8882],{},"Clique em 'Customize' nas definições do Claude Desktop.\n",[433,8883],{"alt":8884,"src":8885},"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",[488,8887,8888,8889],{},"Selecione 'Developer' para abrir e editar manualmente o ficheiro de configuração dos servidores MCP:\n",[433,8890],{"alt":8891,"src":8892},"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",[488,8894,8895,8896,8898,8899,889],{},"Adicione o seguinte bloco de código à secção ",[495,8897,7560],{}," no ficheiro ",[495,8900,8901],{},"claude_desktop_config.json",[923,8903,8905],{"className":2875,"code":8904,"language":2877,"meta":425,"style":425},"    \"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",[495,8906,8907,8920,8938,8950,8960,8971,8982,8991,8995],{"__ignoreMap":425},[931,8908,8909,8911,8914,8916,8918],{"class":933,"line":934},[931,8910,7571],{"class":945},[931,8912,8913],{"class":1045},"second-brain",[931,8915,3666],{"class":945},[931,8917,579],{"class":941},[931,8919,2884],{"class":945},[931,8921,8922,8924,8926,8928,8930,8932,8934,8936],{"class":933,"line":1061},[931,8923,7584],{"class":945},[931,8925,7587],{"class":937},[931,8927,3666],{"class":945},[931,8929,889],{"class":945},[931,8931,3257],{"class":945},[931,8933,7596],{"class":1045},[931,8935,3666],{"class":945},[931,8937,7601],{"class":945},[931,8939,8940,8942,8944,8946,8948],{"class":933,"line":1068},[931,8941,7584],{"class":945},[931,8943,7608],{"class":937},[931,8945,3666],{"class":945},[931,8947,889],{"class":945},[931,8949,7615],{"class":945},[931,8951,8952,8954,8956,8958],{"class":933,"line":1075},[931,8953,7620],{"class":945},[931,8955,7623],{"class":1045},[931,8957,3666],{"class":945},[931,8959,7601],{"class":945},[931,8961,8962,8964,8967,8969],{"class":933,"line":1923},[931,8963,7620],{"class":945},[931,8965,8966],{"class":1045},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[931,8968,3666],{"class":945},[931,8970,7601],{"class":945},[931,8972,8973,8975,8978,8980],{"class":933,"line":1928},[931,8974,7620],{"class":945},[931,8976,8977],{"class":1045},"--header",[931,8979,3666],{"class":945},[931,8981,7601],{"class":945},[931,8983,8984,8986,8989],{"class":933,"line":1934},[931,8985,7620],{"class":945},[931,8987,8988],{"class":1045},"Authorization: Bearer \u003Cyour-token>",[931,8990,1955],{"class":945},[931,8992,8993],{"class":933,"line":2270},[931,8994,7699],{"class":945},[931,8996,8997],{"class":933,"line":2281},[931,8998,7704],{"class":945},[430,9000,9001,9005,9006],{},[433,9002],{"alt":9003,"src":9004},"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",[433,9007],{"alt":9008,"src":9009},"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",[879,9011,9013],{"id":9012},"integração-do-claude-code-via-mcp","Integração do Claude Code via MCP",[485,9015,9016],{},[488,9017,9018],{},"Execute o seguinte comando no terminal para adicionar o novo servidor MCP:",[923,9020,9022],{"className":2300,"code":9021,"language":2302,"meta":425,"style":425},"claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n",[495,9023,9024],{"__ignoreMap":425},[931,9025,9026,9029,9032,9034,9037,9040,9043,9046,9048,9051,9054,9056],{"class":933,"line":934},[931,9027,9028],{"class":1041},"claude",[931,9030,9031],{"class":1045}," mcp",[931,9033,1055],{"class":1045},[931,9035,9036],{"class":1045}," --transport",[931,9038,9039],{"class":1045}," http",[931,9041,9042],{"class":1045}," second-brain",[931,9044,9045],{"class":1045}," https:\u002F\u002F",[931,9047,5539],{"class":945},[931,9049,9050],{"class":1045},"your-worker-ur",[931,9052,9053],{"class":941},"l",[931,9055,1249],{"class":945},[931,9057,9058],{"class":1045},"\u002Fmcp\n",[485,9060,9061,9067],{},[488,9062,9063,9064,461],{},"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 ",[495,9065,9066],{},"AUTH_TOKEN",[488,9068,9069,9070,9073,9074,9077,9078,461],{},"Crie o ficheiro ",[495,9071,9072],{},"CLAUDE.md"," na diretoria ",[495,9075,9076],{},"~\u002F.claude"," com as instruções descritas em ",[444,9079,9082],{"href":9080,"rel":9081},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[448],"CLAUDE_INSTRUCTIONS.md",[879,9084,9086],{"id":9085},"integração-do-gemini-cli-via-mcp","Integração do Gemini CLI via MCP",[533,9088,9089],{},[488,9090,9091],{},"Adicione a seguinte configuração de servidor MCP ao seu ficheiro '.\u002F.gemini\u002Fsettings.json':",[923,9093,9095],{"className":2875,"code":9094,"language":2877,"meta":425,"style":425},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[495,9096,9097,9109,9127,9139,9151,9155],{"__ignoreMap":425},[931,9098,9099,9101,9103,9105,9107],{"class":933,"line":934},[931,9100,7571],{"class":945},[931,9102,8913],{"class":1045},[931,9104,3666],{"class":945},[931,9106,579],{"class":941},[931,9108,2884],{"class":945},[931,9110,9111,9113,9115,9117,9119,9121,9123,9125],{"class":933,"line":1061},[931,9112,7584],{"class":945},[931,9114,7811],{"class":937},[931,9116,3666],{"class":945},[931,9118,889],{"class":945},[931,9120,3257],{"class":945},[931,9122,8966],{"class":1045},[931,9124,3666],{"class":945},[931,9126,7601],{"class":945},[931,9128,9129,9131,9133,9135,9137],{"class":933,"line":1068},[931,9130,7584],{"class":945},[931,9132,7830],{"class":937},[931,9134,3666],{"class":945},[931,9136,889],{"class":945},[931,9138,2914],{"class":945},[931,9140,9141,9143,9145,9147,9149],{"class":933,"line":1075},[931,9142,7620],{"class":945},[931,9144,7843],{"class":1041},[931,9146,3666],{"class":945},[931,9148,889],{"class":945},[931,9150,1379],{"class":945},[931,9152,9153],{"class":933,"line":1923},[931,9154,7854],{"class":945},[931,9156,9157],{"class":933,"line":1928},[931,9158,7704],{"class":945},[533,9160,9161],{"start":1061},[488,9162,9163],{},"Inicialize o Gemini CLI.",[879,9165,9167],{"id":9166},"testar-o-second-brain-em-agentes-de-ia","Testar o Second Brain em agentes de IA",[533,9169,9170,9180,9194],{},[488,9171,9172,9173,9175,9176],{},"Ao definir uma paleta de cores de marca básica no ",[441,9174,7513],{},", o Second Brain não é ativado de imediato por padrão.\n",[433,9177],{"alt":9178,"src":9179},"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",[488,9181,9182,9183,9186,9187,9189,9190],{},"Ao utilizar comandos simples como 'remember', são chamadas as ferramentas integradas locais ",[495,9184,9185],{},"memory_user-edits"," do ",[441,9188,7513],{},", e não a camada de armazenamento remoto.\n",[433,9191],{"alt":9192,"src":9193},"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",[488,9195,9196,9197,9200],{},"Ao enviar o seguinte comando no ",[441,9198,9199],{},"Claude Code",", a integração com o Second Brain foi chamada com sucesso:",[923,9202,9205],{"className":9203,"code":9204,"language":4613},[4611],"Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n",[495,9206,9204],{"__ignoreMap":425},[430,9208,9209,9213,9214,1368,9217,9221,9222,9225,9226,9228,9229,9233,9234,9237,9238,9221,9242],{},[433,9210],{"alt":9211,"src":9212},"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 ",[441,9215,9216],{},"Second Brain na Cloudflare",[433,9218],{"alt":9219,"src":9220},"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- ",[899,9223,9224],{},"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 ",[441,9227,7513],{},", é 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",[433,9230],{"alt":9231,"src":9232},"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 ",[441,9235,9236],{},"Gemini CLI",", onde terá de indicar 'Second Brain' para ativar as ferramentas MCP integradas.\n",[433,9239],{"alt":9240,"src":9241},"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",[899,9243,9244],{},"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.",[879,9246,9248],{"id":9247},"extensões-para-navegadores-web","Extensões para navegadores web",[485,9250,9251,9254],{},[488,9252,9253],{},"Estão disponíveis extensões para os navegadores Chrome, Firefox e Microsoft Edge.",[488,9255,9256,9257],{},"As funcionalidades incluem:\n",[485,9258,9259,9265,9271],{},[488,9260,9261,9264],{},[441,9262,9263],{},"Capturar a página atual"," — guarda automaticamente o título e o endereço URL no seu Second Brain.",[488,9266,9267,9270],{},[441,9268,9269],{},"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.",[488,9272,9273,9276,9277,9280],{},[441,9274,9275],{},"Adicionar notas rápidas"," — escreva observações rápidas ou categorize com ",[495,9278,9279],{},"#hashtags"," diretamente no popup da extensão antes de gravar; os hashtags são indexados automaticamente como tags.",[879,9282,9284],{"id":9283},"sincronização-de-conhecimento-pessoal-com-o-plugin-obsidian","Sincronização de conhecimento pessoal com o plugin Obsidian",[485,9286,9287,9290],{},[488,9288,9289],{},"Existe um plugin Obsidian para efetuar a sincronização das suas notas pessoais do Obsidian Vault diretamente com o Second Brain na Cloudflare.",[488,9291,9292],{},"Pode usar tags específicas nas notas que deseja enviar para o armazenamento persistente.",[2158,9294,9296],{"id":9295},"instalar-o-plugin-obsidian","Instalar o plugin Obsidian",[533,9298,9299,9306,9313,9320],{},[488,9300,9301,9302],{},"Abra o Obsidian → Definições → Community Plugins\n",[433,9303],{"alt":9304,"src":9305},"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",[488,9307,9308,9309],{},"Clique no botão 'Browse' para pesquisar plug-ins.\n",[433,9310],{"alt":9311,"src":9312},"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",[488,9314,9315,9316],{},"Procure por 'Second Brain Sync'.\n",[433,9317],{"alt":9318,"src":9319},"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",[488,9321,9322,9323],{},"Clique no botão 'Install' (Instalar) e, em seguida, em 'Enable' (Ativar).\n",[433,9324],{"alt":9325,"src":9326},"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",[2158,9328,9330],{"id":9329},"configurar-o-plugin-obsidian","Configurar o plugin Obsidian",[533,9332,9333,9336,9343,9350,9357,9367],{},[488,9334,9335],{},"Aceda a Obsidian → Definições → Second Brain Sync",[488,9337,9338,9339],{},"Preencha os campos 'URL' e o 'Auth token' com os dados do seu Worker.\n",[433,9340],{"alt":9341,"src":9342},"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",[488,9344,9345,9346],{},"Clique em 'Test' para verificar se a ligação remota está operacional.\n",[433,9347],{"alt":9348,"src":9349},"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",[488,9351,9352,9353],{},"Defina os comportamentos de sincronização. Configure a tag de sincronização desejada em 'Sync tag' e ative 'Auto-sync on save'.\n",[433,9354],{"alt":9355,"src":9356},"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",[488,9358,9359,9360,9362,9363],{},"Crie uma nota na sua pasta do Obsidian com a tag ",[495,9361,8913],{}," (conforme definido no ecrã de configurações).\n",[433,9364],{"alt":9365,"src":9366},"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",[488,9368,9369,9370],{},"A nota é gravada e sincronizada de imediato para a sua instância de Cloudflare.\n",[433,9371],{"alt":9372,"src":9373},"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",[474,9375,2569],{"id":2568},[430,9377,9378],{},"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.",[430,9380,9381],{},"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.",[430,9383,9384],{},"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.",[474,9386,1611],{"id":1610},[485,9388,9389,9395,9401,9408,9415],{},[488,9390,9391],{},[444,9392,9393],{"href":9393,"rel":9394},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[448],[488,9396,9397],{},[444,9398,9399],{"href":9399,"rel":9400},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[448],[488,9402,9403],{},[444,9404,9407],{"href":9405,"rel":9406},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[448],"Connect to AI Clients",[488,9409,9410],{},[444,9411,9414],{"href":9412,"rel":9413},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[448],"Second Brain Obsidian Plugin",[488,9416,9417],{},[444,9418,9419],{"href":9419,"rel":9420},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[448],[1639,9422,9423],{},"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":425,"searchDepth":1061,"depth":1068,"links":9425},[9426,9427,9428,9440,9441],{"id":8684,"depth":1061,"text":8685},{"id":8694,"depth":1061,"text":8695},{"id":8715,"depth":1061,"text":8716,"children":9429},[9430,9431,9432,9433,9434,9435,9436],{"id":8790,"depth":1068,"text":8791},{"id":8875,"depth":1068,"text":8876},{"id":9012,"depth":1068,"text":9013},{"id":9085,"depth":1068,"text":9086},{"id":9166,"depth":1068,"text":9167},{"id":9247,"depth":1068,"text":9248},{"id":9283,"depth":1068,"text":9284,"children":9437},[9438,9439],{"id":9295,"depth":1075,"text":9296},{"id":9329,"depth":1075,"text":9330},{"id":2568,"depth":1061,"text":2569},{"id":1610,"depth":1061,"text":1611},[9443,1659],"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":9449,"robots":1693,"sitemap":9452},[9450],{"@type":1670,"headline":9451,"description":9445},"Memória de IA persistente auto-hospedada: Cloudflare e MCP",{"lastmod":9444},{"title":9451,"description":9445,"ogTitle":8679,"ogDescription":9445,"twitterTitle":8679,"twitterDescription":9445},"pt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[6219,6907,9456,8706,4068],"Memória de IA","2A8G4GBE0gVo-TlyYCIBGp4hYUpOZtEDV7cqi45ry1s",{"id":9459,"title":2516,"author":425,"body":9460,"category":9975,"date":9976,"description":9977,"extension":1664,"image":9978,"imageAlt":9979,"isPublished":1064,"meta":9980,"minRead":1075,"navigation":1064,"path":237,"seo":9984,"stem":9985,"tags":9986,"updatedAt":1702,"__hash__":9989},"article\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md",{"type":427,"value":9461,"toc":9968},[9462,9466,9469,9476,9480,9486,9489,9492,9496,9499,9506,9522,9816,9928,9930,9933,9935,9965],[474,9463,9465],{"id":9464},"o-que-é-o-cloudflare-warp","O que é o Cloudflare WARP?",[430,9467,9468],{},"O Cloudflare WARP é um aplicativo de cliente que direciona o tráfego do dispositivo especificado através da rede global da Cloudflare, em vez de enviá-lo diretamente para a internet pública.",[430,9470,9471,9472,9475],{},"Ele cria um túnel criptografado baseado no protocolo ",[441,9473,9474],{},"WireGuard",", protegendo o tráfego do dispositivo até o data center da Cloudflare mais próximo. Políticas podem ser criadas em seu painel da Cloudflare para filtrar, registrar, inspecionar ou rotear esse tráfego de entrada.",[474,9477,9479],{"id":9478},"por-que-precisamos-do-cloudflare-warp","Por que precisamos do Cloudflare WARP?",[430,9481,9482,9483,461],{},"Para expor com segurança recursos internos—como serviços web privados ou aplicativos SaaS—a funcionários, contratados e outras partes interessadas, o cliente Cloudflare WARP atua como ponto de aplicação no lado do cliente para o ",[441,9484,9485],{},"Acesso à Rede de Confiança Zero (ZTNA)",[430,9487,9488],{},"O cliente Cloudflare WARP é instalado no laptop ou celular do usuário. Ele exige que os usuários se autentiquem e cumpram verificações específicas de integridade de segurança (como vir de uma faixa de IPs aprovada, usar um domínio de e-mail registrado ou executar um firewall ativo) antes de conceder acesso.",[430,9490,9491],{},"Ao tunelar o tráfego do dispositivo diretamente para a Cloudflare, a identidade do usuário, o dispositivo e as políticas são verificados antes que as solicitações cheguem aos recursos internos. Como resultado, os recursos internos nunca ficam expostos à internet pública, e cada solicitação é totalmente registrada e auditada.",[474,9493,9495],{"id":9494},"suporte-a-múltiplos-perfis-do-warp-em-um-único-dispositivo","Suporte a múltiplos perfis do WARP em um único dispositivo",[430,9497,9498],{},"Quando os usuários precisam alternar entre contas pessoais e corporativas da Cloudflare, ou quando os administradores de sistemas gerenciam múltiplos locatários (tenants), oferecer suporte a múltiplos perfis do WARP em um único dispositivo se torna crucial.",[430,9500,9501,9502,9505],{},"Para conseguir isso no macOS, podemos usar um arquivo de perfil MDM ",[495,9503,9504],{},".mobileconfig"," para definir e registrar os diferentes ambientes do WARP.",[485,9507,9508,9519],{},[488,9509,9510,9518],{},[444,9511,9514,9515,9517],{"href":9512,"rel":9513},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[448],"Download a sample ",[495,9516,9504],{}," file"," diretamente da Cloudflare.",[488,9520,9521],{},"Abaixo está um exemplo de como essa configuração se parece:",[923,9523,9527],{"className":9524,"code":9525,"language":9526,"meta":425,"style":425},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n  \u003Ckey>PayloadContent\u003C\u002Fkey>\n  \u003Carray>\n    \u003Cdict>\n      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n      \u003Ckey>PayloadType\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n      \u003Cinteger>1\u003C\u002Finteger>\n      \u003Ckey>configs\u003C\u002Fkey>\n      \u003Carray>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 1\u003C\u002Fstring>\n        \u003C\u002Fdict>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 2\u003C\u002Fstring>\n        \u003C\u002Fdict>\n      \u003C\u002Farray>\n    \u003C\u002Fdict>\n  \u003C\u002Farray>\n  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n  \u003Cfalse\u002F>\n  \u003Ckey>PayloadScope\u003C\u002Fkey>\n  \u003Cstring>System\u003C\u002Fstring>\n  \u003Ckey>PayloadType\u003C\u002Fkey>\n  \u003Cstring>Configuration\u003C\u002Fstring>\n  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n  \u003Cinteger>1\u003C\u002Finteger>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n","xml",[495,9528,9529,9534,9539,9544,9549,9554,9559,9564,9569,9574,9579,9584,9589,9594,9599,9604,9609,9614,9619,9624,9629,9634,9639,9644,9649,9654,9659,9664,9668,9672,9677,9681,9686,9690,9696,9702,9708,9714,9720,9726,9732,9738,9744,9750,9756,9762,9768,9774,9780,9786,9792,9798,9804,9810],{"__ignoreMap":425},[931,9530,9531],{"class":933,"line":934},[931,9532,9533],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[931,9535,9536],{"class":933,"line":1061},[931,9537,9538],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[931,9540,9541],{"class":933,"line":1068},[931,9542,9543],{},"\u003Cplist version=\"1.0\">\n",[931,9545,9546],{"class":933,"line":1075},[931,9547,9548],{},"\u003Cdict>\n",[931,9550,9551],{"class":933,"line":1923},[931,9552,9553],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[931,9555,9556],{"class":933,"line":1928},[931,9557,9558],{},"  \u003Carray>\n",[931,9560,9561],{"class":933,"line":1934},[931,9562,9563],{},"    \u003Cdict>\n",[931,9565,9566],{"class":933,"line":2270},[931,9567,9568],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[931,9570,9571],{"class":933,"line":2281},[931,9572,9573],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[931,9575,9576],{"class":933,"line":2377},[931,9577,9578],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[931,9580,9581],{"class":933,"line":1695},[931,9582,9583],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[931,9585,9586],{"class":933,"line":2388},[931,9587,9588],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[931,9590,9591],{"class":933,"line":2393},[931,9592,9593],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[931,9595,9596],{"class":933,"line":2399},[931,9597,9598],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[931,9600,9601],{"class":933,"line":3326},[931,9602,9603],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[931,9605,9606],{"class":933,"line":3337},[931,9607,9608],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[931,9610,9611],{"class":933,"line":3342},[931,9612,9613],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[931,9615,9616],{"class":933,"line":3350},[931,9617,9618],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[931,9620,9621],{"class":933,"line":3879},[931,9622,9623],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[931,9625,9626],{"class":933,"line":3885},[931,9627,9628],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[931,9630,9631],{"class":933,"line":3894},[931,9632,9633],{},"      \u003Carray>\n",[931,9635,9636],{"class":933,"line":4543},[931,9637,9638],{},"        \u003Cdict>\n",[931,9640,9641],{"class":933,"line":4996},[931,9642,9643],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[931,9645,9646],{"class":933,"line":5005},[931,9647,9648],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[931,9650,9651],{"class":933,"line":5013},[931,9652,9653],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[931,9655,9656],{"class":933,"line":5021},[931,9657,9658],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[931,9660,9661],{"class":933,"line":5026},[931,9662,9663],{},"        \u003C\u002Fdict>\n",[931,9665,9666],{"class":933,"line":5033},[931,9667,9638],{},[931,9669,9670],{"class":933,"line":5041},[931,9671,9643],{},[931,9673,9674],{"class":933,"line":5049},[931,9675,9676],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[931,9678,9679],{"class":933,"line":5060},[931,9680,9653],{},[931,9682,9683],{"class":933,"line":5068},[931,9684,9685],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[931,9687,9688],{"class":933,"line":5075},[931,9689,9663],{},[931,9691,9693],{"class":933,"line":9692},34,[931,9694,9695],{},"      \u003C\u002Farray>\n",[931,9697,9699],{"class":933,"line":9698},35,[931,9700,9701],{},"    \u003C\u002Fdict>\n",[931,9703,9705],{"class":933,"line":9704},36,[931,9706,9707],{},"  \u003C\u002Farray>\n",[931,9709,9711],{"class":933,"line":9710},37,[931,9712,9713],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[931,9715,9717],{"class":933,"line":9716},38,[931,9718,9719],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[931,9721,9723],{"class":933,"line":9722},39,[931,9724,9725],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[931,9727,9729],{"class":933,"line":9728},40,[931,9730,9731],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[931,9733,9735],{"class":933,"line":9734},41,[931,9736,9737],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[931,9739,9741],{"class":933,"line":9740},42,[931,9742,9743],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[931,9745,9747],{"class":933,"line":9746},43,[931,9748,9749],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[931,9751,9753],{"class":933,"line":9752},44,[931,9754,9755],{},"  \u003Cfalse\u002F>\n",[931,9757,9759],{"class":933,"line":9758},45,[931,9760,9761],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[931,9763,9765],{"class":933,"line":9764},46,[931,9766,9767],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[931,9769,9771],{"class":933,"line":9770},47,[931,9772,9773],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[931,9775,9777],{"class":933,"line":9776},48,[931,9778,9779],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[931,9781,9783],{"class":933,"line":9782},49,[931,9784,9785],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[931,9787,9789],{"class":933,"line":9788},50,[931,9790,9791],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[931,9793,9795],{"class":933,"line":9794},51,[931,9796,9797],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[931,9799,9801],{"class":933,"line":9800},52,[931,9802,9803],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[931,9805,9807],{"class":933,"line":9806},53,[931,9808,9809],{},"\u003C\u002Fdict>\n",[931,9811,9813],{"class":933,"line":9812},54,[931,9814,9815],{},"\u003C\u002Fplist>\n",[485,9817,9818,9828,9840,9850,9856,9873,9885,9904,9919],{},[488,9819,9820,9821,575,9824,9827],{},"Substitua ",[495,9822,9823],{},"your-team-name-1",[495,9825,9826],{},"your-team-name-2"," pelos seus respectivos nomes de equipe do Cloudflare Zero Trust.",[488,9829,3371,9830,9833,9834,9837,9838,461],{},[495,9831,9832],{},"uuidgen"," no seu Terminal para gerar UUIDs exclusivos e use-os para substituir os valores de espaço reservado ",[495,9835,9836],{},"PayloadUUID"," no arquivo ",[495,9839,9504],{},[488,9841,9842,9843,9846,9847,9849],{},"Certifique-se de que a string ",[495,9844,9845],{},"PayloadIdentifier"," também contenha o ",[495,9848,9836],{}," atualizado para manter o perfil distinto.",[488,9851,9852,9853,9855],{},"Salve o arquivo ",[495,9854,9504],{}," editado.",[488,9857,9858,9859,9862,9863,9866,9867,9869],{},"Abra as ",[441,9860,9861],{},"Ajustes do Sistema"," no seu Mac, pesquise por ",[441,9864,9865],{},"Perfis"," e selecione-o.",[1879,9868],{},[433,9870],{"alt":9871,"src":9872},"Painel de Perfis nos Ajustes do Sistema do macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[488,9874,4232,9875,9878,9879,9881],{},[441,9876,9877],{},"Instalar, visualizar ou remover..."," para começar a adicionar o seu novo perfil de configuração.",[1879,9880],{},[433,9882],{"alt":9883,"src":9884},"Botão para instalar, visualizar ou remover perfis no macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[488,9886,9887,9888,9890,9891,9893,9894,9896,9900],{},"Clique no ícone ",[441,9889,714],{}," (mais) no canto primeiro esquerdo e selecione o arquivo ",[495,9892,9504],{}," salvo.",[1879,9895],{},[433,9897],{"alt":9898,"src":9899},"Botão de mais (+) nos perfis do macOS para adicionar um novo perfil","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[433,9901],{"alt":9902,"src":9903},"Selecionando o arquivo .mobileconfig no macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[488,9905,9906,9907,6854,9909,9912,9913,9915],{},"Selecione ",[441,9908,1718],{},[441,9910,9911],{},"Instalar"," para aplicar la configuração.",[1879,9914],{},[433,9916],{"alt":9917,"src":9918},"Confirmando a instalação do perfil do Cloudflare WARP no macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[488,9920,9921,9922,9924],{},"Reinicie o cliente Cloudflare WARP. Agora você deverá ver o alternador de múltiplos perfis na interface do usuário:",[1879,9923],{},[433,9925],{"alt":9926,"src":9927},"Cliente Cloudflare WARP com seletor de múltiplos perfis no macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[474,9929,2569],{"id":2568},[430,9931,9932],{},"O cliente Cloudflare WARP atua como um ponto de segurança crítico nos dispositivos dos usuários, tornando o Acesso à Rede de Confiança Zero robusto e altamente prático. Manter os recursos internos isolados da internet pública garante que cada tentativa de conexão seja autenticada, avaliada e auditada com segurança.",[474,9934,4001],{"id":1610},[485,9936,9937,9944,9951,9958],{},[488,9938,9939],{},[444,9940,9943],{"href":9941,"rel":9942},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[448],"Managed Deployment Preparation",[488,9945,9946],{},[444,9947,9950],{"href":9948,"rel":9949},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[448],"Switch Between Zero Trust Organizations",[488,9952,9953],{},[444,9954,9957],{"href":9955,"rel":9956},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[448],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[488,9959,9960],{},[444,9961,9964],{"href":9962,"rel":9963},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[448],"Cloudflare One Client Documentation",[1639,9966,9967],{},"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":425,"searchDepth":1061,"depth":1068,"links":9969},[9970,9971,9972,9973,9974],{"id":9464,"depth":1061,"text":9465},{"id":9478,"depth":1061,"text":9479},{"id":9494,"depth":1061,"text":9495},{"id":2568,"depth":1061,"text":2569},{"id":1610,"depth":1061,"text":4001},[2602,9443],"2026-07-04","Configure e alterne entre múltiplas organizações do Cloudflare WARP no macOS com um arquivo .mobileconfig. Guia MDM completo para administradores de TI.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002FPT-Switch-Between-Multiple-Cloudflare-WARP-Orgs-on-Mac.webp","Configurar múltiplos perfis do Cloudflare WARP no macOS",{"schemaOrg":9981,"robots":1693,"sitemap":9983},[9982],{"@type":1672,"headline":2516,"description":9977},{"lastmod":9976},{"title":9979,"description":9977,"ogTitle":2516,"ogDescription":9977,"twitterTitle":2516,"twitterDescription":9977},"pt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[9987,1718,9988,2616],"macOS","MDM","EwH2jVxo0k3L6vZD6bfnIxGUBZQQEsBLKPw_paSz3AA",{"id":9991,"title":8280,"author":425,"body":9992,"category":10371,"date":10372,"description":10373,"extension":1664,"image":10374,"imageAlt":10375,"isPublished":1064,"meta":10376,"minRead":1923,"navigation":1064,"path":213,"seo":10380,"stem":10381,"tags":10382,"updatedAt":1702,"__hash__":10387},"article\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md",{"type":427,"value":9993,"toc":10361},[9994,9998,10008,10019,10080,10086,10090,10093,10102,10108,10112,10166,10177,10183,10186,10241,10245,10252,10259,10262,10273,10277,10322,10325,10342,10344,10355,10358],[474,9995,9997],{"id":9996},"o-que-é-uma-habilidade-de-agente-de-ia","O que é uma habilidade de agente de IA?",[430,9999,10000,10001,10004,10005,10007],{},"Uma habilidade de agente (agent skill) é um ",[441,10002,10003],{},"conjunto reutilizável de instruções"," — um procedimento padronizado que ensina a um agente como realizar uma tarefa específica com maestria. Consiste em um único arquivo Markdown chamado ",[495,10006,8276],{}," e pode agrupar outros arquivos necessários para a tarefa, como documentos de referência, modelos ou scripts executáveis.",[430,10009,10010,10011,10018],{},"Veja a habilidade ",[444,10012,10015],{"href":10013,"rel":10014},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[448],[495,10016,10017],{},"grill-me"," como exemplo:",[923,10020,10022],{"className":2202,"code":10021,"language":2204,"meta":425,"style":425},"---\nname: grill-me\ndescription: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n---\n\nInterview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n\nAsk the questions one at a time.\n\nIf a question can be answered by exploring the codebase, explore the codebase instead.\n",[495,10023,10024,10029,10039,10049,10053,10057,10062,10066,10071,10075],{"__ignoreMap":425},[931,10025,10026],{"class":933,"line":934},[931,10027,10028],{"class":1041},"---\n",[931,10030,10031,10034,10036],{"class":933,"line":1061},[931,10032,10033],{"class":1354},"name",[931,10035,889],{"class":945},[931,10037,10038],{"class":1045}," grill-me\n",[931,10040,10041,10044,10046],{"class":933,"line":1068},[931,10042,10043],{"class":1354},"description",[931,10045,889],{"class":945},[931,10047,10048],{"class":1045}," Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n",[931,10050,10051],{"class":933,"line":1075},[931,10052,10028],{"class":1041},[931,10054,10055],{"class":933,"line":1923},[931,10056,1065],{"emptyLinePlaceholder":1064},[931,10058,10059],{"class":933,"line":1928},[931,10060,10061],{"class":1045},"Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n",[931,10063,10064],{"class":933,"line":1934},[931,10065,1065],{"emptyLinePlaceholder":1064},[931,10067,10068],{"class":933,"line":2270},[931,10069,10070],{"class":1045},"Ask the questions one at a time.\n",[931,10072,10073],{"class":933,"line":2281},[931,10074,1065],{"emptyLinePlaceholder":1064},[931,10076,10077],{"class":933,"line":2377},[931,10078,10079],{"class":1045},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[430,10081,10082,10083,10085],{},"Um arquivo ",[495,10084,8276],{}," contains um pequeno bloco de metadados e um corpo de instruções. Os metadados consistem no nome e na descrição da habilidade, carregados pelo agente de IA durante a inicialização.",[474,10087,10089],{"id":10088},"como-funcionam-as-habilidades-de-agentes-de-ia-divulgação-progressiva","Como funcionam as habilidades de agentes de IA: divulgação progressiva",[430,10091,10092],{},"Inicialmente, apenas o nome e a descrição são carregados no contexto. Quando a solicitação do usuário corresponde à descrição de uma habilidade, o corpo de instruções correspondente é inserido no mesmo contexto.",[430,10094,10095,10096,10101],{},"Vejamos como a habilidade ",[444,10097,10099],{"href":10013,"rel":10098},[448],[495,10100,10017],{}," é utilizada na prática.",[430,10103,10104],{},[433,10105],{"alt":10106,"src":10107},"Diagrama de sequência ilustrando o mecanismo de divulgação progressiva para a execução de habilidades de agentes de IA","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-progressive-disclosure-sequence-diagram.webp",[879,10109,10111],{"id":10110},"passo-a-passo","Passo a passo",[533,10113,10114,10120,10126,10132,10138,10150,10160],{},[488,10115,10116,10119],{},[441,10117,10118],{},"Solicitação (Request)"," — O usuário pede algo ao agente (\"sabatine-me sobre o design do meu fluxo de trabalho\").",[488,10121,10122,10125],{},[441,10123,10124],{},"Prompt de seleção"," — A solicitação do usuário, juntamente com as descrições de todas as habilidades disponíveis, é enviada ao LLM.",[488,10127,10128,10131],{},[441,10129,10130],{},"Seleção do LLM"," — O LLM compara a solicitação com cada descrição e retorna a(s) habilidade(s) correspondente(s).",[488,10133,10134,10137],{},[441,10135,10136],{},"Confirmação"," — O agente exibe a habilidade proposta ao usuário, que confirma (ou rejeita\u002Fajusta) a escolha.",[488,10139,10140,10143,10144,10147,10148,461],{},[441,10141,10142],{},"Instruções carregadas"," — O agente busca as instruções ",[899,10145,10146],{},"completas"," para a habilidade confirmada: o corpo do arquivo ",[495,10149,8276],{},[488,10151,10152,10155,10156,10159],{},[441,10153,10154],{},"Prompt de execução"," — A solicitação do usuário ",[441,10157,10158],{},"somada às instruções da habilidade selecionada"," é enviada ao LLM.",[488,10161,10162,10165],{},[441,10163,10164],{},"Resposta"," — O LLM gera a saída, que é a primeira pergunta da sabatina.",[430,10167,10168,10169,10176],{},"Agora vamos usar o ",[444,10170,10173],{"href":10171,"rel":10172},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[448],[495,10174,10175],{},"excalidraw-diagram-skill"," para ilustrar como funciona uma habilidade vinculada a um documento de referência:",[430,10178,10179],{},[433,10180],{"alt":10181,"src":10182},"Diagrama de sequência mostrando um agente de IA executando uma habilidade carregada com arquivos de referência e modelos externos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-with-reference-files-sequence-diagram.webp",[879,10184,10111],{"id":10185},"passo-a-passo-1",[533,10187,10188,10193,10198,10207,10212,10225,10232],{},[488,10189,10190,10192],{},[441,10191,10118],{}," — O usuário pede algo ao agente (\"desenhe o fluxo de trabalho do processo de deploy\").",[488,10194,10195,10197],{},[441,10196,10124],{}," — A solicitação do usuário, além das descrições de todas as habilidades disponíveis, é enviada ao LLM.",[488,10199,10200,10202,10203,10206],{},[441,10201,10130],{}," — O LLM compara a solicitação com as descrições e retorna o que for compatível. Aqui, \"desenhe o fluxo de trabalho\" corresponde à descrição do ",[495,10204,10205],{},"excalidraw-diagram",", sendo selecionado.",[488,10208,10209,10211],{},[441,10210,10136],{}," — O agente apresenta a habilidade proposta ao usuário, que confirma (ou rejeita\u002Fajusta) a escolha.",[488,10213,10214,10143,10216,10218,10219,10221,10222,10224],{},[441,10215,10142],{},[899,10217,10146],{}," da habilidade: o corpo do ",[495,10220,8276],{}," e quaisquer arquivos referenciados (para o ",[495,10223,10205],{},", isso inclui a paleta de cores, o esquema JSON e os modelos de elementos).",[488,10226,10227,10155,10229,10231],{},[441,10228,10154],{},[441,10230,10158],{}," vai para o LLM. O modelo agora tem a metodologia detalhada em mãos.",[488,10233,10234,10236,10237,10240],{},[441,10235,10164],{}," — O LLM gera a saída (um arquivo JSON ",[495,10238,10239],{},".excalidraw","), que o agente entrega de volta ao usuário.",[474,10242,10244],{"id":10243},"habilidades-de-agentes-de-ia-vs-ferramentas-e-mcp","Habilidades de agentes de IA vs. Ferramentas e MCP",[430,10246,10247,10248,10251],{},"Habilidades não substituem prompts, ferramentas ou integrações MCP. Ferramentas e protocolos MCP ampliam o alcance do agente a sistemas externos — consultando um banco de dados, chamando uma API e assim por diante. Já as habilidades aprofundam o conhecimento prático (",[899,10249,10250],{},"know-how",") do agente para a execução de uma tarefa específica.",[430,10253,10254,10255,10258],{},"Um MCP como o ",[444,10256,10257],{"href":395},"Configuração do NetSuite MCP no ChatGPT e Claude"," permite que o agente responda a perguntas acessando dados financeiros e operacionais em tempo real no NetSuite. Em seguida, uma habilidade de relatórios operacionais do NetSuite orienta o agente sobre como estruturar esse relatório e apresentar as respostas estruturadas ao usuário.",[430,10260,10261],{},"Alguns cenários ideais para o uso de habilidades incluem:",[485,10263,10264,10267,10270],{},[488,10265,10266],{},"Fluxos de trabalho de várias etapas",[488,10268,10269],{},"Processamento de documentos, como extração de dados de PDFs",[488,10271,10272],{},"Padronização de geração de código",[474,10274,10276],{"id":10275},"como-criar-habilidades-de-agentes-de-ia","Como criar habilidades de agentes de IA",[533,10278,10279,10289,10303,10312],{},[488,10280,10281,10284,10285,10288],{},[441,10282,10283],{},"Crie uma pasta"," com o nome da habilidade (ex: ",[495,10286,10287],{},"netsuite-operation-report\u002F",").",[488,10290,10291,10296,10297,10299,10300,10302],{},[441,10292,10293,10294],{},"Escreva o arquivo ",[495,10295,8276],{}," contendo um ",[495,10298,10033],{},", uma ",[495,10301,10043],{}," precisa e um corpo de instruções conciso (com menos de 200 palavras).",[488,10304,10305,10308,10309,10311],{},[441,10306,10307],{},"Adicione os recursos"," que a tarefa exige — documentos de referência, templates, scripts. Mantenha o arquivo ",[495,10310,8276],{}," enxuto e aponte os links para os detalhes.",[488,10313,10314,10317,10318,10321],{},[441,10315,10316],{},"Instale a habilidade"," em um diretório onde os agentes possam descobri-la. Consulte ",[444,10319,10320],{"href":359},"Centralização de habilidades para agentes"," para entender como gerenciar habilidades em múltiplos agentes.",[430,10323,10324],{},"Algumas dicas para escrever excelentes habilidades:",[485,10326,10327,10330,10336,10339],{},[488,10328,10329],{},"Redija a descrição pensando no acionamento (trigger) do sistema, não na leitura humana.",[488,10331,10332,10333,10335],{},"Mantenha o ",[495,10334,8276],{}," curto (menos de 200 palavras). Coloque o caso geral no corpo do texto e delegue as exceções para documentos de referência.",[488,10337,10338],{},"Use scripts para tarefas determinísticas. Não peça para o LLM fazer contas e aritmética simples.",[488,10340,10341],{},"Controle as versões. Adicione-o ao Git.",[474,10343,2569],{"id":2568},[430,10345,10346,10347,10350,10351,10354],{},"Diferente das ferramentas e do MCP, que especificam ",[899,10348,10349],{},"ao que se conectar",", as habilidades de agentes empacotam ",[899,10352,10353],{},"como realizar o trabalho",". Elas são complementos fundamentais, não substitutos.",[430,10356,10357],{},"Ao tirar proveito da divulgação progressiva, as habilidades mantêm a janela de contexto do seu agente limpa e eficiente — carregando instruções detalhadas, documentos de referência e scripts executáveis apenas quando a intenção da solicitação do usuário os ativa de fato.",[1639,10359,10360],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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);}",{"title":425,"searchDepth":1061,"depth":1068,"links":10362},[10363,10364,10368,10369,10370],{"id":9996,"depth":1061,"text":9997},{"id":10088,"depth":1061,"text":10089,"children":10365},[10366,10367],{"id":10110,"depth":1068,"text":10111},{"id":10185,"depth":1068,"text":10111},{"id":10243,"depth":1061,"text":10244},{"id":10275,"depth":1061,"text":10276},{"id":2568,"depth":1061,"text":2569},[1659],"2026-06-26","Descubra o que são habilidades de agentes de IA, entenda a divulgação progressiva e aprenda a criar instruções reutilizáveis para fluxos de trabalho eficientes.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002FPT-AI-Agent-Skills-What-They-Are-%26-How-to-Create-Them.webp","Guia de habilidades de agentes de IA: crie novos workflows",{"schemaOrg":10377,"robots":1693,"sitemap":10379},[10378],{"@type":1672,"headline":8280,"description":10373},{"lastmod":10372},{"title":10375,"description":10373,"ogTitle":8280,"ogDescription":10373,"twitterTitle":8280,"twitterDescription":10373},"pt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",[10383,10384,10385,10386],"Agentes de IA","Habilidades de Agentes","Fluxos de Trabalho Reutilizáveis","Tutorial de IA","YpLi8LsrzMKZ0wdwwn0TjwuJEtgCfN7WEXwrLXFU6qA",{"id":10389,"title":1729,"author":425,"body":10390,"category":10985,"date":10986,"description":10987,"extension":1664,"image":10988,"imageAlt":10989,"isPublished":1064,"meta":10990,"minRead":1928,"navigation":1064,"path":225,"seo":11004,"stem":11006,"tags":11007,"updatedAt":1702,"__hash__":11011},"article\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server.md",{"type":427,"value":10391,"toc":10974},[10392,10396,10399,10402,10406,10410,10413,10426,10432,10435,10460,10467,10494,10500,10505,10519,10531,10537,10542,10558,10562,10565,10584,10590,10593,10604,10614,10625,10655,10659,10669,10679,10689,10702,10709,10719,10725,10754,10770,10774,10780,10792,10797,10830,10834,10837,10851,10857,10920,10922,10966,10968,10971],[474,10393,10395],{"id":10394},"por-que-hospedar-o-hermes-agent-em-um-vps-remoto","Por que hospedar o Hermes Agent em um VPS remoto?",[430,10397,10398],{},"Como o Hermes Agent é capaz de executar tarefas em segundo plano, agendar tarefas e responder a chamadas de webhooks, precisamos de uma máquina que esteja em standby 24 horas por dia, 7 dias por semana. Computadores locais podem sofrer quedas de energia, desconectar-se da Internet ou ter seus recursos de hardware esgotados. Um servidor remoto garante 99% de tempo de atividade (uptime) e facilita a escala de recursos computacionais sempre que necessário.",[430,10400,10401],{},"Existem vários provedores acessíveis de servidores privados virtuais (VPS) no mercado, como Hetzner, Hostinger e Contabo. Nós usamos a Contabo há algum tempo e, até o momento, tudo tem funcionado muito bem.",[474,10403,10405],{"id":10404},"como-configurar-o-hermes-agent-em-um-vps-linux","Como configurar o Hermes Agent em um VPS Linux",[879,10407,10409],{"id":10408},"passo-1-conectar-se-ao-seu-vps","Passo 1: Conectar-se ao seu VPS",[430,10411,10412],{},"Abra o terminal e conecte-se via SSH à sua máquina remota:",[923,10414,10416],{"className":1032,"code":10415,"language":1034,"meta":425,"style":425},"ssh root@your_server_ip\n",[495,10417,10418],{"__ignoreMap":425},[931,10419,10420,10423],{"class":933,"line":934},[931,10421,10422],{"class":1041},"ssh",[931,10424,10425],{"class":1045}," root@your_server_ip\n",[430,10427,10428],{},[433,10429],{"alt":10430,"src":10431},"Conexão SSH ao servidor VPS Linux no terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fvps-terminal-ssh-connection.webp",[430,10433,10434],{},"Certifique-se de que os pacotes do seu servidor estejam atualizados:",[923,10436,10438],{"className":1032,"code":10437,"language":1034,"meta":425,"style":425},"sudo apt update && sudo apt upgrade -y\n",[495,10439,10440],{"__ignoreMap":425},[931,10441,10442,10444,10446,10449,10451,10453,10455,10458],{"class":933,"line":934},[931,10443,1891],{"class":1041},[931,10445,4445],{"class":1045},[931,10447,10448],{"class":1045}," update",[931,10450,5432],{"class":945},[931,10452,4366],{"class":1041},[931,10454,4445],{"class":1045},[931,10456,10457],{"class":1045}," upgrade",[931,10459,4478],{"class":1045},[430,10461,10462,10463,10466],{},"Adicione um novo usuário, ",[495,10464,10465],{},"hermes",", ou o seu nome de usuário de preferência:",[923,10468,10470],{"className":1032,"code":10469,"language":1034,"meta":425,"style":425},"sudo adduser hermes \nsudo passwd hermes\n",[495,10471,10472,10484],{"__ignoreMap":425},[931,10473,10474,10476,10479,10482],{"class":933,"line":934},[931,10475,1891],{"class":1041},[931,10477,10478],{"class":1045}," adduser",[931,10480,10481],{"class":1045}," hermes",[931,10483,2025],{"class":941},[931,10485,10486,10488,10491],{"class":933,"line":1061},[931,10487,1891],{"class":1041},[931,10489,10490],{"class":1045}," passwd",[931,10492,10493],{"class":1045}," hermes\n",[430,10495,10496,10497,889],{},"Desative o login por senha para o usuário ",[495,10498,10499],{},"root",[533,10501,10502],{},[488,10503,10504],{},"Abra o arquivo de configuração do SSH:",[923,10506,10508],{"className":1032,"code":10507,"language":1034,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fssh\u002Fsshd_config\n",[495,10509,10510],{"__ignoreMap":425},[931,10511,10512,10514,10516],{"class":933,"line":934},[931,10513,1891],{"class":1041},[931,10515,2311],{"class":1045},[931,10517,10518],{"class":1045}," \u002Fetc\u002Fssh\u002Fsshd_config\n",[533,10520,10521],{"start":1061},[488,10522,10523,10524,10527,10528,889],{},"Localize a linha ",[495,10525,10526],{},"PermitRootLogin"," e altere seu valor para ",[495,10529,10530],{},"no",[923,10532,10535],{"className":10533,"code":10534,"language":4613,"meta":425},[4611],"PermitRootLogin no\n",[495,10536,10534],{"__ignoreMap":425},[533,10538,10539],{"start":1068},[488,10540,10541],{},"Salve o arquivo e reinicie o serviço SSH:",[923,10543,10545],{"className":1032,"code":10544,"language":1034,"meta":425,"style":425},"sudo systemctl restart ssh\n",[495,10546,10547],{"__ignoreMap":425},[931,10548,10549,10551,10553,10555],{"class":933,"line":934},[931,10550,1891],{"class":1041},[931,10552,1894],{"class":1045},[931,10554,1897],{"class":1045},[931,10556,10557],{"class":1045}," ssh\n",[879,10559,10561],{"id":10560},"passo-2-instalar-o-hermes-agent","Passo 2: Instalar o Hermes Agent",[430,10563,10564],{},"Execute o seguinte comando:",[923,10566,10568],{"className":1032,"code":10567,"language":1034,"meta":425,"style":425},"curl -fsSL https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh | bash\n",[495,10569,10570],{"__ignoreMap":425},[931,10571,10572,10574,10576,10579,10581],{"class":933,"line":934},[931,10573,2960],{"class":1041},[931,10575,4357],{"class":1045},[931,10577,10578],{"class":1045}," https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh",[931,10580,4363],{"class":945},[931,10582,10583],{"class":1041}," bash\n",[430,10585,10586],{},[433,10587],{"alt":10588,"src":10589},"Executando o script de instalação do Hermes Agent no terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-installation-terminal.webp",[430,10591,10592],{},"Depois de instalado, verifique a instalação digitando:",[923,10594,10596],{"className":1032,"code":10595,"language":1034,"meta":425,"style":425},"hermes --version\n",[495,10597,10598],{"__ignoreMap":425},[931,10599,10600,10602],{"class":933,"line":934},[931,10601,10465],{"class":1041},[931,10603,3589],{"class":1045},[430,10605,1830,10606,10609,10610],{},[495,10607,10608],{},"hermes setup"," para configurar o Hermes Agent:\n",[433,10611],{"alt":10612,"src":10613},"Executando o comando hermes setup no terminal para iniciar a configuração","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-setup-wizard.webp",[430,10615,10616,10617,10620,10621],{},"Selecione um provedor de LLM, comece com o ",[495,10618,10619],{},"DeepSeek"," e adicione outros mais tarde.\n",[433,10622],{"alt":10623,"src":10624},"Selecionando DeepSeek como o provedor de LLM na configuração do Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-llm-provider-selection.webp",[430,10626,10627,10628,1368,10630,10634,10638,10639,10642,10643,10638,10647,10650,10651],{},"Insira a chave de API do ",[495,10629,10619],{},[433,10631],{"alt":10632,"src":10633},"Inserindo a chave de API do DeepSeek no terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-enter-api-key.webp",[433,10635],{"alt":10636,"src":10637},"Confirmação de sucesso da chave de API do provedor de LLM","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-api-key-success.webp","\nSelecione ",[495,10640,10641],{},"local machine"," para executar o Hermes Agent:\n",[433,10644],{"alt":10645,"src":10646},"Selecionando local machine para o ambiente de execução do Hermes Agent","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-local-machine.webp",[495,10648,10649],{},"Telegram"," nos canais de comunicação. Outros canais podem ser configurados posteriormente.\n",[433,10652],{"alt":10653,"src":10654},"Selecionando o Telegram como canal de comunicação na configuração do Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-telegram-channel.webp",[879,10656,10658],{"id":10657},"passo-3-integração-com-o-telegram","Passo 3: Integração com o Telegram",[430,10660,9906,10661,10664,10665],{},[495,10662,10663],{},"[2]"," para usar o bot do Telegram.\n",[433,10666],{"alt":10667,"src":10668},"Selecionando a opção de configurar a integração do bot do Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-bot-integration-option.webp",[430,10670,10671,10672,10674,10675],{},"Acesse o ",[495,10673,10649],{}," e pesquise por 'BotFather'.\n",[433,10676],{"alt":10677,"src":10678},"Pesquisando por BotFather no aplicativo Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-botfather.webp",[430,10680,4232,10681,10684,10685],{},[495,10682,10683],{},"Open"," para abrir o 'BotFather'.\n",[433,10686],{"alt":10687,"src":10688},"Abrindo a interface de chat com BotFather no Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-open-botfather-chat.webp",[430,10690,4232,10691,10694,10695,1796,10698],{},[495,10692,10693],{},"Create a New Bot"," (ou envie o comando ",[495,10696,10697],{},"\u002Fnewbot",[433,10699],{"alt":10700,"src":10701},"Enviando o comando newbot ao BotFather para criar um novo bot do Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-create-new-bot.webp",[430,10703,10704,10705],{},"Preencha os nomes requeridos e crie o bot.\n",[433,10706],{"alt":10707,"src":10708},"Configurando o nome e usuário do novo bot do Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-bot-details-configured.webp",[430,10710,4232,10711,10714,10715],{},[495,10712,10713],{},"Copy"," para copiar o token e cole-o de volta no terminal.\n",[433,10716],{"alt":10717,"src":10718},"Copiando o token da API HTTP do bot do Telegram recém-criado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-copy-http-api-token.webp",[430,10720,10721,10722,10724],{},"Encontre o ID da sua conta de usuário do ",[495,10723,10649],{}," e adicione-o à lista de usuários permitidos ('Allowed user list'):",[485,10726,10727,10737,10751],{},[488,10728,10729,10730,10732,10733],{},"Pesquise por '@raw_data_bot' no ",[495,10731,10649],{},".\n",[433,10734],{"alt":10735,"src":10736},"Pesquisando por raw data bot no Telegram para obter o ID do usuário","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-raw-data-bot.webp",[488,10738,10739,10740,10743,10744,10732,10747],{},"Clique no ",[495,10741,10742],{},"RawDataBot"," e depois no botão Start (Começar). O ID do usuário será exibido após ",[495,10745,10746],{},"P.S. Your ID:",[433,10748],{"alt":10749,"src":10750},"Iniciando o RawDataBot para visualizar o ID da conta de usuário","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-raw-data-bot-user-id.webp",[488,10752,10753],{},"Copie o ID de usuário e cole-o no terminal.",[430,10755,10756,10757,10761,10762,10766],{},"Como estamos executando na nuvem, queremos que o serviço seja iniciado automaticamente.\n",[433,10758],{"alt":10759,"src":10760},"Configurando a opção de início automático para o serviço systemd do Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-autostart-service-option.webp","\nDeixe todas as opções como padrão:\n",[433,10763],{"alt":10764,"src":10765},"Mantendo as configurações de instalação padrão no terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-1.webp",[433,10767],{"alt":10768,"src":10769},"Concluindo as opções padrão de configuração do Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-2.webp",[474,10771,10773],{"id":10772},"testando-seu-hermes-agent-com-o-bot-do-telegram","Testando seu Hermes Agent com o bot do Telegram",[430,10775,10776,10777,889],{},"Execute o seguinte comando para iniciar o ",[495,10778,10779],{},"hermes gateway",[923,10781,10783],{"className":1032,"code":10782,"language":1034,"meta":425,"style":425},"hermes gateway\n",[495,10784,10785],{"__ignoreMap":425},[931,10786,10787,10789],{"class":933,"line":934},[931,10788,10465],{"class":1041},[931,10790,10791],{"class":1045}," gateway\n",[430,10793,10671,10794,10796],{},[495,10795,10649],{}," e adicione o bot criado, '@tech_cloud_hermes_bot', às suas conversas.",[485,10798,10799,10811,10821],{},[488,10800,10801,10802,10804,10805,10732,10807],{},"Digite '\u002Fnew' no ",[495,10803,10649],{}," para iniciar uma nova sessão do ",[495,10806,1714],{},[433,10808],{"alt":10809,"src":10810},"Digitando o comando new no Telegram para iniciar uma nova sessão do Hermes Agent","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-new-session.webp",[488,10812,10813,10814,10816,10817],{},"Digitar ",[495,10815,1499],{}," listará todos os comandos disponíveis.\n",[433,10818],{"alt":10819,"src":10820},"Digitando commands no Telegram para listar as instruções disponíveis do Hermes","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-commands-list.webp",[488,10822,10813,10823,10825,10826],{},[495,10824,1529],{}," exibirá uma lista com os LLMs disponíveis.\n",[433,10827],{"alt":10828,"src":10829},"Digitando model no Telegram para ver a lista de LLMs ativos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-model-selection.webp",[474,10831,10833],{"id":10832},"executando-o-hermes-gateway-como-um-serviço-em-segundo-plano","Executando o Hermes Gateway como um serviço em segundo plano",[430,10835,10836],{},"Crie o arquivo de serviço:",[923,10838,10840],{"className":2300,"code":10839,"language":2302,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[495,10841,10842],{"__ignoreMap":425},[931,10843,10844,10846,10848],{"class":933,"line":934},[931,10845,1891],{"class":1041},[931,10847,2311],{"class":1045},[931,10849,10850],{"class":1045}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[430,10852,10853,10854,10856],{},"Cole o seguinte conteúdo, substituindo ",[495,10855,10465],{}," em '\u002Fhome\u002Fhermes' pelo seu nome de usuário preferido:",[923,10858,10860],{"className":2326,"code":10859,"language":2328,"meta":425,"style":425},"[Unit]\nDescription=Hermes Gateway\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n",[495,10861,10862,10866,10871,10875,10879,10883,10887,10891,10896,10900,10904,10908,10912,10916],{"__ignoreMap":425},[931,10863,10864],{"class":933,"line":934},[931,10865,2335],{},[931,10867,10868],{"class":933,"line":1061},[931,10869,10870],{},"Description=Hermes Gateway\n",[931,10872,10873],{"class":933,"line":1068},[931,10874,2345],{},[931,10876,10877],{"class":933,"line":1075},[931,10878,1065],{"emptyLinePlaceholder":1064},[931,10880,10881],{"class":933,"line":1923},[931,10882,2354],{},[931,10884,10885],{"class":933,"line":1928},[931,10886,2359],{},[931,10888,10889],{"class":933,"line":1934},[931,10890,2364],{},[931,10892,10893],{"class":933,"line":2270},[931,10894,10895],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\n",[931,10897,10898],{"class":933,"line":2281},[931,10899,2374],{},[931,10901,10902],{"class":933,"line":2377},[931,10903,2380],{},[931,10905,10906],{"class":933,"line":1695},[931,10907,2385],{},[931,10909,10910],{"class":933,"line":2388},[931,10911,1065],{"emptyLinePlaceholder":1064},[931,10913,10914],{"class":933,"line":2393},[931,10915,2396],{},[931,10917,10918],{"class":933,"line":2399},[931,10919,2402],{},[430,10921,2407],{},[923,10923,10925],{"className":2300,"code":10924,"language":2302,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-gateway\nsudo systemctl start hermes-gateway\nsudo systemctl status hermes-gateway\n",[495,10926,10927,10935,10946,10956],{"__ignoreMap":425},[931,10928,10929,10931,10933],{"class":933,"line":934},[931,10930,1891],{"class":1041},[931,10932,1894],{"class":1045},[931,10934,2421],{"class":1045},[931,10936,10937,10939,10941,10943],{"class":933,"line":1061},[931,10938,1891],{"class":1041},[931,10940,1894],{"class":1045},[931,10942,2022],{"class":1045},[931,10944,10945],{"class":1045}," hermes-gateway\n",[931,10947,10948,10950,10952,10954],{"class":933,"line":1068},[931,10949,1891],{"class":1041},[931,10951,1894],{"class":1045},[931,10953,2441],{"class":1045},[931,10955,10945],{"class":1045},[931,10957,10958,10960,10962,10964],{"class":933,"line":1075},[931,10959,1891],{"class":1041},[931,10961,1894],{"class":1045},[931,10963,1918],{"class":1045},[931,10965,10945],{"class":1045},[474,10967,2569],{"id":2568},[430,10969,10970],{},"Neste artigo, focamos em como configurar o Hermes Agent e usar o Telegram para se comunicar com ele. Manter o Hermes Agent em execução em um servidor remoto oferece um assistente digital real que funciona 24 horas por dia, 7 dias por semana.",[1639,10972,10973],{},"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1061,"depth":1068,"links":10975},[10976,10977,10982,10983,10984],{"id":10394,"depth":1061,"text":10395},{"id":10404,"depth":1061,"text":10405,"children":10978},[10979,10980,10981],{"id":10408,"depth":1068,"text":10409},{"id":10560,"depth":1068,"text":10561},{"id":10657,"depth":1068,"text":10658},{"id":10772,"depth":1061,"text":10773},{"id":10832,"depth":1061,"text":10833},{"id":2568,"depth":1061,"text":2569},[1659],"2026-06-19","Instale o Hermes Agent em um VPS remoto para garantir suporte 24 horas por dia. Siga o nosso guia passo a paso e integre-o com seu próprio bot do Telegram.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002FPT-How%20to%20Setup%20Hermes%20on%20Remote%20Server.webp","Guia passo a passo para instalar o Hermes Agent em um VPS Linux e integrá-lo a um bot do Telegram.",{"schemaOrg":10991,"robots":1693,"sitemap":11003},[10992],{"@type":1672,"name":1729,"description":10987,"image":10988,"step":10993},[10994,10997,11000],{"@type":1675,"name":10409,"text":10995,"image":10431,"url":10996},"Abra o terminal e conecte-se via SSH à sua máquina remota: Certifique-se de que os pacotes do seu servidor estejam atualizados: Adicione um novo us...","#passo-1-conectar-se-ao-seu-vps",{"@type":1675,"name":10561,"text":10998,"image":10589,"url":10999},"Execute o seguinte comando: Depois de instalado, verifique a instalação digitando: Execute `hermes setup` para configurar o Hermes Agent: Selecione...","#passo-2-instalar-o-hermes-agent",{"@type":1675,"name":10658,"text":11001,"image":10668,"url":11002},"Selecione `[2]` para usar o bot do Telegram. Acesse o `Telegram` e pesquise por 'BotFather'. Clique em `Open` para abrir o 'BotFather'. Clique em `...","#passo-3-integrao-com-o-telegram",{"lastmod":10986},{"title":11005,"description":10987,"ogTitle":1729,"ogDescription":10987,"twitterTitle":1729,"twitterDescription":10987},"Configuração do Hermes Agent no VPS: Guia de Bot do Telegram","pt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",[1714,11008,11009,11010,8674],"VPS Setup","Telegram Bot","Linux VPS","kFF1oLcXZtGj8Oh10ngzAGRuWJX_j9kzta_KDeDZSEY",{"id":11013,"title":11014,"author":1702,"body":11015,"category":11454,"date":11455,"description":11456,"extension":1664,"image":11457,"imageAlt":11458,"isPublished":1064,"meta":11459,"minRead":2281,"navigation":1064,"path":235,"seo":11463,"stem":11465,"tags":11466,"updatedAt":1702,"__hash__":11470},"article\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude.md","Guia do Conector de IA do NetSuite: Configuração do MCP",{"type":427,"value":11016,"toc":11440},[11017,11020,11034,11038,11048,11064,11068,11202,11206,11260,11264,11316,11320,11324,11330,11335,11339,11345,11357,11361,11371,11387,11391,11397,11402,11406,11412,11415,11417],[430,11018,11019],{},"O Oracle NetSuite é há muito tempo uma plataforma de planeamento de recursos empresariais (ERP) baseada na nuvem para pequenas e médias empresas. No entanto, a interface de utilizador do seu website é infame pela sua curva de aprendizagem acentuada, navegação complexa com muitos cliques e estruturas de relatórios rígidas.",[430,11021,11022,11023,11026,11027,1129,11030,11033],{},"Com o lançamento recente do ",[441,11024,11025],{},"NetSuite AI Connector Service",", os utilizadores podem aproveitar o ",[441,11028,11029],{},"Model Context Protocol (MCP)",[441,11031,11032],{},"assistentes de IA (inteligência artificial)"," para fazer perguntas diretamente em linguagem natural e obter respostas em tempo real a partir de dados financeiros e operacionais.",[474,11035,11037],{"id":11036},"como-funciona-o-conector-de-ia-do-netsuite-mcp","Como Funciona o Conector de IA do NetSuite MCP",[430,11039,598,11040,11043,11044,11047],{},[441,11041,11042],{},"MCP do NetSuite"," expõe um conjunto de ferramentas à ",[441,11045,11046],{},"IA",", como a execução de consultas SuiteQL, leitura de pesquisas guardadas (Saved Searches) e relatórios, ou execução de operações de registo, como a criação de um novo registo de cliente. Todas as ferramentas são controladas pelos permissões nativos baseados em funções do NetSuite.",[430,11049,11050,11051,11053,11054,11056,11057,11060,11061,11063],{},"Quando um utilizador faz uma pergunta em linguagem natural, a ",[441,11052,11046],{}," utiliza o ",[441,11055,11029],{}," para traduzir o pedido em operações estruturadas que o NetSuite compreende. O ",[441,11058,11059],{},"NetSuite"," executa as operações utilizando as permissões do utilizador, e os resultados são devolvidos à ",[441,11062,11046],{}," para análise e apresentação.",[474,11065,11067],{"id":11066},"guia-de-configuração-do-conector-de-ia-do-netsuite","Guia de Configuração do Conector de IA do NetSuite",[533,11069,11070,11124,11139,11148,11155,11162,11183],{},[488,11071,11072,11073,2656,11076,11079],{},"Ativar o ",[441,11074,11075],{},"Server SuiteScript",[441,11077,11078],{},"REST Web Services",[533,11080,11081,11092,11118],{},[488,11082,11083,11084,11087,11088],{},"Aceda a ",[899,11085,11086],{},"Setup > Company > Enable Features"," (Configuração > Empresa > Ativar Funcionalidades).\n",[433,11089],{"alt":11090,"src":11091},"Interface de configuração de Ativar Recursos do Oracle NetSuite para Configuração da Empresa","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-setup-company-enable-features.webp",[488,11093,11094,11095,1368,11098],{},"No separador secundário ",[441,11096,11097],{},"SuiteCloud",[485,11099,11100,11109],{},[488,11101,11102,11103,10732,11105],{},"Em SuiteScript, selecione a caixa ",[441,11104,11075],{},[433,11106],{"alt":11107,"src":11108},"Ativando o SuiteScript de Servidor na guia SuiteCloud do NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-server-suitescript.webp",[488,11110,11111,11112,10732,11114],{},"Em SuiteTalk (Serviços Web), selecione a caixa ",[441,11113,11078],{},[433,11115],{"alt":11116,"src":11117},"Ativando Serviços Web REST na guia SuiteCloud do NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-rest-web-services.webp",[488,11119,4232,11120,11123],{},[441,11121,11122],{},"Guardar"," (Save).",[488,11125,11126,11127,11130,11131,11134,11135],{},"Instale primeiro o ",[441,11128,11129],{},"NetSuite MCP Standard Tools",". Clique em ",[899,11132,11133],{},"Customization > SuiteCloud Development > SuiteApp Marketplace"," (Personalização > Desenvolvimento SuiteCloud > Mercado de SuiteApps).\n",[433,11136],{"alt":11137,"src":11138},"Navegação para o mercado de aplicativos SuiteApp Marketplace em Personalização no NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-navigation.webp",[488,11140,11141,11142,10732,11144],{},"Pesquise por ",[441,11143,11129],{},[433,11145],{"alt":11146,"src":11147},"Pesquisa pelo NetSuite MCP Standard Tools no mercado de SuiteApps","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-search-mcp-tools.webp",[488,11149,11150,11151],{},"Assim que estiver instalado, verá o estado 'Installed' (Instalado) à direita.\n",[433,11152],{"alt":11153,"src":11154},"NetSuite MCP Standard Tools mostrado como Instalado no mercado de SuiteApps","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-status-mcp-tools.webp",[488,11156,11157,11158],{},"Siga as mesmas instruções para instalar o 'NetSuite AI Connector Service Companion'.\n",[433,11159],{"alt":11160,"src":11161},"NetSuite AI Connector Service Companion mostrado como Instalado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-ai-connector-companion.webp",[488,11163,11164,11165],{},"Configurar um Registo de Integração\n",[533,11166,11167,11176],{},[488,11168,11083,11169,10732,11172],{},[899,11170,11171],{},"Setup > Integration > Manage Integrations",[433,11173],{"alt":11174,"src":11175},"Navegação para Gerenciar Integrações no menu de Configuração do NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-integration-manage-integrations-navigation.webp",[488,11177,11178,11179],{},"Crie um Registo de Integração para o ChatGPT e regressaremos depois com o token_id real:\n",[433,11180],{"alt":11181,"src":11182},"Criando um novo registro de integração no NetSuite para conexão com o ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-create-integration-record-chatgpt.webp",[488,11184,11185,11186,11190,11194,11198],{},"Crie uma função personalizada para o MCP com as permissões mínimas e atribua-a aos utilizadores. Ex.:\n",[433,11187],{"alt":11188,"src":11189},"Configurando permissões de função personalizadas para a integração do NetSuite MCP - Parte 1","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-1.webp",[433,11191],{"alt":11192,"src":11193},"Configurando permissões de função personalizadas para a integração do NetSuite MCP - Parte 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-2.webp",[433,11195],{"alt":11196,"src":11197},"Configurando permissões de função personalizadas para a integração do NetSuite MCP - Parte 3","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-3.webp",[433,11199],{"alt":11200,"src":11201},"Configurando permissões de função personalizadas para a integração do NetSuite MCP - Parte 4","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-4.webp",[474,11203,11205],{"id":11204},"como-integrar-o-netsuite-mcp-com-o-chatgpt","Como Integrar o NetSuite MCP com o ChatGPT",[533,11207,11208,11215,11222,11229,11239,11246,11253],{},[488,11209,11210,11211],{},"Clique em 'Settings' (Definições).\n",[433,11212],{"alt":11213,"src":11214},"Navegação para Configurações na interface de usuário do ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-settings-navigation.webp",[488,11216,11217,11218],{},"Clique em 'Apps' > 'Advanced settings' (Definições avançadas).\n",[433,11219],{"alt":11220,"src":11221},"Navegação para Apps e Configurações avançadas na configuração do ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-apps-advanced-settings.webp",[488,11223,11224,11225],{},"Ative o 'Developer mode' (Modo de programador) e clique em 'Create app' (Criar aplicação).                          s\n",[433,11226],{"alt":11227,"src":11228},"Ativando o Modo de desenvolvedor e clicando em Criar app no ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-developer-mode-create-app.webp",[488,11230,11231,11232,10732,11235],{},"Introduza os detalhes. Em Connection, introduza ",[495,11233,11234],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fall",[433,11236],{"alt":11237,"src":11238},"Inserindo detalhes da URL de conexão do NetSuite MCP para criar o app no ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-create-app-netsuite-mcp-connection.webp",[488,11240,11241,11242],{},"Clique em 'Create'. Uma vez integrado, verá o seguinte pop-up.\n",[433,11243],{"alt":11244,"src":11245},"Confirmação em pop-up mostrando o NetSuite MCP integrado com sucesso no ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-mcp-integrated-popup.webp",[488,11247,11248,11249],{},"Clique em 'Sign in with NetSuite MCP' (Iniciar sessão com o NetSuite MCP).\n",[433,11250],{"alt":11251,"src":11252},"Prompt do ChatGPT para fazer login com as ferramentas padrão do NetSuite MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-sign-in-with-netsuite-mcp.webp",[488,11254,11255,11256],{},"Clique no botão 'Continue' para conceder permissões.\n",[433,11257],{"alt":11258,"src":11259},"Concedendo permissões de conexão para o NetSuite MCP na tela de autorização do ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-grant-permissions-netsuite-mcp.webp",[474,11261,11263],{"id":11262},"como-integrar-o-netsuite-mcp-com-o-claude-ai","Como Integrar o NetSuite MCP com o Claude AI",[533,11265,11266,11273,11280,11287,11302,11309],{},[488,11267,11268,11269],{},"Clique em 'Customize' (Personalizar).\n",[433,11270],{"alt":11271,"src":11272},"Clicando na opção Personalizar na interface de usuário do Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-customize-navigation.webp",[488,11274,11275,11276],{},"Clique em 'Connect your apps' (Ligar as suas aplicações).\n",[433,11277],{"alt":11278,"src":11279},"Clicando em Conectar seus apps nas configurações de personalização do Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-connect-your-apps.webp",[488,11281,11282,11283],{},"Pesquise por 'NetSuite'.\n",[433,11284],{"alt":11285,"src":11286},"Pesquisando o aplicativo NetSuite nos aplicativos conectados do Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-search-netsuite-app.webp",[488,11288,11289,11290,11293,11294,11297,11298],{},"Clique em 'NetSuite' e introduza o URL do servidor: ",[495,11291,11292],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fsuiteapp\u002Fcom.netsuite.mcpstandardtools",". Substitua ",[495,11295,11296],{},"\u003Caccount_id>"," pelo ID real da sua conta.\n",[433,11299],{"alt":11300,"src":11301},"Inserindo a URL de conexão do servidor NetSuite MCP no Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-server-url-setup.webp",[488,11303,11304,11305],{},"Clique no botão 'Continue'.\n",[433,11306],{"alt":11307,"src":11308},"Clicando em Continuar para autenticar a conexão do servidor NetSuite MCP no Claude","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-continue-authentication.webp",[488,11310,11311,11312],{},"Clique em 'Continue' para autenticar o conector.\n",[433,11313],{"alt":11314,"src":11315},"Verificação final de autenticação para o conector NetSuite MCP no Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-authenticate-connector.webp",[474,11317,11319],{"id":11318},"casos-de-uso-de-ia-do-netsuite","Casos de Uso de IA do NetSuite",[879,11321,11323],{"id":11322},"caso-de-uso-no-chatgpt-mostrar-faturas-vencidas-há-mais-de-30-dias-no-netsuite","Caso de Uso no ChatGPT: Mostrar faturas vencidas há mais de 30 dias no NetSuite",[430,11325,11326],{},[433,11327],{"alt":11328,"src":11329},"ChatGPT executando uma consulta SuiteQL para buscar faturas vencidas no NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-overdue-invoices-query-result.webp",[485,11331,11332],{},[488,11333,11334],{},"O ChatGPT criou a consulta SuiteQL e executou-a. Isto é extremamente prático e poupa imenso tempo em comparação com a criação de um relatório através da interface web do NetSuite.",[879,11336,11338],{"id":11337},"caso-de-uso-no-chatgpt-e-claude-consegue-desenhar-as-vendas-dos-últimos-30-dias-num-gráfico-de-linhas","Caso de Uso no ChatGPT e Claude: Consegue desenhar as vendas dos últimos 30 dias num gráfico de linhas?",[430,11340,11341],{},[433,11342],{"alt":11343,"src":11344},"ChatGPT falhando ao renderizar um gráfico de linhas de vendas a partir de dados do NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-failed-render-netsuite-sales-line-graph.webp",[485,11346,11347,11350],{},[488,11348,11349],{},"O ChatGPT não conseguiu gerar o gráfico de linhas.",[488,11351,11352,11353],{},"Experimentei no Claude e funcionou. A diferença pode dever-se às capacidades do modelo de linguagem de grande dimensão (LLM).\n",[433,11354],{"alt":11355,"src":11356},"Claude AI renderizando com sucesso um gráfico de linhas visual das vendas do NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-successfully-rendered-netsuite-sales-line-graph.webp",[879,11358,11360],{"id":11359},"caso-de-uso-no-claude-criar-um-registo-de-cliente","Caso de Uso no Claude: Criar um registo de cliente",[430,11362,11363,11367],{},[433,11364],{"alt":11365,"src":11366},"Prompt do Claude AI para criar um novo registro de cliente no NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-prompt.webp",[433,11368],{"alt":11369,"src":11370},"Confirmação do Claude AI sobre a criação bem-sucedida do registro de cliente no NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-success.webp",[485,11372,11373,11380],{},[488,11374,11375,11376],{},"Uma verificação rápida na interface do NetSuite confirma que o registo foi criado com sucesso.\n",[433,11377],{"alt":11378,"src":11379},"Verificando o registro de cliente recém-criado na interface de usuário web do NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-ui-verify-new-customer-record-created.webp",[488,11381,11382,11383],{},"A execução no ChatGPT mostra que o registo está disponível:\n",[433,11384],{"alt":11385,"src":11386},"ChatGPT confirmando que o novo registro de cliente do NetSuite está disponível","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-verify-netsuite-customer-record-available.webp",[879,11388,11390],{"id":11389},"caso-de-uso-no-claude-executar-consulta-suiteql","Caso de Uso no Claude: Executar Consulta SuiteQL",[430,11392,11393],{},[433,11394],{"alt":11395,"src":11396},"Claude AI executando diretamente e exibindo resultados de uma consulta SuiteQL do NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-run-suiteql-query-result.webp",[485,11398,11399],{},[488,11400,11401],{},"A consulta SuiteQL pode ser executada diretamente.",[474,11403,11405],{"id":11404},"considerações-finais-sobre-o-conector-de-ia-do-netsuite","Considerações Finais sobre o Conector de IA do NetSuite",[430,11407,11408,11409,11411],{},"A maior vantagem de utilizar o MCP é para utilizadores que não têm perfil técnico suficiente para criar relatórios complexos. Estes utilizadores podem usar linguagem corrente para interrogar os dados e pedir à ",[441,11410,11046],{}," para apresentar o relatório exatamente como desejam.",[430,11413,11414],{},"Para evitar ataques de injeção de prompt e o uso indevido de operações de escrita, conceda apenas permissões de escrita a determinados registos e transações. Quando a IA usa o MCP para atualizar ou criar um registo, executa-o como SuiteScript do lado do servidor, o que ignora totalmente qualquer script do lado do cliente ou validação de força.",[474,11416,1611],{"id":1610},[485,11418,11419,11426,11433],{},[488,11420,11421],{},[444,11422,11425],{"href":11423,"rel":11424},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_0902023450.html#subsect_90090238176",[448],"Instalação do SuiteApp MCP Standard Tools",[488,11427,11428],{},[444,11429,11432],{"href":11430,"rel":11431},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_4160616848.html#subsect_0419123151",[448],"Perguntas Frequentes sobre o Serviço do Conector de IA do NetSuite",[488,11434,11435],{},[444,11436,11439],{"href":11437,"rel":11438},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Fsection_0714082142.html#bridgehead_0804033331",[448],"Ligar ao Serviço do Conector de IA do NetSuite",{"title":425,"searchDepth":1061,"depth":1068,"links":11441},[11442,11443,11444,11445,11446,11452,11453],{"id":11036,"depth":1061,"text":11037},{"id":11066,"depth":1061,"text":11067},{"id":11204,"depth":1061,"text":11205},{"id":11262,"depth":1061,"text":11263},{"id":11318,"depth":1061,"text":11319,"children":11447},[11448,11449,11450,11451],{"id":11322,"depth":1068,"text":11323},{"id":11337,"depth":1068,"text":11338},{"id":11359,"depth":1068,"text":11360},{"id":11389,"depth":1068,"text":11390},{"id":11404,"depth":1061,"text":11405},{"id":1610,"depth":1061,"text":1611},[1659],"2026-06-13","Configure o Conector de IA do NetSuite (MCP) com o ChatGPT e Claude. Descubra como consultar dados de ERP e automatizar tarefas usando linguagem natural.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002FPT-Setup-NetSuite-MCP-on-ChatGPT-%26-Claude.webp","Miniatura de integração de IA do NetSuite MCP apresentando fundo corporativo azul escuro com logotipos do ChatGPT e Claude conectados ao banco de dados em nuvem do NetSuite",{"schemaOrg":11460,"robots":1693,"sitemap":11462},[11461],{"@type":1670,"headline":11014,"description":11456},{"lastmod":11455},{"title":11464,"description":11456,"ogTitle":11014,"ogDescription":11456,"twitterTitle":11014,"twitterDescription":11456},"Integração de IA do NetSuite MCP: Conectar ChatGPT e Claude","pt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",[11059,6907,11467,11468,11469],"ChatGPT","Claude","AI","qOJBqpuEboIsdGzK7Bh15Y_aki6iKkCSsasqLIPntSE",{"id":11472,"title":11473,"author":1702,"body":11474,"category":11665,"date":11666,"description":11667,"extension":1664,"image":11668,"imageAlt":11669,"isPublished":1064,"meta":11670,"minRead":1928,"navigation":1064,"path":241,"seo":11674,"stem":11675,"tags":11676,"updatedAt":1702,"__hash__":11680},"article\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis.md","Testando Claude Fable 5: Avaliação em Análise Financeira",{"type":427,"value":11475,"toc":11663},[11476,11487,11498,11501,11507,11523,11533,11539,11545,11551,11572,11581,11595,11603,11621,11624,11635,11644,11647,11660],[430,11477,11478,11479,11482,11483],{},"Em 9 de junho de 2026, a Anthropic lançou o ",[441,11480,11481],{},"Claude Fable 5",", um modelo de classe Mythos com salvaguardas avançadas em áreas como cibersegurança, destilação, química e biologia.\n",[433,11484],{"alt":11485,"src":11486},"Anúncio oficial de lançamento do Anthropic Claude Fable 5 e recursos avançados do modelo","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-launch-announcement.webp",[430,11488,11489,11490,11493,11494],{},"A Anthropic publicou dados mostrando que o Fable 5 está à frente do Opus 4.8 e do GPT-5.5 em vários benchmarks importantes. No ",[441,11491,11492],{},"GDPval-AA (trabalho cognitivo)",", ele está significativamente à frente do Opus 4.8, GPT 5.5 e Gemini 3.1 Pro.\n",[433,11495],{"alt":11496,"src":11497},"Comparação de benchmarks do Claude Fable 5 incluindo pontuação de trabalho cognitivo GDPval-AA","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-benchmarks-gdpval-aa.webp",[430,11499,11500],{},"De acordo com o Claude, \"o Fable 5 apresenta forte desempenho em tarefas analíticas complexas\".",[430,11502,11503],{},[433,11504],{"alt":11505,"src":11506},"Declaração de excelente desempenho do Claude Fable 5 em tarefas analíticas complexas","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-analytical-performance-statement.webp",[430,11508,11509,11510,11513,11514,11517,11518,461],{},"Decidimos testar o ",[441,11511,11512],{},"Fable 5"," executando uma análise comparativa da 'Space Exploration Technologies Corporation (SpaceX)' para fins de pesquisa de investimentos, utilizando a habilidade de '",[441,11515,11516],{},"comps-analysis","'. O arquivo 'skill.md' foi extraído do ",[444,11519,11522],{"href":11520,"rel":11521},"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services\u002Fblob\u002Fmain\u002Fplugins\u002Fagent-plugins\u002Fmarket-researcher\u002Fskills\u002Fcomps-analysis\u002FSKILL.md",[448],"repositório de serviços financeiros do GitHub da Anthropic",[430,11524,11525,11529],{},[433,11526],{"alt":11527,"src":11528},"Iniciando a habilidade de análise comparativa financeira do SpaceX no chat do Claude Fable 5","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-initiation.webp",[433,11530],{"alt":11531,"src":11532},"Claude Fable 5 executando a análise comparativa financeira automatizada para a SpaceX","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-running-progress.webp",[430,11534,11535],{},[433,11536],{"alt":11537,"src":11538},"Resultado final do fluxo de trabalho de análise financeira comparativa da SpaceX","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-results-terminal.webp",[430,11540,11541,11542,11544],{},"A tarefa levou cerca de 25 minutos. O Claude não fez perguntas para esclarecimento, exceto para pedir permissão de acesso a sites externos. Impressionantemente, o ",[441,11543,11512],{}," foi capaz de encontrar de forma independente as empresas concorrentes para a comparação.",[430,11546,11547],{},[433,11548],{"alt":11549,"src":11550},"Claude Fable 5 solicitando permissão explícita para acessar de forma segura sites externos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-external-site-access-permission.webp",[430,11552,11553,11557,11558,11561,11562,575,11567,461],{},[433,11554],{"alt":11555,"src":11556},"Empresas concorrentes da SpaceX identificadas de maneira totalmente autônoma pelo Claude Fable 5","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-spacex-comps-excel-memo.webp","\n*",[441,11559,11560],{},"Atenção:"," Este teste tem fins educacionais e de pesquisa e não constitui recomendação de investimento. Os arquivos originais gerados podem ser baixados aqui: ",[444,11563,11566],{"href":11564,"rel":11565},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Analysis_2026-06-10.xlsx",[448],"SpaceX_Comps_Analysis_2026-06-10.xlsx",[444,11568,11571],{"href":11569,"rel":11570},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Memo_2026-06-10.pdf",[448],"SpaceX_Comps_Memo_2026-06-10.pdf",[430,11573,11574,11575,11578,11579,461],{},"Quando testamos a mesma habilidade usando o ",[441,11576,11577],{},"Qwen deep research",", tivemos que inserir manualmente as empresas concorrentes. Os dados numéricos apresentaram pequenas variações em relação ao ",[441,11580,11512],{},[430,11582,11583,11587,11591],{},[433,11584],{"alt":11585,"src":11586},"Iniciando a análise comparativa financeira da SpaceX usando o Qwen deep research","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-initiation.webp",[433,11588],{"alt":11589,"src":11590},"Inserção manual de empresas concorrentes no Qwen deep research para análise corporativa da SpaceX","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-running.webp",[433,11592],{"alt":11593,"src":11594},"Visualização prévia do relatório financeiro de benchmarking da SpaceX gerado pelo Qwen","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-report-preview.webp",[430,11596,11597,11598,461],{},"*O relatório gerado pelo Qwen pode ser baixado aqui: ",[444,11599,11602],{"href":11600,"rel":11601},"https:\u002F\u002Ftechvoyage.dev\u002FThe_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[448],"The_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[430,11604,11605,11606,11609,11610,10732,11613,11617],{},"Embora ambos os relatórios de Claude e Qwen tenham sido produzidos com base na mesma metodologia especificada na habilidade, os números divergiram porque Claude e Qwen extraíram dados de fontes diferentes. For exemplo, o Claude Fable 5 usou ",[441,11607,11608],{},"Stock Analysis",", enquanto o Qwen usou o ",[441,11611,11612],{},"SEC.gov",[433,11614],{"alt":11615,"src":11616},"Dados financeiros corporativos extraídos do Stock Analysis pelo modelo Claude Fable 5","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-data-source-stock-analysis.webp",[433,11618],{"alt":11619,"src":11620},"Documentos oficiais da SEC e portal de dados do SEC.gov utilizados pelo Qwen deep research","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-data-source-sec-gov.webp",[430,11622,11623],{},"O relatório do Qwen também continha muito mais informações sobre o modelo de negócios, estrutura de capital e operações corporativas.",[430,11625,11626,11627,11630,11631],{},"Depois de comparar os relatórios, decidimos tentar novamente utilizando o comando ",[495,11628,11629],{},"\u002Fresearch"," no aplicativo de desktop do Claude.\n",[433,11632],{"alt":11633,"src":11634},"Utilizando o novo comando de pesquisa no app de desktop do Claude para análise aprofundada de mercado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-desktop-research-command-spacex.webp",[430,11636,11637,11638,11643],{},"O relatório de análise recém-gerado, ",[444,11639,11642],{"href":11640,"rel":11641},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Analysis.pdf",[448],"SpaceX_Analysis.pdf",", incluiu seções extras de recomendações e ressalvas. Comparado à pesquisa profunda do Qwen, ele ainda carecia de informações detalhadas da empresa, como as operações e a estrutura de capital.",[430,11645,11646],{},"Será que o Fable 5 vale o preço premium cobrado? Pode valer para tarefas complexas e longas e para codificação autônoma. No entanto, para certos trabalhos cognitivos, como análise de empresas, pode ainda não ser o melhor custo-benefício.",[430,11648,11649,11650,11652,11653,10732,11656],{},"No final, testamos o quão bem o ",[441,11651,11512],{}," se desempenha em traduções. Estranhamente, o modelo reverteu automaticamente de volta para o ",[441,11654,11655],{},"Opus 4.8",[433,11657],{"alt":11658,"src":11659},"O app de desktop do Claude revertendo automaticamente o modelo ativo de Fable 5 para Opus 4.8","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-translation-opus-switching.webp",[430,11661,11662],{},"Será que isso significa que qualquer conversão de contexto longo será revertida para o Opus 4.8? Trata-se de uma instabilidade temporária durante o uso antes de 22 de junho? Ou o sistema é simplesmente inteligente o bastante para identificar que a tradução não requer um modelo tão potente?",{"title":425,"searchDepth":1061,"depth":1068,"links":11664},[],[1659],"2026-06-11","Testamos o novo Claude Fable 5 da Anthropic contra o Qwen Deep Research para análise financeira. Será que essa atualização realmente vale o seu preço premium?","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002FPT-Testing-Claude-Fable-5-in-Financial-Analysis.webp","Claude Fable 5 vs Qwen: Teste de Análise Financeira de IA",{"schemaOrg":11671,"robots":1693,"sitemap":11673},[11672],{"@type":1670,"headline":11473,"description":11667},{"lastmod":11666},{"title":11669,"description":11667,"ogTitle":11473,"ogDescription":11667,"twitterTitle":11473,"twitterDescription":11667},"pt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",[11481,11677,11678,11679],"Análise Financeira","Qwen Deep Research","Benchmarks de IA","MTAm2wrDgESWXyvb8oP1S9RoSek-2TSVTFcBhvn7IV4",{"id":11682,"title":11683,"author":1702,"body":11684,"category":11891,"date":11892,"description":11893,"extension":1664,"image":11894,"imageAlt":11895,"isPublished":1064,"meta":11896,"minRead":1923,"navigation":1064,"path":243,"seo":11900,"stem":11901,"tags":11902,"updatedAt":1702,"__hash__":11903},"article\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2.md","Guia do Browser e do Scheduler no Google Antigravity 2",{"type":427,"value":11685,"toc":11886},[11686,11699,11703,11709,11718,11733,11739,11742,11753,11757,11760,11767,11774,11785,11788,11794,11805,11811,11821,11834,11844,11854,11857,11863,11865,11875],[430,11687,11688,11689,575,11692,4712,11695,11698],{},"Os comandos ",[495,11690,11691],{},"\u002Fbrowser",[495,11693,11694],{},"\u002Fschedule",[441,11696,11697],{},"Google Antigravity 2"," redefinem a nossa forma de interagir com a IA. Estes dois comandos transformam o Antigravity numa plataforma de automação proativa que consegue interagir com a web em tempo real e executar fluxos de trabalho recorrentes.",[474,11700,11702],{"id":11701},"browser-run","Browser Run",[430,11704,11705,11706,11708],{},"O comando ",[495,11707,11691],{}," força a utilização do navegador Chrome para concluir uma tarefa. Os utilizadores mantêm o controlo sobre quando e como os agentes acedem à web durante o fluxo de trabalho. São tiradas capturas de ecrã e gravações de vídeo durante o processo.",[430,11710,11711,11714],{},[441,11712,11713],{},"Caso de Uso:",[433,11715],{"alt":11716,"src":11717},"Usando o comando \u002Fbrowser para enviar uma licença médica","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-command-sick-leave-prompt.webp",[430,11719,11720,11721,11725,11729],{},"Abaixo estão os resultados apresentados pelo agente:\n",[433,11722],{"alt":11723,"src":11724},"Subagente de automação do navegador iniciando a tarefa de envio de licença médica","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-subagent-delegation.webp",[433,11726],{"alt":11727,"src":11728},"Automatizador de navegador configurando o Chrome com depuração remota e permissões","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-permissions-and-chrome-setup.webp",[433,11730],{"alt":11731,"src":11732},"Subagente do navegador pausando em uma tela de login solicitando credenciais","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-login-wall-encountered.webp",[430,11734,11735],{},[433,11736],{"alt":11737,"src":11738},"Subagente do navegador aguardando o usuário concluir o processo de login","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-waiting-for-user-login.webp",[430,11740,11741],{},"O Antigravity foi capaz de abrir a página e submeter o formulário. Quando é necessário iniciar sessão, o agente aguarda até que conclua o login no website.",[430,11743,11744,11749,11750,11752],{},[11745,11746],"video",{"alt":11747,"src":11748,"controls":1064},"Vídeo do subagente do navegador executando o processo de envio de licença médica","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-sick-leave-process.webm","\nO comando ",[495,11751,11691],{}," é útil quando precisamos da documentação mais recente da web, registos de alterações (changelogs), para testar aplicações web ou verificar o estado de APIs para concluir uma tarefa.",[474,11754,11756],{"id":11755},"schedule-task","Schedule Task",[430,11758,11759],{},"O Antigravity 2 tem uma funcionalidade integrada para agendar tarefas. Iremos testá-la ao preencher automaticamente uma folha de horas (timesheet) a cada 10 minutos.",[430,11761,11762,11763],{},"Clique em 'Scheduled Tasks' (Tarefas Agendadas):\n",[433,11764],{"alt":11765,"src":11766},"Opção de menu Tarefas Agendadas na barra lateral","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-menu-item.webp",[430,11768,11769,11770],{},"Clique no botão '+ New' para criar uma nova tarefa agendada:\n",[433,11771],{"alt":11772,"src":11773},"Visualização vazia de Tarefas Agendadas com um botão de nova tarefa","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-empty-state-new-button.webp",[430,11775,11776,11777,11781],{},"Preencha o formulário e agende a tarefa para correr a cada 10 minutos:\n",[433,11778],{"alt":11779,"src":11780},"Formulário de nova tarefa agendada preenchido para entrada automática no quadro de horários","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-new-task-form.webp",[433,11782],{"alt":11783,"src":11784},"Tarefa ativa de Entrada Automática no Quadro de Horários na lista de Tarefas Agendadas","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-active-task-list.webp",[430,11786,11787],{},"A tarefa foi acionada, mas resultou num erro.",[430,11789,11790],{},[433,11791],{"alt":11792,"src":11793},"Mensagem de erro indicando que não há modelos disponíveis para a camada flash","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-error-no-models.webp",[430,11795,11796,11797,11800,11801,11804],{},"Tentámos adicionar valores 'env' ao ficheiro ",[495,11798,11799],{},"sidecar.json",", localizado em ",[495,11802,11803],{},".gemini\u002Fconfig\u002Fsidecars\u002Fauto-timesheet-entry",", mas continuámos a obter o mesmo erro.",[923,11806,11809],{"className":11807,"code":11808,"language":4613},[4611],"    \"env\": {\n        \"GEMINI_MODEL\": \"gemini-3.5-flash\",\n        \"GOOGLE_CLOUD_PROJECT\": \"your-gcp-project-id\"\n    }\n",[495,11810,11808],{"__ignoreMap":425},[430,11812,11813,11814,11817,11818,461],{},"Inspecionando os logs das tarefas agendadas em ",[495,11815,11816],{},".gemini\u002Fantigravity\u002Fsidecar_data\u002F",", podemos ver ",[495,11819,11820],{},"[schedule] Triggering command: \"agentapi\" [new-conversation]",[430,11822,11823,11824,11829,11830,11833],{},"A resposta ao nosso problema publicado no ",[444,11825,11828],{"href":11826,"rel":11827},"https:\u002F\u002Fdiscuss.ai.google.dev\u002Ft\u002Fscheduled-tasks-in-antigravity-2-ended-with-errors\u002F168013",[448],"Fórum Build with Google AI"," sugere que é necessária uma chave de API para o ",[495,11831,11832],{},"agentapi",". Tentámos usar a chave de API, mas ainda assim sem sucesso.",[430,11835,11836,11837,11839,11840],{},"Tentámos novamente utilizando o comando ",[495,11838,11694],{}," diretamente na caixa de conversação.\n",[433,11841],{"alt":11842,"src":11843},"Usando o comando \u002Fschedule para solicitar a tarefa de automação do quadro de horários","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fschedule-command-timesheet-prompt.webp",[430,11845,11846,11847,11849,11850],{},"As tarefas agendadas através do comando ",[495,11848,11694],{}," não aparecem na opção de menu 'Scheduled Tasks'.\n",[433,11851],{"alt":11852,"src":11853},"A lista de Tarefas Agendadas não mostra as tarefas criadas pelo comando CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-list-missing-cli-task.webp",[430,11855,11856],{},"A tarefa cron foi devidamente acionada.",[430,11858,11859],{},[433,11860],{"alt":11861,"src":11862},"Log da tarefa cron confirmando que ela foi acionada","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fcron-job-triggered-log.webp",[474,11864,8002],{"id":6119},[430,11866,11688,11867,575,11869,11871,11872,11874],{},[495,11868,11691],{},[495,11870,11694],{}," no Antigravity 2 não são apenas funcionalidades isoladas; a sua combinação cria uma ferramenta extraordinária. Por exemplo, pode agendar um agente para usar o ",[495,11873,11691],{}," para aceder a websites de notícias e informação todas as segundas-feiras de manhã às 6:00, sintetizar os dados e apresentar um briefing diário completo.",[430,11876,11877,11878,11881,11882,11885],{},"Outros comandos, como o ",[495,11879,11880],{},"\u002Fgrill-me"," (mencionado no artigo ",[444,11883,11884],{"href":419},"Antigravity 2 em ação: agentes de IA, skills e o MCP","), podem ser usados ao planear novas tarefas agendadas. Este comando solicita ao agente que peça clarificações aos utilizadores sobre ambiguidades e detete casos limite antes de finalizar o planeamento.",{"title":425,"searchDepth":1061,"depth":1068,"links":11887},[11888,11889,11890],{"id":11701,"depth":1061,"text":11702},{"id":11755,"depth":1061,"text":11756},{"id":6119,"depth":1061,"text":8002},[1659],"2026-06-07","Descubra como os comandos \u002Fbrowser e \u002Fschedule elevam o Google Antigravity 2 a uma poderosa plataforma de automação proativa com IA.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002FPT-Use-Browser-and-Scheduler-in-Antigravity-2.webp","Google Antigravity 2: Automação Web com Browser e Schedule",{"schemaOrg":11897,"robots":1693,"sitemap":11899},[11898],{"@type":1670,"headline":11895,"description":11893},{"lastmod":11892},{"title":11895,"description":11893,"ogTitle":11683,"ogDescription":11893,"twitterTitle":11683,"twitterDescription":11893},"pt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",[],"1yQSeMhULzsVF-cOYkZ2DsLklEXy5pjWL-mqb-k5S30",{"id":11905,"title":11884,"author":425,"body":11906,"category":12229,"date":12230,"description":12231,"extension":1664,"image":12232,"imageAlt":12233,"isPublished":1064,"meta":12234,"minRead":1923,"navigation":1064,"path":247,"seo":12238,"stem":12239,"tags":12240,"updatedAt":1702,"__hash__":12241},"article\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2.md",{"type":427,"value":11907,"toc":12219},[11908,11911,11918,11922,11928,11931,11935,11941,11944,11950,11956,11962,11972,11977,11981,11989,11993,11999,12005,12011,12014,12020,12026,12031,12036,12039,12043,12051,12057,12061,12067,12073,12079,12082,12086,12089,12093,12099,12105,12111,12114,12194,12200,12211,12213,12216],[430,11909,11910],{},"O Antigravity 2, como uma aplicação desktop focada em agentes, permite aos usuários orquestrar uma equipe de subagentes para gerar um resumo diário de e-mails e calendários, ou para construir, testar e implantar uma aplicação. Mas como isso realmente funciona na prática?",[430,11912,11913,11914,11917],{},"Vamos explorar o que o Antigravity 2 pode fazer por você — desde comandos e skills integrados até como integrações com servidores do Firebase Model Context Protocol (MCP) estão transformando desenvolvedores em arquitetos full-stack. Consulte este artigo, ",[444,11915,11916],{"href":391},"Google Antigravity 2: Instalação e Primeiras Impressões",", para saber como instalar e configurar as skills e os servidores MCP.",[474,11919,11921],{"id":11920},"comandos-integrados","Comandos Integrados",[879,11923,11925],{"id":11924},"goal",[495,11926,11927],{},"\u002Fgoal",[430,11929,11930],{},"Com este comando, você orienta o agente a rodar continuamente até que uma tarefa específica seja totalmente concluída.",[430,11932,11933],{},[441,11934,11713],{},[430,11936,11937],{},[433,11938],{"alt":11939,"src":11940},"Comando goal do Antigravity 2 para criar um jogo Textris","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-goal-command-prompt.webp",[430,11942,11943],{},"Quando solicitamos subagentes dinâmicos, três agentes são criados para realizar a tarefa.",[430,11945,11946],{},[433,11947],{"alt":11948,"src":11949},"Antigravity 2 gerando subagentes para concluir tarefas de forma autônoma","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-1.webp",[430,11951,11952],{},[433,11953],{"alt":11954,"src":11955},"Progresso detalhado dos subagentes do Antigravity 2 executando etapas","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-2.webp",[430,11957,11958],{},[433,11959],{"alt":11960,"src":11961},"Conclusão de tarefas autônomas pelos subagentes do Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-3.webp",[430,11963,11964,11965,1368,11968],{},"Para jogar o jogo Textris gerado em HTML, por favor clique neste ",[444,11966,6853],{"href":11967},"\u002Ftextris",[11745,11969],{"alt":11970,"src":11971,"controls":1064},"AI generated Textris game in HTML","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fai-generated-textri-game-html.webm",[430,11973,11705,11974,11976],{},[495,11975,11927],{}," cria um plano de ação, executa-o passo a passo e reporta o progresso a você em cada etapa. Além disso, o próprio agente gerencia a janela de contexto sem ultrapassar os limites de tokens. Isso é ideal para tarefas longas, como otimização de desempenho ou refatoração de módulos, que exigem várias rodadas de iteração.",[879,11978,11979],{"id":10017},[495,11980,11880],{},[430,11982,11983,11984,11988],{},"Este comando ativa a skill ",[444,11985,10017],{"href":11986,"rel":11987},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[448],", desenvolvida por Matt Pocock. É uma ferramenta direta e altamente eficaz. O objetivo dela é questionar suas decisões de desenvolvimento sob múltiplos ângulos, esclarecer casos extremos, alinhar a estrutura e consolidar o plano antes do início da implementação.",[430,11990,11991],{},[441,11992,11713],{},[430,11994,11995],{},[433,11996],{"alt":11997,"src":11998},"Acionando o comando grill-me para a arquitetura Cloudflare no Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-command-prompt.webp",[430,12000,12001],{},[433,12002],{"alt":12003,"src":12004},"Sessão interativa de perguntas usando a habilidade grill-me","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-1.webp",[430,12006,12007],{},[433,12008],{"alt":12009,"src":12010},"Esclarecendo casos extremos e estruturando o plano com grill-me","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-2.webp",[430,12012,12013],{},"Ele suporta seleção de múltiplas opções:",[430,12015,12016],{},[433,12017],{"alt":12018,"src":12019},"Usando recursos de múltipla escolha durante o processo grill-me","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-1.webp",[430,12021,12022],{},[433,12023],{"alt":12024,"src":12025},"Finalizando escolhas com o recurso de múltipla escolha do grill-me","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-2.webp",[430,12027,11705,12028,12030],{},[495,12029,11880],{}," é fascinante. Ele abrange quase todos os aspectos do design de arquitetura para implantação no Cloudflare. Isso o torna perfeito para o design de arquitetura de software, refatoração em vários domínios e outras tarefas de alta complexidade.",[879,12032,12033],{"id":425},[495,12034,12035],{},"@\u002F ",[430,12037,12038],{},"Este comando não aparece na lista pública, mas às vezes precisamos dele para gerenciar nossa janela de contexto. Ele é utilizado para incluir uma pasta ou arquivos específicos (não mídias) na caixa de conversa do chat.",[474,12040,12042],{"id":12041},"skills-habilidades","Skills (Habilidades)",[430,12044,12045,12046,12048,12049,461],{},"Podemos digitar ",[495,12047,8362],{}," para abrir o menu pop-up e escolher uma skill. Vamos testar a ",[495,12050,10205],{},[430,12052,12053],{},[433,12054],{"alt":12055,"src":12056},"Selecionando a habilidade de diagrama Excalidraw na caixa pop-up do Antigravity","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-skill-selection-excalidraw.webp",[430,12058,12059],{},[441,12060,11713],{},[430,12062,12063],{},[433,12064],{"alt":12065,"src":12066},"Fornecendo instruções para gerar um diagrama do Excalidraw","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-prompt.webp",[430,12068,12069],{},[433,12070],{"alt":12071,"src":12072},"Geração bem-sucedida de um diagrama de arquitetura do Excalidraw","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-generation.webp",[430,12074,12075],{},[433,12076],{"alt":12077,"src":12078},"Antigravity architecture diagram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-architecture.webp",[430,12080,12081],{},"A skill foi executada com sucesso após algumas rodadas de confirmações de permissão de sistema.",[474,12083,12085],{"id":12084},"servidores-mcp","Servidores MCP",[430,12087,12088],{},"Quando o agente cria um backend, você normalmente precisa abrir um console web, criar um banco de dados, copiar chaves de API e colá-las de volta. Ao integrar servidores MCP diretamente no Antigravity, o agente ganha \"mãos\" para controlar sua infraestrutura de nuvem de forma autônoma.",[430,12090,12091],{},[441,12092,11713],{},[430,12094,12095],{},[433,12096],{"alt":12097,"src":12098},"Instruindo o servidor MCP a criar um aplicativo da web Firebase","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-prompt.webp",[430,12100,12101],{},[433,12102],{"alt":12103,"src":12104},"Antigravity usando servidores MCP para manipular a infraestrutura do Firebase","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-1.webp",[430,12106,12107],{},[433,12108],{"alt":12109,"src":12110},"Criação bem-sucedida de um aplicativo Firebase por meio de servidores MCP do Antigravity","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-2.webp",[430,12112,12113],{},"O agente conseguiu criar o web app no Firebase usando servidores MCP com sucesso. Vamos checar o repositório.",[923,12115,12117],{"className":1032,"code":12116,"language":1034,"meta":425,"style":425},"Create a new public GitHub repository called ‘to-do-app-techvoyage’. Then push all the current project files to it with the commit message ‘Initial commit — to-do-app’.\n",[495,12118,12119],{"__ignoreMap":425},[931,12120,12121,12124,12127,12130,12133,12136,12139,12142,12145,12148,12151,12154,12157,12160,12163,12166,12169,12172,12175,12177,12180,12183,12186,12188,12191],{"class":933,"line":934},[931,12122,12123],{"class":1041},"Create",[931,12125,12126],{"class":1045}," a",[931,12128,12129],{"class":1045}," new",[931,12131,12132],{"class":1045}," public",[931,12134,12135],{"class":1045}," GitHub",[931,12137,12138],{"class":1045}," repository",[931,12140,12141],{"class":1045}," called",[931,12143,12144],{"class":1045}," ‘to-do-app-techvoyage’.",[931,12146,12147],{"class":1045}," Then",[931,12149,12150],{"class":1045}," push",[931,12152,12153],{"class":1045}," all",[931,12155,12156],{"class":1045}," the",[931,12158,12159],{"class":1045}," current",[931,12161,12162],{"class":1045}," project",[931,12164,12165],{"class":1045}," files",[931,12167,12168],{"class":1045}," to",[931,12170,12171],{"class":1045}," it",[931,12173,12174],{"class":1045}," with",[931,12176,12156],{"class":1045},[931,12178,12179],{"class":1045}," commit",[931,12181,12182],{"class":1045}," message",[931,12184,12185],{"class":1045}," ‘Initial",[931,12187,12179],{"class":1045},[931,12189,12190],{"class":1045}," —",[931,12192,12193],{"class":1045}," to-do-app’.\n",[430,12195,12196],{},[433,12197],{"alt":12198,"src":12199},"Agente enviando automaticamente arquivos de projeto para um novo repositório GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-github-repository-push.webp",[430,12201,12202,12203,12206,12207,461],{},"O repositório ",[495,12204,12205],{},"to-do-app-techvoyage"," está disponível no GitHub por este ",[444,12208,6853],{"href":12209,"rel":12210},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fto-do-app-techvoyage",[448],[474,12212,6120],{"id":6119},[430,12214,12215],{},"Embora o MCP e as Skills no Antigravity 2 — rodando com o ágil Gemini 3.5 Flash — entreguem uma velocidade surpreendente, o fluxo dos agentes atualmente sofre gargalos com constantes solicitações de permissão e falta de checkpoints de rollback. Até que um recurso de checkpoint seja lançado, commits de Git frequentes são sua rede de segurança indispensável.",[1639,12217,12218],{},"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 .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":425,"searchDepth":1061,"depth":1068,"links":12220},[12221,12226,12227,12228],{"id":11920,"depth":1061,"text":11921,"children":12222},[12223,12224,12225],{"id":11924,"depth":1068,"text":11927},{"id":10017,"depth":1068,"text":11880},{"id":425,"depth":1068,"text":12035},{"id":12041,"depth":1061,"text":12042},{"id":12084,"depth":1061,"text":12085},{"id":6119,"depth":1061,"text":6120},[1659],"2026-06-06","Explore o Antigravity 2, um app desktop focado em agentes. Aprenda a orquestrar subagentes de IA, usar skills integradas e aproveitar servidores MCP.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002FPT-What-can-we-do-with-Antigravity-2.webp","Tutorial do Antigravity 2: agentes de IA, skills e servidores MCP",{"schemaOrg":12235,"robots":1693,"sitemap":12237},[12236],{"@type":1670,"headline":11884,"description":12231},{"lastmod":12230},{"title":12233,"description":12231,"ogTitle":11884,"ogDescription":12231,"twitterTitle":11884,"twitterDescription":12231},"pt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[],"76uJkY05QqzI-Qi_z3fdram16LlyeKzVs5l4SODeUqE",{"id":12243,"title":11916,"author":1702,"body":12244,"category":12924,"date":12925,"description":12926,"extension":1664,"image":12927,"imageAlt":12928,"isPublished":1064,"meta":12929,"minRead":1075,"navigation":1064,"path":233,"seo":12933,"stem":12934,"tags":12935,"updatedAt":1702,"__hash__":12936},"article\u002Fpt\u002Farticle\u002Fsetup-antigravity-2.md",{"type":427,"value":12245,"toc":12913},[12246,12257,12259,12262,12273,12276,12280,12289,12295,12302,12308,12315,12325,12327,12331,12338,12344,12347,12353,12357,12360,12373,12387,12394,12406,12416,12430,12432,12436,12439,12452,12455,12760,12770,12776,12786,12792,12798,12804,12806,12810,12820,12832,12838,12844,12850,12867,12870,12876,12878,12882,12885,12891,12894,12900,12902,12904,12907,12910],[430,12247,12248,12249,12252,12253,12256],{},"No Google I\u002FO 2026, a Google anunciou o ",[441,12250,12251],{},"Antigravity 2",", um aplicativo de desktop independente que coloca o ",[441,12254,12255],{},"agente"," como a interface de usuário principal. Você simplesmente descreve o que deseja realizar, e o agente gera um plano, divide-o em subtarefas gerenciáveis e as executa.",[879,12258,1756],{"id":1755},[430,12260,12261],{},"Antes de começarmos, você precisará de:",[485,12263,12264,12267,12270],{},[488,12265,12266],{},"Um computador (usamos macOS neste guia)",[488,12268,12269],{},"Um navegador web moderno",[488,12271,12272],{},"Uma conta do Gmail",[12274,12275],"hr",{},[474,12277,12279],{"id":12278},"_1-instalar-o-antigravity-2","1. Instalar o Antigravity 2",[430,12281,12282,12283,12288],{},"Baixe o Antigravity 2 em ",[444,12284,12287],{"href":12285,"rel":12286},"https:\u002F\u002Fantigravity.google\u002Fdownload",[448],"antigravity.google"," e instale-o em seu computador. Na primeira inicialização, você será solicitado a fazer login com sua conta do Gmail.",[430,12290,12291],{},[433,12292],{"alt":12293,"src":12294},"Tela de login com conta Google na primeira inicialização do Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-gmail-login.webp",[430,12296,12297,12298,12301],{},"Depois de fazer login, você notará um ",[441,12299,12300],{},"botão de voz"," no campo de entrada, permitindo gravar comandos de voz em vez de digitá-los.",[430,12303,12304],{},[433,12305],{"alt":12306,"src":12307},"Botão de gravação de voz no campo de texto do Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-voice-input-field.webp",[430,12309,12310,12311,12314],{},"O Antigravity 2 também apresenta o conceito de ",[441,12312,12313],{},"Projeto"," (Project), que pode abranger várias pastas locais e operar com suas próprias configurações e permissões de agente específicas.",[430,12316,12317,12321],{},[433,12318],{"alt":12319,"src":12320},"Menu de seleção e configuração de projetos no Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-menu.webp",[433,12322],{"alt":12323,"src":12324},"Criação de um novo projeto de IA com caminho de pasta no Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-creation.webp",[12274,12326],{},[474,12328,12330],{"id":12329},"_2-configurar-servidores-mcp-e-plugins","2. Configurar Servidores MCP e Plugins",[430,12332,12333,12334,12337],{},"Todos os servidores de Model Context Protocol (MCP), plugins e habilidades (skills) são gerenciados na seção ",[441,12335,12336],{},"Customizations"," (Personalizações) no menu de configurações:",[430,12339,12340],{},[433,12341],{"alt":12342,"src":12343},"Guia de personalizações nas configurações para gerenciar servidores MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-settings-customizations.webp",[430,12345,12346],{},"Atualmente, os únicos plugins disponíveis são da Google, mas esperamos que mais sejam lançados no futuro.",[430,12348,12349],{},[433,12350],{"alt":12351,"src":12352},"Lista de plugins oficiais do Google e integrações no Antigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-google-plugins-list.webp",[2158,12354,12356],{"id":12355},"adicionando-um-servidor-mcp-disponível","Adicionando um Servidor MCP Disponível",[430,12358,12359],{},"Para instalar um servidor MCP pré-configurado (por exemplo, GitHub):",[533,12361,12362,12367],{},[488,12363,4232,12364,461],{},[441,12365,12366],{},"Add MCP+",[488,12368,12369,12370,461],{},"Selecione o ",[441,12371,12372],{},"GitHub MCP Server",[430,12374,12375,12379,12383],{},[433,12376],{"alt":12377,"src":12378},"Adicionar um servidor MCP pré-configurado clicando no botão Add MCP plus","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-mcp-button.webp",[433,12380],{"alt":12381,"src":12382},"Seleção do GitHub MCP Server na lista de integrações disponíveis","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-select-github-mcp.webp",[433,12384],{"alt":12385,"src":12386},"Assistente de configuração e autorização do servidor MCP do GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-setup.webp",[430,12388,12389,12390],{},"A configuração do GitHub MCP Server terminou com um erro:\n",[433,12391],{"alt":12392,"src":12393},"Erro de configuração durante o processo de instalação do GitHub MCP Server","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-error.webp",[430,12395,12396,12397,12399,12400,12402,12403,12405],{},"Como já temos o ",[495,12398,2762],{}," instalado no macOS, podemos contornar isso executando o comando ",[495,12401,2762],{}," diretamente na conversa. No entanto, primeiro precisamos adicionar explicitamente o comando ",[495,12404,2762],{}," às permissões do Antigravity.",[430,12407,12408,12412],{},[433,12409],{"alt":12410,"src":12411},"Caixa de diálogo para adicionar o comando git às permissões","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-1.webp",[433,12413],{"alt":12414,"src":12415},"Concessão de permissão de execução do comando git no menu de configurações","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-2.webp",[430,12417,12418,12419,12421,12422,12426],{},"Vamos testar o comando para ver se o ",[495,12420,2762],{}," agora funciona:\n",[433,12423],{"alt":12424,"src":12425},"Envio de solicitação de git status dentro da caixa de chat da IA","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-1.webp",[433,12427],{"alt":12428,"src":12429},"Execução bem-sucedida do comando git status diretamente no chat","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-2.webp",[12274,12431],{},[474,12433,12435],{"id":12434},"_3-adicionar-servidores-mcp-personalizados","3. Adicionar Servidores MCP Personalizados",[430,12437,12438],{},"Se o servidor MCP desejado não estiver na lista padrão, você poderá adicioná-lo editando o arquivo de configuração do MCP diretamente. A configuração está localizada em:",[923,12440,12442],{"className":1032,"code":12441,"language":1034,"meta":425,"style":425},"~\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[495,12443,12444],{"__ignoreMap":425},[931,12445,12446,12449],{"class":933,"line":934},[931,12447,12448],{"class":945},"~",[931,12450,12451],{"class":941},"\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[430,12453,12454],{},"Vamos adicionar alguns servidores MCP da Cloudflare como exemplo. Como a Cloudflare suporta registro dinâmico de clientes, precisamos apenas ativar o OAuth. Adicione o seguinte à sua configuração JSON:",[923,12456,12458],{"className":2875,"code":12457,"language":2877,"meta":425,"style":425},"    \"cloudflare-api\": {\n      \"serverUrl\": \"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-docs\": {\n      \"serverUrl\": \"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp\"\n    },\n    \"cloudflare-bindings\": {\n      \"serverUrl\": \"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-builds\": {\n      \"serverUrl\": \"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-observability\": {\n      \"serverUrl\": \"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[495,12459,12460,12473,12493,12505,12517,12521,12528,12541,12558,12564,12577,12596,12608,12620,12624,12630,12643,12662,12674,12686,12690,12696,12709,12728,12740,12752,12756],{"__ignoreMap":425},[931,12461,12462,12464,12467,12469,12471],{"class":933,"line":934},[931,12463,7571],{"class":945},[931,12465,12466],{"class":1045},"cloudflare-api",[931,12468,3666],{"class":945},[931,12470,579],{"class":941},[931,12472,2884],{"class":945},[931,12474,12475,12477,12480,12482,12484,12486,12489,12491],{"class":933,"line":1061},[931,12476,7584],{"class":945},[931,12478,12479],{"class":937},"serverUrl",[931,12481,3666],{"class":945},[931,12483,889],{"class":945},[931,12485,3257],{"class":945},[931,12487,12488],{"class":1045},"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp",[931,12490,3666],{"class":945},[931,12492,7601],{"class":945},[931,12494,12495,12497,12499,12501,12503],{"class":933,"line":1068},[931,12496,7584],{"class":945},[931,12498,7830],{"class":937},[931,12500,3666],{"class":945},[931,12502,889],{"class":945},[931,12504,2914],{"class":945},[931,12506,12507,12509,12511,12513,12515],{"class":933,"line":1075},[931,12508,7620],{"class":945},[931,12510,7843],{"class":1041},[931,12512,3666],{"class":945},[931,12514,889],{"class":945},[931,12516,1379],{"class":945},[931,12518,12519],{"class":933,"line":1923},[931,12520,7854],{"class":945},[931,12522,12523,12526],{"class":933,"line":1928},[931,12524,12525],{"class":945},"    }",[931,12527,7601],{"class":941},[931,12529,12530,12532,12535,12537,12539],{"class":933,"line":1934},[931,12531,7571],{"class":945},[931,12533,12534],{"class":1045},"cloudflare-docs",[931,12536,3666],{"class":945},[931,12538,579],{"class":941},[931,12540,2884],{"class":945},[931,12542,12543,12545,12547,12549,12551,12553,12556],{"class":933,"line":2270},[931,12544,7584],{"class":945},[931,12546,12479],{"class":937},[931,12548,3666],{"class":945},[931,12550,889],{"class":945},[931,12552,3257],{"class":945},[931,12554,12555],{"class":1045},"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp",[931,12557,1955],{"class":945},[931,12559,12560,12562],{"class":933,"line":2281},[931,12561,12525],{"class":945},[931,12563,7601],{"class":941},[931,12565,12566,12568,12571,12573,12575],{"class":933,"line":2377},[931,12567,7571],{"class":945},[931,12569,12570],{"class":1045},"cloudflare-bindings",[931,12572,3666],{"class":945},[931,12574,579],{"class":941},[931,12576,2884],{"class":945},[931,12578,12579,12581,12583,12585,12587,12589,12592,12594],{"class":933,"line":1695},[931,12580,7584],{"class":945},[931,12582,12479],{"class":937},[931,12584,3666],{"class":945},[931,12586,889],{"class":945},[931,12588,3257],{"class":945},[931,12590,12591],{"class":1045},"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp",[931,12593,3666],{"class":945},[931,12595,7601],{"class":945},[931,12597,12598,12600,12602,12604,12606],{"class":933,"line":2388},[931,12599,7584],{"class":945},[931,12601,7830],{"class":937},[931,12603,3666],{"class":945},[931,12605,889],{"class":945},[931,12607,2914],{"class":945},[931,12609,12610,12612,12614,12616,12618],{"class":933,"line":2393},[931,12611,7620],{"class":945},[931,12613,7843],{"class":1041},[931,12615,3666],{"class":945},[931,12617,889],{"class":945},[931,12619,1379],{"class":945},[931,12621,12622],{"class":933,"line":2399},[931,12623,7854],{"class":945},[931,12625,12626,12628],{"class":933,"line":3326},[931,12627,12525],{"class":945},[931,12629,7601],{"class":941},[931,12631,12632,12634,12637,12639,12641],{"class":933,"line":3337},[931,12633,7571],{"class":945},[931,12635,12636],{"class":1045},"cloudflare-builds",[931,12638,3666],{"class":945},[931,12640,579],{"class":941},[931,12642,2884],{"class":945},[931,12644,12645,12647,12649,12651,12653,12655,12658,12660],{"class":933,"line":3342},[931,12646,7584],{"class":945},[931,12648,12479],{"class":937},[931,12650,3666],{"class":945},[931,12652,889],{"class":945},[931,12654,3257],{"class":945},[931,12656,12657],{"class":1045},"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp",[931,12659,3666],{"class":945},[931,12661,7601],{"class":945},[931,12663,12664,12666,12668,12670,12672],{"class":933,"line":3350},[931,12665,7584],{"class":945},[931,12667,7830],{"class":937},[931,12669,3666],{"class":945},[931,12671,889],{"class":945},[931,12673,2914],{"class":945},[931,12675,12676,12678,12680,12682,12684],{"class":933,"line":3879},[931,12677,7620],{"class":945},[931,12679,7843],{"class":1041},[931,12681,3666],{"class":945},[931,12683,889],{"class":945},[931,12685,1379],{"class":945},[931,12687,12688],{"class":933,"line":3885},[931,12689,7854],{"class":945},[931,12691,12692,12694],{"class":933,"line":3894},[931,12693,12525],{"class":945},[931,12695,7601],{"class":941},[931,12697,12698,12700,12703,12705,12707],{"class":933,"line":4543},[931,12699,7571],{"class":945},[931,12701,12702],{"class":1045},"cloudflare-observability",[931,12704,3666],{"class":945},[931,12706,579],{"class":941},[931,12708,2884],{"class":945},[931,12710,12711,12713,12715,12717,12719,12721,12724,12726],{"class":933,"line":4996},[931,12712,7584],{"class":945},[931,12714,12479],{"class":937},[931,12716,3666],{"class":945},[931,12718,889],{"class":945},[931,12720,3257],{"class":945},[931,12722,12723],{"class":1045},"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp",[931,12725,3666],{"class":945},[931,12727,7601],{"class":945},[931,12729,12730,12732,12734,12736,12738],{"class":933,"line":5005},[931,12731,7584],{"class":945},[931,12733,7830],{"class":937},[931,12735,3666],{"class":945},[931,12737,889],{"class":945},[931,12739,2914],{"class":945},[931,12741,12742,12744,12746,12748,12750],{"class":933,"line":5013},[931,12743,7620],{"class":945},[931,12745,7843],{"class":1041},[931,12747,3666],{"class":945},[931,12749,889],{"class":945},[931,12751,1379],{"class":945},[931,12753,12754],{"class":933,"line":5021},[931,12755,7854],{"class":945},[931,12757,12758],{"class":933,"line":5026},[931,12759,7704],{"class":945},[430,12761,12762,12763,12765,12766,12769],{},"Volte para a seção ",[441,12764,12336],{}," no aplicativo e clique no botão ",[441,12767,12768],{},"Refresh"," (Atualizar). Agora você verá os servidores MCP da Cloudflare listados, pendentes de autorização.",[430,12771,12772],{},[433,12773],{"alt":12774,"src":12775},"Servidores MCP da Cloudflare listados pendentes de autorização","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-mcp-pending.webp",[430,12777,4232,12778,12781,12782,12785],{},[441,12779,12780],{},"Authenticate"," ao lado do servidor MCP. Isso abrirá uma página de autenticação no seu navegador web. Depois de autenticado, um código de autorização (",[441,12783,12784],{},"auth code",") será gerado.",[430,12787,12788],{},[433,12789],{"alt":12790,"src":12791},"Navegador web exibindo o código de autorização OAuth dinâmico","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-code.webp",[430,12793,12794,12795,461],{},"Copie esse código de autorização, cole-o de volta no campo de entrada de texto no Antigravity e clique em ",[441,12796,12797],{},"Submit",[430,12799,12800],{},[433,12801],{"alt":12802,"src":12803},"Envio do código de verificação OAuth na interface do Antigravity","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-submit.webp",[12274,12805],{},[474,12807,12809],{"id":12808},"_4-adicionar-habilidades-personalizadas","4. Adicionar Habilidades Personalizadas",[430,12811,12812,12813,12816,12817,461],{},"Atualmente, a adição de habilidades personalizadas (skills) ",[441,12814,12815],{},"não pode"," ser feita diretamente pela interface do usuário do aplicativo de desktop. Em vez disso, elas devem ser adicionadas diretamente na pasta ",[495,12818,12819],{},"~\u002F.gemini\u002Fconfig\u002Fskills",[430,12821,12822,12823,12826,12827],{},"Como usamos a CLI ",[495,12824,12825],{},"npx skills"," para centralizar todas as habilidades de nossos agentes, qualquer nova habilidade adicionada pode ser disponibilizada para todos os agentes, incluindo o Antigravity. ",[899,12828,12829,12830,10288],{},"(Para saber mais sobre isso, consulte nosso artigo: ",[444,12831,8623],{"href":359},[430,12833,12834,12835,12837],{},"Inicialmente, ao digitar ",[495,12836,8362],{}," na caixa de conversa, a lista de habilidades aparece vazia:",[430,12839,12840],{},[433,12841],{"alt":12842,"src":12843},"Caixa de comandos exibindo lista de habilidades vazia ao digitar barra","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-empty-skills-list.webp",[430,12845,12846,12847,12849],{},"Parece que o Antigravity 2 não lê automaticamente a pasta global de habilidades (",[495,12848,8608],{},"). Para corrigir isso, precisamos criar um link simbólico apontando para o diretório de configuração do Antigravity:",[923,12851,12853],{"className":1032,"code":12852,"language":1034,"meta":425,"style":425},"ln -s ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[495,12854,12855],{"__ignoreMap":425},[931,12856,12857,12859,12861,12864],{"class":933,"line":934},[931,12858,3652],{"class":1041},[931,12860,3508],{"class":1045},[931,12862,12863],{"class":1045}," ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram",[931,12865,12866],{"class":1045}," ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[430,12868,12869],{},"Depois de vinculado, a habilidade fica disponível no aplicativo!",[430,12871,12872],{},[433,12873],{"alt":12874,"src":12875},"Habilidade de diagramas do Excalidraw aparecendo na lista de comandos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-excalidraw-skill-available.webp",[12274,12877],{},[474,12879,12881],{"id":12880},"_5-testar-uma-tarefa-simples","5. Testar uma Tarefa Simples",[430,12883,12884],{},"Agora que tudo está configurado, vamos fazer um teste.",[430,12886,12887],{},[433,12888],{"alt":12889,"src":12890},"Envio de uma tarefa de teste para listar bancos de dados D1","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-simple-task-prompt.webp",[430,12892,12893],{},"Como mostrado abaixo, o modelo detecta e utiliza com sucesso o servidor MCP da Cloudflare recém-adicionado para lidar com a solicitação.",[430,12895,12896],{},[433,12897],{"alt":12898,"src":12899},"Agente de IA executando com sucesso a listagem de bancos de dados D1","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-task-success.webp",[12274,12901],{},[474,12903,6120],{"id":6119},[430,12905,12906],{},"O Antigravity 2 representa uma grande mudança de uma IDE tradicional para um aplicativo de desktop acessível, capacitando os usuários comuns a atuarem como orquestradores de qualquer tarefa.",[430,12908,12909],{},"No entanto, o Antigravity 2 precisa de alguns ajustes. Quando as funcionalidades falham, a depuração pode ser frustrante devido ao tratamento de erros vago. Além disso, a documentação oficial parece pouco refinada — provavelmente gerada por IA —, já que várias referências e caminhos de arquivo estão incorretos no momento.",[1639,12911,12912],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":425,"searchDepth":1061,"depth":1068,"links":12914},[12915,12916,12917,12920,12921,12922,12923],{"id":1755,"depth":1068,"text":1756},{"id":12278,"depth":1061,"text":12279},{"id":12329,"depth":1061,"text":12330,"children":12918},[12919],{"id":12355,"depth":1075,"text":12356},{"id":12434,"depth":1061,"text":12435},{"id":12808,"depth":1061,"text":12809},{"id":12880,"depth":1061,"text":12881},{"id":6119,"depth":1061,"text":6120},[1659],"2026-06-05","Descubra as novidades do Google Antigravity 2. Leia nosso guia prático para instalar o aplicativo, testar tarefas de agentes de IA e adicionar servidores MCP personalizados manualmente.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002FPT-Setup-Antigravity-2.0.webp","Análise e Configuração do Google Antigravity 2: Agentes de IA, MCPs e Plugins",{"schemaOrg":12930,"robots":1693,"sitemap":12932},[12931],{"@type":1670,"headline":12928,"description":12926},{"lastmod":12925},{"title":12928,"description":12926,"ogTitle":11916,"ogDescription":12926,"twitterTitle":11916,"twitterDescription":12926},"pt\u002Farticle\u002Fsetup-antigravity-2",[],"NBObOBkGAwG819GS00YeBSbT1cm1fHBudYRXJX3iZ_w",{"id":12938,"title":8623,"author":1702,"body":12939,"category":13354,"date":13355,"description":13356,"extension":1664,"image":13357,"imageAlt":13358,"isPublished":1064,"meta":13359,"minRead":1075,"navigation":1064,"path":217,"seo":13365,"stem":13366,"tags":13367,"updatedAt":1702,"__hash__":13368},"article\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents.md",{"type":427,"value":12940,"toc":13344},[12941,12952,12955,12978,12993,12997,13007,13023,13033,13040,13043,13065,13071,13082,13099,13108,13118,13122,13129,13150,13153,13159,13169,13175,13178,13198,13207,13211,13217,13289,13295,13299,13335,13341],[430,12942,12943,12944,12947,12948,12951],{},"Se você executa múltiplos agentes de IA ou CLIs em seu computador — seja Hermes, Claude Code, Codex, Antigravity, Kimi ou outras ferramentas compatíveis —, provavelmente já enfrentou um problema frustrante: ",[441,12945,12946],{},"a fragmentação de habilidades"," (skills). Cada agente ou CLI mantém sua própria pasta ",[495,12949,12950],{},"skills"," separada, o que leva a instalações duplicadas, divergência de versões e sobrecarga de gerenciamento.",[430,12953,12954],{},"Em nosso trabalho diário com agentes de IA, frequentemente nos deparávamos com os seguintes problemas:",[485,12956,12957,12963,12969],{},[488,12958,12959,12962],{},[441,12960,12961],{},"Múltiplas instalações",": Instalar uma nova habilidade para um agente e depois ter que instalá-la novamente para cada um dos outros.",[488,12964,12965,12968],{},[441,12966,12967],{},"Divergência de versões"," (version drift): Personalizar ou corrigir uma habilidade para um agente, esquecer de atualizar o restante e acabar com agentes se comportando de forma diferente.",[488,12970,12971,12974,12975,12977],{},[441,12972,12973],{},"Gerenciamento de habilidades",": Ter que vasculhar cada pasta ",[495,12976,12950],{}," de cada agente no sistema apenas para ver quais habilidades estavam realmente instaladas.",[430,12979,598,12980,12982,12983,12985,12986,461],{},[495,12981,12825],{}," CLI, uma ferramenta de linha de comando de código aberto desenvolvida pela Vercel, resolve esse problema permitindo que você gerencie uma única pasta ",[495,12984,12950],{}," centralizada e a compartilhe entre todos os seus agentes. Você pode conferir o ",[444,12987,12989,12990,12992],{"href":8569,"rel":12988},[448],"repositório do ",[495,12991,12825],{}," no GitHub",[474,12994,12996],{"id":12995},"pasta-centralizada","Pasta Centralizada",[430,12998,12999,13000,13002,13003,13006],{},"O conceito é simples: se apontarmos a pasta ",[495,13001,12950],{}," de cada agente para a ",[441,13004,13005],{},"mesma pasta física",", o problema da fragmentação desaparece por completo.",[430,13008,13009,13010,13012,13013,13015,13016,13019,13020,13022],{},"Quando você instala uma habilidade usando o ",[495,13011,12825],{}," CLI, ela é baixada para a pasta centralizada em sua máquina (",[495,13014,8608],{},"). Em seguida, o CLI cria um ",[441,13017,13018],{},"link simbólico"," (symlink, que funciona como um atalho direto) da pasta ",[495,13021,12950],{}," de cada agente de volta para essa pasta centralizada.",[430,13024,13025,13026,13029,13030,13032],{},"Por exemplo, quando o Claude Code procura por habilidades em ",[495,13027,13028],{},"~\u002F.claude\u002Fskills\u002F",", ele é redirecionado de forma transparente para ",[495,13031,8608],{},". Se você fizer um ajuste em uma habilidade dentro dessa pasta centralizada, cada agente verá a atualização instantaneamente. Sem cópias manuais, sem scripts de sincronização e sem desperdício de espaço em disco.",[474,13034,13036,13037,13039],{"id":13035},"instalando-o-npx-skills-e-adicionando-uma-habilidade","Instalando o ",[495,13038,12825],{}," e Adicionando uma Habilidade",[430,13041,13042],{},"Execute o seguinte comando para começar e adicionar nossa primeira habilidade:",[923,13044,13046],{"className":1032,"code":13045,"language":1034,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill --skill excalidraw-diagram\n",[495,13047,13048],{"__ignoreMap":425},[931,13049,13050,13052,13054,13056,13059,13062],{"class":933,"line":934},[931,13051,7596],{"class":1041},[931,13053,8583],{"class":1045},[931,13055,1055],{"class":1045},[931,13057,13058],{"class":1045}," https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[931,13060,13061],{"class":1045}," --skill",[931,13063,13064],{"class":1045}," excalidraw-diagram\n",[430,13066,13067],{},[433,13068],{"alt":13069,"src":13070},"Usando o comando npx skills add para instalar uma habilidade do GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-add-command.webp",[430,13072,13073,13074,13077,13078],{},"O CLI perguntará se deseja configurar isso para um projeto específico ou globalmente. Geralmente recomendamos escolher ",[441,13075,13076],{},"global"," para que todos os agentes compatíveis possam acessá-la:\n",[433,13079],{"alt":13080,"src":13081},"Selecionando a opção de instalação global na CLI npx skills","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-install-global-prompt.webp",[430,13083,13084,13085,13087,13088,1368,13091,13095],{},"Em seguida, certifique-se de selecionar ",[495,13086,8604],{}," para garantir uma ",[441,13089,13090],{},"única fonte da verdade",[433,13092],{"alt":13093,"src":13094},"Escolhendo o método symlink para sincronização de habilidades","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-symlink-option.webp",[433,13096],{"alt":13097,"src":13098},"Confirmação de instalação bem-sucedida e criação de symlink na CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-installation-completed.webp",[430,13100,13101,13102,1368,13104],{},"Feito isso, podemos verificar que a habilidade está instalada na pasta centralizada em ",[495,13103,8608],{},[433,13105],{"alt":13106,"src":13107},"Verificando as habilidades instaladas no diretório centralizado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-directory-verification.webp",[430,13109,13110,13111,13113,13114],{},"Abra o Kimi CLI (ou qualquer outro agente) e a habilidade ",[495,13112,10205],{}," estará disponível e pronta para uso!\n",[433,13115],{"alt":13116,"src":13117},"Kimi CLI mostrando as habilidades centralizadas carregadas e prontas","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skills-integration.webp",[474,13119,13121],{"id":13120},"criando-uma-habilidade-do-zero","Criando uma Habilidade do Zero",[430,13123,13124,13125,13128],{},"Para criar suas próprias habilidades, você pode usar a ferramenta ",[495,13126,13127],{},"skill-creator"," da Anthropic. Instale-a assim:",[923,13130,13132],{"className":1032,"code":13131,"language":1034,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills --skill skill-creator\n",[495,13133,13134],{"__ignoreMap":425},[931,13135,13136,13138,13140,13142,13145,13147],{"class":933,"line":934},[931,13137,7596],{"class":1041},[931,13139,8583],{"class":1045},[931,13141,1055],{"class":1045},[931,13143,13144],{"class":1045}," https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills",[931,13146,13061],{"class":1045},[931,13148,13149],{"class":1045}," skill-creator\n",[430,13151,13152],{},"Agora, no Kimi ou em qualquer outro agente, insira o seguinte comando (prompt):",[923,13154,13157],{"className":13155,"code":13156,"language":4613},[4611],"Use the skill-creator to help me build a skill for creating a product landing page\n",[495,13158,13156],{"__ignoreMap":425},[430,13160,13161,13162,13164,13165],{},"O Kimi ou o seu agente detectará automaticamente o ",[495,13163,13127],{}," e guiará você passo a passo pelo processo:\n",[433,13166],{"alt":13167,"src":13168},"Assistente interativo skill-creator em execução na Kimi CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skill-creator-setup.webp",[474,13170,13172,13173],{"id":13171},"outros-comandos-úteis-do-npx-skills","Outros Comandos Úteis do ",[495,13174,12825],{},[430,13176,13177],{},"Aqui estão alguns outros comandos práticos:",[485,13179,13180,13186,13192],{},[488,13181,13182,13185],{},[495,13183,13184],{},"npx skills ls -g",": Lista todas as habilidades instaladas globalmente",[488,13187,13188,13191],{},[495,13189,13190],{},"npx skills update",": Mantém todas as habilidades atualizadas com um único comando",[488,13193,13194,13197],{},[495,13195,13196],{},"npx skills remove",": Desinstala\u002Fremove uma habilidade de forma interativa",[430,13199,13200,13201,13206],{},"Consulte o ",[444,13202,12989,13204,12992],{"href":8569,"rel":13203},[448],[495,13205,12825],{}," para ver mais comandos e referências.",[474,13208,13210],{"id":13209},"indo-mais-longe","Indo Mais Longe",[430,13212,13213,13214,13216],{},"Como todas as habilidades agora estão em um único lugar (",[495,13215,8608],{},"), podemos inicializar essa pasta como um repositório Git e enviá-la para o GitHub ou GitLab.",[923,13218,13220],{"className":1032,"code":13219,"language":1034,"meta":425,"style":425},"cd ~\u002F.agents\u002Fskills\ngit init\ngit add .\ngit commit -m \"Initial skills folder\"\ngit remote add origin https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\ngit push -u origin main\n",[495,13221,13222,13229,13236,13244,13260,13275],{"__ignoreMap":425},[931,13223,13224,13226],{"class":933,"line":934},[931,13225,2786],{"class":962},[931,13227,13228],{"class":1045}," ~\u002F.agents\u002Fskills\n",[931,13230,13231,13233],{"class":933,"line":1061},[931,13232,2762],{"class":1041},[931,13234,13235],{"class":1045}," init\n",[931,13237,13238,13240,13242],{"class":933,"line":1068},[931,13239,2762],{"class":1041},[931,13241,1055],{"class":1045},[931,13243,4869],{"class":1045},[931,13245,13246,13248,13250,13253,13255,13258],{"class":933,"line":1075},[931,13247,2762],{"class":1041},[931,13249,12179],{"class":1045},[931,13251,13252],{"class":1045}," -m",[931,13254,3257],{"class":945},[931,13256,13257],{"class":1045},"Initial skills folder",[931,13259,1955],{"class":945},[931,13261,13262,13264,13267,13269,13272],{"class":933,"line":1923},[931,13263,2762],{"class":1041},[931,13265,13266],{"class":1045}," remote",[931,13268,1055],{"class":1045},[931,13270,13271],{"class":1045}," origin",[931,13273,13274],{"class":1045}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\n",[931,13276,13277,13279,13281,13284,13286],{"class":933,"line":1928},[931,13278,2762],{"class":1041},[931,13280,12150],{"class":1045},[931,13282,13283],{"class":1045}," -u",[931,13285,13271],{"class":1045},[931,13287,13288],{"class":1045}," main\n",[430,13290,13291,13292,461],{},"Agora, temos um histórico completo de todas as alterações de habilidades, o que significa que podemos reverter facilmente se uma atualização quebrar algo. Além disso, podemos sincronizar perfeitamente as habilidades entre várias máquinas (como um notebook e um computador desktop) executando um rápido ",[495,13293,13294],{},"git pull",[474,13296,13298],{"id":13297},"alguns-pontos-de-atenção-segurança-e-riscos","Alguns Pontos de Atenção (Segurança e Riscos)",[485,13300,13301,13307,13313,13323,13329],{},[488,13302,13303,13306],{},[441,13304,13305],{},"A compatibilidade varia",": Nem todas as plataformas de agentes oferecem suporte a todos os recursos ainda (como ganchos personalizados ou ferramentas permitidas específicas). Uma habilidade pode funcionar muito bem em um agente, mas falhar em outro.",[488,13308,13309,13312],{},[441,13310,13311],{},"Confie na fonte",": Instale apenas habilidades de fontes confiáveis.",[488,13314,13315,13318,13319,13322],{},[441,13316,13317],{},"Revise antes de executar",": Se estiver usando uma habilidade personalizada ou de terceiros, revise os arquivos (especialmente na pasta ",[495,13320,13321],{},"scripts\u002F",") antes de permitir que o seu agente a execute.",[488,13324,13325,13328],{},[441,13326,13327],{},"Menor privilégio",": Tente não conceder a uma habilidade mais permissões de ferramentas ou acessos do que ela realmente precisa para funcionar.",[488,13330,13331,13334],{},[441,13332,13333],{},"Nunca codifique segredos",": Mantenha suas chaves de API e segredos fora dos arquivos de suas habilidades.",[430,13336,13337,13338,13340],{},"Configurar uma \"única fonte da verdade\" centralizada com o ",[495,13339,12825],{}," poupou nossa equipe de frustrações e trabalho duplicado. Recomendamos muito que faça o teste — os recursos de IA aumentam à medida que suas habilidades crescem!",[1639,13342,13343],{},"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":425,"searchDepth":1061,"depth":1068,"links":13345},[13346,13347,13349,13350,13352,13353],{"id":12995,"depth":1061,"text":12996},{"id":13035,"depth":1061,"text":13348},"Instalando o npx skills e Adicionando uma Habilidade",{"id":13120,"depth":1061,"text":13121},{"id":13171,"depth":1061,"text":13351},"Outros Comandos Úteis do npx skills",{"id":13209,"depth":1061,"text":13210},{"id":13297,"depth":1061,"text":13298},[1659],"2026-06-04","Usa vários agentes de IA como Claude Code ou Kimi? Aprenda a gerenciar uma pasta centralizada de habilidades compartilhada usando o npx skills CLI.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002FFim-da-fragmenta%C3%A7%C3%A3o-de-habilidades-de-agentes-usando-npx-skills.webp","Centralizando habilidades de agentes de IA com npx skills CLI",{"schemaOrg":13360,"robots":1693,"sitemap":13363},[13361],{"@type":1670,"headline":13362,"description":13356},"Como resolver a fragmentação de habilidades de agentes de IA",{"lastmod":13364},"2026-06-03",{"title":13362,"description":13356,"ogTitle":8623,"ogDescription":13356,"twitterTitle":8623,"twitterDescription":13356},"pt\u002Farticle\u002Fcentralised-the-skills-for-agents",[],"NY5BNYfPbnlX-TyHUY_ohBsY_wCDBfEQP2hZsc3QBM4",{"id":13370,"title":13371,"author":1702,"body":13372,"category":13607,"date":13608,"description":13609,"extension":1664,"image":13610,"imageAlt":13611,"isPublished":1064,"meta":13612,"minRead":2270,"navigation":1064,"path":223,"seo":13617,"stem":13618,"tags":13619,"updatedAt":1702,"__hash__":13620},"article\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare.md","Đừng public NodeWarden: Bảo mật qua Cloudflare",{"type":427,"value":13373,"toc":13598},[13374,13377,13380,13394,13398,13405,13407,13411,13414,13418,13448,13452,13455,13522,13526,13529,13593,13595],[430,13375,13376],{},"No momento em que o seu NodeWarden é exposto publicamente na internet, ele começa a atrair milhares de bots automatizados em busca de vulnerabilidades 24 horas por dia, 7 dias por semana. Para proteger seus dados confidenciais, você precisa colocar sua instância do NodeWarden sob o nível máximo de bloqueio possível.",[430,13378,13379],{},"Para proteger sua instância do NodeWarden, você pode usar um dos dois recursos da Cloudflare:",[485,13381,13382,13388],{},[488,13383,13384,13387],{},[441,13385,13386],{},"Cloudflare IP Access Rules (Regras de Acesso por IP):"," Permite bloquear, desafiar (challenge) ou permitir o tráfego com base em endereços IP ou países específicos.",[488,13389,13390,13393],{},[441,13391,13392],{},"Cloudflare Zero Trust (Recomendado):"," Atua como um gateway seguro que torna sua instância do NodeWarden completamente invisível para o público, permitindo a passagem apenas de usuários autorizados.",[2158,13395,13397],{"id":13396},"por-que-recomendamos-o-cloudflare-zero-trust","Por que recomendamos o Cloudflare Zero Trust",[430,13399,13400,13401,13404],{},"Aconselhamos fortemente o uso do Cloudflare Zero Trust, pois as regras de acesso por IP estão vinculadas a endereços IP ou países, o que significa que você precisa atualizar manualmente suas regras toda vez que viajar ou se tiver um IP dinâmico. Por outro lado, o Cloudflare Zero Trust se baseia na sua ",[441,13402,13403],{},"identidade",", e não na sua localização — proporcionando um acesso contínuo e seguro ao NodeWarden.",[12274,13406],{},[474,13408,13410],{"id":13409},"guia-de-configuração","Guia de Configuração",[430,13412,13413],{},"Siga estas etapas para configurar o Cloudflare Zero Trust para o NodeWarden.",[2158,13415,13417],{"id":13416},"fase-1-primeiros-passos","Fase 1: Primeiros passos",[533,13419,13420,13427,13434,13441],{},[488,13421,13422,13423],{},"No seu painel da Cloudflare, clique em 'Zero Trust' no menu à esquerda.\n",[433,13424],{"alt":13425,"src":13426},"Barra lateral do painel da Cloudflare mostrando a opção Zero Trust selecionada no menu de navegação.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-dashboard-zero-trust-sidebar.webp",[488,13428,13429,13430],{},"Clique em 'Access controls' e depois em 'Applications'.\n",[433,13431],{"alt":13432,"src":13433},"Menu de navegação do Cloudflare Zero Trust com a seção de Controles de acesso expandida.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-access-controls-menu.webp",[488,13435,13436,13437],{},"Pode ser solicitado que você escolha um plano ('Choose a plan').\n",[433,13438],{"alt":13439,"src":13440},"Tela de configuração da conta Cloudflare Zero Trust solicitando que o usuário escolha um plano de assinatura.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-choose-plan-setup.webp",[488,13442,13443,13444],{},"Clique no botão 'Choose a plan' e escolha o plano 'Zero Trust Free'.\n",[433,13445],{"alt":13446,"src":13447},"A página de detalhes do plano Zero Trust Free na Cloudflare, destacando o botão Selecionar plano.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-free-plan-selection.webp",[2158,13449,13451],{"id":13450},"fase-2-proteja-sua-interface-web","Fase 2: Proteja sua interface Web",[430,13453,13454],{},"Primeiro, vamos criar uma aplicação para proteger o painel web do NodeWarden.",[533,13456,13457,13464,13471,13478,13485,13492,13499,13502,13509,13512],{},[488,13458,13459,13460],{},"Clique em 'Create new application' para criar a primeira aplicação.\n",[433,13461],{"alt":13462,"src":13463},"Painel de aplicativos do Cloudflare Access com o botão Criar novo aplicativo.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-create-new-application.webp",[488,13465,13466,13467],{},"Escolha 'Self-hosted and private'.\n",[433,13468],{"alt":13469,"src":13470},"O modal Adicionar um aplicativo no Cloudflare Access com o tipo de aplicativo Auto-hospedado e privado selecionado.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-add-self-hosted-application.webp",[488,13472,13473,13474],{},"Insira o nome de domínio do NodeWarden.\n",[433,13475],{"alt":13476,"src":13477},"Tela de configuração do aplicativo Cloudflare Access mostrando o hostname público configurado como warden.techvoyage.dev.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-application-public-hostname.webp",[488,13479,13480,13481],{},"Clique em 'Create new policy' para criar uma política.\n",[433,13482],{"alt":13483,"src":13484},"Página de políticas do Cloudflare Access mostrando que nenhuma política foi adicionada e um botão para criar uma nova política.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.webp",[488,13486,13487,13488],{},"Selecione 'Emails' e insira um e-mail na seção 'Policy rules'.\n",[433,13489],{"alt":13490,"src":13491},"Tela de configuração da regra de política do Cloudflare Access com um endereço de e-mail especificado como critério de inclusão.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.webp",[488,13493,13494,13495],{},"Insira um nome e selecione 'Allow' na seção 'Policy details'.\n",[433,13496],{"alt":13497,"src":13498},"Tela de detalhes da política do Cloudflare Access mostrando o nome da política NodeWarden-Web e a ação definida como Permitir.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-details-allow.webp",[488,13500,13501],{},"Clique em 'Save Policy' para criar a política.",[488,13503,13504,13505],{},"Insira um nome e selecione '1 month' na seção 'Details'.\n",[433,13506],{"alt":13507,"src":13508},"Resumo final de la configuración para um aplicativo Cloudflare Access chamado NodeWarden-Web com duração de sessão de um mês.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-application-final-details.webp",[488,13510,13511],{},"Clique em 'Create' para criar a aplicação.",[488,13513,13514,13517,13518],{},[441,13515,13516],{},"Teste:"," Abra o domínio no navegador da web; você verá o 'Cloudflare Access' solicitando o e-mail.\n",[433,13519],{"alt":13520,"src":13521},"Uma visualização da tela de login do Cloudflare Access para NodeWarden-Web, solicitando um endereço de e-mail.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-login-screen-preview.webp",[2158,13523,13525],{"id":13524},"fase-3-permitir-a-sincronização-dos-clientes-bitwarden-bypass-de-api","Fase 3: Permitir a Sincronização dos Clientes BitWarden (Bypass de API)",[430,13527,13528],{},"Os aplicativos de desktop e mobile do BitWarden não conseguem processar a tela de login por e-mail da Cloudflare, por isso precisamos criar uma segunda aplicação que permita que o tráfego ignore (bypass) a tela de login especificamente para a sincronização da API.",[533,13530,13531,13542,13557,13562,13569,13576,13579,13586],{},[488,13532,13533,13534,13537,13538,13541],{},"Volte para Applications e clique em ",[441,13535,13536],{},"Create new application",", escolhendo ",[441,13539,13540],{},"Self-hosted and private"," novamente.",[488,13543,13544,13545,13548,13549,13552,13553],{},"Insira 'api\u002F",[899,13546,13547],{},"', 'identity\u002F","', 'notifications\u002F",[899,13550,13551],{},"' e 'icons\u002F","' na seção Destinations.\n",[433,13554],{"alt":13555,"src":13556},"Configurando múltiplos hostnames públicos para bypass de API no Cloudflare Access, incluindo os caminhos api, identity, notifications e icons.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-api-bypass-destinations.webp",[488,13558,13559,13560],{},"Clique em 'Create new policy' para criar a política.\n",[433,13561],{"alt":13483,"src":13484},[488,13563,13564,13565],{},"Selecione 'Everyone' em 'Policy rules'.\n",[433,13566],{"alt":13567,"src":13568},"Configuração da regra de política do Cloudflare Access com Todos selecionado para permitir acesso amplo a caminhos específicos.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-everyone.webp",[488,13570,13571,13572],{},"Insira un nome e selecione 'Bypass' em 'Policy details'.\n",[433,13573],{"alt":13574,"src":13575},"Detalhes da política do Cloudflare Access para NodeWarden-API com la acción definida como Bypass.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-details-bypass.webp",[488,13577,13578],{},"Clique em 'Save Policy' para salvar.",[488,13580,13581,13582],{},"Insira um nome e selecione '1 month' para 'Session Duration'.\n",[433,13583],{"alt":13584,"src":13585},"Tela de configuração final para o aplicativo NodeWarden-API no Cloudflare Access.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-api-application-final-details.webp",[488,13587,13588,13589],{},"Você deverá ter 2 aplicações criadas no final.\n",[433,13590],{"alt":13591,"src":13592},"O painel de aplicativos do Cloudflare Access mostrando os aplicativos Web e API criados com sucesso.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-applications-list-final.webp",[474,13594,8002],{"id":6119},[430,13596,13597],{},"Lembre-se apenas de que a Cloudflare é o seu escudo de proteção externo. Para manter um cofre (vault) verdadeiramente seguro, certifique-se de continuar usando uma senha mestra forte, de utilizar a Autenticação de Dois Fatores (2FA) e de manter a sua conta da Cloudflare segura.",{"title":425,"searchDepth":1061,"depth":1068,"links":13599},[13600,13601,13606],{"id":13396,"depth":1075,"text":13397},{"id":13409,"depth":1061,"text":13410,"children":13602},[13603,13604,13605],{"id":13416,"depth":1075,"text":13417},{"id":13450,"depth":1075,"text":13451},{"id":13524,"depth":1075,"text":13525},{"id":6119,"depth":1061,"text":8002},[2602,9443],"2026-05-27","No momento em que o seu NodeWarden é exposto publicamente na internet, ele começa a atrair milhares de bots automatizados em busca de vulnerabilidades 24 horas por dia, 7 dias por semana.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fproteja-nodewarden-integracao-cloudflare-guia.webp","Miniatura de um guia passo a passo para proteger um cofre NodeWarden com integração Cloudflare, mostrando um cofre digital acorrentado e um rack de servidores protegido.",{"schemaOrg":13613,"robots":1693,"sitemap":13616},[13614],{"@type":1670,"headline":13615,"description":13609},"Pare de expor seu cofre: Proteja o NodeWarden com Cloudflare",{"lastmod":13608},{"title":13615,"description":13609,"ogTitle":13615,"ogDescription":13609,"twitterTitle":13615,"twitterDescription":13609},"pt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",[],"5dmQaCfyaGhc3hILQQ9Sfx1PfBK37V47AOmO-4fZaNk",{"id":13622,"title":13623,"author":1702,"body":13624,"category":14191,"date":14192,"description":14193,"extension":1664,"image":14194,"imageAlt":14195,"isPublished":1064,"meta":14196,"minRead":2270,"navigation":1064,"path":231,"seo":14201,"stem":14202,"tags":14203,"updatedAt":1702,"__hash__":14204},"article\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare.md","Como auto-hospedar um cofre de senhas tipo BitWarden",{"type":427,"value":13625,"toc":14176},[13626,13629,13636,13640,13823,13827,13843,13847,13877,13881,13911,13915,13949,13953,13996,14000,14036,14040,14043,14047,14076,14080,14103,14107,14110,14127,14132,14135,14138,14152,14156,14169,14171],[430,13627,13628],{},"Suas senhas são a sua propriedade digital mais crítica, e mantê-las seguras significa tê-las em suas próprias mãos. Ao fazer o self-hosting do seu gerenciador de senhas, você assume o controle da sua própria segurança.",[430,13630,13631,13632,13635],{},"O ",[441,13633,13634],{},"BitWarden","​ é amplamente considerado um dos mais confiáveis no domínio de gerenciamento de senhas e seu código-fonte é disponibilizado sob a licença AGPL-3.0. O NodeWarden é um servidor não oficial compatível com o BitWarden, escrito em BitWarden, que pode ser feito deploy gratuitamente na Cloudflare.",[474,13637,13639],{"id":13638},"comparação-de-funcionalidades-com-o-servidor-oficial-do-bitwarden","Comparação de Funcionalidades com o Servidor Oficial do BitWarden",[604,13641,13642,13657],{},[607,13643,13644],{},[610,13645,13646,13649,13651,13654],{},[613,13647,13648],{},"Funcionalidade",[613,13650,13634],{},[613,13652,13653],{},"NodeWarden",[613,13655,13656],{},"Notas",[633,13658,13659,13675,13690,13702,13714,13729,13745,13760,13775,13787,13799,13812],{},[610,13660,13661,13664,13667,13669],{},[638,13662,13663],{},"Cofre Web (Web Vault)",[638,13665,13666],{},"✅",[638,13668,13666],{},[638,13670,13671,13674],{},[441,13672,13673],{},"Interface original do Web Vault","​",[610,13676,13677,13683,13685,13687],{},[638,13678,13679,13680],{},"Sincronização completa ",[495,13681,13682],{},"\u002Fapi\u002Fsync",[638,13684,13666],{},[638,13686,13666],{},[638,13688,13689],{},"Compatibilidade otimizada para clientes oficiais",[610,13691,13692,13695,13697,13699],{},[638,13693,13694],{},"Upload \u002F download de anexos",[638,13696,13666],{},[638,13698,13666],{},[638,13700,13701],{},"Cloudflare R2 ou KV",[610,13703,13704,13707,13709,13711],{},[638,13705,13706],{},"Send (Enviar)",[638,13708,13666],{},[638,13710,13666],{},[638,13712,13713],{},"Suporta envio de textos e de arquivos",[610,13715,13716,13719,13721,13723],{},[638,13717,13718],{},"Importar \u002F Exportar",[638,13720,13666],{},[638,13722,13666],{},[638,13724,13725,13726,13674],{},"Suporta importação do BitWarden JSON \u002F CSV \u002F ",[441,13727,13728],{},"ZIP com anexos",[610,13730,13731,13736,13738,13740],{},[638,13732,13733,13674],{},[441,13734,13735],{},"Central de Backup em Nuvem",[638,13737,8545],{},[638,13739,13666],{},[638,13741,13742,13674],{},[441,13743,13744],{},"Backup agendado para WebDAV \u002F E3",[610,13746,13747,13750,13753,13755],{},[638,13748,13749],{},"Dica de senha (web)",[638,13751,13752],{},"⚠️ Limitado",[638,13754,13666],{},[638,13756,13757,13674],{},[441,13758,13759],{},"Não exige e-mail",[610,13761,13762,13765,13767,13769],{},[638,13763,13764],{},"TOTP \u002F Steam TOTP",[638,13766,13666],{},[638,13768,13666],{},[638,13770,13771,13772],{},"Inclui suporte a ",[495,13773,13774],{},"steam:\u002F\u002F",[610,13776,13777,13780,13782,13784],{},[638,13778,13779],{},"Multiusuário",[638,13781,13666],{},[638,13783,13666],{},[638,13785,13786],{},"Registro baseado em convite",[610,13788,13789,13792,13794,13796],{},[638,13790,13791],{},"Organizações \u002F Coleções \u002F Papéis",[638,13793,13666],{},[638,13795,8545],{},[638,13797,13798],{},"Não implementado",[610,13800,13801,13804,13806,13809],{},[638,13802,13803],{},"Login com 2FA",[638,13805,13666],{},[638,13807,13808],{},"⚠️ Parcial",[638,13810,13811],{},"Atualmente apenas TOTP em nível de usuário",[610,13813,13814,13817,13819,13821],{},[638,13815,13816],{},"SSO \u002F SCIM \u002F Diretório corporativo",[638,13818,13666],{},[638,13820,8545],{},[638,13822,13798],{},[474,13824,13826],{"id":13825},"o-que-precisamos","O que precisamos:",[533,13828,13829,13834,13840],{},[488,13830,13831],{},[441,13832,13833],{},"Uma conta no GitHub",[488,13835,13836,13839],{},[441,13837,13838],{},"Uma conta na Cloudflare","​ (Gratuita) com o Cloudflare R2 Storage ativado.",[488,13841,13842],{},"_Opcional:_Um nome de domínio personalizado gerenciado na Cloudflare.",[879,13844,13846],{"id":13845},"fase-1-preparar-o-código","Fase 1: Preparar o Código",[533,13848,13849,13868],{},[488,13850,13851,13852,13856,13857,13861,13862,13864],{},"Faça um _fork_do repositório do NodeWarden acessando ",[444,13853,13854],{"href":13854,"rel":13855},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fnodewarden",[448]," do repositório original ",[444,13858,13859],{"href":13859,"rel":13860},"https:\u002F\u002Fgithub.com\u002Fshuaiplus\u002Fnodewarden",[448]," GitHub.",[1879,13863],{},[433,13865],{"alt":13866,"src":13867},"Fazendo um fork do repositório NodeWarden no GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Ffork-nodewarden-repo.webp",[488,13869,13870,13871,13873],{},"Ative o Workflow \"Sync Upstream\".",[1879,13872],{},[433,13874],{"alt":13875,"src":13876},"Ativando o fluxo de trabalho Sync Upstream no GitHub Actions","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fenable-sync-upstream.webp",[879,13878,13880],{"id":13879},"fase-2-fazer-o-deploy-na-cloudflare","Fase 2: Fazer o Deploy na Cloudflare",[533,13882,13883,13892,13905],{},[488,13884,13885,13886,13888],{},"Crie uma aplicação Worker na Cloudflare.",[1879,13887],{},[433,13889],{"alt":13890,"src":13891},"Criando um novo aplicativo Worker no painel do Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcreate-cloudflare-worker.webp",[488,13893,13894,13895,13897,13901],{},"Selecione 'Continue with GitHub' para fazer o deploy do app.",[1879,13896],{},[433,13898],{"alt":13899,"src":13900},"Implantando o aplicativo NodeWarden conectando ao GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fdeploy-github-repo.webp",[433,13902],{"alt":13903,"src":13904},"Progresso de compilação e implantação do Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-deploy-status.webp",[488,13906,13907,13908,461],{},"Aguarde alguns instantes até a Cloudflare fazer a build e o deploy do seu app. Ele fornecerá uma URL padrão terminada em ",[495,13909,13910],{},"worker.dev",[879,13912,13914],{"id":13913},"opcional-adicionar-um-domínio-personalizado","(Opcional) Adicionar um Domínio Personalizado:",[485,13916,13917,13923,13936],{},[488,13918,13919,13920,461],{},"Nas configurações do seu Cloudflare Worker, vá para a aba ",[441,13921,13922],{},"Settings",[488,13924,13925,13926,13929,13930,13929,13933,461],{},"Clique em ",[441,13927,13928],{},"Triggers","​ -> ",[441,13931,13932],{},"Custom Domains",[441,13934,13935],{},"+ Add Custom Domain",[488,13937,13938,13939,13941,13945],{},"Digite seu domínio de preferência e siga as instruções.",[1879,13940],{},[433,13942],{"alt":13943,"src":13944},"Navegando para as configurações de domínio personalizado no Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fworker-settings-custom-domain.webp",[433,13946],{"alt":13947,"src":13948},"Adicionando um domínio personalizado ao Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fadd-custom-domain.webp",[879,13950,13952],{"id":13951},"fase-3-proteger-seu-servidor-o-segredo-jwt","Fase 3: Proteger Seu Servidor (O Segredo JWT)",[533,13954,13955,13958,13970,13990],{},[488,13956,13957],{},"Vá até o seu navegador de internet e insira o nome do seu domínio personalizado ou o domínio 'worker.dev' gerado.",[488,13959,13960,13961,461,13964,13966],{},"Você receberá o aviso '",[441,13962,13963],{},"JWT_SECRET is missing'",[1879,13965],{},[433,13967],{"alt":13968,"src":13969},"Mensagem de erro JWT_SECRET is missing no servidor NodeWarden","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fjwt-secret-missing-error.webp",[488,13971,13972,13973,13976,13977,1868,13980,13982,13986],{},"Copie a chave secreta (secret key) gerada, volte para a aba de Settings no seu NodeWarden Worker e clique no botão '",[441,13974,13975],{},"+ Add","' na seção '",[441,13978,13979],{},"Variables and Secrets",[1879,13981],{},[433,13983],{"alt":13984,"src":13985},"Seção de Variáveis e Segredos nas configurações do Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fworker-variables-secrets.webp",[433,13987],{"alt":13988,"src":13989},"Adicionando o segredo JWT gerado às variáveis do Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fadd-jwt-secret.webp",[488,13991,13992,13993,1868],{},"Insira o segredo gerado e clique no botão '",[441,13994,13995],{},"Deploy \u002F Save",[879,13997,13999],{"id":13998},"fase-4-criar-sua-conta-de-administrador","Fase 4: Criar sua Conta de Administrador",[533,14001,14002,14011,14024,14033],{},[488,14003,14004,14005,14007],{},"Volte ao navegador web e recarregue a página; você verá a seguinte tela de login.",[1879,14006],{},[433,14008],{"alt":14009,"src":14010},"Página de login do servidor NodeWarden","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fnodewarden-login.webp",[488,14012,14013,14014,14017,14018,14020],{},"Clique em '",[441,14015,14016],{},"Create Account","' para criar a conta de administrador.",[1879,14019],{},[433,14021],{"alt":14022,"src":14023},"Clicando no botão Create Account na página de login do NodeWarden","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcreate-account-button.webp",[488,14025,14026,14027,14029],{},"Faça login usando a conta admin recém-criada para acessar o Dashboard.",[1879,14028],{},[433,14030],{"alt":14031,"src":14032},"Visão geral do painel de administração do NodeWarden","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fnodewarden-dashboard.webp",[488,14034,14035],{},"Agora temos o servidor rodando e operante. Vamos começar a configurar os clientes do BitWarden.",[879,14037,14039],{"id":14038},"fase-5-conectar-seus-dispositivos","Fase 5: Conectar Seus Dispositivos",[430,14041,14042],{},"Você pode usar os aplicativos oficiais do BitWarden em todos os seus dispositivos.",[2158,14044,14046],{"id":14045},"extensão-do-chrome","Extensão do Chrome",[533,14048,14049,14052,14055,14064,14073],{},[488,14050,14051],{},"Instale a extensão do BitWarden no Chrome.",[488,14053,14054],{},"Abra a extensão.",[488,14056,14057,14058,14060],{},"Clique no link ao lado de 'Accessing:' na parte inferior da janelinha popup.",[1879,14059],{},[433,14061],{"alt":14062,"src":14063},"Selecionando a opção auto-hospedado na extensão do Bitwarden para Chrome","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-extension-self-hosted.webp",[488,14065,14066,14067,14069],{},"Insira o nome de domínio do servidor NodeWarden.",[1879,14068],{},[433,14070],{"alt":14071,"src":14072},"Inserindo a URL do servidor na extensão do Bitwarden para Chrome","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-extension-domain.webp",[488,14074,14075],{},"Salve as configurações e faça o login com sua conta.",[2158,14077,14079],{"id":14078},"app-para-ios","App para iOS",[533,14081,14082,14085,14094],{},[488,14083,14084],{},"Instale o app do BitWarden através da App Store.",[488,14086,14087,14088,14090],{},"Abra o app e clique em '' ao lado de 'Logging in on:'.",[1879,14089],{},[433,14091],{"alt":14092,"src":14093},"Acessando as configurações de auto-hospedado no aplicativo Bitwarden para iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-ios-self-hosted.webp",[488,14095,14096,14097,14099],{},"Insira o nome de domínio do servidor NodeWarden e clique no botão '✓'.",[1879,14098],{},[433,14100],{"alt":14101,"src":14102},"Configurando a URL do servidor no aplicativo Bitwarden para iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-ios-domain.webp",[879,14104,14106],{"id":14105},"outros-clientes","Outros Clientes",[430,14108,14109],{},"O NodeWarden foi testado e confirmou-se compatível com estes clientes oficiais do BitWarden:",[485,14111,14112,14115,14118,14121,14124],{},[488,14113,14114],{},"✅ Windows (desktop)",[488,14116,14117],{},"✅ Apps mobile Android\u002FiOS",[488,14119,14120],{},"✅ Extensões de navegador",[488,14122,14123],{},"✅ Linux (desktop)",[488,14125,14126],{},"⚠️ macOS desktop (não verificado totalmente)",[14128,14129,14131],"h1",{"id":14130},"backup-do-cofre-vault","Backup do Cofre (Vault)",[430,14133,14134],{},"O NodeWarden permite fazer backup do seu cofre no seu computador local ou em um armazenamento remoto (armazenamento compatível com S3 ou WebDAV).",[430,14136,14137],{},"Para automatizar backups remotos:",[485,14139,14140,14143],{},[488,14141,14142],{},"Configure os detalhes do armazenamento remoto dentro do painel do NodeWarden.",[488,14144,14145,14146,14148],{},"Certifique-se de que a tarefa Cron esteja configurada nas configurações do seu Cloudflare Worker para o backup remoto automático.",[1879,14147],{},[433,14149],{"alt":14150,"src":14151},"Configurando gatilhos Cron para backups automáticos do cofre no Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-worker-cron.webp",[14128,14153,14155],{"id":14154},"recomendações-finais-de-segurança","Recomendações Finais de Segurança",[485,14157,14158,14161,14164],{},[488,14159,14160],{},"Proteja o acesso da sua conta na Cloudflare, caso contrário, os dados podem ser comprometidos. Ative a Autenticação de Dois Fatores (2FA) ou o Passkey em sua conta da Cloudflare imediatamente.",[488,14162,14163],{},"Hospede o NodeWarden em uma conta da Cloudflare dedicada. Não compartilhe os recursos com outras aplicações web para minimizar os riscos de segurança.",[488,14165,14166],{},[444,14167,14168],{"href":371},"Proteger o NodeWarden com a Cloudflare",[14128,14170,4001],{"id":1610},[485,14172,14173],{},[488,14174,14175],{},"Guia Oficial de Início do NodeWarden",{"title":425,"searchDepth":1061,"depth":1068,"links":14177},[14178,14179],{"id":13638,"depth":1061,"text":13639},{"id":13825,"depth":1061,"text":13826,"children":14180},[14181,14182,14183,14184,14185,14186,14190],{"id":13845,"depth":1068,"text":13846},{"id":13879,"depth":1068,"text":13880},{"id":13913,"depth":1068,"text":13914},{"id":13951,"depth":1068,"text":13952},{"id":13998,"depth":1068,"text":13999},{"id":14038,"depth":1068,"text":14039,"children":14187},[14188,14189],{"id":14045,"depth":1075,"text":14046},{"id":14078,"depth":1075,"text":14079},{"id":14105,"depth":1068,"text":14106},[2602,9443],"2026-05-25","Suas senhas são a sua propriedade digital mais crítica, e mantê-las seguras significa tê-las em suas próprias mãos.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fservidor-auto-hospedado-bitwarden.webp","Miniatura do tutorial de hospedagem de um servidor compatível com Bitwarden, exibindo um cofre digital e um rack de servidores seguro.",{"schemaOrg":14197,"robots":1693,"sitemap":14200},[14198],{"@type":1670,"headline":14199,"description":14193},"Como proteger suas senhas no seu próprio cofre hospedando um servidor compatível com BitWarden",{"lastmod":14192},{"title":14199,"description":14193,"ogTitle":14199,"ogDescription":14193,"twitterTitle":14199,"twitterDescription":14193},"pt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",[],"90VG2W5bTdw1xwbt6O1UTfLLUyOJxshz-Pc4dRRNILg",1792489976851]