[{"data":1,"prerenderedAt":6356},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices":421,"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices-surround":1947},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"id":422,"title":423,"author":424,"body":425,"category":1921,"date":1923,"description":1924,"extension":1925,"image":1926,"imageAlt":1927,"isPublished":740,"meta":1928,"minRead":1182,"navigation":740,"path":239,"seo":1937,"stem":1939,"tags":1940,"updatedAt":1945,"__hash__":1946},"article\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices.md","Sincronizar cofres do Obsidian entre dispositivos","",{"type":426,"value":427,"toc":1899},"minimark",[428,432,438,449,458,478,483,492,497,503,519,535,538,543,548,555,560,564,569,644,651,684,688,696,704,711,778,781,800,807,819,823,827,838,843,854,876,881,895,900,906,911,926,929,934,937,942,946,951,966,970,984,994,998,1003,1006,1016,1049,1053,1060,1212,1246,1251,1272,1283,1288,1292,1302,1375,1379,1385,1422,1553,1560,1566,1573,1579,1582,1588,1594,1608,1619,1626,1632,1639,1776,1782,1787,1790,1795,1798,1802,1807,1812,1818,1829,1839,1843,1854,1859,1865,1868,1872,1895],[429,430,431],"p",{},"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,434],"img",{"src":435,"alt":436,"style":437},"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;",[429,439,440,441,448],{},"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 ",[442,443,447],"a",{"href":444,"rel":445},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[446],"nofollow","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.",[429,450,451,452,457],{},"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 ",[442,453,456],{"href":454,"rel":455},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[446],"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.",[429,459,460,461,464,465,467,468,471,472,477],{},"Neste guia, iremos configurar o ",[462,463,447],"strong",{}," e o ",[462,466,456],{}," num ",[462,469,470],{},"VPS"," (Servidor Privado Virtual), alojando-os de forma segura dentro de uma rede privada ",[462,473,474],{},[442,475,476],{"href":363},"Cloudflare Zero Trust",", em vez de os expor à internet aberta.",[433,479],{"src":480,"alt":481,"style":482},"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;",[484,485],"article-card",{"description":486,"image":487,"image-alt":488,"label":489,"min-read":490,"title":491,"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",[493,494,496],"h2",{"id":495},"sincronização-segura-de-cofres-do-obsidian-com-o-synch","Sincronização segura de cofres do Obsidian com o Synch",[429,498,499,500,502],{},"O ",[462,501,447],{}," oferece as seguintes funcionalidades:",[504,505,506,510,513,516],"ul",{},[507,508,509],"li",{},"Sincroniza o seu cofre assim que são detetadas alterações",[507,511,512],{},"Encripta os dados do cofre antes do carregamento",[507,514,515],{},"Permite a restauração a partir do histórico de versões",[507,517,518],{},"Inclui gestão automática de conflitos",[429,520,499,521,523,524,527,528,531,532,534],{},[462,522,447],{}," gera uma ",[462,525,526],{},"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 ",[462,529,530],{},"palavra-passe do cofre","; esta palavra-passe é utilizada para proteger a ",[462,533,526],{},", permitindo que esta seja armazenada de forma segura no servidor e desbloqueada noutros dispositivos.",[429,536,537],{},"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.",[539,540,542],"h3",{"id":541},"configurar-o-synch-no-seu-vps","Configurar o Synch no seu VPS",[544,545,547],"h4",{"id":546},"criar-um-nome-de-domínio","Criar um nome de domínio",[429,549,550,551,554],{},"Crie um registo A no Cloudflare e defina o estado do proxy para ",[462,552,553],{},"Apenas DNS"," (ignorando o CDN do Cloudflare).",[433,556],{"src":557,"alt":558,"style":559},"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;",[544,561,563],{"id":562},"instalar-o-synch-com-docker-no-ubuntu","Instalar o Synch com Docker no Ubuntu",[565,566,568],"h5",{"id":567},"clonar-o-repositório","Clonar o repositório",[570,571,575],"pre",{"className":572,"code":573,"language":574,"meta":424,"style":424},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","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","bash",[576,577,578,598,604,611,621,626,632],"code",{"__ignoreMap":424},[579,580,583,587,591,594],"span",{"class":581,"line":582},"line",1,[579,584,586],{"class":585},"sBMFI","git",[579,588,590],{"class":589},"sfazB"," clone",[579,592,593],{"class":589}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[579,595,597],{"class":596},"sTEyZ","       \n",[579,599,601],{"class":581,"line":600},2,[579,602,603],{"class":596},"        \n",[579,605,607],{"class":581,"line":606},3,[579,608,610],{"class":609},"sHwdD","# Navegar para a pasta da API\n",[579,612,614,618],{"class":581,"line":613},4,[579,615,617],{"class":616},"s2Zo4","cd",[579,619,620],{"class":589}," synch\u002Fapps\u002Fapi\n",[579,622,624],{"class":581,"line":623},5,[579,625,603],{"class":596},[579,627,629],{"class":581,"line":628},6,[579,630,631],{"class":609},"# Copiar o ficheiro de ambiente de exemplo:\n",[579,633,635,638,641],{"class":581,"line":634},7,[579,636,637],{"class":585},"cp",[579,639,640],{"class":589}," .env.example",[579,642,643],{"class":589}," .env\n",[565,645,647,648],{"id":646},"editar-os-valores-do-env","Editar os valores do ",[576,649,650],{},".env",[504,652,653,659,678],{},[507,654,655,658],{},[576,656,657],{},"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).",[507,660,661,664,665,668,669,673,674,677],{},[576,662,663],{},"BETTER_AUTH_SECRET"," e ",[576,666,667],{},"SYNC_TOKEN_SECRET",": Gere chaves seguras utilizando esta ",[442,670,672],{"href":671},"\u002Fpt\u002Ftools\u002Fsecret-key-hex","ferramenta online de chaves secretas"," ou executando ",[576,675,676],{},"openssl rand -hex 32"," duas vezes no seu terminal.",[507,679,680,683],{},[576,681,682],{},"AUTH_ALLOWED_EMAILS",": Uma lista separada por vírgulas dos endereços de e-mail autorizados a registar-se e criar contas.",[565,685,687],{"id":686},"adicionar-o-domínio-ao-caddyfile","Adicionar o domínio ao Caddyfile",[429,689,690,691,695],{},"Os detalhes sobre como o módulo DNS do Cloudflare é integrado com o Caddy e iniciado num contentor podem ser consultados no nosso ",[442,692,694],{"href":693},"\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#_4-enable-https-with-caddy","artigo sobre a auto-hospedagem do Buzz",".",[484,697],{"description":698,"image":699,"image-alt":700,"label":701,"min-read":702,"title":703,"to":693},"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","12","Como auto-hospedar o Buzz do Block: Espaço para agentes de IA",[429,705,706,707,710],{},"Inclua a diretiva ",[576,708,709],{},"SYNCH_DOMAIN"," no seu Caddyfile, apontando para a porta 8787 (a porta utilizada pelo contentor do Synch):",[570,712,716],{"className":713,"code":714,"language":715,"meta":424,"style":424},"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",[576,717,718,724,732,736,742,756,761,773],{"__ignoreMap":424},[579,719,720],{"class":581,"line":582},[579,721,723],{"class":722},"sMK4o","{\n",[579,725,726,729],{"class":581,"line":600},[579,727,728],{"class":596},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[579,730,731],{"class":722},"}\n",[579,733,734],{"class":581,"line":606},[579,735,731],{"class":596},[579,737,738],{"class":581,"line":613},[579,739,741],{"emptyLinePlaceholder":740},true,"\n",[579,743,744,747,750,753],{"class":581,"line":623},[579,745,746],{"class":722},"{",[579,748,749],{"class":596},"$SYNCH_DOMAIN",[579,751,752],{"class":722},"}",[579,754,755],{"class":722}," {\n",[579,757,758],{"class":581,"line":628},[579,759,760],{"class":596},"  encode zstd gzip\n",[579,762,763,766,769],{"class":581,"line":634},[579,764,765],{"class":596},"  reverse_proxy host.docker.internal",[579,767,768],{"class":722},":",[579,770,772],{"class":771},"sbssI","8787\n",[579,774,776],{"class":581,"line":775},8,[579,777,731],{"class":722},[429,779,780],{},"Inicie o contentor:",[570,782,784],{"className":572,"code":783,"language":574,"meta":424,"style":424},"docker compose up -d\n",[576,785,786],{"__ignoreMap":424},[579,787,788,791,794,797],{"class":581,"line":582},[579,789,790],{"class":585},"docker",[579,792,793],{"class":589}," compose",[579,795,796],{"class":589}," up",[579,798,799],{"class":589}," -d\n",[429,801,802,803,806],{},"Execute o seguinte comando ",[576,804,805],{},"curl"," para verificar a sua disponibilidade:",[570,808,810],{"className":572,"code":809,"language":574,"meta":424,"style":424},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[576,811,812],{"__ignoreMap":424},[579,813,814,816],{"class":581,"line":582},[579,815,805],{"class":585},[579,817,818],{"class":589}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[539,820,822],{"id":821},"ligar-o-obsidian-ao-seu-servidor-synch","Ligar o Obsidian ao seu servidor Synch",[544,824,826],{"id":825},"instalar-o-plug-in-synch-no-obsidian","Instalar o plug-in Synch no Obsidian",[429,828,829,830,833,834,837],{},"Abra as Definições do Obsidian, navegue para ",[462,831,832],{},"Community plugins"," (Plug-ins da comunidade) e clique no botão ",[462,835,836],{},"'Browse'"," (Procurar):",[433,839],{"src":840,"alt":841,"style":842},"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;",[429,844,845,846,849,850],{},"Procure e instale ",[462,847,848],{},"'Synchrun'",":\n",[433,851],{"src":852,"alt":853,"style":559},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","Instalando o plugin Synchrun no Obsidian",[429,855,856,857,859,860,863,864,867,868,871,872,875],{},"Assim que o ",[462,858,848],{}," estiver instalado, abra as definições do plug-in e ative ",[462,861,862],{},"'Use a self-hosted server'"," (Utilizar um servidor auto-hospedado). Em seguida, introduza ",[576,865,866],{},"https:\u002F\u002Fsynch.pafor.me"," no campo ",[462,869,870],{},"'Server URL'"," (URL do Servidor) e clique em ",[462,873,874],{},"'Save'"," (Guardar).",[433,877],{"src":878,"alt":879,"style":880},"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;",[429,882,883,884,887,888,891,892,894],{},"Clique no botão ",[462,885,886],{},"'Sign in on this device'"," (Iniciar sessão neste dispositivo) sob ",[462,889,890],{},"'Account'"," (Conta). A seguir, registe-se para obter uma conta utilizando o endereço de e-mail especificado na sua lista ",[576,893,682],{},"; será então redirecionado para a seguinte página de autorização:",[433,896],{"src":897,"alt":898,"style":899},"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;",[429,901,883,902,905],{},[462,903,904],{},"'Allow Obsidian sign-in'"," (Permitir início de sessão no Obsidian):",[433,907],{"src":908,"alt":909,"style":910},"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;",[429,912,883,913,916,917,920,921],{},[462,914,915],{},"'Return to Obsidian'"," (Voltar ao Obsidian) e, em seguida, clique em ",[462,918,919],{},"'Create vault'"," (Criar cofre):\n",[433,922],{"src":923,"alt":924,"style":925},"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;",[429,927,928],{},"Introduza um nome e uma palavra-passe segura para criar o seu cofre remoto.",[433,930],{"src":931,"alt":932,"style":933},"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;",[429,935,936],{},"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,938],{"src":939,"alt":940,"style":941},"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;",[493,943,945],{"id":944},"acesso-ao-obsidian-no-navegador-com-o-ignis","Acesso ao Obsidian no navegador com o Ignis",[429,947,499,948,950],{},[462,949,456],{}," 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.",[429,952,953,954,959,960,965],{},"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 ",[442,955,958],{"href":956,"rel":957},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[446],"Limitações"," e de ",[442,961,964],{"href":962,"rel":963},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[446],"Compatibilidade de plug-ins"," do Ignis para obter listagens detalhadas de compatibilidade.",[539,967,969],{"id":968},"configuração-do-ignis","Configuração do Ignis",[429,971,972,973,975,976,979,980,983],{},"Iremos instalar o ",[462,974,456],{}," no nosso VPS utilizando o Docker, montando-o na pasta local ",[576,977,978],{},".\u002Fvaults",". Este diretório do cofre será sincronizado utilizando a ",[462,981,982],{},"Synch CLI"," para descarregar as atualizações das notas a partir do cofre remoto que configurámos anteriormente.",[429,985,986,987,989,990,695],{},"Como o ",[462,988,456],{}," não possui autenticação integrada, deve ser protegido por trás de uma rede privada ",[462,991,992],{},[442,993,476],{"href":363},[544,995,997],{"id":996},"criar-registo-dns","Criar registo DNS",[433,999],{"src":1000,"alt":1001,"style":1002},"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;",[544,1004,687],{"id":1005},"adicionar-o-domínio-ao-caddyfile-1",[429,1007,1008,1009,1012,1013,768],{},"Adicione ",[576,1010,1011],{},"obsidian.pafor.me"," ao seu Caddyfile da mesma forma que ",[576,1014,1015],{},"synch.pafor.me",[570,1017,1019],{"className":713,"code":1018,"language":715,"meta":424,"style":424},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[576,1020,1021,1032,1036,1045],{"__ignoreMap":424},[579,1022,1023,1025,1028,1030],{"class":581,"line":582},[579,1024,746],{"class":722},[579,1026,1027],{"class":596},"$OBSIDIAN_DOMAIN",[579,1029,752],{"class":722},[579,1031,755],{"class":722},[579,1033,1034],{"class":581,"line":600},[579,1035,760],{"class":596},[579,1037,1038,1040,1042],{"class":581,"line":606},[579,1039,765],{"class":596},[579,1041,768],{"class":722},[579,1043,1044],{"class":771},"9898\n",[579,1046,1047],{"class":581,"line":613},[579,1048,731],{"class":722},[544,1050,1052],{"id":1051},"iniciar-o-ignis-utilizando-o-docker","Iniciar o Ignis utilizando o Docker",[429,1054,1055,1056,1059],{},"Guarde o seguinte ficheiro docker compose yml como ",[576,1057,1058],{},"ignis-docker-compose.yml"," no VPS:",[570,1061,1065],{"className":1062,"code":1063,"language":1064,"meta":424,"style":424},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","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","yml",[576,1066,1067,1075,1082,1092,1099,1113,1120,1125,1132,1140,1148,1156,1164,1172,1180,1191,1196,1204],{"__ignoreMap":424},[579,1068,1069,1073],{"class":581,"line":582},[579,1070,1072],{"class":1071},"swJcz","services",[579,1074,849],{"class":722},[579,1076,1077,1080],{"class":581,"line":600},[579,1078,1079],{"class":1071},"  ignis",[579,1081,849],{"class":722},[579,1083,1084,1087,1089],{"class":581,"line":606},[579,1085,1086],{"class":1071},"    image",[579,1088,768],{"class":722},[579,1090,1091],{"class":589}," nobbe\u002Fignis:latest\n",[579,1093,1094,1097],{"class":581,"line":613},[579,1095,1096],{"class":1071},"    ports",[579,1098,849],{"class":722},[579,1100,1101,1104,1107,1110],{"class":581,"line":623},[579,1102,1103],{"class":722},"      -",[579,1105,1106],{"class":722}," \"",[579,1108,1109],{"class":589},"9898:8080",[579,1111,1112],{"class":722},"\"\n",[579,1114,1115,1118],{"class":581,"line":628},[579,1116,1117],{"class":1071},"    environment",[579,1119,849],{"class":722},[579,1121,1122],{"class":581,"line":634},[579,1123,1124],{"class":609},"      # coincidir com o utilizador do seu host (executar: id)\n",[579,1126,1127,1129],{"class":581,"line":775},[579,1128,1103],{"class":722},[579,1130,1131],{"class":589}," PUID=1000\n",[579,1133,1135,1137],{"class":581,"line":1134},9,[579,1136,1103],{"class":722},[579,1138,1139],{"class":589}," PGID=1000\n",[579,1141,1143,1145],{"class":581,"line":1142},10,[579,1144,1103],{"class":722},[579,1146,1147],{"class":589}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[579,1149,1151,1154],{"class":581,"line":1150},11,[579,1152,1153],{"class":1071},"    volumes",[579,1155,849],{"class":722},[579,1157,1159,1161],{"class":581,"line":1158},12,[579,1160,1103],{"class":722},[579,1162,1163],{"class":589}," .\u002Fvaults:\u002Fvaults\n",[579,1165,1167,1169],{"class":581,"line":1166},13,[579,1168,1103],{"class":722},[579,1170,1171],{"class":589}," .\u002Fdata:\u002Fapp\u002Fdata\n",[579,1173,1175,1177],{"class":581,"line":1174},14,[579,1176,1103],{"class":722},[579,1178,1179],{"class":589}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[579,1181,1183,1186,1188],{"class":581,"line":1182},15,[579,1184,1185],{"class":1071},"    restart",[579,1187,768],{"class":722},[579,1189,1190],{"class":589}," unless-stopped\n",[579,1192,1194],{"class":581,"line":1193},16,[579,1195,741],{"emptyLinePlaceholder":740},[579,1197,1199,1202],{"class":581,"line":1198},17,[579,1200,1201],{"class":1071},"volumes",[579,1203,849],{"class":722},[579,1205,1207,1210],{"class":581,"line":1206},18,[579,1208,1209],{"class":1071},"  obsidian-app",[579,1211,849],{"class":722},[504,1213,1214,1225,1239],{},[507,1215,1216,1217,1220,1221,1224],{},"Utilize a porta ",[576,1218,1219],{},"9898"," no host, visto que a ",[576,1222,1223],{},"8080"," é habitualmente utilizada por outros serviços.",[507,1226,1227,1228,1231,1232,464,1235,1238],{},"Execute o comando ",[576,1229,1230],{},"id"," no seu VPS para verificar o ",[576,1233,1234],{},"UID",[576,1236,1237],{},"GID"," do utilizador do seu host para garantir as permissões corretas do sistema de ficheiros.",[507,1240,1241,1242,1245],{},"Defina ",[576,1243,1244],{},"WS_ORIGINS"," para permitir apenas ligações WebSocket originárias do seu nome de domínio específico.",[429,1247,1248,1249,768],{},"Inicie o Docker do ",[462,1250,456],{},[570,1252,1254],{"className":572,"code":1253,"language":574,"meta":424,"style":424},"docker compose -f ignis-docker-compose.yml up -d\n",[576,1255,1256],{"__ignoreMap":424},[579,1257,1258,1260,1262,1265,1268,1270],{"class":581,"line":582},[579,1259,790],{"class":585},[579,1261,793],{"class":589},[579,1263,1264],{"class":589}," -f",[579,1266,1267],{"class":589}," ignis-docker-compose.yml",[579,1269,796],{"class":589},[579,1271,799],{"class":589},[429,1273,1274,1275,1278,1279,1282],{},"Ao aceder ao seu domínio num navegador web, surgirá o ",[462,1276,1277],{},"'Vault Manager'"," (Gestor de Cofres). Estará vazio, uma vez que ainda não configurou nenhum cofre. Iremos configurar a ",[462,1280,1281],{},"'Synch CLI'"," na próxima secção para sincronizar os conteúdos do nosso cofre remoto.",[433,1284],{"src":1285,"alt":1286,"style":1287},"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;",[544,1289,1291],{"id":1290},"questão-de-firewall","Questão de Firewall",[429,1293,1294,1295,1298,1299,768],{},"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 ",[576,1296,1297],{},"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 ",[576,1300,1301],{},"iptables",[570,1303,1305],{"className":572,"code":1304,"language":574,"meta":424,"style":424},"# 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",[576,1306,1307,1312,1341,1345,1350],{"__ignoreMap":424},[579,1308,1309],{"class":581,"line":582},[579,1310,1311],{"class":609},"# Bloquear todo o tráfego público externo\n",[579,1313,1314,1317,1320,1323,1326,1329,1332,1335,1338],{"class":581,"line":600},[579,1315,1316],{"class":585},"sudo",[579,1318,1319],{"class":589}," iptables",[579,1321,1322],{"class":589}," -I",[579,1324,1325],{"class":589}," DOCKER-USER",[579,1327,1328],{"class":589}," -i",[579,1330,1331],{"class":589}," ext_if",[579,1333,1334],{"class":589}," -j",[579,1336,1337],{"class":589}," DROP",[579,1339,1340],{"class":596}," \n",[579,1342,1343],{"class":581,"line":606},[579,1344,741],{"emptyLinePlaceholder":740},[579,1346,1347],{"class":581,"line":613},[579,1348,1349],{"class":609},"# Permitir tráfego apenas do IP privado do seu cliente Cloudflare WARP\n",[579,1351,1352,1354,1356,1358,1360,1362,1364,1367,1370,1372],{"class":581,"line":623},[579,1353,1316],{"class":585},[579,1355,1319],{"class":589},[579,1357,1322],{"class":589},[579,1359,1325],{"class":589},[579,1361,1328],{"class":589},[579,1363,1331],{"class":589},[579,1365,1366],{"class":589}," -s",[579,1368,1369],{"class":771}," 100.96.0.10",[579,1371,1334],{"class":589},[579,1373,1374],{"class":589}," ACCEPT\n",[544,1376,1378],{"id":1377},"configuração-da-synch-cli","Configuração da Synch CLI",[429,1380,1381,1382,1384],{},"A ",[462,1383,982],{}," é 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.",[429,1386,1387,1388,1390,1391,1394,1395,1398,1399,1402,1403,1406,1407,664,1410,1413,1414,1417,1418,1421],{},"Compile a ",[462,1389,982],{}," a partir do seu repositório ",[576,1392,1393],{},"synch"," clonado. A compilação requer o ",[462,1396,1397],{},"Node.js >= 22.5"," (pois a CLI depende do ",[576,1400,1401],{},"node:sqlite"," e de APIs globais do navegador como ",[576,1404,1405],{},"fetch",", ",[576,1408,1409],{},"WebSocket",[576,1411,1412],{},"WebCrypto",") e o ",[462,1415,1416],{},"pnpm"," (dado que o repositório está estruturado como um espaço de trabalho de pnpm utilizando a versão ",[576,1419,1420],{},"10.33.0","):",[570,1423,1425],{"className":572,"code":1424,"language":574,"meta":424,"style":424},"# 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",[576,1426,1427,1432,1443,1450,1454,1459,1466,1470,1475,1488,1492,1497,1508,1537,1541,1546],{"__ignoreMap":424},[579,1428,1429],{"class":581,"line":582},[579,1430,1431],{"class":609},"# Verificar versões\n",[579,1433,1434,1437,1440],{"class":581,"line":600},[579,1435,1436],{"class":585},"node",[579,1438,1439],{"class":589}," --version",[579,1441,1442],{"class":609},"   # deve ser >= 22.5\n",[579,1444,1445,1447],{"class":581,"line":606},[579,1446,1416],{"class":585},[579,1448,1449],{"class":589}," --version\n",[579,1451,1452],{"class":581,"line":613},[579,1453,741],{"emptyLinePlaceholder":740},[579,1455,1456],{"class":581,"line":623},[579,1457,1458],{"class":609},"# Na raiz do repositório\n",[579,1460,1461,1463],{"class":581,"line":628},[579,1462,1416],{"class":585},[579,1464,1465],{"class":589}," install\n",[579,1467,1468],{"class":581,"line":634},[579,1469,741],{"emptyLinePlaceholder":740},[579,1471,1472],{"class":581,"line":775},[579,1473,1474],{"class":609},"# Compilar o pacote da CLI\n",[579,1476,1477,1479,1482,1485],{"class":581,"line":1134},[579,1478,1416],{"class":585},[579,1480,1481],{"class":589}," -C",[579,1483,1484],{"class":589}," apps\u002Fcli",[579,1486,1487],{"class":589}," build\n",[579,1489,1490],{"class":581,"line":1142},[579,1491,741],{"emptyLinePlaceholder":740},[579,1493,1494],{"class":581,"line":1150},[579,1495,1496],{"class":609},"# 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",[579,1498,1499,1502,1505],{"class":581,"line":1158},[579,1500,1501],{"class":585},"chmod",[579,1503,1504],{"class":589}," +x",[579,1506,1507],{"class":589}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[579,1509,1510,1513,1516,1518,1521,1524,1527,1529,1532,1535],{"class":581,"line":1166},[579,1511,1512],{"class":585},"ln",[579,1514,1515],{"class":589}," -sf",[579,1517,1106],{"class":722},[579,1519,1520],{"class":596},"$PWD",[579,1522,1523],{"class":589},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[579,1525,1526],{"class":722},"\"",[579,1528,1106],{"class":722},[579,1530,1531],{"class":596},"$HOME",[579,1533,1534],{"class":589},"\u002F.local\u002Fbin\u002Fsynch",[579,1536,1112],{"class":722},[579,1538,1539],{"class":581,"line":1174},[579,1540,741],{"emptyLinePlaceholder":740},[579,1542,1543],{"class":581,"line":1182},[579,1544,1545],{"class":609},"# Verificação\n",[579,1547,1548,1550],{"class":581,"line":1193},[579,1549,1393],{"class":585},[579,1551,1552],{"class":589}," --help\n",[429,1554,1555,1556,1559],{},"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 ",[576,1557,1558],{},"synch login --api-url \u003Curl-da-api-synch-remota>"," para definir o seu endpoint de destino da API.",[429,1561,1562],{},[433,1563],{"alt":1564,"src":1565},"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",[429,1567,1568,1569,1572],{},"Execute ",[576,1570,1571],{},"synch login"," no seu terminal e receberá um URL de autenticação:",[429,1574,1575],{},[433,1576],{"alt":1577,"src":1578},"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",[429,1580,1581],{},"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.",[429,1583,1584],{},[433,1585],{"alt":1586,"src":1587},"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",[429,1589,1568,1590,1593],{},[576,1591,1592],{},"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.",[429,1595,1596,1597,1600,1601,1604,1605,1421],{},"O ID do cofre remoto pode ser encontrado nas definições do plug-in ",[462,1598,1599],{},"Synchrun",", clicando em ",[462,1602,1603],{},"'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, ",[576,1606,1607],{},"123e4567-e89b-12d3-a456-426614174000",[429,1609,1610,1615],{},[433,1611],{"src":1612,"alt":1613,"style":1614},"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,1616],{"alt":1617,"src":1618},"Localizando o ID exclusivo do cofre remoto no Synchrun","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[429,1620,1621,1622,1625],{},"Introduza a palavra-passe do seu cofre quando solicitado para estabelecer a ligação. Assim que estiver ligado, execute ",[576,1623,1624],{},"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.",[429,1627,1628],{},[433,1629],{"alt":1630,"src":1631},"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",[429,1633,1634,1635,1638],{},"Para automatizar este processo, configure e ative um serviço systemd para executar o ",[576,1636,1637],{},"synch watch"," continuamente, garantindo que as alterações sejam sincronizadas instantaneamente no arranque:",[570,1640,1642],{"className":572,"code":1641,"language":574,"meta":424,"style":424},"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",[576,1643,1644,1660,1665,1670,1675,1680,1684,1689,1694,1699,1704,1709,1714,1719,1724,1729,1733,1738,1743,1749,1760],{"__ignoreMap":424},[579,1645,1646,1648,1651,1654,1657],{"class":581,"line":582},[579,1647,1316],{"class":585},[579,1649,1650],{"class":589}," tee",[579,1652,1653],{"class":589}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[579,1655,1656],{"class":722}," \u003C\u003C",[579,1658,1659],{"class":722},"'EOF'\n",[579,1661,1662],{"class":581,"line":600},[579,1663,1664],{"class":589},"[Unit]\n",[579,1666,1667],{"class":581,"line":606},[579,1668,1669],{"class":589},"Description=Synch vault watcher\n",[579,1671,1672],{"class":581,"line":613},[579,1673,1674],{"class":589},"After=network-online.target\n",[579,1676,1677],{"class":581,"line":623},[579,1678,1679],{"class":589},"Wants=network-online.target\n",[579,1681,1682],{"class":581,"line":628},[579,1683,741],{"emptyLinePlaceholder":740},[579,1685,1686],{"class":581,"line":634},[579,1687,1688],{"class":589},"[Service]\n",[579,1690,1691],{"class":581,"line":775},[579,1692,1693],{"class":589},"Type=simple\n",[579,1695,1696],{"class":581,"line":1134},[579,1697,1698],{"class":589},"User=\u003Cusername>\n",[579,1700,1701],{"class":581,"line":1142},[579,1702,1703],{"class":589},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[579,1705,1706],{"class":581,"line":1150},[579,1707,1708],{"class":589},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[579,1710,1711],{"class":581,"line":1158},[579,1712,1713],{"class":589},"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",[579,1715,1716],{"class":581,"line":1166},[579,1717,1718],{"class":589},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[579,1720,1721],{"class":581,"line":1174},[579,1722,1723],{"class":589},"Restart=always\n",[579,1725,1726],{"class":581,"line":1182},[579,1727,1728],{"class":589},"RestartSec=5\n",[579,1730,1731],{"class":581,"line":1193},[579,1732,741],{"emptyLinePlaceholder":740},[579,1734,1735],{"class":581,"line":1198},[579,1736,1737],{"class":589},"[Install]\n",[579,1739,1740],{"class":581,"line":1206},[579,1741,1742],{"class":589},"WantedBy=multi-user.target\n",[579,1744,1746],{"class":581,"line":1745},19,[579,1747,1748],{"class":722},"EOF\n",[579,1750,1752,1754,1757],{"class":581,"line":1751},20,[579,1753,1316],{"class":585},[579,1755,1756],{"class":589}," systemctl",[579,1758,1759],{"class":589}," daemon-reload\n",[579,1761,1763,1765,1767,1770,1773],{"class":581,"line":1762},21,[579,1764,1316],{"class":585},[579,1766,1756],{"class":589},[579,1768,1769],{"class":589}," enable",[579,1771,1772],{"class":589}," --now",[579,1774,1775],{"class":589}," synch-watch.service\n",[429,1777,1778,1779,1781],{},"Abra ",[576,1780,1011],{}," 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,1783],{"src":1784,"alt":1785,"style":1786},"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;",[429,1788,1789],{},"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,1791],{"src":1792,"alt":1793,"style":1794},"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;",[429,1796,1797],{},"Para testar a configuração, pode adicionar uma nova nota através da interface web:",[433,1799],{"src":1800,"alt":1801,"style":1794},"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",[429,1803,1804,1805,695],{},"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 ",[462,1806,456],{},[433,1808],{"src":1809,"alt":1810,"style":1811},"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;",[429,1813,1814,1815,1817],{},"Visualizar o ",[576,1816,1011],{}," num navegador web móvel:",[429,1819,1820,1825],{},[433,1821],{"src":1822,"alt":1823,"style":1824},"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,1826],{"src":1827,"alt":1828,"style":1824},"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",[429,1830,1831,1832,1834,1835,1838],{},"Quando elimina uma nota no ",[462,1833,456],{},", esta é movida em segurança para a pasta ",[576,1836,1837],{},"~\u002Fvaults\u002F\u003Cnome-do-cofre>\u002F.trash"," do seu cofre local.",[493,1840,1842],{"id":1841},"considerações-finais-sobre-cofres-auto-hospedados","Considerações finais sobre cofres auto-hospedados",[429,1844,1845,1846,464,1848,1850,1851,1853],{},"Juntos, o ",[462,1847,447],{},[462,1849,456],{}," 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 ",[462,1852,476],{}," garante que as suas notas pessoais fiquem completamente protegidas da internet pública.",[429,1855,499,1856,1858],{},[462,1857,456],{}," 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.",[429,1860,1861,1862,1864],{},"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 ",[462,1863,526],{}," 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.",[429,1866,1867],{},"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.",[493,1869,1871],{"id":1870},"referências","Referências",[504,1873,1874,1881,1888],{},[507,1875,1876],{},[442,1877,1880],{"href":1878,"rel":1879},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[446],"Implementação do Synch com Docker Compose",[507,1882,1883],{},[442,1884,1887],{"href":1885,"rel":1886},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[446],"Implementação do Ignis com Docker",[507,1889,1890],{},[442,1891,1894],{"href":1892,"rel":1893},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[446],"Como funciona a encriptação de ponta a ponta no Synch?",[1896,1897,1898],"style",{},"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":424,"searchDepth":600,"depth":606,"links":1900},[1901,1910,1919,1920],{"id":495,"depth":600,"text":496,"children":1902},[1903,1907],{"id":541,"depth":606,"text":542,"children":1904},[1905,1906],{"id":546,"depth":613,"text":547},{"id":562,"depth":613,"text":563},{"id":821,"depth":606,"text":822,"children":1908},[1909],{"id":825,"depth":613,"text":826},{"id":944,"depth":600,"text":945,"children":1911},[1912],{"id":968,"depth":606,"text":969,"children":1913},[1914,1915,1916,1917,1918],{"id":996,"depth":613,"text":997},{"id":1005,"depth":613,"text":687},{"id":1051,"depth":613,"text":1052},{"id":1290,"depth":613,"text":1291},{"id":1377,"depth":613,"text":1378},{"id":1841,"depth":600,"text":1842},{"id":1870,"depth":600,"text":1871},[1922],"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.","md","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":1929,"robots":1934,"sitemap":1935},[1930,1932],{"@type":1931,"headline":423,"description":1924,"image":1926},"Article",{"@type":1933,"name":423,"description":1924,"image":1926},"HowTo","index, follow",{"lastmod":1936},"2026-09-16",{"title":1938,"description":1924,"ogTitle":423,"ogDescription":1924,"twitterTitle":423,"twitterDescription":1924},"Sincronização segura do Obsidian com Synch e Ignis","pt\u002Farticle\u002Fsync-obsidian-across-devices",[1941,1942,1943,1944],"Self-hosting","Obsidian","Sync","Zero Trust",null,"w9q-i3XBW-a7XzDtUq653w4_WENAorcI_0Z65GRHL2g",{"surround":1948,"related":5018},[1949,4128],{"id":1950,"title":703,"author":424,"body":1951,"category":4088,"date":4091,"description":4092,"extension":1925,"image":4093,"imageAlt":4094,"isPublished":740,"meta":4095,"minRead":1206,"navigation":740,"path":229,"seo":4119,"stem":4121,"tags":4122,"updatedAt":1945,"__hash__":4127},"article\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":426,"value":1952,"toc":4058},[1953,1956,1962,1968,1972,1975,2013,2017,2023,2061,2065,2069,2083,2090,2095,2099,2103,2118,2124,2172,2198,2202,2210,2216,2220,2223,2433,2437,2477,2483,2490,2498,2547,2553,2579,2583,2587,2614,2640,2645,2687,2695,2967,2971,3014,3019,3026,3030,3034,3058,3061,3067,3070,3074,3082,3088,3091,3097,3100,3129,3135,3141,3144,3150,3154,3157,3160,3163,3169,3172,3178,3184,3190,3195,3199,3210,3217,3223,3226,3232,3236,3243,3249,3256,3260,3265,3329,3342,3397,3400,3471,3474,3490,3496,3500,3546,3552,3555,3561,3564,3570,3574,3590,3606,3612,3710,3713,3719,3730,3779,3785,3791,3803,3819,3822,3828,3832,3839,3861,3870,3968,3979,3985,3992,3998,4001,4007,4010,4016,4020,4023,4025,4055],[429,1954,1955],{},"A fragmentação de contexto é um obstáculo frustrante ao trabalhar com múltiplos agentes de IA. Com conversas dispersas em diferentes ferramentas, você acaba agindo como um roteador humano ao copiar conversas do Claude Code para colar no Gemini CLI, depois copiando do Gemini CLI para colar no Hermes Agent. Essa fricção aumenta quando colegas humanos estão na mesma equipe.",[429,1957,1958],{},[433,1959],{"alt":1960,"src":1961},"A interface de usuário do espaço de trabalho colaborativo Buzz mostrando canais de chat e agentes de IA ativos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[429,1963,499,1964,1967],{},[462,1965,1966],{},"Buzz",", um espaço de trabalho colaborativo de código aberto, reúne equipes humanas e agentes de IA em um ambiente único e unificado. Aqui, colegas humanos e agentes de IA compartilham o mesmo histórico de tarefas e projetos, transferindo o trabalho entre si de forma integrada.",[493,1969,1971],{"id":1970},"o-que-é-o-buzz-do-block-o-espaço-de-trabalho-colaborativo-para-agentes-de-ia","O que é o Buzz do Block? O espaço de trabalho colaborativo para agentes de IA",[429,1973,1974],{},"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:",[504,1976,1977,1983,1989,1995,2001,2007],{},[507,1978,1979,1982],{},[462,1980,1981],{},"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.",[507,1984,1985,1988],{},[462,1986,1987],{},"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.",[507,1990,1991,1994],{},[462,1992,1993],{},"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.",[507,1996,1997,2000],{},[462,1998,1999],{},"Sistema de identidade unificado:"," Humanos e agentes usam o mesmo sistema de identidade, autenticado por meio de chaves criptográficas.",[507,2002,2003,2006],{},[462,2004,2005],{},"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.",[507,2008,2009,2012],{},[462,2010,2011],{},"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.",[493,2014,2016],{"id":2015},"a-arquitetura-criptográfica-baseada-em-nostr-do-buzz","A arquitetura criptográfica baseada em Nostr do Buzz",[429,2018,2019],{},[433,2020],{"alt":2021,"src":2022},"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",[504,2024,2025,2031,2037,2043,2049,2055],{},[507,2026,2027,2030],{},[462,2028,2029],{},"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.",[507,2032,2033,2036],{},[462,2034,2035],{},"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.",[507,2038,2039,2042],{},[462,2040,2041],{},"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).",[507,2044,2045,2048],{},[462,2046,2047],{},"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.",[507,2050,2051,2054],{},[462,2052,2053],{},"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.",[507,2056,2057,2060],{},[462,2058,2059],{},"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.",[493,2062,2064],{"id":2063},"como-auto-hospedar-o-relay-buzz-do-block-em-um-vps-linux","Como auto-hospedar o relay Buzz do Block em um VPS Linux",[539,2066,2068],{"id":2067},"_0-pré-requisitos","0. Pré-requisitos",[504,2070,2071,2074,2077,2080],{},[507,2072,2073],{},"Um VPS Linux",[507,2075,2076],{},"Um domínio que aponte para o seu servidor",[507,2078,2079],{},"Docker e o plugin Docker Compose",[507,2081,2082],{},"Conta da Cloudflare (plano gratuito)",[429,2084,2085,2086,2089],{},"Neste guia, executaremos o relay Nostr em um VPS Ubuntu por trás de uma rede privada ",[442,2087,2088],{"href":363},"Expor o Hermes Agent em rede privada com Cloudflare WARP",". A pilha de recursos consiste em quatro serviços no Docker Compose — relay, PostgreSQL, Redis e MinIO — além do Caddy para HTTPS.",[484,2091],{"description":2092,"image":2093,"image-alt":2094,"label":489,"min-read":490,"title":2088,"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.","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 a uma rede privada usando Cloudflare Zero Trust e túnel WARP",[539,2096,2098],{"id":2097},"_1-dns-da-cloudflare-e-api-token","1. DNS da Cloudflare e API Token",[544,2100,2102],{"id":2101},"criar-um-api-token-da-cloudflare","Criar um API Token da Cloudflare",[2104,2105,2106,2112],"ol",{},[507,2107,883,2108,2111],{},[462,2109,2110],{},"Profile"," no canto superior direito no menu suspenso do ícone do usuário.",[507,2113,2114,2115,695],{},"Clique em ",[462,2116,2117],{},"API Tokens",[429,2119,2120],{},[433,2121],{"alt":2122,"src":2123},"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",[2104,2125,2126,2131,2137,2157,2162,2166,2169],{"start":606},[507,2127,2114,2128,695],{},[462,2129,2130],{},"Create Token",[507,2132,2133,2134,695],{},"Use o modelo ",[462,2135,2136],{},"Edit zone DNS",[507,2138,2139,2140],{},"Configure o modelo da seguinte maneira:\n",[504,2141,2142,2148],{},[507,2143,2144,2147],{},[462,2145,2146],{},"Permissions",": Zone — DNS — Edit",[507,2149,2150,2153,2154],{},[462,2151,2152],{},"Zone Resources",": Include — Specific zone — ",[576,2155,2156],{},"example.com",[507,2158,2114,2159,695],{},[462,2160,2161],{},"Continue to summary",[507,2163,2114,2164,695],{},[462,2165,2130],{},[507,2167,2168],{},"Copie o token gerado, pois ele não será exibido novamente após fechar a página.",[507,2170,2171],{},"Teste o token gerado no seu terminal para se certificar de que funciona corretamente:",[570,2173,2175],{"className":572,"code":2174,"language":574,"meta":424,"style":424},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[576,2176,2177],{"__ignoreMap":424},[579,2178,2179,2181,2183,2186,2188,2191,2193,2196],{"class":581,"line":582},[579,2180,805],{"class":585},[579,2182,1106],{"class":722},[579,2184,2185],{"class":589},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[579,2187,1526],{"class":722},[579,2189,2190],{"class":589}," -H",[579,2192,1106],{"class":722},[579,2194,2195],{"class":589},"Authorization: Bearer YOUR_TOKEN_HERE",[579,2197,1112],{"class":722},[544,2199,2201],{"id":2200},"registros-dns","Registros DNS",[504,2203,2204],{},[507,2205,2206,2207,2209],{},"Crie um registro A e configure-o como ",[462,2208,553],{}," (DNS only).",[429,2211,2212],{},[433,2213],{"alt":2214,"src":2215},"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",[539,2217,2219],{"id":2218},"_2-instalar-o-docker-no-ubuntu","2. Instalar o Docker no Ubuntu",[429,2221,2222],{},"Execute os seguintes comandos para instalar o Docker no Ubuntu:",[570,2224,2226],{"className":572,"code":2225,"language":574,"meta":424,"style":424},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[576,2227,2228,2233,2261,2265,2270,2312,2316,2321,2331,2335,2340,2361,2365,2370,2381,2385,2390,2396,2400,2414,2418,2423],{"__ignoreMap":424},[579,2229,2230],{"class":581,"line":582},[579,2231,2232],{"class":609},"# Add Docker's official GPG key and set up the Docker repository\n",[579,2234,2235,2237,2240,2243,2246,2249,2252,2255,2258],{"class":581,"line":600},[579,2236,805],{"class":585},[579,2238,2239],{"class":589}," -fsSL",[579,2241,2242],{"class":589}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[579,2244,2245],{"class":722}," |",[579,2247,2248],{"class":585}," sudo",[579,2250,2251],{"class":589}," gpg",[579,2253,2254],{"class":589}," --dearmor",[579,2256,2257],{"class":589}," -o",[579,2259,2260],{"class":589}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[579,2262,2263],{"class":581,"line":606},[579,2264,741],{"emptyLinePlaceholder":740},[579,2266,2267],{"class":581,"line":613},[579,2268,2269],{"class":609},"# Add the official Docker repository\n",[579,2271,2272,2275,2277,2280,2283,2286,2289,2292,2295,2297,2299,2301,2303,2306,2309],{"class":581,"line":623},[579,2273,2274],{"class":616},"echo",[579,2276,1106],{"class":722},[579,2278,2279],{"class":589},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[579,2281,2282],{"class":722},"$(",[579,2284,2285],{"class":585},"lsb_release",[579,2287,2288],{"class":589}," -cs",[579,2290,2291],{"class":722},")",[579,2293,2294],{"class":589}," stable",[579,2296,1526],{"class":722},[579,2298,2245],{"class":722},[579,2300,2248],{"class":585},[579,2302,1650],{"class":589},[579,2304,2305],{"class":589}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[579,2307,2308],{"class":722}," >",[579,2310,2311],{"class":589}," \u002Fdev\u002Fnull\n",[579,2313,2314],{"class":581,"line":628},[579,2315,741],{"emptyLinePlaceholder":740},[579,2317,2318],{"class":581,"line":634},[579,2319,2320],{"class":609},"# Update package list\n",[579,2322,2323,2325,2328],{"class":581,"line":775},[579,2324,1316],{"class":585},[579,2326,2327],{"class":589}," apt",[579,2329,2330],{"class":589}," update\n",[579,2332,2333],{"class":581,"line":1134},[579,2334,741],{"emptyLinePlaceholder":740},[579,2336,2337],{"class":581,"line":1142},[579,2338,2339],{"class":609},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[579,2341,2342,2344,2346,2349,2352,2355,2358],{"class":581,"line":1150},[579,2343,1316],{"class":585},[579,2345,2327],{"class":589},[579,2347,2348],{"class":589}," install",[579,2350,2351],{"class":589}," docker-ce",[579,2353,2354],{"class":589}," docker-ce-cli",[579,2356,2357],{"class":589}," containerd.io",[579,2359,2360],{"class":589}," -y\n",[579,2362,2363],{"class":581,"line":1158},[579,2364,741],{"emptyLinePlaceholder":740},[579,2366,2367],{"class":581,"line":1166},[579,2368,2369],{"class":609},"# Start automatically when the system boots\n",[579,2371,2372,2374,2376,2378],{"class":581,"line":1174},[579,2373,1316],{"class":585},[579,2375,1756],{"class":589},[579,2377,1769],{"class":589},[579,2379,2380],{"class":589}," docker\n",[579,2382,2383],{"class":581,"line":1182},[579,2384,741],{"emptyLinePlaceholder":740},[579,2386,2387],{"class":581,"line":1193},[579,2388,2389],{"class":609},"# Verify docker is installed\n",[579,2391,2392,2394],{"class":581,"line":1198},[579,2393,790],{"class":585},[579,2395,1449],{"class":589},[579,2397,2398],{"class":581,"line":1206},[579,2399,741],{"emptyLinePlaceholder":740},[579,2401,2402,2404,2406,2408,2411],{"class":581,"line":1745},[579,2403,1316],{"class":585},[579,2405,2327],{"class":589},[579,2407,2348],{"class":589},[579,2409,2410],{"class":589}," -y",[579,2412,2413],{"class":589}," docker-compose-plugin\n",[579,2415,2416],{"class":581,"line":1751},[579,2417,741],{"emptyLinePlaceholder":740},[579,2419,2420],{"class":581,"line":1762},[579,2421,2422],{"class":609},"# Verify the compose plugin is installed\n",[579,2424,2426,2428,2430],{"class":581,"line":2425},22,[579,2427,790],{"class":585},[579,2429,793],{"class":589},[579,2431,2432],{"class":589}," version\n",[539,2434,2436],{"id":2435},"_3-clonar-e-configurar","3. Clonar e configurar",[570,2438,2440],{"className":572,"code":2439,"language":574,"meta":424,"style":424},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[576,2441,2442,2451,2455,2462,2470],{"__ignoreMap":424},[579,2443,2444,2446,2448],{"class":581,"line":582},[579,2445,586],{"class":585},[579,2447,590],{"class":589},[579,2449,2450],{"class":589}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[579,2452,2453],{"class":581,"line":600},[579,2454,741],{"emptyLinePlaceholder":740},[579,2456,2457,2459],{"class":581,"line":606},[579,2458,617],{"class":616},[579,2460,2461],{"class":589}," buzz\u002Fdeploy\u002Fcompose\n",[579,2463,2464,2466,2468],{"class":581,"line":613},[579,2465,637],{"class":585},[579,2467,640],{"class":589},[579,2469,643],{"class":589},[579,2471,2472,2475],{"class":581,"line":623},[579,2473,2474],{"class":585},"nano",[579,2476,643],{"class":589},[429,2478,2479,2480,2482],{},"Modifique ",[576,2481,650],{}," em grupos:",[504,2484,2485],{},[507,2486,2487],{},[462,2488,2489],{},"Domínio:",[570,2491,2496],{"className":2492,"code":2494,"language":2495},[2493],"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",[576,2497,2494],{"__ignoreMap":424},[504,2499,2500,2510],{},[507,2501,2502,2505,2506,2509],{},[462,2503,2504],{},"Chave do proprietário:"," ",[576,2507,2508],{},"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.",[507,2511,2512,2515],{},[462,2513,2514],{},"Segredos (Secrets):",[504,2516,2517,2527,2541],{},[507,2518,2519,2520,2523,2524,2526],{},"Gere segredos usando esta ",[442,2521,2522],{"href":671},"ferramenta online"," ou com ",[576,2525,676],{}," (execute sete vezes)",[507,2528,2529,2530,2533,2534,1406,2537,2540],{},"Substitua cada marcador ",[576,2531,2532],{},"CHANGE_ME",": ",[576,2535,2536],{},"BUZZ_RELAY_PRIVATE_KEY",[576,2538,2539],{},"BUZZ_GIT_HOOK_HMAC_SECRET",", as senhas do Postgres\u002FRedis\u002FTypesense e as chaves secretas\u002Facesso do S3.",[507,2542,2543,2544,695],{},"Marcadores restantes são a causa mais comum de loops de reinicialização de contêineres; verifique os seus com ",[576,2545,2546],{},"grep CHANGE_ME .env",[570,2548,2551],{"className":2549,"code":2550,"language":2495},[2493],"    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",[576,2552,2550],{"__ignoreMap":424},[504,2554,2555],{},[507,2556,2557,2560],{},[462,2558,2559],{},"Outros:",[504,2561,2562,2568],{},[507,2563,1008,2564,2567],{},[576,2565,2566],{},"CLOUDFLARE_API_TOKEN"," como uma variável de ambiente e atribua o token de API gerado anteriormente. Isso é obrigatório para o Caddy.",[507,2569,2570,2571,1406,2573,664,2576,695],{},"Buzz é fornecido com padrões abertos — qualquer pessoa que conheça a URL do seu relay pode se autenticar e participar. Defina ",[576,2572,2508],{},[576,2574,2575],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[576,2577,2578],{},"BUZZ_REQUIRE_AUTH_TOKEN=true",[539,2580,2582],{"id":2581},"_4-habilitar-https-com-caddy","4. Habilitar HTTPS com Caddy",[544,2584,2586],{"id":2585},"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",[504,2588,2589,2600,2611],{},[507,2590,2591,2592,2595,2596,2599],{},"Configuramos o DNS-01 com a Cloudflare para o Caddy. DNS-01 funciona fazendo com que o plug-in grave um registro TXT ",[576,2593,2594],{},"_acme-challenge.buzz.pafor.me"," no ",[462,2597,2598],{},"DNS público",";",[507,2601,2602,2603,2606,2607,2610],{},"Let's Encrypt então consulta o registro na internet pública para verificar o controle do domínio. Isso significa que ",[576,2604,2605],{},"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 ",[576,2608,2609],{},"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.",[507,2612,2613],{},"Adicione o seguinte ao Caddyfile:",[570,2615,2617],{"className":1062,"code":2616,"language":1064,"meta":424,"style":424},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[576,2618,2619,2623,2636],{"__ignoreMap":424},[579,2620,2621],{"class":581,"line":582},[579,2622,723],{"class":722},[579,2624,2625,2628,2631,2634],{"class":581,"line":600},[579,2626,2627],{"class":589},"  acme_dns cloudflare",[579,2629,2630],{"class":722}," {",[579,2632,2633],{"class":589},"env.CLOUDFLARE_API_TOKEN",[579,2635,731],{"class":722},[579,2637,2638],{"class":581,"line":606},[579,2639,731],{"class":722},[504,2641,2642],{},[507,2643,2644],{},"Crie um Dockerfile.caddy com o seguinte conteúdo, que é exigido pelo compose.caddy.yml:",[570,2646,2648],{"className":1062,"code":2647,"language":1064,"meta":424,"style":424},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[576,2649,2650,2655,2659,2664,2669,2673,2678,2682],{"__ignoreMap":424},[579,2651,2652],{"class":581,"line":582},[579,2653,2654],{"class":589},"FROM caddy:2-builder AS builder\n",[579,2656,2657],{"class":581,"line":600},[579,2658,741],{"emptyLinePlaceholder":740},[579,2660,2661],{"class":581,"line":606},[579,2662,2663],{"class":589},"RUN xcaddy build \\\n",[579,2665,2666],{"class":581,"line":613},[579,2667,2668],{"class":589},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[579,2670,2671],{"class":581,"line":623},[579,2672,741],{"emptyLinePlaceholder":740},[579,2674,2675],{"class":581,"line":628},[579,2676,2677],{"class":589},"FROM caddy:2-alpine\n",[579,2679,2680],{"class":581,"line":634},[579,2681,741],{"emptyLinePlaceholder":740},[579,2683,2684],{"class":581,"line":775},[579,2685,2686],{"class":589},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[504,2688,2689],{},[507,2690,2479,2691,2694],{},[576,2692,2693],{},"compose.caddy.yml"," para usar a imagem com o módulo da Cloudflare e passar o token de API da Cloudflare:",[570,2696,2698],{"className":1062,"code":2697,"language":1064,"meta":424,"style":424},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[576,2699,2700,2706,2713,2726,2730,2737,2744,2754,2764,2773,2780,2787,2797,2803,2813,2823,2829,2840,2851,2857,2864,2871,2878,2887,2895,2903,2908,2915,2923,2931,2942,2950,2957],{"__ignoreMap":424},[579,2701,2702,2704],{"class":581,"line":582},[579,2703,1072],{"class":1071},[579,2705,849],{"class":722},[579,2707,2708,2711],{"class":581,"line":600},[579,2709,2710],{"class":1071},"  relay",[579,2712,849],{"class":722},[579,2714,2715,2717,2719,2723],{"class":581,"line":606},[579,2716,1096],{"class":1071},[579,2718,768],{"class":722},[579,2720,2722],{"class":2721},"spNyl"," !reset",[579,2724,2725],{"class":722}," []\n",[579,2727,2728],{"class":581,"line":613},[579,2729,741],{"emptyLinePlaceholder":740},[579,2731,2732,2735],{"class":581,"line":623},[579,2733,2734],{"class":1071},"  caddy",[579,2736,849],{"class":722},[579,2738,2739,2742],{"class":581,"line":628},[579,2740,2741],{"class":1071},"    build",[579,2743,849],{"class":722},[579,2745,2746,2749,2751],{"class":581,"line":634},[579,2747,2748],{"class":1071},"      context",[579,2750,768],{"class":722},[579,2752,2753],{"class":771}," .\n",[579,2755,2756,2759,2761],{"class":581,"line":775},[579,2757,2758],{"class":1071},"      dockerfile",[579,2760,768],{"class":722},[579,2762,2763],{"class":589}," Dockerfile.caddy\n",[579,2765,2766,2768,2770],{"class":581,"line":1134},[579,2767,1086],{"class":1071},[579,2769,768],{"class":722},[579,2771,2772],{"class":589}," buzz-caddy:cloudflare\n",[579,2774,2775,2778],{"class":581,"line":1142},[579,2776,2777],{"class":1071},"    depends_on",[579,2779,849],{"class":722},[579,2781,2782,2785],{"class":581,"line":1150},[579,2783,2784],{"class":1071},"      relay",[579,2786,849],{"class":722},[579,2788,2789,2792,2794],{"class":581,"line":1158},[579,2790,2791],{"class":1071},"        condition",[579,2793,768],{"class":722},[579,2795,2796],{"class":589}," service_healthy\n",[579,2798,2799,2801],{"class":581,"line":1166},[579,2800,1117],{"class":1071},[579,2802,849],{"class":722},[579,2804,2805,2808,2810],{"class":581,"line":1174},[579,2806,2807],{"class":1071},"      BUZZ_DOMAIN",[579,2809,768],{"class":722},[579,2811,2812],{"class":589}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[579,2814,2815,2818,2820],{"class":581,"line":1182},[579,2816,2817],{"class":1071},"      CLOUDFLARE_API_TOKEN",[579,2819,768],{"class":722},[579,2821,2822],{"class":589}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[579,2824,2825,2827],{"class":581,"line":1193},[579,2826,1096],{"class":1071},[579,2828,849],{"class":722},[579,2830,2831,2833,2835,2838],{"class":581,"line":1198},[579,2832,1103],{"class":722},[579,2834,1106],{"class":722},[579,2836,2837],{"class":589},"${CADDY_HTTP_PORT:-80}:80",[579,2839,1112],{"class":722},[579,2841,2842,2844,2846,2849],{"class":581,"line":1206},[579,2843,1103],{"class":722},[579,2845,1106],{"class":722},[579,2847,2848],{"class":589},"${CADDY_HTTPS_PORT:-443}:443",[579,2850,1112],{"class":722},[579,2852,2853,2855],{"class":581,"line":1745},[579,2854,1153],{"class":1071},[579,2856,849],{"class":722},[579,2858,2859,2861],{"class":581,"line":1751},[579,2860,1103],{"class":722},[579,2862,2863],{"class":589}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[579,2865,2866,2868],{"class":581,"line":1762},[579,2867,1103],{"class":722},[579,2869,2870],{"class":589}," buzz-caddy-data:\u002Fdata\n",[579,2872,2873,2875],{"class":581,"line":2425},[579,2874,1103],{"class":722},[579,2876,2877],{"class":589}," buzz-caddy-config:\u002Fconfig\n",[579,2879,2881,2883,2885],{"class":581,"line":2880},23,[579,2882,1185],{"class":1071},[579,2884,768],{"class":722},[579,2886,1190],{"class":589},[579,2888,2890,2893],{"class":581,"line":2889},24,[579,2891,2892],{"class":1071},"    networks",[579,2894,849],{"class":722},[579,2896,2898,2900],{"class":581,"line":2897},25,[579,2899,1103],{"class":722},[579,2901,2902],{"class":589}," buzz-net\n",[579,2904,2906],{"class":581,"line":2905},26,[579,2907,741],{"emptyLinePlaceholder":740},[579,2909,2911,2913],{"class":581,"line":2910},27,[579,2912,1201],{"class":1071},[579,2914,849],{"class":722},[579,2916,2918,2921],{"class":581,"line":2917},28,[579,2919,2920],{"class":1071},"  buzz-caddy-data",[579,2922,849],{"class":722},[579,2924,2926,2929],{"class":581,"line":2925},29,[579,2927,2928],{"class":1071},"    labels",[579,2930,849],{"class":722},[579,2932,2934,2937,2939],{"class":581,"line":2933},30,[579,2935,2936],{"class":1071},"      com.buzz.volume",[579,2938,768],{"class":722},[579,2940,2941],{"class":589}," caddy-data\n",[579,2943,2945,2948],{"class":581,"line":2944},31,[579,2946,2947],{"class":1071},"  buzz-caddy-config",[579,2949,849],{"class":722},[579,2951,2953,2955],{"class":581,"line":2952},32,[579,2954,2928],{"class":1071},[579,2956,849],{"class":722},[579,2958,2960,2962,2964],{"class":581,"line":2959},33,[579,2961,2936],{"class":1071},[579,2963,768],{"class":722},[579,2965,2966],{"class":589}," caddy-config\n",[544,2968,2970],{"id":2969},"iniciar-os-contêineres-docker","Iniciar os contêineres Docker",[570,2972,2974],{"className":572,"code":2973,"language":574,"meta":424,"style":424},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[576,2975,2976,2996,3000,3005],{"__ignoreMap":424},[579,2977,2978,2980,2982,2984,2987,2989,2992,2994],{"class":581,"line":582},[579,2979,790],{"class":585},[579,2981,793],{"class":589},[579,2983,1264],{"class":589},[579,2985,2986],{"class":589}," compose.yml",[579,2988,1264],{"class":589},[579,2990,2991],{"class":589}," compose.caddy.yml",[579,2993,796],{"class":589},[579,2995,799],{"class":589},[579,2997,2998],{"class":581,"line":600},[579,2999,741],{"emptyLinePlaceholder":740},[579,3001,3002],{"class":581,"line":606},[579,3003,3004],{"class":609},"#Check the Docker status\n",[579,3006,3007,3009,3011],{"class":581,"line":613},[579,3008,790],{"class":585},[579,3010,793],{"class":589},[579,3012,3013],{"class":589}," ps\n",[433,3015],{"src":3016,"alt":3017,"style":3018},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","Janela de terminal exibindo contêineres em execução para os serviços do Buzz via docker compose ps","max-width: 700px; width: 100%; height: auto;",[429,3020,3021,3022,3025],{},"Abra o seu navegador e navegue até ",[576,3023,3024],{},"http:\u002F\u002Fbuzz.pafor.me"," para verificar se o relay está funcionando.",[433,3027],{"src":3028,"alt":3029,"style":933},"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",[539,3031,3033],{"id":3032},"passo-5-backups-desde-o-primeiro-dia","Passo 5: Backups desde o primeiro dia",[570,3035,3037],{"className":572,"code":3036,"language":574,"meta":424,"style":424},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[576,3038,3039,3050],{"__ignoreMap":424},[579,3040,3041,3044,3047],{"class":581,"line":582},[579,3042,3043],{"class":585},"mkdir",[579,3045,3046],{"class":589}," -p",[579,3048,3049],{"class":589}," \u002Fbuzz_backups\n",[579,3051,3052,3055],{"class":581,"line":600},[579,3053,3054],{"class":585},"crontab",[579,3056,3057],{"class":589}," -e\n",[429,3059,3060],{},"Adicione um trabalho cron de backup noturno do banco de dados:",[570,3062,3065],{"className":3063,"code":3064,"language":2495},[2493],"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",[576,3066,3064],{"__ignoreMap":424},[429,3068,3069],{},"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.",[493,3071,3073],{"id":3072},"configurando-o-cliente-desktop-buzz-e-as-identidades-nostr","Configurando o cliente desktop Buzz e as identidades Nostr",[429,3075,3076,3077,3081],{},"Baixe o aplicativo desktop do Buzz em ",[442,3078,3079],{"href":3079,"rel":3080},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[446]," e inicie-o. Preencha as informações do perfil até chegar à página \"Join or create a community\".",[429,3083,3084],{},[433,3085],{"alt":3086,"src":3087},"Tela de configuração inicial do cliente desktop Buzz para participar ou criar uma comunidade","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[429,3089,3090],{},"Clique em \"Join a community\" e copie a sua chave pública.",[429,3092,3093],{},[433,3094],{"alt":3095,"src":3096},"Exibição do cliente Buzz mostrando a identidade da chave pública antes de participar da comunidade","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[429,3098,3099],{},"Execute o seguinte comando no VPS para se adicionar como o primeiro membro:",[570,3101,3103],{"className":572,"code":3102,"language":574,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[576,3104,3105],{"__ignoreMap":424},[579,3106,3107,3109,3111,3114,3117,3120,3123,3126],{"class":581,"line":582},[579,3108,790],{"class":585},[579,3110,793],{"class":589},[579,3112,3113],{"class":589}," exec",[579,3115,3116],{"class":589}," relay",[579,3118,3119],{"class":589}," buzz-admin",[579,3121,3122],{"class":589}," add-member",[579,3124,3125],{"class":589}," --pubkey",[579,3127,3128],{"class":589}," npub1yourkeyhere\n",[429,3130,1008,3131,3134],{},[576,3132,3133],{},"wss:\u002F\u002Fbuzz.pafor.me"," como a URL da comunidade e clique em \"Next\".",[429,3136,3137],{},[433,3138],{"alt":3139,"src":3140},"Inserindo a URL do relay da comunidade auto-hospedada no aplicativo desktop Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[429,3142,3143],{},"Digite um nome e clique no botão Next.",[429,3145,3146],{},[433,3147],{"alt":3148,"src":3149},"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",[539,3151,3153],{"id":3152},"canais-channels-e-agentes","Canais (Channels) e Agentes",[429,3155,3156],{},"Canais são grupos de tarefas ou projetos. Crie um canal por tarefa ou projeto e inclua os humanos e agentes.",[429,3158,3159],{},"Tudo dentro de um canal é compartilhado automaticamente, eliminando a necessidade de instruir cada membro individualmente. Cada agente pode ser mencionado usando @ e lê as mensagens relevantes. Além disso, os agentes podem se mencionar usando @ entre si.",[429,3161,3162],{},"Vamos enviar uma mensagem direta (DM) para um agente pré-configurado",[429,3164,3165],{},[433,3166],{"alt":3167,"src":3168},"Enviando mensagem direta para um agente de IA no cliente desktop colaborativo Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[429,3170,3171],{},"Vamos criar um canal e adicionar alguns agentes a ele",[429,3173,3174],{},[433,3175],{"alt":3176,"src":3177},"Criando um novo canal de tarefa ou projeto no aplicativo desktop Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[429,3179,3180],{},[433,3181],{"alt":3182,"src":3183},"Adicionando membro humano e agentes de IA ao canal recém-criado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[429,3185,3186],{},[433,3187],{"alt":3188,"src":3189},"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,3191],{"src":3192,"alt":3193,"style":3194},"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;",[539,3196,3198],{"id":3197},"habilitar-runtimes-de-agentes","Habilitar runtimes de agentes",[429,3200,3201,3202,3205,3206,3209],{},"Os runtimes predefinidos dependem da descoberta automática que detecta os binários de inicialização (como ",[576,3203,3204],{},"hermes-acp",") em diretórios padrão como ",[576,3207,3208],{},"~\u002F.local\u002Fbin",". Se uma ferramenta foi instalada em um local não padrão, o Buzz não poderá resolvê-la.",[429,3211,3212,3213,3216],{},"Para o Kimi Code, o ID do agente é kimi, e o Buzz procura o seu binario em ",[576,3214,3215],{},"~\u002F.local\u002Fbin\u002Fkimi",". Um link simbólico resolve o problema:",[570,3218,3221],{"className":3219,"code":3220,"language":2495},[2493],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[576,3222,3220],{"__ignoreMap":424},[429,3224,3225],{},"O Kimi Code agora aparece em runtimes de agentes.",[429,3227,3228],{},[433,3229],{"alt":3230,"src":3231},"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",[539,3233,3235],{"id":3234},"projetos-e-repositórios","Projetos e Repositórios",[429,3237,3238,3239,3242],{},"Primeiro, ative o recurso '",[462,3240,3241],{},"Projects","' em Settings → Experiments:",[429,3244,3245],{},[433,3246],{"alt":3247,"src":3248},"Habilitando o recurso experimental Projects na guia de configurações do Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[429,3250,3251,3252,3255],{},"Atualmente, um projeto deve ser criado usando o ",[576,3253,3254],{},"buzz-cli"," (embora a criação direta de projetos a partir da interface do usuário esteja planejada para uma versão futura).",[544,3257,3259],{"id":3258},"instalar-buzz-cli","Instalar buzz-cli",[429,3261,3262,3263,1059],{},"Execute os seguintes comandos para instalar o ",[576,3264,3254],{},[570,3266,3268],{"className":572,"code":3267,"language":574,"meta":424,"style":424},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[576,3269,3270,3281,3288,3301],{"__ignoreMap":424},[579,3271,3272,3274,3276,3278],{"class":581,"line":582},[579,3273,1316],{"class":585},[579,3275,2327],{"class":589},[579,3277,2348],{"class":589},[579,3279,3280],{"class":589}," cargo\n",[579,3282,3283,3285],{"class":581,"line":600},[579,3284,617],{"class":616},[579,3286,3287],{"class":589}," ~\u002Fbuzz\n",[579,3289,3290,3293,3295,3298],{"class":581,"line":606},[579,3291,3292],{"class":585},"cargo",[579,3294,2348],{"class":589},[579,3296,3297],{"class":589}," --path",[579,3299,3300],{"class":589}," crates\u002Fbuzz-cli\n",[579,3302,3303,3305,3308,3311,3314,3317,3320,3323,3326],{"class":581,"line":613},[579,3304,2274],{"class":616},[579,3306,3307],{"class":722}," '",[579,3309,3310],{"class":589},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[579,3312,3313],{"class":722},"'",[579,3315,3316],{"class":722}," >>",[579,3318,3319],{"class":589}," ~\u002F.bashrc",[579,3321,3322],{"class":722}," &&",[579,3324,3325],{"class":616}," source",[579,3327,3328],{"class":589}," ~\u002F.bashrc\n",[429,3330,3331,3332,3335,3336,3338,3339,3341],{},"Gere um par de chaves privada e pública usando a ",[442,3333,2522],{"href":3334},"\u002Fpt\u002Ftools\u002Fnostr-key-generator"," ou o ",[576,3337,3254],{},". Este par constitui a identidade do ",[576,3340,3254],{}," no relay Nostr.",[570,3343,3345],{"className":572,"code":3344,"language":574,"meta":424,"style":424},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[576,3346,3347,3369,3373,3378],{"__ignoreMap":424},[579,3348,3349,3351,3354,3357,3360,3363,3366],{"class":581,"line":582},[579,3350,790],{"class":585},[579,3352,3353],{"class":589}," run",[579,3355,3356],{"class":589}," --rm",[579,3358,3359],{"class":589}," --entrypoint",[579,3361,3362],{"class":589}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[579,3364,3365],{"class":589}," ghcr.io\u002Fblock\u002Fbuzz:main",[579,3367,3368],{"class":589}," generate-key\n",[579,3370,3371],{"class":581,"line":600},[579,3372,741],{"emptyLinePlaceholder":740},[579,3374,3375],{"class":581,"line":606},[579,3376,3377],{"class":609},"# Use the generated Public Key\n",[579,3379,3380,3382,3384,3386,3388,3390,3392,3394],{"class":581,"line":613},[579,3381,790],{"class":585},[579,3383,793],{"class":589},[579,3385,3113],{"class":589},[579,3387,3116],{"class":589},[579,3389,3119],{"class":589},[579,3391,3122],{"class":589},[579,3393,3125],{"class":589},[579,3395,3396],{"class":589}," generated_Public_key\n",[429,3398,3399],{},"Configurar a CLI:",[570,3401,3403],{"className":572,"code":3402,"language":574,"meta":424,"style":424},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[576,3404,3405,3410,3442,3446],{"__ignoreMap":424},[579,3406,3407],{"class":581,"line":582},[579,3408,3409],{"class":609},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[579,3411,3412,3414,3416,3419,3421,3424,3427,3430,3433,3436,3439],{"class":581,"line":600},[579,3413,2274],{"class":616},[579,3415,3307],{"class":722},[579,3417,3418],{"class":589},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[579,3420,3313],{"class":722},[579,3422,3423],{"class":722},"  >>",[579,3425,3426],{"class":589}," \u002Fhome\u002F",[579,3428,3429],{"class":722},"\u003C",[579,3431,3432],{"class":589},"use",[579,3434,3435],{"class":596},"r",[579,3437,3438],{"class":722},">",[579,3440,3441],{"class":589},"\u002F.bashrc\n",[579,3443,3444],{"class":581,"line":606},[579,3445,741],{"emptyLinePlaceholder":740},[579,3447,3448,3450,3452,3455,3457,3459,3461,3463,3465,3467,3469],{"class":581,"line":613},[579,3449,2274],{"class":616},[579,3451,3307],{"class":722},[579,3453,3454],{"class":589},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[579,3456,3313],{"class":722},[579,3458,3423],{"class":722},[579,3460,3426],{"class":589},[579,3462,3429],{"class":722},[579,3464,3432],{"class":589},[579,3466,3435],{"class":596},[579,3468,3438],{"class":722},[579,3470,3441],{"class":589},[429,3472,3473],{},"Execute o seguinte comando para verificar se o buzz-cli está configurado corretamente:",[570,3475,3477],{"className":572,"code":3476,"language":574,"meta":424,"style":424},"buzz channels list\n",[576,3478,3479],{"__ignoreMap":424},[579,3480,3481,3484,3487],{"class":581,"line":582},[579,3482,3483],{"class":585},"buzz",[579,3485,3486],{"class":589}," channels",[579,3488,3489],{"class":589}," list\n",[429,3491,3492],{},[433,3493],{"alt":3494,"src":3495},"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",[544,3497,3499],{"id":3498},"criar-um-projeto-com-o-buzz-cli","Criar um projeto com o buzz-cli",[570,3501,3503],{"className":572,"code":3502,"language":574,"meta":424,"style":424},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[576,3504,3505,3510],{"__ignoreMap":424},[579,3506,3507],{"class":581,"line":582},[579,3508,3509],{"class":609},"# --channel refers to the UUID of the channel\n",[579,3511,3512,3514,3517,3520,3523,3526,3529,3531,3534,3536,3539,3541,3544],{"class":581,"line":600},[579,3513,3483],{"class":585},[579,3515,3516],{"class":589}," repos",[579,3518,3519],{"class":589}," create",[579,3521,3522],{"class":589}," --id",[579,3524,3525],{"class":589}," TestKOA",[579,3527,3528],{"class":589}," --name",[579,3530,3307],{"class":722},[579,3532,3533],{"class":589},"Display Name",[579,3535,3313],{"class":722},[579,3537,3538],{"class":589}," --channel",[579,3540,1106],{"class":722},[579,3542,3543],{"class":589},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[579,3545,1112],{"class":722},[429,3547,3548,3549,3551],{},"Um projeto só pode ser removido por seu proprietário. Como o projeto \"Display Name\" foi criado pelo ",[576,3550,3254],{},", que carece de um comando de remoção, ele não pode ser excluído dessa maneira.",[429,3553,3554],{},"Consulte o aplicativo desktop Buzz para verificar se o projeto foi criado.",[429,3556,3557],{},[433,3558],{"alt":3559,"src":3560},"Visualização de projetos do aplicativo Buzz confirmando a criação bem-sucedida do projeto","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[429,3562,3563],{},"Assim que um projeto estiver disponível em Projects, mais projetos poderão ser adicionados usando o botão \"+\" no canto superior direito.",[429,3565,3566],{},[433,3567],{"alt":3568,"src":3569},"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",[544,3571,3573],{"id":3572},"vincular-repositórios-git-existentes","Vincular repositórios Git existentes",[429,3575,3576,3577,3580,3581,3584,3585,768],{},"Instale o ",[576,3578,3579],{},"git-credential-nostr"," na máquina onde os repositórios git estão instalados. Ele requer o ",[462,3582,3583],{},"git 2.46+"," e a toolchain Rust. Consulte este ",[442,3586,3589],{"href":3587,"rel":3588},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[446],"Readme",[570,3591,3593],{"className":572,"code":3592,"language":574,"meta":424,"style":424},"cargo install --path crates\u002Fgit-credential-nostr\n",[576,3594,3595],{"__ignoreMap":424},[579,3596,3597,3599,3601,3603],{"class":581,"line":582},[579,3598,3292],{"class":585},[579,3600,2348],{"class":589},[579,3602,3297],{"class":589},[579,3604,3605],{"class":589}," crates\u002Fgit-credential-nostr\n",[429,3607,3608,3609,3611],{},"Configure o ",[576,3610,3579],{}," para autorização do relay Buzz:",[570,3613,3615],{"className":572,"code":3614,"language":574,"meta":424,"style":424},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[576,3616,3617,3622,3638,3652,3656,3661,3670,3697],{"__ignoreMap":424},[579,3618,3619],{"class":581,"line":582},[579,3620,3621],{"class":609},"# 1. Register the helper and enable per-path credentials.\n",[579,3623,3624,3626,3629,3632,3635],{"class":581,"line":600},[579,3625,586],{"class":585},[579,3627,3628],{"class":589}," config",[579,3630,3631],{"class":589}," --global",[579,3633,3634],{"class":589}," credential.helper",[579,3636,3637],{"class":589}," nostr\n",[579,3639,3640,3642,3644,3646,3649],{"class":581,"line":606},[579,3641,586],{"class":585},[579,3643,3628],{"class":589},[579,3645,3631],{"class":589},[579,3647,3648],{"class":589}," credential.useHttpPath",[579,3650,3651],{"class":722}," true\n",[579,3653,3654],{"class":581,"line":613},[579,3655,741],{"emptyLinePlaceholder":740},[579,3657,3658],{"class":581,"line":623},[579,3659,3660],{"class":609},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[579,3662,3663,3665,3667],{"class":581,"line":628},[579,3664,3043],{"class":585},[579,3666,3046],{"class":589},[579,3668,3669],{"class":589}," ~\u002F.nostr\n",[579,3671,3672,3674,3676,3679,3681,3683,3686,3688,3691,3694],{"class":581,"line":634},[579,3673,2274],{"class":616},[579,3675,1106],{"class":722},[579,3677,3678],{"class":589},"nsec1...",[579,3680,1526],{"class":722},[579,3682,2308],{"class":722},[579,3684,3685],{"class":589}," ~\u002F.nostr\u002Fkey",[579,3687,3322],{"class":722},[579,3689,3690],{"class":585}," chmod",[579,3692,3693],{"class":771}," 600",[579,3695,3696],{"class":589}," ~\u002F.nostr\u002Fkey\n",[579,3698,3699,3701,3703,3705,3708],{"class":581,"line":775},[579,3700,586],{"class":585},[579,3702,3628],{"class":589},[579,3704,3631],{"class":589},[579,3706,3707],{"class":589}," nostr.keyfile",[579,3709,3696],{"class":589},[429,3711,3712],{},"Crie um repositório no relay Buzz:",[570,3714,3717],{"className":3715,"code":3716,"language":2495},[2493],"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",[576,3718,3716],{"__ignoreMap":424},[429,3720,3721,3722,3725,3726,3729],{},"No seu primeiro ",[576,3723,3724],{},"git push",", você encontrará um erro ",[576,3727,3728],{},"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):",[570,3731,3733],{"className":572,"code":3732,"language":574,"meta":424,"style":424},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[576,3734,3735,3763,3767,3772],{"__ignoreMap":424},[579,3736,3737,3739,3741,3744,3746,3749,3751,3754,3757,3760],{"class":581,"line":582},[579,3738,3483],{"class":585},[579,3740,3516],{"class":589},[579,3742,3743],{"class":589}," bind",[579,3745,3522],{"class":589},[579,3747,3748],{"class":589}," koa-email-routing",[579,3750,3538],{"class":589},[579,3752,3753],{"class":722}," \u003C",[579,3755,3756],{"class":589},"CHANNEL_UUI",[579,3758,3759],{"class":596},"D",[579,3761,3762],{"class":722},">\n",[579,3764,3765],{"class":581,"line":600},[579,3766,741],{"emptyLinePlaceholder":740},[579,3768,3769],{"class":581,"line":606},[579,3770,3771],{"class":609},"# push the code again\n",[579,3773,3774,3776],{"class":581,"line":613},[579,3775,586],{"class":585},[579,3777,3778],{"class":589}," push\n",[429,3780,3781,3782,3784],{},"A verificação do projeto no aplicativo Buzz desktop mostra o seguinte, porque o aplicativo precisa do ",[462,3783,3583],{}," — iniciar o aplicativo diretamente pode carregar uma versão mais antiga do Git:",[429,3786,3787],{},[433,3788],{"alt":3789,"src":3790},"O cliente Buzz exibindo erro de carregamento do Git devido a versão local do Git desatualizada inferior a 2.46","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[429,3792,3793,3794,3797,3798,695],{},"Exporte o PATH por meio de ",[576,3795,3796],{},"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 ",[442,3799,3802],{"href":3800,"rel":3801},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[446],"problema",[570,3804,3806],{"className":572,"code":3805,"language":574,"meta":424,"style":424},"open -a Buzz\n",[576,3807,3808],{"__ignoreMap":424},[579,3809,3810,3813,3816],{"class":581,"line":582},[579,3811,3812],{"class":585},"open",[579,3814,3815],{"class":589}," -a",[579,3817,3818],{"class":589}," Buzz\n",[429,3820,3821],{},"Consulte novamente os Projetos no aplicativo Buzz, os detalhes do repositório agora estão carregados.",[429,3823,3824],{},[433,3825],{"alt":3826,"src":3827},"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",[493,3829,3831],{"id":3830},"sincronizando-agentes-de-ia-com-o-buzz-mobile-app-via-código-qr","Sincronizando agentes de IA com o Buzz Mobile App via código QR",[429,3833,3834,3835,3838],{},"O emparelhamento do aplicativo móvel Buzz só aceita o protocolo HTTPS e o ",[576,3836,3837],{},"buzz-pair-relay"," não é iniciado por padrão no VPS.",[570,3840,3842],{"className":572,"code":3841,"language":574,"meta":424,"style":424},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[576,3843,3844,3850],{"__ignoreMap":424},[579,3845,3846,3848],{"class":581,"line":582},[579,3847,617],{"class":616},[579,3849,3287],{"class":589},[579,3851,3852,3854,3856,3858],{"class":581,"line":600},[579,3853,3292],{"class":585},[579,3855,2348],{"class":589},[579,3857,3297],{"class":589},[579,3859,3860],{"class":589}," crates\u002Fbuzz-pair-relay\n",[429,3862,3863,3864,3867,3868,768],{},"Adicione o seguinte ao ",[576,3865,3866],{},"compose.yml"," para iniciar o serviço ",[576,3869,3837],{},[570,3871,3873],{"className":1062,"code":3872,"language":1064,"meta":424,"style":424},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[576,3874,3875,3882,3891,3911,3917,3927,3933,3944,3952,3958],{"__ignoreMap":424},[579,3876,3877,3880],{"class":581,"line":582},[579,3878,3879],{"class":1071},"  pair",[579,3881,849],{"class":722},[579,3883,3884,3886,3888],{"class":581,"line":600},[579,3885,1086],{"class":1071},[579,3887,768],{"class":722},[579,3889,3890],{"class":589}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[579,3892,3893,3896,3898,3901,3903,3906,3908],{"class":581,"line":606},[579,3894,3895],{"class":1071},"    entrypoint",[579,3897,768],{"class":722},[579,3899,3900],{"class":722}," [",[579,3902,1526],{"class":722},[579,3904,3905],{"class":589},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[579,3907,1526],{"class":722},[579,3909,3910],{"class":722},"]\n",[579,3912,3913,3915],{"class":581,"line":613},[579,3914,1117],{"class":1071},[579,3916,849],{"class":722},[579,3918,3919,3922,3924],{"class":581,"line":623},[579,3920,3921],{"class":1071},"      BUZZ_PAIR_RELAY_BIND_ADDR",[579,3923,768],{"class":722},[579,3925,3926],{"class":589}," 0.0.0.0:5000\n",[579,3928,3929,3931],{"class":581,"line":628},[579,3930,1096],{"class":1071},[579,3932,849],{"class":722},[579,3934,3935,3937,3939,3942],{"class":581,"line":634},[579,3936,1103],{"class":722},[579,3938,1106],{"class":722},[579,3940,3941],{"class":589},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[579,3943,1112],{"class":722},[579,3945,3946,3948,3950],{"class":581,"line":775},[579,3947,1185],{"class":1071},[579,3949,768],{"class":722},[579,3951,1190],{"class":589},[579,3953,3954,3956],{"class":581,"line":1134},[579,3955,2892],{"class":1071},[579,3957,849],{"class":722},[579,3959,3960,3963,3966],{"class":581,"line":1142},[579,3961,3962],{"class":722},"      [",[579,3964,3965],{"class":589},"buzz-net",[579,3967,3910],{"class":722},[429,3969,1008,3970,664,3973,3976,3977,768],{},[576,3971,3972],{},"BUZZ_PAIRING_RELAY_URL",[576,3974,3975],{},"BUZZ_PAIR_RELAY_PORT"," ao arquivo ",[576,3978,650],{},[570,3980,3983],{"className":3981,"code":3982,"language":2495},[2493],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[576,3984,3982],{"__ignoreMap":424},[429,3986,3987,3988,3991],{},"Vá para '",[462,3989,3990],{},"Mobile","' nas configurações da versão desktop do Buzz:",[429,3993,3994],{},[433,3995],{"alt":3996,"src":3997},"Caixa de diálogo de configurações no aplicativo Buzz mostrando a guia de configuração de dispositivos móveis","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[429,3999,4000],{},"Clique em \"Start pairing\" — um código QR é gerado; escaneie esse código QR com o aplicativo Buzz no dispositivo móvel. Ele será emparelhado depois que você clicar em \"Code Match\".",[429,4002,4003],{},[433,4004],{"alt":4005,"src":4006},"Gerando código QR de emparelhamento seguro no cliente de desktop para sincronização móvel do Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[429,4008,4009],{},"Os agentes no aplicativo móvel Buzz só estão disponíveis se estiverem sendo executados no aplicativo de dektop Buzz. O computador desktop deve estar ligado para que os agentes funcionem.",[429,4011,4012],{},[433,4013],{"alt":4014,"src":4015},"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",[493,4017,4019],{"id":4018},"considerações-finais","Considerações Finais",[429,4021,4022],{},"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.",[493,4024,1871],{"id":1870},[504,4026,4027,4034,4041,4048],{},[507,4028,4029],{},[442,4030,4033],{"href":4031,"rel":4032},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[446],"Buzz releases",[507,4035,4036],{},[442,4037,4040],{"href":4038,"rel":4039},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[446],"Introducing Buzz",[507,4042,4043],{},[442,4044,4047],{"href":4045,"rel":4046},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[446],"What is buzz",[507,4049,4050],{},[442,4051,4054],{"href":4052,"rel":4053},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[446],"How to self-host Buzz (Miget)",[1896,4056,4057],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":424,"searchDepth":600,"depth":606,"links":4059},[4060,4061,4062,4076,4085,4086,4087],{"id":1970,"depth":600,"text":1971},{"id":2015,"depth":600,"text":2016},{"id":2063,"depth":600,"text":2064,"children":4063},[4064,4065,4069,4070,4071,4075],{"id":2067,"depth":606,"text":2068},{"id":2097,"depth":606,"text":2098,"children":4066},[4067,4068],{"id":2101,"depth":613,"text":2102},{"id":2200,"depth":613,"text":2201},{"id":2218,"depth":606,"text":2219},{"id":2435,"depth":606,"text":2436},{"id":2581,"depth":606,"text":2582,"children":4072},[4073,4074],{"id":2585,"depth":613,"text":2586},{"id":2969,"depth":613,"text":2970},{"id":3032,"depth":606,"text":3033},{"id":3072,"depth":600,"text":3073,"children":4077},[4078,4079,4080],{"id":3152,"depth":606,"text":3153},{"id":3197,"depth":606,"text":3198},{"id":3234,"depth":606,"text":3235,"children":4081},[4082,4083,4084],{"id":3258,"depth":613,"text":3259},{"id":3498,"depth":613,"text":3499},{"id":3572,"depth":613,"text":3573},{"id":3830,"depth":600,"text":3831},{"id":4018,"depth":600,"text":4019},{"id":1870,"depth":600,"text":1871},[4089,4090,3483],"collaboration","ai-agents","2026-09-08","Aprenda a auto-hospedar o relay Buzz da Block em um VPS Linux com Cloudflare. Crie um espaço de trabalho seguro baseado em Nostr para humanos e agentes IA.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FPT-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","Um cartão tecnológico premium de 16:9 com detalhes em azul profundo e laranja ilustrando como auto-hospedar o relay Buzz do Block em um VPS Ubuntu, apresentando um painel glassmorphic limpo com tipografia centrada.",{"schemaOrg":4096,"robots":1934,"sitemap":4117},[4097,4099],{"@type":4098,"headline":703,"description":4092,"image":4093},"TechArticle",{"@type":1933,"name":703,"description":4092,"image":4093,"step":4100},[4101,4105,4108,4111,4114],{"@type":4102,"name":4103,"text":4104},"HowToStep","Fase 1: Configuração da Cloudflare","Criar um token de API da Cloudflare e configurar as definições de DNS.",{"@type":4102,"name":4106,"text":4107},"Fase 2: Instalar o Docker","Configurar e instalar o Docker Engine no VPS Ubuntu.",{"@type":4102,"name":4109,"text":4110},"Fase 3: Clonar e configurar","Clonar o repositório e configurar as variáveis do compose.",{"@type":4102,"name":4112,"text":4113},"Fase 4: Integração do Caddy","Compilar um Caddy personalizado com o módulo de desafio DNS da Cloudflare.",{"@type":4102,"name":4115,"text":4116},"Fase 5: Backup automatizado","Configurar uma tarefa cron para fazer backup automático do PostgreSQL.",{"lastmod":4118},"2026-09-03",{"title":4120,"description":4092,"ogTitle":703,"ogDescription":4092,"twitterTitle":703,"twitterDescription":4092},"Como instalar e auto-hospedar o relay Buzz em VPS Ubuntu","pt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[4123,4124,1966,4125,4126],"Nostr","Docker","Caddy","Cloudflare","d81fxoKo6iAaIp8OwbrHCSaUSob7w9HyKP0oH38Exq0",{"id":4129,"title":2088,"author":424,"body":4130,"category":5001,"date":5003,"description":5004,"extension":1925,"image":2093,"imageAlt":5005,"isPublished":740,"meta":5006,"minRead":1134,"navigation":740,"path":219,"seo":5011,"stem":5013,"tags":5014,"updatedAt":5010,"__hash__":5017},"article\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md",{"type":426,"value":4131,"toc":4983},[4132,4146,4156,4160,4163,4175,4179,4187,4191,4195,4244,4248,4378,4382,4416,4420,4423,4487,4490,4526,4529,4556,4560,4570,4574,4612,4700,4704,4709,4726,4735,4805,4810,4855,4859,4904,4919,4923,4966,4970,4980],[429,4133,4134,4135,4138,4139,4142,4143,4145],{},"Um desafio comum surge quando você deseja acessar seu ",[462,4136,4137],{},"Hermes Agent"," de outros dispositivos, como notebooks, tablets ou telefones, sem expô-lo à internet pública. Utilizar o ",[462,4140,4141],{},"Cloudflare WARP"," com o ",[462,4144,476],{}," permite que você exponha o Hermes Agent globalmente sem abrir uma única porta de entrada no seu firewall.",[429,4147,4148,4149,4152,4153,4155],{},"Se você seguiu nosso guia anterior, '",[442,4150,4151],{"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 ",[462,4154,4141],{}," para expor o Hermes Agent a uma rede privada pela internet.",[493,4157,4159],{"id":4158},"entendendo-a-arquitetura","Entendendo a Arquitetura",[429,4161,4162],{},"Os componentes em ação:",[2104,4164,4165,4170],{},[507,4166,4167,4169],{},[462,4168,476],{},": O painel de controle da Cloudflare onde você define regras de roteamento e políticas de acesso.",[507,4171,4172,4174],{},[462,4173,4141],{},": 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.",[539,4176,4178],{"id":4177},"pré-requisitos","Pré-requisitos",[504,4180,4181,4184],{},[507,4182,4183],{},"Um Hermes Agent em execução no seu VPS.",[507,4185,4186],{},"Uma conta gratuita da Cloudflare.",[493,4188,4190],{"id":4189},"guia-passo-a-passo","Guia Passo a Passo",[539,4192,4194],{"id":4193},"passo-1-configurar-o-cloudflare-zero-trust","Passo 1: Configurar o Cloudflare Zero Trust",[2104,4196,4197,4205,4212,4223,4230,4237],{},[507,4198,4199,4200,695],{},"Faça login no seu ",[442,4201,4204],{"href":4202,"rel":4203},"https:\u002F\u002Fdash.cloudflare.com\u002F",[446],"Painel da Cloudflare",[507,4206,4207,4208],{},"Clique em 'Zero Trust' no menu à esquerda.\n",[433,4209],{"alt":4210,"src":4211},"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",[507,4213,4214,4215,4218,4219],{},"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., ",[576,4216,4217],{},"ai-team",").\n",[433,4220],{"alt":4221,"src":4222},"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",[507,4224,4225,4226],{},"Clique em 'Access' e depois em 'Policies' para criar uma política de acesso definindo quem tem acesso à rede.\n",[433,4227],{"alt":4228,"src":4229},"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",[507,4231,4232,4233],{},"Clique em 'Create new policy'.\n",[433,4234],{"alt":4235,"src":4236},"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",[507,4238,4239,4240],{},"Selecione 'Emails' e insira seu e-mail em 'Policy rules'.\n",[433,4241],{"alt":4242,"src":4243},"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",[539,4245,4247],{"id":4246},"passo-2-configurar-o-cliente-cloudflare-warp-no-vps","Passo 2: Configurar o cliente Cloudflare WARP no VPS",[2104,4249,4250,4259,4265,4272,4275,4290,4293,4371],{},[507,4251,1568,4252,664,4255,4258],{},[576,4253,4254],{},"sudo apt update",[576,4256,4257],{},"sudo apt install cloudflare-warp"," no terminal do seu VPS.",[507,4260,1568,4261,4264],{},[576,4262,4263],{},"warp-cli registration new \u003CTEAM-NAME>"," no terminal do seu VPS, o que exibirá um URL.",[507,4266,4267,4268,4271],{},"Copie o URL gerado, que será parecido com ",[576,4269,4270],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp",", e cole-o no seu navegador para autenticação.",[507,4273,4274],{},"Como a autenticação por e-mail foi definida na configuração da política acima, insira seu e-mail para autenticar.",[507,4276,4277,4278,4281,4282,4285,4286,4289],{},"Na página de '",[462,4279,4280],{},"Success","' (Colaboração bem-sucedida) no navegador, clique com o botão direito e selecione '",[462,4283,4284],{},"Inspect","' (Inspecionar) no botão azul '",[462,4287,4288],{},"Open Cloudflare WARP","'.",[507,4291,4292],{},"Copie o token longo que aparece no link do botão.",[507,4294,1568,4295,4298,4299,4302,4303],{},[576,4296,4297],{},"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.",[4300,4301],"br",{},"Se encontrar o 'Error: Failed to communicate with the WARP API' no Ubuntu 26, execute os seguintes comandos:",[570,4304,4306],{"className":572,"code":4305,"language":574,"meta":424,"style":424},"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",[576,4307,4308,4320,4324,4329,4340,4344,4349],{"__ignoreMap":424},[579,4309,4310,4312,4314,4317],{"class":581,"line":582},[579,4311,1316],{"class":585},[579,4313,1756],{"class":589},[579,4315,4316],{"class":589}," restart",[579,4318,4319],{"class":589}," warp-svc.service\n",[579,4321,4322],{"class":581,"line":600},[579,4323,741],{"emptyLinePlaceholder":740},[579,4325,4326],{"class":581,"line":606},[579,4327,4328],{"class":609},"# Check status\n",[579,4330,4331,4333,4335,4338],{"class":581,"line":613},[579,4332,1316],{"class":585},[579,4334,1756],{"class":589},[579,4336,4337],{"class":589}," status",[579,4339,4319],{"class":589},[579,4341,4342],{"class":581,"line":623},[579,4343,741],{"emptyLinePlaceholder":740},[579,4345,4346],{"class":581,"line":628},[579,4347,4348],{"class":609},"# Run the warp-cli registration token again\n",[579,4350,4351,4354,4357,4360,4363,4366,4369],{"class":581,"line":634},[579,4352,4353],{"class":585},"warp-cli",[579,4355,4356],{"class":589}," --accept-tos",[579,4358,4359],{"class":589}," registration",[579,4361,4362],{"class":589}," token",[579,4364,4365],{"class":722},"   \"",[579,4367,4368],{"class":589},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[579,4370,1112],{"class":722},[507,4372,4373,4374],{},"Volte ao painel do Cloudflare Zero Trust e clique em 'Devices' (Dispositivos). O dispositivo do seu VPS deve ser exibido agora.\n",[433,4375],{"alt":4376,"src":4377},"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",[539,4379,4381],{"id":4380},"passo-3-configurar-o-roteamento-de-tráfego","Passo 3: Configurar o roteamento de tráfego",[2104,4383,4384,4391,4398,4405],{},[507,4385,4386,4387],{},"Clique no perfil do seu VPS no painel de Dispositivos.\n",[433,4388],{"alt":4389,"src":4390},"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",[507,4392,4393,4394],{},"Role para baixo até a seção 'Split Tunnels' (Túneis divididos).\n",[433,4395],{"alt":4396,"src":4397},"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",[507,4399,4400,4401],{},"Clique no botão 'Manage' (Gerenciar) e defina as configurações conforme mostrado abaixo. Substitua o endereço IP, se necessário.\n",[433,4402],{"alt":4403,"src":4404},"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",[507,4406,4407,4408,4411,4412,4415],{},"Expor o ",[576,4409,4410],{},"address"," (endereço) e o ",[576,4413,4414],{},"host"," roteará o tráfego para seus serviços pela mesma rede privada.",[539,4417,4419],{"id":4418},"passo-4-configurar-o-firewall-no-vps","Passo 4: Configurar o Firewall no VPS",[429,4421,4422],{},"Habilite o firewall para permitir apenas a sub-rede '100.96.0.0\u002F12', bloqueando qualquer outro acesso público de entrada.",[570,4424,4426],{"className":572,"code":4425,"language":574,"meta":424,"style":424},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[576,4427,4428,4439,4456,4470],{"__ignoreMap":424},[579,4429,4430,4432,4435,4437],{"class":581,"line":582},[579,4431,1316],{"class":585},[579,4433,4434],{"class":589}," ufw",[579,4436,1769],{"class":589},[579,4438,1340],{"class":596},[579,4440,4441,4443,4445,4448,4451,4454],{"class":581,"line":600},[579,4442,1316],{"class":585},[579,4444,4434],{"class":589},[579,4446,4447],{"class":589}," default",[579,4449,4450],{"class":589}," allow",[579,4452,4453],{"class":589}," outgoing",[579,4455,1340],{"class":596},[579,4457,4458,4460,4462,4464,4467],{"class":581,"line":606},[579,4459,1316],{"class":585},[579,4461,4434],{"class":589},[579,4463,4447],{"class":589},[579,4465,4466],{"class":589}," deny",[579,4468,4469],{"class":589}," incoming\n",[579,4471,4472,4474,4476,4478,4481,4484],{"class":581,"line":613},[579,4473,1316],{"class":585},[579,4475,4434],{"class":589},[579,4477,4450],{"class":589},[579,4479,4480],{"class":589}," in",[579,4482,4483],{"class":589}," from",[579,4485,4486],{"class":589}," 100.96.0.0\u002F12\n",[429,4488,4489],{},"Permita o tráfego de loopback para evitar a interrupção de serviços locais:",[570,4491,4493],{"className":572,"code":4492,"language":574,"meta":424,"style":424},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[576,4494,4495,4511],{"__ignoreMap":424},[579,4496,4497,4499,4501,4503,4505,4508],{"class":581,"line":582},[579,4498,1316],{"class":585},[579,4500,4434],{"class":589},[579,4502,4450],{"class":589},[579,4504,4480],{"class":589},[579,4506,4507],{"class":589}," on",[579,4509,4510],{"class":589}," lo\n",[579,4512,4513,4515,4517,4519,4522,4524],{"class":581,"line":600},[579,4514,1316],{"class":585},[579,4516,4434],{"class":589},[579,4518,4450],{"class":589},[579,4520,4521],{"class":589}," out",[579,4523,4507],{"class":589},[579,4525,4510],{"class":589},[429,4527,4528],{},"Recarregue o firewall e verifique o status:",[570,4530,4532],{"className":572,"code":4531,"language":574,"meta":424,"style":424},"sudo ufw reload \nsudo ufw status verbose\n",[576,4533,4534,4545],{"__ignoreMap":424},[579,4535,4536,4538,4540,4543],{"class":581,"line":582},[579,4537,1316],{"class":585},[579,4539,4434],{"class":589},[579,4541,4542],{"class":589}," reload",[579,4544,1340],{"class":596},[579,4546,4547,4549,4551,4553],{"class":581,"line":600},[579,4548,1316],{"class":585},[579,4550,4434],{"class":589},[579,4552,4337],{"class":589},[579,4554,4555],{"class":589}," verbose\n",[539,4557,4559],{"id":4558},"passo-5-expor-o-hermes-agent-à-rede-privada","Passo 5: Expor o Hermes Agent à Rede Privada",[429,4561,4562,4563,4566,4567,695],{},"Vamos expor o ",[462,4564,4565],{},"Hermes Agent Web Dashboard"," à nossa rede privada e usar o provedor de autenticação padrão, ",[462,4568,4569],{},"Nous Research",[544,4571,4573],{"id":4572},"configurar-o-provedor-de-autenticação","Configurar o provedor de autenticação",[2104,4575,4576,4585,4592,4599,4606],{},[507,4577,4578,4579,4584],{},"Vá até ",[442,4580,4583],{"href":4581,"rel":4582},"https:\u002F\u002Fportal.nousresearch.com",[446],"portal.nousresearch.com"," para registrar uma conta.",[507,4586,4587,4588],{},"Selecione 'Local Dashboards' (Painéis locais).\n",[433,4589],{"alt":4590,"src":4591},"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",[507,4593,4594,4595],{},"Clique em 'Register Dashboard' (Registrar painel).\n",[433,4596],{"alt":4597,"src":4598},"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",[507,4600,4601,4602],{},"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,4603],{"alt":4604,"src":4605},"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",[507,4607,4608,4609,768],{},"Copie o 'OAuth client ID' e cole-o em seu arquivo ",[576,4610,4611],{},"config.yaml",[570,4613,4617],{"className":4614,"code":4615,"language":4616,"meta":424,"style":424},"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",[576,4618,4619,4626,4636,4647,4654,4664,4674,4681,4691],{"__ignoreMap":424},[579,4620,4621,4624],{"class":581,"line":582},[579,4622,4623],{"class":1071},"dashboard",[579,4625,849],{"class":722},[579,4627,4628,4631,4633],{"class":581,"line":600},[579,4629,4630],{"class":1071},"  theme",[579,4632,768],{"class":722},[579,4634,4635],{"class":589}," default\n",[579,4637,4638,4641,4643],{"class":581,"line":606},[579,4639,4640],{"class":1071},"  show_token_analytics",[579,4642,768],{"class":722},[579,4644,4646],{"class":4645},"sfNiH"," false\n",[579,4648,4649,4652],{"class":581,"line":613},[579,4650,4651],{"class":1071},"  oauth",[579,4653,849],{"class":722},[579,4655,4656,4659,4661],{"class":581,"line":623},[579,4657,4658],{"class":1071},"    client_id",[579,4660,768],{"class":722},[579,4662,4663],{"class":589}," agent:cmq02x7ha0002jk0ba3kfnb\n",[579,4665,4666,4669,4671],{"class":581,"line":628},[579,4667,4668],{"class":1071},"    portal_url",[579,4670,768],{"class":722},[579,4672,4673],{"class":589}," https:\u002F\u002Fportal.nousresearch.com\n",[579,4675,4676,4679],{"class":581,"line":634},[579,4677,4678],{"class":1071},"  basic_auth",[579,4680,849],{"class":722},[579,4682,4683,4686,4688],{"class":581,"line":775},[579,4684,4685],{"class":1071},"    username",[579,4687,768],{"class":722},[579,4689,4690],{"class":722}," ''\n",[579,4692,4693,4696,4698],{"class":581,"line":1134},[579,4694,4695],{"class":1071},"    password_hash",[579,4697,768],{"class":722},[579,4699,4690],{"class":722},[544,4701,4703],{"id":4702},"configurar-o-systemd-para-iniciar-automaticamente-o-painel-do-hermes","Configurar o Systemd para Iniciar Automaticamente o Painel do Hermes",[2104,4705,4706],{},[507,4707,4708],{},"Crie um arquivo de serviço:",[570,4710,4714],{"className":4711,"code":4712,"language":4713,"meta":424,"style":424},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[576,4715,4716],{"__ignoreMap":424},[579,4717,4718,4720,4723],{"class":581,"line":582},[579,4719,1316],{"class":585},[579,4721,4722],{"class":589}," nano",[579,4724,4725],{"class":589}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[2104,4727,4728],{"start":600},[507,4729,4730,4731,4734],{},"Cole a seguinte configuração, garantindo que ",[576,4732,4733],{},"--host 0.0.0.0"," faça parte do comando:",[570,4736,4740],{"className":4737,"code":4738,"language":4739,"meta":424,"style":424},"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",[576,4741,4742,4746,4751,4756,4760,4764,4769,4774,4779,4783,4788,4793,4797,4801],{"__ignoreMap":424},[579,4743,4744],{"class":581,"line":582},[579,4745,1664],{},[579,4747,4748],{"class":581,"line":600},[579,4749,4750],{},"Description=Hermes Dashboard\n",[579,4752,4753],{"class":581,"line":606},[579,4754,4755],{},"After=network.target\n",[579,4757,4758],{"class":581,"line":613},[579,4759,741],{"emptyLinePlaceholder":740},[579,4761,4762],{"class":581,"line":623},[579,4763,1688],{},[579,4765,4766],{"class":581,"line":628},[579,4767,4768],{},"User=hermes\n",[579,4770,4771],{"class":581,"line":634},[579,4772,4773],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[579,4775,4776],{"class":581,"line":775},[579,4777,4778],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[579,4780,4781],{"class":581,"line":1134},[579,4782,1723],{},[579,4784,4785],{"class":581,"line":1142},[579,4786,4787],{},"RestartSec=10\n",[579,4789,4790],{"class":581,"line":1150},[579,4791,4792],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[579,4794,4795],{"class":581,"line":1158},[579,4796,741],{"emptyLinePlaceholder":740},[579,4798,4799],{"class":581,"line":1166},[579,4800,1737],{},[579,4802,4803],{"class":581,"line":1174},[579,4804,1742],{},[2104,4806,4807],{"start":606},[507,4808,4809],{},"Habilite e inicie o serviço:",[570,4811,4813],{"className":4711,"code":4812,"language":4713,"meta":424,"style":424},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[576,4814,4815,4823,4834,4845],{"__ignoreMap":424},[579,4816,4817,4819,4821],{"class":581,"line":582},[579,4818,1316],{"class":585},[579,4820,1756],{"class":589},[579,4822,1759],{"class":589},[579,4824,4825,4827,4829,4831],{"class":581,"line":600},[579,4826,1316],{"class":585},[579,4828,1756],{"class":589},[579,4830,1769],{"class":589},[579,4832,4833],{"class":589}," hermes-dashboard\n",[579,4835,4836,4838,4840,4843],{"class":581,"line":606},[579,4837,1316],{"class":585},[579,4839,1756],{"class":589},[579,4841,4842],{"class":589}," start",[579,4844,4833],{"class":589},[579,4846,4847,4849,4851,4853],{"class":581,"line":613},[579,4848,1316],{"class":585},[579,4850,1756],{"class":589},[579,4852,4337],{"class":589},[579,4854,4833],{"class":589},[539,4856,4858],{"id":4857},"passo-6-instalar-o-cliente-cloudflare-warp-no-desktop","Passo 6: Instalar o cliente Cloudflare WARP no Desktop",[2104,4860,4861,4869,4872,4879,4886,4893],{},[507,4862,4863,4864,695],{},"Baixe o cliente Cloudflare WARP pelo ",[442,4865,4868],{"href":4866,"rel":4867},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[446],"portal da Cloudflare",[507,4870,4871],{},"Abra e inicie o cliente Cloudflare WARP após a instalação.",[507,4873,4874,4875],{},"Faça login quando solicitado.\n",[433,4876],{"alt":4877,"src":4878},"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",[507,4880,4881,4882],{},"Uma página de 'Success' (Sucesso) será exibida após o login.\n",[433,4883],{"alt":4884,"src":4885},"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",[507,4887,4888,4889],{},"O cliente WARP agora deve mostrar que está conectado à sua equipe do Zero Trust.\n",[433,4890],{"alt":4891,"src":4892},"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",[507,4894,4895,4896,4899,4900],{},"Navegue até o seu navegador e insira o seu IP privado (ex., ",[576,4897,4898],{},"100.96.0.3","). O Hermes Web Dashboard deve ser carregado com sucesso.\n",[433,4901],{"alt":4902,"src":4903},"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",[4905,4906,4907],"blockquote",{},[429,4908,4909,4912,4913,4918],{},[462,4910,4911],{},"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 ",[462,4914,4915],{},[442,4916,4917],{"href":399},"Alternar entre múltiplos perfis do Cloudflare WARP no macOS"," para alternar entre as contas sem problemas.",[539,4920,4922],{"id":4921},"passo-7-instalar-o-cliente-cloudflare-warp-em-dispositivos-ios","Passo 7: Instalar o cliente Cloudflare WARP em Dispositivos iOS",[2104,4924,4925,4931,4939,4947,4955],{},[507,4926,3576,4927,4930],{},[462,4928,4929],{},"Cloudflare One"," através da App Store.",[507,4932,4933,4934],{},"Abra o aplicativo Cloudflare One e insira o nome da sua equipe quando solicitado.\n",[433,4935],{"alt":4936,"src":4937,"width":4938},"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,[507,4940,4941,4942],{},"Faça login usando o mesmo endereço de e-mail que foi configurado na regra de política acima.\n",[433,4943],{"alt":4944,"src":4945,"width":4946},"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,[507,4948,4949,4950],{},"Assim que estiver conectado, a tela deve ficar parecida com isto:\n",[433,4951],{"alt":4952,"src":4953,"width":4954},"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,[507,4956,4957,4958,4960,4961],{},"Navegue até o seu navegador e insira o IP privado ",[576,4959,4898],{}," para acessar o Hermes Web Dashboard no seu dispositivo móvel.\n",[433,4962],{"alt":4963,"src":4964,"width":4965},"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,[493,4967,4969],{"id":4968},"conclusão","Conclusão",[429,4971,4972,4973,4975,4976,4979],{},"Com o ",[462,4974,476],{}," gerenciando as políticas de identidade e o cliente ",[462,4977,4978],{},"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.",[1896,4981,4982],{},"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":424,"searchDepth":600,"depth":606,"links":4984},[4985,4988,5000],{"id":4158,"depth":600,"text":4159,"children":4986},[4987],{"id":4177,"depth":606,"text":4178},{"id":4189,"depth":600,"text":4190,"children":4989},[4990,4991,4992,4993,4994,4998,4999],{"id":4193,"depth":606,"text":4194},{"id":4246,"depth":606,"text":4247},{"id":4380,"depth":606,"text":4381},{"id":4418,"depth":606,"text":4419},{"id":4558,"depth":606,"text":4559,"children":4995},[4996,4997],{"id":4572,"depth":613,"text":4573},{"id":4702,"depth":613,"text":4703},{"id":4857,"depth":606,"text":4858},{"id":4921,"depth":606,"text":4922},{"id":4968,"depth":600,"text":4969},[4090,5002],"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.","Exposição segura do Hermes Agent em rede privada usando Cloudflare Zero Trust e túnel WARP",{"schemaOrg":5007,"robots":1934,"sitemap":5009},[5008],{"@type":1933,"headline":2088,"description":5004,"name":2088,"image":2093},{"lastmod":5010},"2026-09-28",{"title":5012,"description":5004,"ogTitle":2088,"ogDescription":5004,"twitterTitle":2088,"twitterDescription":5004},"Acesso seguro ao Hermes Agent com Cloudflare Zero Trust","pt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[4141,1944,4137,5015,5016],"Rede privada","Tutorial","YSMA4-lqPipX1pmOP069tbQJepC0q97hwEJOym2fqzI",[5019,5020,5822],{"id":4129,"title":2088,"author":424,"body":4130,"category":5001,"date":5003,"description":5004,"extension":1925,"image":2093,"imageAlt":5005,"isPublished":740,"meta":5006,"minRead":1134,"navigation":740,"path":363,"seo":5011,"stem":5013,"tags":5014,"updatedAt":5010,"__hash__":5017},{"id":5021,"title":5022,"author":1945,"body":5023,"category":5805,"date":5807,"description":5808,"extension":1925,"image":5809,"imageAlt":5810,"isPublished":740,"meta":5811,"minRead":1134,"navigation":740,"path":415,"seo":5816,"stem":5817,"tags":5818,"updatedAt":1945,"__hash__":5821},"article\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","Criar sistema persistente de memória de IA na Cloudflare",{"type":426,"value":5024,"toc":5787},[5025,5029,5032,5035,5039,5042,5056,5060,5067,5081,5084,5087,5131,5135,5216,5220,5246,5354,5365,5369,5374,5415,5439,5443,5448,5519,5524,5528,5562,5568,5607,5611,5643,5647,5655,5659,5689,5693,5736,5738,5741,5744,5747,5750,5784],[493,5026,5028],{"id":5027},"a-importância-da-memória-persistente-de-ia-para-os-agentes","A importância da memória persistente de IA para os agentes",[429,5030,5031],{},"À medida que os assistentes de IA se tornam integrados no nosso quotidiano, deparamo-nos frequentemente com o problema do contexto em branco. As decisões tomadas na semana passada são esquecidas, exigindo que introduzamos repetidamente os mesmos detalhes de stacks tecnológicas e redefinamos as preferências do utilizador em cada nova sessão.",[429,5033,5034],{},"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.",[493,5036,5038],{"id":5037},"sistemas-de-memória-de-ia-auto-hospedados-vs-integrados","Sistemas de memória de IA auto-hospedados vs. integrados",[429,5040,5041],{},"Muitos agentes de IA vêm equipados com memória integrada, mas raramente limitamos o nosso fluxo de trabalho a um único assistente. Usamos o Claude para desenhar e arquitetar um projeto; o Kimi para programar; e o ChatGPT para pesquisa geral. O contexto não é partilhado entre estes diferentes agentes; permanece isolado em cada ferramenta de forma estanque.",[429,5043,5044,5045,5050,5051,5055],{},"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 ",[442,5046,5049],{"href":5047,"rel":5048},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[446],"Second Brain",", desenvolvido como um fork de ",[442,5052,5053],{"href":5053,"rel":5054},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare",[446],", 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.",[493,5057,5059],{"id":5058},"como-criar-um-second-brain-de-memória-de-ia-na-cloudflare","Como criar um Second Brain de memória de IA na Cloudflare",[429,5061,5062,5063,5066],{},"O sistema de memória Second Brain é implementado sobre o ",[462,5064,5065],{},"Cloudflare Workers",", proporcionando uma infraestrutura de servidores serverless distribuída globalmente com baixíssima latência. Isto permite que as operações de pesquisa de memória e armazenamento ocorram de forma quase instantânea na lógica de raciocínio da IA.",[429,5068,5069,5070,5073,5074,5077,5078,5080],{},"O modelo de embeddings do ",[462,5071,5072],{},"Workers AI"," é usado para gerar os vetores. Estes embeddings são guardados no ",[462,5075,5076],{},"Cloudflare Vectorize",", que é uma base de dados vetorial altamente otimizada e distribuída. O ",[462,5079,5076],{}," realiza buscas de similaridade por cosseno para identificar memórias com relevância sémântica.",[429,5082,5083],{},"O Second Brain conta também com mecanismos inteligentes de desduplicação e fusão. Textos com menos de 85% de similaridade sémântica são armazenados diretamente; caso contrário, são bloqueados ou marcados como potenciais duplicados. Textos longos que excedam 1.600 caracteres são fragmentados respeitando os limites de frases ou quebras de linha, mantendo uma sobreposição (overlap) de 200 caracteres para preservar a continuidade do assunto. Cada fragmento é então vetorizado para correspondências de alta precisão.",[429,5085,5086],{},"As seguintes ferramentas são expostas como interfaces MCP para utilização direta pelos agentes de IA:",[504,5088,5089,5095,5101,5107,5113,5119,5125],{},[507,5090,5091,5094],{},[576,5092,5093],{},"remember",": Guardar ideias, decisões, preferências e contexto geral do projeto.",[507,5096,5097,5100],{},[576,5098,5099],{},"append",": Acrescentar novas informações ou atualizações a uma memória existente.",[507,5102,5103,5106],{},[576,5104,5105],{},"update",": Substituir uma memória existente por completo.",[507,5108,5109,5112],{},[576,5110,5111],{},"recall",": Localizar memórias com base no seu significado sémântico e não em palavras-chave exatas.",[507,5114,5115,5118],{},[576,5116,5117],{},"list_recent",": Listar as memórias gravadas recentemente.",[507,5120,5121,5124],{},[576,5122,5123],{},"forget",": Apagar de forma definitiva um registo de memória.",[507,5126,5127,5130],{},[576,5128,5129],{},"link\u002Fconnections",": Conectar memórias relacionadas entre si (funcionalidade de grafo v2).",[539,5132,5134],{"id":5133},"configuração-do-second-brain-na-cloudflare","Configuração do Second Brain na Cloudflare",[2104,5136,5137,5154,5161,5168,5175,5182,5193,5199,5202,5209],{},[507,5138,2114,5139,5142,5143,5148,5149,5153],{},[576,5140,5141],{},"Deploy to Cloudflare"," na página do ",[442,5144,5147],{"href":5145,"rel":5146},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[446],"Github repo",". [[",[433,5150],{"alt":5151,"src":5152},"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","]]",[507,5155,5156,5157],{},"Preencha o formulário do Cloudflare Worker apresentado.\n",[433,5158],{"alt":5159,"src":5160},"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",[507,5162,5163,5164],{},"Introduza '384' no campo Dimensions; selecione 'cosine' para Metric; e clique no botão Deploy.\n",[433,5165],{"alt":5166,"src":5167},"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",[507,5169,5170,5171],{},"O ecrã seguinte apresenta a visão geral do seu Second Brain no Cloudflare Worker:\n",[433,5172],{"alt":5173,"src":5174},"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",[507,5176,5177,5178],{},"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,5179],{"alt":5180,"src":5181},"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",[507,5183,5184,5185,5189],{},"Clique no link 'Rotate' para poder definir o novo valor: ",[433,5186],{"alt":5187,"src":5188},"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,5190],{"alt":5191,"src":5192},"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",[507,5194,1227,5195,5198],{},[576,5196,5197],{},"openssl rand -base64 32"," no seu terminal macOS para gerar um valor aleatório seguro e cole-o no campo 'Value'.",[507,5200,5201],{},"Clique no botão 'Deploy' para guardar o novo valor da variável 'AUTH_TOKEN'.",[507,5203,5204,5205],{},"Abra o endereço URL do seu worker do Second Brain no seu navegador de internet.\n",[433,5206],{"alt":5207,"src":5208},"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",[507,5210,5211,5212,5215],{},"Introduza o 'AUTH_TOKEN' gerado no campo de input ",[576,5213,5214],{},"Bearer token"," e clique no botão 'Connect' para aceder ao painel de controlo (Web UI).",[539,5217,5219],{"id":5218},"integração-do-claude-desktop-via-mcp","Integração do Claude Desktop via MCP",[2104,5221,5222,5229,5236],{},[507,5223,5224,5225],{},"Clique em 'Customize' nas definições do Claude Desktop.\n",[433,5226],{"alt":5227,"src":5228},"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",[507,5230,5231,5232],{},"Selecione 'Developer' para abrir e editar manualmente o ficheiro de configuração dos servidores MCP:\n",[433,5233],{"alt":5234,"src":5235},"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",[507,5237,5238,5239,5242,5243,768],{},"Adicione o seguinte bloco de código à secção ",[576,5240,5241],{},"mcpServers"," no ficheiro ",[576,5244,5245],{},"claude_desktop_config.json",[570,5247,5249],{"className":713,"code":5248,"language":715,"meta":424,"style":424},"    \"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",[576,5250,5251,5265,5287,5301,5313,5324,5335,5344,5349],{"__ignoreMap":424},[579,5252,5253,5256,5259,5261,5263],{"class":581,"line":582},[579,5254,5255],{"class":722},"    \"",[579,5257,5258],{"class":589},"second-brain",[579,5260,1526],{"class":722},[579,5262,2533],{"class":596},[579,5264,723],{"class":722},[579,5266,5267,5270,5273,5275,5277,5279,5282,5284],{"class":581,"line":600},[579,5268,5269],{"class":722},"      \"",[579,5271,5272],{"class":2721},"command",[579,5274,1526],{"class":722},[579,5276,768],{"class":722},[579,5278,1106],{"class":722},[579,5280,5281],{"class":589},"npx",[579,5283,1526],{"class":722},[579,5285,5286],{"class":722},",\n",[579,5288,5289,5291,5294,5296,5298],{"class":581,"line":606},[579,5290,5269],{"class":722},[579,5292,5293],{"class":2721},"args",[579,5295,1526],{"class":722},[579,5297,768],{"class":722},[579,5299,5300],{"class":722}," [\n",[579,5302,5303,5306,5309,5311],{"class":581,"line":613},[579,5304,5305],{"class":722},"        \"",[579,5307,5308],{"class":589},"mcp-remote",[579,5310,1526],{"class":722},[579,5312,5286],{"class":722},[579,5314,5315,5317,5320,5322],{"class":581,"line":623},[579,5316,5305],{"class":722},[579,5318,5319],{"class":589},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[579,5321,1526],{"class":722},[579,5323,5286],{"class":722},[579,5325,5326,5328,5331,5333],{"class":581,"line":628},[579,5327,5305],{"class":722},[579,5329,5330],{"class":589},"--header",[579,5332,1526],{"class":722},[579,5334,5286],{"class":722},[579,5336,5337,5339,5342],{"class":581,"line":634},[579,5338,5305],{"class":722},[579,5340,5341],{"class":589},"Authorization: Bearer \u003Cyour-token>",[579,5343,1112],{"class":722},[579,5345,5346],{"class":581,"line":775},[579,5347,5348],{"class":722},"      ]\n",[579,5350,5351],{"class":581,"line":1134},[579,5352,5353],{"class":722},"    }\n",[429,5355,5356,5360,5361],{},[433,5357],{"alt":5358,"src":5359},"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,5362],{"alt":5363,"src":5364},"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",[539,5366,5368],{"id":5367},"integração-do-claude-code-via-mcp","Integração do Claude Code via MCP",[504,5370,5371],{},[507,5372,5373],{},"Execute o seguinte comando no terminal para adicionar o novo servidor MCP:",[570,5375,5377],{"className":4711,"code":5376,"language":4713,"meta":424,"style":424},"claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n",[576,5378,5379],{"__ignoreMap":424},[579,5380,5381,5384,5387,5390,5393,5396,5399,5402,5404,5407,5410,5412],{"class":581,"line":582},[579,5382,5383],{"class":585},"claude",[579,5385,5386],{"class":589}," mcp",[579,5388,5389],{"class":589}," add",[579,5391,5392],{"class":589}," --transport",[579,5394,5395],{"class":589}," http",[579,5397,5398],{"class":589}," second-brain",[579,5400,5401],{"class":589}," https:\u002F\u002F",[579,5403,3429],{"class":722},[579,5405,5406],{"class":589},"your-worker-ur",[579,5408,5409],{"class":596},"l",[579,5411,3438],{"class":722},[579,5413,5414],{"class":589},"\u002Fmcp\n",[504,5416,5417,5423],{},[507,5418,5419,5420,695],{},"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 ",[576,5421,5422],{},"AUTH_TOKEN",[507,5424,5425,5426,5429,5430,5433,5434,695],{},"Crie o ficheiro ",[576,5427,5428],{},"CLAUDE.md"," na diretoria ",[576,5431,5432],{},"~\u002F.claude"," com as instruções descritas em ",[442,5435,5438],{"href":5436,"rel":5437},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[446],"CLAUDE_INSTRUCTIONS.md",[539,5440,5442],{"id":5441},"integração-do-gemini-cli-via-mcp","Integração do Gemini CLI via MCP",[2104,5444,5445],{},[507,5446,5447],{},"Adicione a seguinte configuração de servidor MCP ao seu ficheiro '.\u002F.gemini\u002Fsettings.json':",[570,5449,5451],{"className":713,"code":5450,"language":715,"meta":424,"style":424},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[576,5452,5453,5465,5484,5497,5510,5515],{"__ignoreMap":424},[579,5454,5455,5457,5459,5461,5463],{"class":581,"line":582},[579,5456,5255],{"class":722},[579,5458,5258],{"class":589},[579,5460,1526],{"class":722},[579,5462,2533],{"class":596},[579,5464,723],{"class":722},[579,5466,5467,5469,5472,5474,5476,5478,5480,5482],{"class":581,"line":600},[579,5468,5269],{"class":722},[579,5470,5471],{"class":2721},"httpUrl",[579,5473,1526],{"class":722},[579,5475,768],{"class":722},[579,5477,1106],{"class":722},[579,5479,5319],{"class":589},[579,5481,1526],{"class":722},[579,5483,5286],{"class":722},[579,5485,5486,5488,5491,5493,5495],{"class":581,"line":606},[579,5487,5269],{"class":722},[579,5489,5490],{"class":2721},"oauth",[579,5492,1526],{"class":722},[579,5494,768],{"class":722},[579,5496,755],{"class":722},[579,5498,5499,5501,5504,5506,5508],{"class":581,"line":613},[579,5500,5305],{"class":722},[579,5502,5503],{"class":585},"enabled",[579,5505,1526],{"class":722},[579,5507,768],{"class":722},[579,5509,3651],{"class":722},[579,5511,5512],{"class":581,"line":623},[579,5513,5514],{"class":722},"      }\n",[579,5516,5517],{"class":581,"line":628},[579,5518,5353],{"class":722},[2104,5520,5521],{"start":600},[507,5522,5523],{},"Inicialize o Gemini CLI.",[539,5525,5527],{"id":5526},"testar-o-second-brain-em-agentes-de-ia","Testar o Second Brain em agentes de IA",[2104,5529,5530,5541,5555],{},[507,5531,5532,5533,5536,5537],{},"Ao definir uma paleta de cores de marca básica no ",[462,5534,5535],{},"Claude Desktop",", o Second Brain não é ativado de imediato por padrão.\n",[433,5538],{"alt":5539,"src":5540},"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",[507,5542,5543,5544,5547,5548,5550,5551],{},"Ao utilizar comandos simples como 'remember', são chamadas as ferramentas integradas locais ",[576,5545,5546],{},"memory_user-edits"," do ",[462,5549,5535],{},", e não a camada de armazenamento remoto.\n",[433,5552],{"alt":5553,"src":5554},"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",[507,5556,5557,5558,5561],{},"Ao enviar o seguinte comando no ",[462,5559,5560],{},"Claude Code",", a integração com o Second Brain foi chamada com sucesso:",[570,5563,5566],{"className":5564,"code":5565,"language":2495},[2493],"Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n",[576,5567,5565],{"__ignoreMap":424},[429,5569,5570,5574,5575,849,5578,5582,5583,5587,5588,5590,5591,5595,5596,5599,5600,5582,5604],{},[433,5571],{"alt":5572,"src":5573},"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 ",[462,5576,5577],{},"Second Brain na Cloudflare",[433,5579],{"alt":5580,"src":5581},"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- ",[5584,5585,5586],"em",{},"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 ",[462,5589,5535],{},", é 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,5592],{"alt":5593,"src":5594},"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 ",[462,5597,5598],{},"Gemini CLI",", onde terá de indicar 'Second Brain' para ativar as ferramentas MCP integradas.\n",[433,5601],{"alt":5602,"src":5603},"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",[5584,5605,5606],{},"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.",[539,5608,5610],{"id":5609},"extensões-para-navegadores-web","Extensões para navegadores web",[504,5612,5613,5616],{},[507,5614,5615],{},"Estão disponíveis extensões para os navegadores Chrome, Firefox e Microsoft Edge.",[507,5617,5618,5619],{},"As funcionalidades incluem:\n",[504,5620,5621,5627,5633],{},[507,5622,5623,5626],{},[462,5624,5625],{},"Capturar a página atual"," — guarda automaticamente o título e o endereço URL no seu Second Brain.",[507,5628,5629,5632],{},[462,5630,5631],{},"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.",[507,5634,5635,5638,5639,5642],{},[462,5636,5637],{},"Adicionar notas rápidas"," — escreva observações rápidas ou categorize com ",[576,5640,5641],{},"#hashtags"," diretamente no popup da extensão antes de gravar; os hashtags são indexados automaticamente como tags.",[539,5644,5646],{"id":5645},"sincronização-de-conhecimento-pessoal-com-o-plugin-obsidian","Sincronização de conhecimento pessoal com o plugin Obsidian",[504,5648,5649,5652],{},[507,5650,5651],{},"Existe um plugin Obsidian para efetuar a sincronização das suas notas pessoais do Obsidian Vault diretamente com o Second Brain na Cloudflare.",[507,5653,5654],{},"Pode usar tags específicas nas notas que deseja enviar para o armazenamento persistente.",[544,5656,5658],{"id":5657},"instalar-o-plugin-obsidian","Instalar o plugin Obsidian",[2104,5660,5661,5668,5675,5682],{},[507,5662,5663,5664],{},"Abra o Obsidian → Definições → Community Plugins\n",[433,5665],{"alt":5666,"src":5667},"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",[507,5669,5670,5671],{},"Clique no botão 'Browse' para pesquisar plug-ins.\n",[433,5672],{"alt":5673,"src":5674},"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",[507,5676,5677,5678],{},"Procure por 'Second Brain Sync'.\n",[433,5679],{"alt":5680,"src":5681},"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",[507,5683,5684,5685],{},"Clique no botão 'Install' (Instalar) e, em seguida, em 'Enable' (Ativar).\n",[433,5686],{"alt":5687,"src":5688},"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",[544,5690,5692],{"id":5691},"configurar-o-plugin-obsidian","Configurar o plugin Obsidian",[2104,5694,5695,5698,5705,5712,5719,5729],{},[507,5696,5697],{},"Aceda a Obsidian → Definições → Second Brain Sync",[507,5699,5700,5701],{},"Preencha os campos 'URL' e o 'Auth token' com os dados do seu Worker.\n",[433,5702],{"alt":5703,"src":5704},"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",[507,5706,5707,5708],{},"Clique em 'Test' para verificar se a ligação remota está operacional.\n",[433,5709],{"alt":5710,"src":5711},"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",[507,5713,5714,5715],{},"Defina os comportamentos de sincronização. Configure a tag de sincronização desejada em 'Sync tag' e ative 'Auto-sync on save'.\n",[433,5716],{"alt":5717,"src":5718},"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",[507,5720,5721,5722,5724,5725],{},"Crie uma nota na sua pasta do Obsidian com a tag ",[576,5723,5258],{}," (conforme definido no ecrã de configurações).\n",[433,5726],{"alt":5727,"src":5728},"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",[507,5730,5731,5732],{},"A nota é gravada e sincronizada de imediato para a sua instância de Cloudflare.\n",[433,5733],{"alt":5734,"src":5735},"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",[493,5737,4969],{"id":4968},[429,5739,5740],{},"O Second Brain oferece uma solução de código aberto inteligente para um dos maiores limites das tecnologias de IA: o esquecimento de contexto e a ausência de memória. Ao combinar este projeto com a infraestrutura escalável da Cloudflare, obtém-se uma camada de memória sémântica auto-hospedada, globalmente distribuída e de latência reduzida. Com a integração do Model Context Protocol (MCP), esta base de conhecimento torna-se totalmente portátil entre diferentes agentes de IA.",[429,5742,5743],{},"A integração com o Obsidian amplia esta arquitetura ligando a sua tomada de notas tradicional ao raciocínio lógico da IA. As suas notas e rascunhos são convertidos em dados estruturados que os agentes conseguem interpretar e interrogar a qualquer momento.",[429,5745,5746],{},"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.",[493,5748,5749],{"id":1870},"Referências:",[504,5751,5752,5758,5764,5771,5778],{},[507,5753,5754],{},[442,5755,5756],{"href":5756,"rel":5757},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[446],[507,5759,5760],{},[442,5761,5762],{"href":5762,"rel":5763},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[446],[507,5765,5766],{},[442,5767,5770],{"href":5768,"rel":5769},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[446],"Connect to AI Clients",[507,5772,5773],{},[442,5774,5777],{"href":5775,"rel":5776},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[446],"Second Brain Obsidian Plugin",[507,5779,5780],{},[442,5781,5782],{"href":5782,"rel":5783},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[446],[1896,5785,5786],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":424,"searchDepth":600,"depth":606,"links":5788},[5789,5790,5791,5803,5804],{"id":5027,"depth":600,"text":5028},{"id":5037,"depth":600,"text":5038},{"id":5058,"depth":600,"text":5059,"children":5792},[5793,5794,5795,5796,5797,5798,5799],{"id":5133,"depth":606,"text":5134},{"id":5218,"depth":606,"text":5219},{"id":5367,"depth":606,"text":5368},{"id":5441,"depth":606,"text":5442},{"id":5526,"depth":606,"text":5527},{"id":5609,"depth":606,"text":5610},{"id":5645,"depth":606,"text":5646,"children":5800},[5801,5802],{"id":5657,"depth":613,"text":5658},{"id":5691,"depth":613,"text":5692},{"id":4968,"depth":600,"text":4969},{"id":1870,"depth":600,"text":5749},[5806,4090],"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":5812,"robots":1934,"sitemap":5815},[5813],{"@type":4098,"headline":5814,"description":5808},"Memória de IA persistente auto-hospedada: Cloudflare e MCP",{"lastmod":5807},{"title":5814,"description":5808,"ogTitle":5022,"ogDescription":5808,"twitterTitle":5022,"twitterDescription":5808},"pt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[4126,5819,5820,5049,1942],"MCP","Memória de IA","2A8G4GBE0gVo-TlyYCIBGp4hYUpOZtEDV7cqi45ry1s",{"id":5823,"title":4917,"author":424,"body":5824,"category":6341,"date":6342,"description":6343,"extension":1925,"image":6344,"imageAlt":6345,"isPublished":740,"meta":6346,"minRead":613,"navigation":740,"path":399,"seo":6350,"stem":6351,"tags":6352,"updatedAt":1945,"__hash__":6355},"article\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md",{"type":426,"value":5825,"toc":6334},[5826,5830,5833,5840,5844,5850,5853,5856,5860,5863,5870,5886,6180,6294,6296,6299,6301,6331],[493,5827,5829],{"id":5828},"o-que-é-o-cloudflare-warp","O que é o Cloudflare WARP?",[429,5831,5832],{},"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.",[429,5834,5835,5836,5839],{},"Ele cria um túnel criptografado baseado no protocolo ",[462,5837,5838],{},"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.",[493,5841,5843],{"id":5842},"por-que-precisamos-do-cloudflare-warp","Por que precisamos do Cloudflare WARP?",[429,5845,5846,5847,695],{},"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 ",[462,5848,5849],{},"Acesso à Rede de Confiança Zero (ZTNA)",[429,5851,5852],{},"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.",[429,5854,5855],{},"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.",[493,5857,5859],{"id":5858},"suporte-a-múltiplos-perfis-do-warp-em-um-único-dispositivo","Suporte a múltiplos perfis do WARP em um único dispositivo",[429,5861,5862],{},"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.",[429,5864,5865,5866,5869],{},"Para conseguir isso no macOS, podemos usar um arquivo de perfil MDM ",[576,5867,5868],{},".mobileconfig"," para definir e registrar os diferentes ambientes do WARP.",[504,5871,5872,5883],{},[507,5873,5874,5882],{},[442,5875,5878,5879,5881],{"href":5876,"rel":5877},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[446],"Download a sample ",[576,5880,5868],{}," file"," diretamente da Cloudflare.",[507,5884,5885],{},"Abaixo está um exemplo de como essa configuração se parece:",[570,5887,5891],{"className":5888,"code":5889,"language":5890,"meta":424,"style":424},"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",[576,5892,5893,5898,5903,5908,5913,5918,5923,5928,5933,5938,5943,5948,5953,5958,5963,5968,5973,5978,5983,5988,5993,5998,6003,6008,6013,6018,6023,6028,6032,6036,6041,6045,6050,6054,6060,6066,6072,6078,6084,6090,6096,6102,6108,6114,6120,6126,6132,6138,6144,6150,6156,6162,6168,6174],{"__ignoreMap":424},[579,5894,5895],{"class":581,"line":582},[579,5896,5897],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[579,5899,5900],{"class":581,"line":600},[579,5901,5902],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[579,5904,5905],{"class":581,"line":606},[579,5906,5907],{},"\u003Cplist version=\"1.0\">\n",[579,5909,5910],{"class":581,"line":613},[579,5911,5912],{},"\u003Cdict>\n",[579,5914,5915],{"class":581,"line":623},[579,5916,5917],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[579,5919,5920],{"class":581,"line":628},[579,5921,5922],{},"  \u003Carray>\n",[579,5924,5925],{"class":581,"line":634},[579,5926,5927],{},"    \u003Cdict>\n",[579,5929,5930],{"class":581,"line":775},[579,5931,5932],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[579,5934,5935],{"class":581,"line":1134},[579,5936,5937],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[579,5939,5940],{"class":581,"line":1142},[579,5941,5942],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[579,5944,5945],{"class":581,"line":1150},[579,5946,5947],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[579,5949,5950],{"class":581,"line":1158},[579,5951,5952],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[579,5954,5955],{"class":581,"line":1166},[579,5956,5957],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[579,5959,5960],{"class":581,"line":1174},[579,5961,5962],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[579,5964,5965],{"class":581,"line":1182},[579,5966,5967],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[579,5969,5970],{"class":581,"line":1193},[579,5971,5972],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[579,5974,5975],{"class":581,"line":1198},[579,5976,5977],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[579,5979,5980],{"class":581,"line":1206},[579,5981,5982],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[579,5984,5985],{"class":581,"line":1745},[579,5986,5987],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[579,5989,5990],{"class":581,"line":1751},[579,5991,5992],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[579,5994,5995],{"class":581,"line":1762},[579,5996,5997],{},"      \u003Carray>\n",[579,5999,6000],{"class":581,"line":2425},[579,6001,6002],{},"        \u003Cdict>\n",[579,6004,6005],{"class":581,"line":2880},[579,6006,6007],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[579,6009,6010],{"class":581,"line":2889},[579,6011,6012],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[579,6014,6015],{"class":581,"line":2897},[579,6016,6017],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[579,6019,6020],{"class":581,"line":2905},[579,6021,6022],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[579,6024,6025],{"class":581,"line":2910},[579,6026,6027],{},"        \u003C\u002Fdict>\n",[579,6029,6030],{"class":581,"line":2917},[579,6031,6002],{},[579,6033,6034],{"class":581,"line":2925},[579,6035,6007],{},[579,6037,6038],{"class":581,"line":2933},[579,6039,6040],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[579,6042,6043],{"class":581,"line":2944},[579,6044,6017],{},[579,6046,6047],{"class":581,"line":2952},[579,6048,6049],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[579,6051,6052],{"class":581,"line":2959},[579,6053,6027],{},[579,6055,6057],{"class":581,"line":6056},34,[579,6058,6059],{},"      \u003C\u002Farray>\n",[579,6061,6063],{"class":581,"line":6062},35,[579,6064,6065],{},"    \u003C\u002Fdict>\n",[579,6067,6069],{"class":581,"line":6068},36,[579,6070,6071],{},"  \u003C\u002Farray>\n",[579,6073,6075],{"class":581,"line":6074},37,[579,6076,6077],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[579,6079,6081],{"class":581,"line":6080},38,[579,6082,6083],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[579,6085,6087],{"class":581,"line":6086},39,[579,6088,6089],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[579,6091,6093],{"class":581,"line":6092},40,[579,6094,6095],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[579,6097,6099],{"class":581,"line":6098},41,[579,6100,6101],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[579,6103,6105],{"class":581,"line":6104},42,[579,6106,6107],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[579,6109,6111],{"class":581,"line":6110},43,[579,6112,6113],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[579,6115,6117],{"class":581,"line":6116},44,[579,6118,6119],{},"  \u003Cfalse\u002F>\n",[579,6121,6123],{"class":581,"line":6122},45,[579,6124,6125],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[579,6127,6129],{"class":581,"line":6128},46,[579,6130,6131],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[579,6133,6135],{"class":581,"line":6134},47,[579,6136,6137],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[579,6139,6141],{"class":581,"line":6140},48,[579,6142,6143],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[579,6145,6147],{"class":581,"line":6146},49,[579,6148,6149],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[579,6151,6153],{"class":581,"line":6152},50,[579,6154,6155],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[579,6157,6159],{"class":581,"line":6158},51,[579,6160,6161],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[579,6163,6165],{"class":581,"line":6164},52,[579,6166,6167],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[579,6169,6171],{"class":581,"line":6170},53,[579,6172,6173],{},"\u003C\u002Fdict>\n",[579,6175,6177],{"class":581,"line":6176},54,[579,6178,6179],{},"\u003C\u002Fplist>\n",[504,6181,6182,6192,6204,6214,6220,6237,6249,6269,6285],{},[507,6183,6184,6185,664,6188,6191],{},"Substitua ",[576,6186,6187],{},"your-team-name-1",[576,6189,6190],{},"your-team-name-2"," pelos seus respectivos nomes de equipe do Cloudflare Zero Trust.",[507,6193,1227,6194,6197,6198,6201,6202,695],{},[576,6195,6196],{},"uuidgen"," no seu Terminal para gerar UUIDs exclusivos e use-os para substituir os valores de espaço reservado ",[576,6199,6200],{},"PayloadUUID"," no arquivo ",[576,6203,5868],{},[507,6205,6206,6207,6210,6211,6213],{},"Certifique-se de que a string ",[576,6208,6209],{},"PayloadIdentifier"," também contenha o ",[576,6212,6200],{}," atualizado para manter o perfil distinto.",[507,6215,6216,6217,6219],{},"Salve o arquivo ",[576,6218,5868],{}," editado.",[507,6221,6222,6223,6226,6227,6230,6231,6233],{},"Abra as ",[462,6224,6225],{},"Ajustes do Sistema"," no seu Mac, pesquise por ",[462,6228,6229],{},"Perfis"," e selecione-o.",[4300,6232],{},[433,6234],{"alt":6235,"src":6236},"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",[507,6238,2114,6239,6242,6243,6245],{},[462,6240,6241],{},"Instalar, visualizar ou remover..."," para começar a adicionar o seu novo perfil de configuração.",[4300,6244],{},[433,6246],{"alt":6247,"src":6248},"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",[507,6250,6251,6252,6255,6256,6258,6259,6261,6265],{},"Clique no ícone ",[462,6253,6254],{},"+"," (mais) no canto primeiro esquerdo e selecione o arquivo ",[576,6257,5868],{}," salvo.",[4300,6260],{},[433,6262],{"alt":6263,"src":6264},"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,6266],{"alt":6267,"src":6268},"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",[507,6270,6271,6272,6274,6275,6278,6279,6281],{},"Selecione ",[462,6273,4141],{}," e clique em ",[462,6276,6277],{},"Instalar"," para aplicar la configuração.",[4300,6280],{},[433,6282],{"alt":6283,"src":6284},"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",[507,6286,6287,6288,6290],{},"Reinicie o cliente Cloudflare WARP. Agora você deverá ver o alternador de múltiplos perfis na interface do usuário:",[4300,6289],{},[433,6291],{"alt":6292,"src":6293},"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",[493,6295,4969],{"id":4968},[429,6297,6298],{},"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.",[493,6300,1871],{"id":1870},[504,6302,6303,6310,6317,6324],{},[507,6304,6305],{},[442,6306,6309],{"href":6307,"rel":6308},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[446],"Managed Deployment Preparation",[507,6311,6312],{},[442,6313,6316],{"href":6314,"rel":6315},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[446],"Switch Between Zero Trust Organizations",[507,6318,6319],{},[442,6320,6323],{"href":6321,"rel":6322},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[446],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[507,6325,6326],{},[442,6327,6330],{"href":6328,"rel":6329},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[446],"Cloudflare One Client Documentation",[1896,6332,6333],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":424,"searchDepth":600,"depth":606,"links":6335},[6336,6337,6338,6339,6340],{"id":5828,"depth":600,"text":5829},{"id":5842,"depth":600,"text":5843},{"id":5858,"depth":600,"text":5859},{"id":4968,"depth":600,"text":4969},{"id":1870,"depth":600,"text":1871},[5002,5806],"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":6347,"robots":1934,"sitemap":6349},[6348],{"@type":1933,"headline":4917,"description":6343},{"lastmod":6342},{"title":6345,"description":6343,"ogTitle":4917,"ogDescription":6343,"twitterTitle":4917,"twitterDescription":6343},"pt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[6353,4141,6354,1944],"macOS","MDM","EwH2jVxo0k3L6vZD6bfnIxGUBZQQEsBLKPw_paSz3AA",1792490011231]