[{"data":1,"prerenderedAt":3970},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac":421,"\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac-surround":1019},[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":398,"author":423,"body":424,"category":997,"date":1000,"description":1001,"extension":1002,"image":1003,"imageAlt":1004,"isPublished":1005,"meta":1006,"minRead":526,"navigation":1005,"path":61,"seo":1012,"stem":400,"tags":1013,"updatedAt":1017,"__hash__":1018},"article\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md","",{"type":425,"value":426,"toc":990},"minimark",[427,432,436,444,448,455,458,461,465,468,476,496,826,945,949,952,956,986],[428,429,431],"h2",{"id":430},"what-is-cloudflare-warp","What Is Cloudflare WARP?",[433,434,435],"p",{},"Cloudflare WARP is a client-side application that routes specified device traffic through Cloudflare's global network instead of directly out to the public internet.",[433,437,438,439,443],{},"It creates an encrypted tunnel built on the ",[440,441,442],"strong",{},"WireGuard"," protocol, securing traffic from the device to the nearest Cloudflare data center. Policies can then be created in your Cloudflare dashboard to filter, log, inspect, or route this incoming traffic.",[428,445,447],{"id":446},"why-do-we-need-cloudflare-warp","Why Do We Need Cloudflare WARP?",[433,449,450,451,454],{},"To securely expose internal resources—such as private web services or SaaS applications—to employees, contractors, and other stakeholders, the Cloudflare WARP client is the as the client-side enforcement point for ",[440,452,453],{},"Zero Trust Network Access (ZTNA)",".",[433,456,457],{},"The Cloudflare WARP client is installed on a user’s laptop or phone. It requires users to authenticate and meet specific security posture checks (such as coming from an approved IP range, using a registered email domain, or running an active firewall) before granting access.",[433,459,460],{},"By tunneling device traffic directly to Cloudflare, the user's identity, device, and policies are verified before requests ever reach internal resources. As a result, internal resources are never exposed to the public internet, and every single request is fully logged and audited.",[428,462,464],{"id":463},"supporting-multiple-warp-profiles-on-one-device","Supporting Multiple WARP Profiles on One Device",[433,466,467],{},"When users need to switch between personal and corporate Cloudflare accounts, or when system administrators manage multiple tenants, supporting multiple WARP profiles on a single device becomes crucial.",[433,469,470,471,475],{},"To achieve this on macOS, we can use a ",[472,473,474],"code",{},".mobileconfig"," MDM profile file to define and register the different WARP environments.",[477,478,479,493],"ul",{},[480,481,482,492],"li",{},[483,484,488,489,491],"a",{"href":485,"rel":486},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[487],"nofollow","Download a sample ",[472,490,474],{}," file"," directly from Cloudflare.",[480,494,495],{},"Below is an example of what this configuration looks like:",[497,498,502],"pre",{"className":499,"code":500,"language":501,"meta":423,"style":423},"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",[472,503,504,512,518,524,530,536,542,548,554,560,566,572,578,584,590,596,602,608,614,620,626,632,638,644,650,656,662,668,673,678,684,689,695,700,706,712,718,724,730,736,742,748,754,760,766,772,778,784,790,796,802,808,814,820],{"__ignoreMap":423},[505,506,509],"span",{"class":507,"line":508},"line",1,[505,510,511],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[505,513,515],{"class":507,"line":514},2,[505,516,517],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[505,519,521],{"class":507,"line":520},3,[505,522,523],{},"\u003Cplist version=\"1.0\">\n",[505,525,527],{"class":507,"line":526},4,[505,528,529],{},"\u003Cdict>\n",[505,531,533],{"class":507,"line":532},5,[505,534,535],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[505,537,539],{"class":507,"line":538},6,[505,540,541],{},"  \u003Carray>\n",[505,543,545],{"class":507,"line":544},7,[505,546,547],{},"    \u003Cdict>\n",[505,549,551],{"class":507,"line":550},8,[505,552,553],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[505,555,557],{"class":507,"line":556},9,[505,558,559],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[505,561,563],{"class":507,"line":562},10,[505,564,565],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[505,567,569],{"class":507,"line":568},11,[505,570,571],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[505,573,575],{"class":507,"line":574},12,[505,576,577],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[505,579,581],{"class":507,"line":580},13,[505,582,583],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[505,585,587],{"class":507,"line":586},14,[505,588,589],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[505,591,593],{"class":507,"line":592},15,[505,594,595],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[505,597,599],{"class":507,"line":598},16,[505,600,601],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[505,603,605],{"class":507,"line":604},17,[505,606,607],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[505,609,611],{"class":507,"line":610},18,[505,612,613],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[505,615,617],{"class":507,"line":616},19,[505,618,619],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[505,621,623],{"class":507,"line":622},20,[505,624,625],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[505,627,629],{"class":507,"line":628},21,[505,630,631],{},"      \u003Carray>\n",[505,633,635],{"class":507,"line":634},22,[505,636,637],{},"        \u003Cdict>\n",[505,639,641],{"class":507,"line":640},23,[505,642,643],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[505,645,647],{"class":507,"line":646},24,[505,648,649],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[505,651,653],{"class":507,"line":652},25,[505,654,655],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[505,657,659],{"class":507,"line":658},26,[505,660,661],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[505,663,665],{"class":507,"line":664},27,[505,666,667],{},"        \u003C\u002Fdict>\n",[505,669,671],{"class":507,"line":670},28,[505,672,637],{},[505,674,676],{"class":507,"line":675},29,[505,677,643],{},[505,679,681],{"class":507,"line":680},30,[505,682,683],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[505,685,687],{"class":507,"line":686},31,[505,688,655],{},[505,690,692],{"class":507,"line":691},32,[505,693,694],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[505,696,698],{"class":507,"line":697},33,[505,699,667],{},[505,701,703],{"class":507,"line":702},34,[505,704,705],{},"      \u003C\u002Farray>\n",[505,707,709],{"class":507,"line":708},35,[505,710,711],{},"    \u003C\u002Fdict>\n",[505,713,715],{"class":507,"line":714},36,[505,716,717],{},"  \u003C\u002Farray>\n",[505,719,721],{"class":507,"line":720},37,[505,722,723],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[505,725,727],{"class":507,"line":726},38,[505,728,729],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[505,731,733],{"class":507,"line":732},39,[505,734,735],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[505,737,739],{"class":507,"line":738},40,[505,740,741],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[505,743,745],{"class":507,"line":744},41,[505,746,747],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[505,749,751],{"class":507,"line":750},42,[505,752,753],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[505,755,757],{"class":507,"line":756},43,[505,758,759],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[505,761,763],{"class":507,"line":762},44,[505,764,765],{},"  \u003Cfalse\u002F>\n",[505,767,769],{"class":507,"line":768},45,[505,770,771],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[505,773,775],{"class":507,"line":774},46,[505,776,777],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[505,779,781],{"class":507,"line":780},47,[505,782,783],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[505,785,787],{"class":507,"line":786},48,[505,788,789],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[505,791,793],{"class":507,"line":792},49,[505,794,795],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[505,797,799],{"class":507,"line":798},50,[505,800,801],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[505,803,805],{"class":507,"line":804},51,[505,806,807],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[505,809,811],{"class":507,"line":810},52,[505,812,813],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[505,815,817],{"class":507,"line":816},53,[505,818,819],{},"\u003C\u002Fdict>\n",[505,821,823],{"class":507,"line":822},54,[505,824,825],{},"\u003C\u002Fplist>\n",[477,827,828,839,853,863,868,887,900,919,936],{},[480,829,830,831,834,835,838],{},"Replace ",[472,832,833],{},"your-team-name-1"," and ",[472,836,837],{},"your-team-name-2"," with your respective Cloudflare Zero Trust team names.",[480,840,841,842,845,846,849,850,852],{},"Run the command ",[472,843,844],{},"uuidgen"," in your Terminal to generate unique UUIDs, and use them to replace the placeholder ",[472,847,848],{},"PayloadUUID"," values in the ",[472,851,474],{}," file.",[480,854,855,856,859,860,862],{},"Make sure that the ",[472,857,858],{},"PayloadIdentifier"," string also contains the updated ",[472,861,848],{}," to keep the profile distinct.",[480,864,865,866,852],{},"Save your edited ",[472,867,474],{},[480,869,870,871,874,875,878,879,882],{},"Open ",[440,872,873],{},"System Settings"," on your Mac, search for ",[440,876,877],{},"Profiles",", and select it.",[880,881],"br",{},[883,884],"img",{"alt":885,"src":886},"macOS System Settings Profiles pane","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[480,888,889,890,893,894,896],{},"Click on ",[440,891,892],{},"Install, view or remove..."," to begin adding your new configuration profile.",[880,895],{},[883,897],{"alt":898,"src":899},"macOS Profiles install view or remove button","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[480,901,902,903,906,907,852,909,911,915],{},"Click the ",[440,904,905],{},"+"," (plus) icon in the bottom-left corner and select your saved ",[472,908,474],{},[880,910],{},[883,912],{"alt":913,"src":914},"macOS Profiles plus button to add a new profile","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[883,916],{"alt":917,"src":918},"Selecting the mobileconfig file on macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[480,920,921,922,925,926,929,930,932],{},"Select ",[440,923,924],{},"Cloudflare WARP"," and click ",[440,927,928],{},"Install"," to apply the configuration.",[880,931],{},[883,933],{"alt":934,"src":935},"Confirming Cloudflare WARP profile installation on macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[480,937,938,939,941],{},"Restart your Cloudflare WARP client. You should now see the multi-profile switcher in the user interface:",[880,940],{},[883,942],{"alt":943,"src":944},"Cloudflare WARP client with multi-profile switcher on macOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[428,946,948],{"id":947},"conclusion","Conclusion",[433,950,951],{},"The Cloudflare WARP client acts as a critical security point on user devices, making Zero Trust Network Access both robust and highly practical. Keeping internal resources isolated from the public internet ensures that every connection attempt is securely authenticated, evaluated, and audited.",[428,953,955],{"id":954},"references","References",[477,957,958,965,972,979],{},[480,959,960],{},[483,961,964],{"href":962,"rel":963},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[487],"Managed Deployment Preparation",[480,966,967],{},[483,968,971],{"href":969,"rel":970},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[487],"Switch Between Zero Trust Organizations",[480,973,974],{},[483,975,978],{"href":976,"rel":977},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[487],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[480,980,981],{},[483,982,985],{"href":983,"rel":984},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[487],"Cloudflare One Client Documentation",[987,988,989],"style",{},"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":423,"searchDepth":514,"depth":520,"links":991},[992,993,994,995,996],{"id":430,"depth":514,"text":431},{"id":446,"depth":514,"text":447},{"id":463,"depth":514,"text":464},{"id":947,"depth":514,"text":948},{"id":954,"depth":514,"text":955},[998,999],"security","cloudflare","2026-07-04","Configure and switch multiple Cloudflare WARP organisations on macOS using a .mobileconfig file. A complete MDM guide for IT admins.","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002FEN-Switch-Between-Multiple-Cloudflare-WARP-Orgs-on-Mac.webp","Configure Multiple Cloudflare WARP Profiles on macOS",true,{"schemaOrg":1007,"robots":1010,"sitemap":1011},[1008],{"@type":1009,"headline":398,"description":1001},"HowTo","index, follow",{"lastmod":1000},{"title":1004,"description":1001,"ogTitle":398,"ogDescription":1001,"twitterTitle":398,"twitterDescription":1001},[1014,924,1015,1016],"macOS","MDM","Zero Trust",null,"1b-JmgD0tsBcQooHgG1MNPYYvTAdh8f83JMRp2OWhJ8",{"surround":1020,"related":2238},[1021,1424],{"id":1022,"title":350,"author":423,"body":1023,"category":1407,"date":1409,"description":1410,"extension":1002,"image":1411,"imageAlt":1412,"isPublished":1005,"meta":1413,"minRead":526,"navigation":1005,"path":351,"seo":1417,"stem":352,"tags":1418,"updatedAt":1017,"__hash__":1423},"article\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md",{"type":425,"value":1024,"toc":1397},[1025,1029,1040,1051,1120,1126,1130,1133,1142,1148,1153,1210,1221,1227,1230,1282,1286,1289,1296,1299,1310,1314,1358,1361,1378,1380,1391,1394],[428,1026,1028],{"id":1027},"what-is-an-ai-agent-skill","What Is an AI Agent Skill?",[433,1030,1031,1032,1035,1036,1039],{},"An agent skill is a reusable ",[440,1033,1034],{},"set of instructions"," — a standardised procedure that tells an agent how to do a particular kind of task well. It consists of a single Markdown file, ",[472,1037,1038],{},"SKILL.md",", and can bundle any other files the task requires, such as reference documents, templates, or executable scripts.",[433,1041,1042,1043,1050],{},"Take the ",[483,1044,1047],{"href":1045,"rel":1046},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[487],[472,1048,1049],{},"grill-me"," skill as an example:",[497,1052,1056],{"className":1053,"code":1054,"language":1055,"meta":423,"style":423},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nname: grill-me\ndescription: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n---\n\nInterview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n\nAsk the questions one at a time.\n\nIf a question can be answered by exploring the codebase, explore the codebase instead.\n","yaml",[472,1057,1058,1064,1078,1088,1092,1097,1102,1106,1111,1115],{"__ignoreMap":423},[505,1059,1060],{"class":507,"line":508},[505,1061,1063],{"class":1062},"sBMFI","---\n",[505,1065,1066,1070,1074],{"class":507,"line":514},[505,1067,1069],{"class":1068},"swJcz","name",[505,1071,1073],{"class":1072},"sMK4o",":",[505,1075,1077],{"class":1076},"sfazB"," grill-me\n",[505,1079,1080,1083,1085],{"class":507,"line":520},[505,1081,1082],{"class":1068},"description",[505,1084,1073],{"class":1072},[505,1086,1087],{"class":1076}," Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n",[505,1089,1090],{"class":507,"line":526},[505,1091,1063],{"class":1062},[505,1093,1094],{"class":507,"line":532},[505,1095,1096],{"emptyLinePlaceholder":1005},"\n",[505,1098,1099],{"class":507,"line":538},[505,1100,1101],{"class":1076},"Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n",[505,1103,1104],{"class":507,"line":544},[505,1105,1096],{"emptyLinePlaceholder":1005},[505,1107,1108],{"class":507,"line":550},[505,1109,1110],{"class":1076},"Ask the questions one at a time.\n",[505,1112,1113],{"class":507,"line":556},[505,1114,1096],{"emptyLinePlaceholder":1005},[505,1116,1117],{"class":507,"line":562},[505,1118,1119],{"class":1076},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[433,1121,1122,1123,1125],{},"A ",[472,1124,1038],{}," file contains a small block of metadata and a body of instructions. The metadata consists of the skill's name and description, which the AI agent loads at startup.",[428,1127,1129],{"id":1128},"how-ai-agent-skills-work-progressive-disclosure","How AI Agent Skills Work: Progressive Disclosure",[433,1131,1132],{},"Initially, only the name and description are loaded into the context. When a user's request matches a skill's description, the body of instructions is loaded into the same context.",[433,1134,1135,1136,1141],{},"Let's look at how the ",[483,1137,1139],{"href":1045,"rel":1138},[487],[472,1140,1049],{}," skill is used.",[433,1143,1144],{},[883,1145],{"alt":1146,"src":1147},"Sequence diagram illustrating the progressive disclosure mechanism for executing AI agent skills","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-progressive-disclosure-sequence-diagram.webp",[1149,1150,1152],"h3",{"id":1151},"step-by-step","Step-by-Step",[1154,1155,1156,1162,1168,1174,1180,1194,1204],"ol",{},[480,1157,1158,1161],{},[440,1159,1160],{},"Request"," — The user asks the agent for something (\"grill me on my workflow design\").",[480,1163,1164,1167],{},[440,1165,1166],{},"Selection prompt"," — The user's request, along with the descriptions of all available skills, is sent to the LLM.",[480,1169,1170,1173],{},[440,1171,1172],{},"LLM selects"," — The LLM compares the request to each description and returns the skill(s) that match.",[480,1175,1176,1179],{},[440,1177,1178],{},"Confirmation"," — The agent surfaces the proposed skill(s) back to the user, who confirms (or rejects\u002Fadjusts) the choice.",[480,1181,1182,1185,1186,1190,1191,1193],{},[440,1183,1184],{},"Instructions loaded"," — The agent fetches the ",[1187,1188,1189],"em",{},"full"," instructions for the confirmed skill: the ",[472,1192,1038],{}," body.",[480,1195,1196,1199,1200,1203],{},[440,1197,1198],{},"Execution prompt"," — The user's request ",[440,1201,1202],{},"plus the selected skill's instructions"," is sent to the LLM.",[480,1205,1206,1209],{},[440,1207,1208],{},"Response"," — The LLM produces the output, which is the first grilling question.",[433,1211,1212,1213,1220],{},"Now let's use ",[483,1214,1217],{"href":1215,"rel":1216},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[487],[472,1218,1219],{},"excalidraw-diagram-skill"," to illustrate how a skill with a reference document is used:",[433,1222,1223],{},[883,1224],{"alt":1225,"src":1226},"Sequence diagram showing an AI agent executing a skill loaded with external reference files and templates","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-with-reference-files-sequence-diagram.webp",[1149,1228,1152],{"id":1229},"step-by-step-1",[1154,1231,1232,1237,1241,1250,1254,1266,1273],{},[480,1233,1234,1236],{},[440,1235,1160],{}," — The user asks the agent for something (\"draw the workflow of the deployment process\").",[480,1238,1239,1167],{},[440,1240,1166],{},[480,1242,1243,1245,1246,1249],{},[440,1244,1172],{}," — The LLM compares the request to each description and returns the skill(s) that match. Here, \"draw the workflow\" matches the ",[472,1247,1248],{},"excalidraw-diagram"," description, so it is selected.",[480,1251,1252,1179],{},[440,1253,1178],{},[480,1255,1256,1185,1258,1190,1260,1262,1263,1265],{},[440,1257,1184],{},[1187,1259,1189],{},[472,1261,1038],{}," body and any referenced files (for ",[472,1264,1248],{},", that includes the colour palette, JSON schema, and element templates).",[480,1267,1268,1199,1270,1272],{},[440,1269,1198],{},[440,1271,1202],{}," is sent to the LLM. The model now has the detailed methodology it needs.",[480,1274,1275,1277,1278,1281],{},[440,1276,1208],{}," — The LLM produces the output (an ",[472,1279,1280],{},".excalidraw"," JSON file), which the agent returns to the user.",[428,1283,1285],{"id":1284},"ai-agent-skills-vs-tools-and-mcp","AI Agent Skills vs. Tools and MCP",[433,1287,1288],{},"Skills don't replace prompts, tools, or MCP. Tools and MCP integrations extend an agent's reach to external systems — querying a database, calling an API, and so on. Skills deepen the agent's know-how for completing a task.",[433,1290,1291,1292,1295],{},"An MCP such as the ",[483,1293,1294],{"href":395},"NetSuite MCP"," lets an agent answer user questions by accessing live financial and operational data in NetSuite. Then a NetSuite operational-reporting skill, in turn, guides the agent on how to compose that report and present the answer as a report to the user.",[433,1297,1298],{},"Some scenarios for using skills include:",[477,1300,1301,1304,1307],{},[480,1302,1303],{},"Multi-step workflows",[480,1305,1306],{},"Processing documents, such as extracting data from PDFs",[480,1308,1309],{},"Code-generation standards",[428,1311,1313],{"id":1312},"how-to-create-ai-agent-skills","How to Create AI Agent Skills",[1154,1315,1316,1326,1340,1349],{},[480,1317,1318,1321,1322,1325],{},[440,1319,1320],{},"Create a folder"," named for the skill (e.g. ",[472,1323,1324],{},"netsuite-operation-report\u002F",").",[480,1327,1328,1333,1334,1336,1337,1339],{},[440,1329,1330,1331],{},"Write ",[472,1332,1038],{}," with a ",[472,1335,1069],{},", a sharp ",[472,1338,1082],{},", and a concise body of instructions (under 200 words).",[480,1341,1342,1345,1346,1348],{},[440,1343,1344],{},"Add resources"," the task needs — reference docs, templates, scripts. Keep ",[472,1347,1038],{}," short and link out to the details.",[480,1350,1351,1354,1355,1357],{},[440,1352,1353],{},"Install it"," where agents will discover it. Refer to ",[483,1356,358],{"href":359}," for how to manage skills across multiple agents.",[433,1359,1360],{},"A few tips for writing good skills:",[477,1362,1363,1366,1372,1375],{},[480,1364,1365],{},"Write the description for the trigger, not the human.",[480,1367,1368,1369,1371],{},"Keep ",[472,1370,1038],{}," lean — under 200 words. Put the general case in the body; leave the edge cases to reference documents.",[480,1373,1374],{},"Use scripts for anything deterministic. Don't ask the LLM to do arithmetic.",[480,1376,1377],{},"Version it. Check it into git.",[428,1379,948],{"id":947},[433,1381,1382,1383,1386,1387,1390],{},"Unlike tools and MCP, which define ",[1187,1384,1385],{},"what to connect to",", agent skills package ",[1187,1388,1389],{},"how to do the work",". They are an essential complement, not a replacement.",[433,1392,1393],{},"By leveraging progressive disclosure, skills keep your agent's context window clean and efficient — loading detailed instructions, reference documents, and executable scripts only when a user's request triggers them.",[987,1395,1396],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":423,"searchDepth":514,"depth":520,"links":1398},[1399,1400,1404,1405,1406],{"id":1027,"depth":514,"text":1028},{"id":1128,"depth":514,"text":1129,"children":1401},[1402,1403],{"id":1151,"depth":520,"text":1152},{"id":1229,"depth":520,"text":1152},{"id":1284,"depth":514,"text":1285},{"id":1312,"depth":514,"text":1313},{"id":947,"depth":514,"text":948},[1408],"ai-agents","2026-06-26","Discover what AI agent skills are, how progressive disclosure works, and learn to build custom reusable skills.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002FEN-AI-Agent-Skills-What-They-Are-%26-How-to-Create-Them.webp","AI Agent Skills Guide: How to Build Reusable Workflows",{"schemaOrg":1414,"robots":1010,"sitemap":1416},[1415],{"@type":1009,"headline":350,"description":1410},{"lastmod":1409},{"title":1412,"description":1410,"ogTitle":350,"ogDescription":1410,"twitterTitle":350,"twitterDescription":1410},[1419,1420,1421,1422],"AI Agents","Agent Skills","Reusable Workflows","AI Tutorial","KB_UqaFeAxxEkCKJGNsZFWECf41haD9D0uv9jcvrFz8",{"id":1425,"title":414,"author":1017,"body":1426,"category":2220,"date":2221,"description":2222,"extension":1002,"image":2223,"imageAlt":2224,"isPublished":1005,"meta":2225,"minRead":544,"navigation":1005,"path":415,"seo":2231,"stem":416,"tags":2232,"updatedAt":1017,"__hash__":2237},"article\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md",{"type":425,"value":1427,"toc":2202},[1428,1432,1435,1438,1442,1445,1459,1463,1470,1484,1487,1490,1531,1535,1616,1620,1646,1763,1774,1778,1783,1828,1852,1856,1861,1934,1939,1943,1977,1985,2023,2027,2059,2063,2071,2076,2106,2110,2150,2152,2155,2158,2161,2165,2199],[428,1429,1431],{"id":1430},"the-importance-of-persistent-ai-memory-for-agents","The Importance of Persistent AI Memory for Agents",[433,1433,1434],{},"As AI assistants become integrated into our daily lives, we frequently encounter the blank context issue. The decisions made last week are forgotten, requiring us to input the same tech stack details, and set the user preferences all over again.",[433,1436,1437],{},"Instead of starting from scratch every time, we need to build a memory system that evolves, continuously understands a user's decisions and eliminates the need to repeat context.",[428,1439,1441],{"id":1440},"self-hosted-vs-built-in-ai-memory-systems","Self-Hosted vs. Built-In AI Memory Systems",[433,1443,1444],{},"Many AI agents come with built-in memory, but we don't just use one agent for all purposes. We use Claude for architecting and designing a project; Kimi for coding; and ChatGPT for research. The context is not shared among these agents; it remains siloed per agent.",[433,1446,1447,1448,1453,1454,1458],{},"From a software engineering point of view, we don't trust black boxes. We need AI memory system that is observable, auditable, and under our control. The open sourced project, ",[483,1449,1452],{"href":1450,"rel":1451},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[487],"Second Brain",", forked from ",[483,1455,1456],{"href":1456,"rel":1457},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare",[487],", provides a persistent and self-hosted memory system with Model Context Protocol (MCP) support.  Any compatible AI agents such as Claude, ChatGPT, Kimi Code can share the same context.",[428,1460,1462],{"id":1461},"how-to-build-a-second-brain-ai-memory-on-cloudflare","How to Build a Second Brain AI Memory on Cloudflare",[433,1464,1465,1466,1469],{},"The Second Brain memory system is deployed on ",[440,1467,1468],{},"Cloudflare Workers",", which provides globally distributed, low-latency execution server infrastructure. This allows the memory recall and other operations to execute with minimal latency to the AI’s reasoning loop.",[433,1471,1472,1473,1476,1477,1480,1481,1483],{},"The ",[440,1474,1475],{},"Workers AI"," embedding model is used for generating the embeddings. These embeddings are stored in ",[440,1478,1479],{},"Cloudflare Vectorize",", which is a globally distributed vector database. The ",[440,1482,1479],{}," performs the cosine similarity search for semantically related memories.",[433,1485,1486],{},"Duplication detection and smart merging mechanisms are implemented in Second Brain. Content with less than 85% similarity is stored, otherwise it is blocked or marked as a duplicate candidate. Text exceeding 1,600 characters is split at sentence or line-break boundaries with 200-character overlap to prevent loss of context. Then each chunk is embedded as a vector which allows precise matching.",[433,1488,1489],{},"The following tools are exposed as MCP interfaces to be used in AI agents:",[477,1491,1492,1498,1504,1510,1516,1522,1528],{},[480,1493,1494,1497],{},[472,1495,1496],{},"remember",": Store ideas, decisions, preferences, and project context",[480,1499,1500,1503],{},[472,1501,1502],{},"append",": Add an update to an existing memory",[480,1505,1506,1509],{},[472,1507,1508],{},"update",": Replace an existing memory",[480,1511,1512,1515],{},[472,1513,1514],{},"recall",": Find memories by meaning rather than exact wording",[480,1517,1518,1521],{},[472,1519,1520],{},"list_recent",": Browse recently saved memories",[480,1523,1524,1527],{},[472,1525,1526],{},"forget",": Permanently delete a memory",[480,1529,1530],{},"`link\u002Fconnections``: Connect related memories (v2 graph feature)",[1149,1532,1534],{"id":1533},"setup-second-brain-on-cloudflare","Setup Second Brain on Cloudflare",[1154,1536,1537,1554,1561,1568,1575,1582,1593,1599,1602,1609],{},[480,1538,889,1539,1542,1543,1548,1549,1553],{},[472,1540,1541],{},"Deploy to Cloudflare"," at the ",[483,1544,1547],{"href":1545,"rel":1546},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[487],"Github repo"," page. [[",[883,1550],{"alt":1551,"src":1552},"GitHub page with the Deploy to Cloudflare button highlighted","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[480,1555,1556,1557],{},"Fill out the Cloudflare Worker form.\n",[883,1558],{"alt":1559,"src":1560},"Cloudflare Workers deployment configuration form","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[480,1562,1563,1564],{},"Enter '384' for Dimensions; select 'cosine' for Metric; and click the Deploy button.\n",[883,1565],{"alt":1566,"src":1567},"Cloudflare Vectorize database creation settings screen","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[480,1569,1570,1571],{},"The following is the overview of the Second Brain in Cloudflare Worker\n",[883,1572],{"alt":1573,"src":1574},"Overview dashboard of the deployed Second Brain worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[480,1576,1577,1578],{},"Click on 'Settings', then click edit icon for 'AUTH_TOKEN' for creating a token\n",[883,1579],{"alt":1580,"src":1581},"Cloudflare Worker variable settings highlighting AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[480,1583,1584,1585,1589],{},"Click the 'Rotate' link for entering a new value           ",[883,1586],{"alt":1587,"src":1588},"AUTH_TOKEN variable modification and rotation screen","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[883,1590],{"alt":1591,"src":1592},"Entering the generated random string into the AUTH_TOKEN value field","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[480,1594,841,1595,1598],{},[472,1596,1597],{},"openssl rand -base64 32"," at macOS terminal to create a random value and paste it in the 'Value' input field.",[480,1600,1601],{},"Click the 'Deploy' button to update the new value of 'AUTH_TOKEN'.",[480,1603,1604,1605],{},"Open the Second Brain worker url on the web browser\n",[883,1606],{"alt":1607,"src":1608},"Second Brain Web UI login screen with Bearer Token input","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[480,1610,1611,1612,1615],{},"Enter the created 'AUTH_TOKEN' in the ",[472,1613,1614],{},"Bearer token"," input field and click 'Connect' button to login to the Web UI.",[1149,1617,1619],{"id":1618},"integrating-claude-desktop-via-mcp","Integrating Claude Desktop via MCP",[1154,1621,1622,1629,1636],{},[480,1623,1624,1625],{},"Click on 'Customize' at Claude Desktop.\n",[883,1626],{"alt":1627,"src":1628},"Claude Desktop interface pointing to the Customize button","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[480,1630,1631,1632],{},"Click on 'Developer' to manually edit the MCP Servers config file\n",[883,1633],{"alt":1634,"src":1635},"Claude Desktop Developer settings menu to access MCP config","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[480,1637,1638,1639,1642,1643],{},"Add the following code to the ",[472,1640,1641],{},"mcpServers"," section in",[472,1644,1645],{},"claude_desktop_config.json",[497,1647,1651],{"className":1648,"code":1649,"language":1650,"meta":423,"style":423},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","    \"second-brain\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n        \"--header\",\n        \"Authorization: Bearer \u003Cyour-token>\"\n      ]\n    }\n","json",[472,1652,1653,1671,1695,1709,1721,1732,1743,1753,1758],{"__ignoreMap":423},[505,1654,1655,1658,1661,1664,1668],{"class":507,"line":508},[505,1656,1657],{"class":1072},"    \"",[505,1659,1660],{"class":1076},"second-brain",[505,1662,1663],{"class":1072},"\"",[505,1665,1667],{"class":1666},"sTEyZ",": ",[505,1669,1670],{"class":1072},"{\n",[505,1672,1673,1676,1680,1682,1684,1687,1690,1692],{"class":507,"line":514},[505,1674,1675],{"class":1072},"      \"",[505,1677,1679],{"class":1678},"spNyl","command",[505,1681,1663],{"class":1072},[505,1683,1073],{"class":1072},[505,1685,1686],{"class":1072}," \"",[505,1688,1689],{"class":1076},"npx",[505,1691,1663],{"class":1072},[505,1693,1694],{"class":1072},",\n",[505,1696,1697,1699,1702,1704,1706],{"class":507,"line":520},[505,1698,1675],{"class":1072},[505,1700,1701],{"class":1678},"args",[505,1703,1663],{"class":1072},[505,1705,1073],{"class":1072},[505,1707,1708],{"class":1072}," [\n",[505,1710,1711,1714,1717,1719],{"class":507,"line":526},[505,1712,1713],{"class":1072},"        \"",[505,1715,1716],{"class":1076},"mcp-remote",[505,1718,1663],{"class":1072},[505,1720,1694],{"class":1072},[505,1722,1723,1725,1728,1730],{"class":507,"line":532},[505,1724,1713],{"class":1072},[505,1726,1727],{"class":1076},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[505,1729,1663],{"class":1072},[505,1731,1694],{"class":1072},[505,1733,1734,1736,1739,1741],{"class":507,"line":538},[505,1735,1713],{"class":1072},[505,1737,1738],{"class":1076},"--header",[505,1740,1663],{"class":1072},[505,1742,1694],{"class":1072},[505,1744,1745,1747,1750],{"class":507,"line":544},[505,1746,1713],{"class":1072},[505,1748,1749],{"class":1076},"Authorization: Bearer \u003Cyour-token>",[505,1751,1752],{"class":1072},"\"\n",[505,1754,1755],{"class":507,"line":550},[505,1756,1757],{"class":1072},"      ]\n",[505,1759,1760],{"class":507,"line":556},[505,1761,1762],{"class":1072},"    }\n",[433,1764,1765,1769,1770],{},[883,1766],{"alt":1767,"src":1768},"Claude Desktop MCP configuration JSON containing the Second Brain server","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. Restart Claude Desktop and check the 'Local MCP servers'. The status says 'running'",[883,1771],{"alt":1772,"src":1773},"Claude Desktop displaying running status for the Second Brain MCP server","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[1149,1775,1777],{"id":1776},"integrating-claude-code-via-mcp","Integrating Claude Code via MCP",[477,1779,1780],{},[480,1781,1782],{},"Run the following command to add the MCP",[497,1784,1788],{"className":1785,"code":1786,"language":1787,"meta":423,"style":423},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n","shell",[472,1789,1790],{"__ignoreMap":423},[505,1791,1792,1795,1798,1801,1804,1807,1810,1813,1816,1819,1822,1825],{"class":507,"line":508},[505,1793,1794],{"class":1062},"claude",[505,1796,1797],{"class":1076}," mcp",[505,1799,1800],{"class":1076}," add",[505,1802,1803],{"class":1076}," --transport",[505,1805,1806],{"class":1076}," http",[505,1808,1809],{"class":1076}," second-brain",[505,1811,1812],{"class":1076}," https:\u002F\u002F",[505,1814,1815],{"class":1072},"\u003C",[505,1817,1818],{"class":1076},"your-worker-ur",[505,1820,1821],{"class":1666},"l",[505,1823,1824],{"class":1072},">",[505,1826,1827],{"class":1076},"\u002Fmcp\n",[477,1829,1830,1836],{},[480,1831,1832,1833],{},"Claude Code detects that the endpoint requires OAuth and will open the login page at the web browser for entering ",[472,1834,1835],{},"AUTH_TOKEN",[480,1837,1838,1839,1842,1843,1846,1847,454],{},"Create the ",[472,1840,1841],{},"CLAUDE.md"," file in ",[472,1844,1845],{},"~\u002F.claude"," folder with the instructions from ",[483,1848,1851],{"href":1849,"rel":1850},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[487],"CLAUDE_INSTRUCTIONS.md",[1149,1853,1855],{"id":1854},"integrating-gemini-cli-via-mcp","Integrating Gemini CLI via MCP",[1154,1857,1858],{},[480,1859,1860],{},"Add the following MCP server settings to '.\u002F.gemini\u002Fsettings.json'",[497,1862,1864],{"className":1648,"code":1863,"language":1650,"meta":423,"style":423},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[472,1865,1866,1878,1897,1911,1925,1930],{"__ignoreMap":423},[505,1867,1868,1870,1872,1874,1876],{"class":507,"line":508},[505,1869,1657],{"class":1072},[505,1871,1660],{"class":1076},[505,1873,1663],{"class":1072},[505,1875,1667],{"class":1666},[505,1877,1670],{"class":1072},[505,1879,1880,1882,1885,1887,1889,1891,1893,1895],{"class":507,"line":514},[505,1881,1675],{"class":1072},[505,1883,1884],{"class":1678},"httpUrl",[505,1886,1663],{"class":1072},[505,1888,1073],{"class":1072},[505,1890,1686],{"class":1072},[505,1892,1727],{"class":1076},[505,1894,1663],{"class":1072},[505,1896,1694],{"class":1072},[505,1898,1899,1901,1904,1906,1908],{"class":507,"line":520},[505,1900,1675],{"class":1072},[505,1902,1903],{"class":1678},"oauth",[505,1905,1663],{"class":1072},[505,1907,1073],{"class":1072},[505,1909,1910],{"class":1072}," {\n",[505,1912,1913,1915,1918,1920,1922],{"class":507,"line":526},[505,1914,1713],{"class":1072},[505,1916,1917],{"class":1062},"enabled",[505,1919,1663],{"class":1072},[505,1921,1073],{"class":1072},[505,1923,1924],{"class":1072}," true\n",[505,1926,1927],{"class":507,"line":532},[505,1928,1929],{"class":1072},"      }\n",[505,1931,1932],{"class":507,"line":538},[505,1933,1762],{"class":1072},[1154,1935,1936],{"start":514},[480,1937,1938],{},"Start the Gemini CLI",[1149,1940,1942],{"id":1941},"test-second-brain-in-ai-agents","Test Second Brain in AI Agents",[1154,1944,1945,1956,1970],{},[480,1946,1947,1948,1951,1952],{},"Started with a simple brand palette settings in '",[440,1949,1950],{},"Claude Desktop","', the Second Brain is not called.\n",[883,1953],{"alt":1954,"src":1955},"First test in Claude Desktop without the Second Brain memory layer active","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[480,1957,1958,1959,1962,1963,1965,1966],{},"Tried with the keyword, 'remember', only ",[472,1960,1961],{},"memory_user-edits"," tools in '",[440,1964,1950],{},"' are used but not Second Brain.\n",[883,1967],{"alt":1968,"src":1969},"Claude Desktop falling back to local built-in user edits instead of Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[480,1971,1972,1973,1976],{},"Tried the the following prompt in '",[440,1974,1975],{},"Claude Code","', Second Brain was called.",[497,1978,1983],{"className":1979,"code":1981,"language":1982},[1980],"language-text","Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n","text",[472,1984,1981],{"__ignoreMap":423},[433,1986,1987,1991,1992,1995,1999,2000,2003,2004,2006,2007,2011,2012,2015,2016,1999,2020],{},[883,1988],{"alt":1989,"src":1990},"Claude Code terminal window showing successful trigger of the Second Brain MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. Verified the colour settings in the ",[440,1993,1994],{},"Second Brain at Cloudflare",[883,1996],{"alt":1997,"src":1998},"Verifying the saved brand color codes in the Second Brain database Web UI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[1187,2001,2002],{},"The reason Claude Code worked was because the CLAUDE_INSTRUCTIONS.md contains the 'Second Brain' keywords.","\n5. Included 'Second Brain' as keywords in '",[440,2005,1950],{},"',  need to be explicitly specified to store to and retrieve from the Second Brain memory layer.\n",[883,2008],{"alt":2009,"src":2010},"Triggering Second Brain in Claude Desktop by explicitly mentioning keywords","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. The keywords, 'Second Brain', need to be mentioned in the ",[440,2013,2014],{},"Gemini CLI"," to trigger the Second Brain MCP.\n",[883,2017],{"alt":2018,"src":2019},"Gemini CLI terminal window demonstrating successful Second Brain MCP calls","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[1187,2021,2022],{},"Adding similar instructions to GEMINI.md like what has been done in CLAUDE_INSTRUCTIONS.md will trigger the Second Brain without mentioning the keywords.",[1149,2024,2026],{"id":2025},"web-browser-extensions","Web Browser Extensions",[477,2028,2029,2032],{},[480,2030,2031],{},"Extensions are available for Chrome, Firefox and Microsoft Edge web browsers.",[480,2033,2034,2035],{},"The extensions are for\n",[477,2036,2037,2043,2049],{},[480,2038,2039,2042],{},[440,2040,2041],{},"Capture the current page"," — saves the title and URL to the Second Brain",[480,2044,2045,2048],{},[440,2046,2047],{},"Capture highlighted text"," — select any text on a page before clicking capture; the excerpt is saved alongside the title and URL",[480,2050,2051,2054,2055,2058],{},[440,2052,2053],{},"Add a note"," — type context or ",[472,2056,2057],{},"#hashtags"," in the popup before saving; hashtags are automatically extracted as tags",[1149,2060,2062],{"id":2061},"syncing-personal-knowledge-with-the-obsidian-plugin","Syncing Personal Knowledge with the Obsidian Plugin",[477,2064,2065,2068],{},[480,2066,2067],{},"Obsidian plugin is available to sync the notes from the Obsidian Vault to Second Brain at Cloudflare.",[480,2069,2070],{},"Notes can be tagged for syncing to the Second Brain",[2072,2073,2075],"h4",{"id":2074},"install-obsidian-plugin","Install Obsidian Plugin",[1154,2077,2078,2085,2092,2099],{},[480,2079,2080,2081],{},"Open Obsidian → Settings → Community Plugins\n",[883,2082],{"alt":2083,"src":2084},"Obsidian settings panel navigating to the Community Plugins section","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[480,2086,2087,2088],{},"Click on 'Browse' button\n",[883,2089],{"alt":2090,"src":2091},"Obsidian community plugins search page showing the Browse button","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[480,2093,2094,2095],{},"Search for 'Second Brain Sync'\n",[883,2096],{"alt":2097,"src":2098},"Searching for Second Brain Sync plugin in Obsidian marketplace","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[480,2100,2101,2102],{},"Click 'Install' button then 'Enable' button\n",[883,2103],{"alt":2104,"src":2105},"Installing and enabling the Second Brain Sync plugin in Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[2072,2107,2109],{"id":2108},"configure-obsidian-plugin","Configure Obsidian Plugin",[1154,2111,2112,2115,2122,2129,2136,2143],{},[480,2113,2114],{},"Open Obsidian → Settings → Second Brain Sync",[480,2116,2117,2118],{},"Enter the 'URL' and 'Auth token'\n",[883,2119],{"alt":2120,"src":2121},"Entering Worker URL and Auth Token in Obsidian plugin settings","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[480,2123,2124,2125],{},"Click 'Test' button to verify it is connected.\n",[883,2126],{"alt":2127,"src":2128},"Obsidian plugin connection test showing successful verification","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[480,2130,2131,2132],{},"Configure the sync behaviours. Set the 'Sync tag' and enable 'Auto-sync on save'.\n",[883,2133],{"alt":2134,"src":2135},"Configuring Sync Tag and enabling Auto-sync on save in Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[480,2137,2138,2139],{},"Create a note in Obsidian with the tag, 'second-brain', as it was configured as the 'Sync tag'.\n",[883,2140],{"alt":2141,"src":2142},"Creating a new Obsidian note tagged with second-brain for synchronization","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[480,2144,2145,2146],{},"The note has been saved and synced to the Second Brain deployed at Cloudflare.\n",[883,2147],{"alt":2148,"src":2149},"Verifying the successfully synchronized Obsidian note in Second Brain Web UI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[428,2151,948],{"id":947},[433,2153,2154],{},"Second Brain provides an open-source solution to one of the most frustrating issues in AI: persistent memory. By combining it with Cloudflare infrastructure, it delivers a fully self-hosted memory layer that is globally distributed with low latency. The MCP tools built into Second Brain make this memory portable across all AI agents.",[433,2156,2157],{},"The Obsidian plugin extends the Second Brain into personal knowledge management. Notes in an Obsidian vault can be selectively synchronised to Second Brain, transforming raw notes into structured context that AI agents can semantically understand and retrieve.",[433,2159,2160],{},"By combining self-hosting, semantic search, and standards-based MCP integration; Second Brain proves to be more than just a memory layer but a practical foundation for building an AI ecosystem.",[428,2162,2164],{"id":2163},"reference","Reference:",[477,2166,2167,2173,2179,2186,2193],{},[480,2168,2169],{},[483,2170,2171],{"href":2171,"rel":2172},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[487],[480,2174,2175],{},[483,2176,2177],{"href":2177,"rel":2178},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[487],[480,2180,2181],{},[483,2182,2185],{"href":2183,"rel":2184},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[487],"Connect to AI Clients",[480,2187,2188],{},[483,2189,2192],{"href":2190,"rel":2191},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[487],"Second Brain Obsidian Plugin",[480,2194,2195],{},[483,2196,2197],{"href":2197,"rel":2198},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[487],[987,2200,2201],{},"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":423,"searchDepth":514,"depth":520,"links":2203},[2204,2205,2206,2218,2219],{"id":1430,"depth":514,"text":1431},{"id":1440,"depth":514,"text":1441},{"id":1461,"depth":514,"text":1462,"children":2207},[2208,2209,2210,2211,2212,2213,2214],{"id":1533,"depth":520,"text":1534},{"id":1618,"depth":520,"text":1619},{"id":1776,"depth":520,"text":1777},{"id":1854,"depth":520,"text":1855},{"id":1941,"depth":520,"text":1942},{"id":2025,"depth":520,"text":2026},{"id":2061,"depth":520,"text":2062,"children":2215},[2216,2217],{"id":2074,"depth":526,"text":2075},{"id":2108,"depth":526,"text":2109},{"id":947,"depth":514,"text":948},{"id":2163,"depth":514,"text":2164},[999,1408],"2026-08-07","Learn how to build a persistent, self-hosted AI memory system on Cloudflare using Second Brain and MCP. Share context across Claude, Gemini, and Obsidian.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FEN-Use-Cloudflare-as-AI-memory.webp","A personal self-hosted AI memory system deployed on Cloudflare Workers and Vectorize using the Model Context Protocol (MCP) and Obsidian sync.",{"schemaOrg":2226,"robots":1010,"sitemap":2230},[2227],{"@type":2228,"headline":2229,"description":2222},"TechArticle","Build a Self-Hosted AI Memory System with Cloudflare & MCP",{"lastmod":2221},{"title":2229,"description":2222,"ogTitle":414,"ogDescription":2222,"twitterTitle":414,"twitterDescription":2222},[2233,2234,2235,1452,2236],"Cloudflare","MCP","AI Memory","Obsidian","i-n5KfCSdIReLHWXO0pss_aKBTXq5lNG61z0LAefVgk",[2239,2489,3047],{"id":2240,"title":370,"author":1017,"body":2241,"category":2477,"date":2478,"description":2479,"extension":1002,"image":2480,"imageAlt":2481,"isPublished":1005,"meta":2482,"minRead":550,"navigation":1005,"path":371,"seo":2486,"stem":372,"tags":2487,"updatedAt":1017,"__hash__":2488},"article\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare.md",{"type":425,"value":2242,"toc":2468},[2243,2246,2249,2263,2267,2274,2277,2281,2284,2288,2318,2322,2325,2392,2396,2399,2461,2465],[433,2244,2245],{},"The moment your NodeWarden is exposed to the public on the Internet, it starts attracting thousands of automated bots scrapping for vulnerabilities 24\u002F7. To protect your sensitive data, You need to put NodeWarden instance in the maximum lockdown possible.",[433,2247,2248],{},"To secure your NodeWarden instance, you can use one of two Cloudflare features:",[477,2250,2251,2257],{},[480,2252,2253,2256],{},[440,2254,2255],{},"Cloudflare IP Access Rules:"," Allows you to block, challenge, or permit traffic based on specific IP addresses or countries.",[480,2258,2259,2262],{},[440,2260,2261],{},"Cloudflare Zero Trust (Recommend):"," Acts as a secure gateway that makes your NodeWarden instance completely invisible to the public, only letting authorised users through.",[2072,2264,2266],{"id":2265},"why-we-recommend-cloudflare-zero-trust","Why we recommend Cloudflare Zero Trust",[433,2268,2269,2270,2273],{},"We strongly advise using Cloudflare Zero Trust since IP Access Rules are tied to IP addresses or countries, meaning you need to manually update the your rules every time you travel or if you have a dynamic IP address. Cloudflare Zero Trust on the other hand relies on your ",[440,2271,2272],{},"identity",", not your location—giving you seamless, secure access to NodeWarden.",[2275,2276],"hr",{},[428,2278,2280],{"id":2279},"configuration-guide","Configuration Guide",[433,2282,2283],{},"Follow these steps to configure Cloudflare Zero Trust for NodeWarden.",[1149,2285,2287],{"id":2286},"phase-1-getting-started","Phase 1: Getting Started",[1154,2289,2290,2297,2304,2311],{},[480,2291,2292,2293],{},"In your Cloudflare dashboard, click on 'Zero Trust' from left menu\n",[883,2294],{"alt":2295,"src":2296},"Cloudflare dashboard sidebar showing the Zero Trust option selected in the navigation menu.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-dashboard-zero-trust-sidebar.webp",[480,2298,2299,2300],{},"Click on 'Access controls' then click on 'Applications'\n",[883,2301],{"alt":2302,"src":2303},"Cloudflare Zero Trust navigation menu with Access controls section expanded.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-access-controls-menu.webp",[480,2305,2306,2307],{},"You may be asked to 'Choose a plan'.\n",[883,2308],{"alt":2309,"src":2310},"Cloudflare Zero Trust account setup screen prompting the user to choose a subscription plan.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-choose-plan-setup.webp",[480,2312,2313,2314],{},"Click on the 'Choose a plan' button and choose the 'Zero Trust Free'.\n",[883,2315],{"alt":2316,"src":2317},"The Zero Trust Free plan details page on Cloudflare, highlighting the Select plan button.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-free-plan-selection.webp",[1149,2319,2321],{"id":2320},"phase-2-secure-your-web-interface","Phase 2: Secure Your Web Interface",[433,2323,2324],{},"First, we will create an application to protect the NodeWarden web dashboard.",[1154,2326,2327,2334,2341,2348,2355,2362,2369,2372,2379,2382],{},[480,2328,2329,2330],{},"Click on 'Create new application' to create the first application\n",[883,2331],{"alt":2332,"src":2333},"Cloudflare Access Applications dashboard featuring the Create new application button.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-create-new-application.webp",[480,2335,2336,2337],{},"Choose the 'Self-hosted and private'\n",[883,2338],{"alt":2339,"src":2340},"The Add an application modal in Cloudflare Access with Self-hosted and private application type selected.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-add-self-hosted-application.webp",[480,2342,2343,2344],{},"Enter the domain name of the NodeWarden.\n",[883,2345],{"alt":2346,"src":2347},"Cloudflare Access application configuration screen showing the public hostname set to warden.techvoyage.dev.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-application-public-hostname.webp",[480,2349,2350,2351],{},"Click on 'Create new policy' to create a policy.\n",[883,2352],{"alt":2353,"src":2354},"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.webp",[480,2356,2357,2358],{},"Select 'Emails' and enter an email under 'Policy rules'.\n",[883,2359],{"alt":2360,"src":2361},"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.webp",[480,2363,2364,2365],{},"Enter a name and select 'Allow' under 'Policy details'.\n",[883,2366],{"alt":2367,"src":2368},"Cloudflare Access policy details screen showing the policy name NodeWarden-Web and the action set to Allow.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-details-allow.webp",[480,2370,2371],{},"Click 'Save Policy' to create the policy.",[480,2373,2374,2375],{},"Enter a name and select '1 month' under the 'Details' section.\n",[883,2376],{"alt":2377,"src":2378},"Final configuration summary for a Cloudflare Access application named NodeWarden-Web with a one-month session duration.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-application-final-details.webp",[480,2380,2381],{},"Click on 'Create' to create the application.",[480,2383,2384,2387,2388],{},[440,2385,2386],{},"Test it:"," Open the domain on the web browser, you will see the 'Cloudflare Access' asking for email.\n",[883,2389],{"alt":2390,"src":2391},"A preview of the Cloudflare Access login screen for NodeWarden-Web, prompting for an email address.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-login-screen-preview.webp",[1149,2393,2395],{"id":2394},"phase-3-allow-bitwarden-clients-syncing-api-bypass","Phase 3: Allow BitWarden Clients Syncing (API Bypass)",[433,2397,2398],{},"The desktop and mobile BitWarden apps cannot process Cloudflare's email login screen, we need to create a second application that allows traffic to bypass the login screen specifically for API syncing.",[1154,2400,2401,2412,2427,2431,2438,2445,2447,2454],{},[480,2402,2403,2404,2407,2408,2411],{},"Go back to Applications and click ",[440,2405,2406],{},"Create new application",", choosing ",[440,2409,2410],{},"Self-hosted and private"," again.",[480,2413,2414,2415,2418,2419,2422,2423],{},"Enter the 'api\u002F",[1187,2416,2417],{},"', 'identity\u002F","', 'notifications\u002F",[1187,2420,2421],{},"', and 'icons\u002F","' in the Destinations.\n",[883,2424],{"alt":2425,"src":2426},"Configuring multiple public hostnames for API bypass in Cloudflare Access, including api, identity, notifications, and icons paths.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-api-bypass-destinations.webp",[480,2428,2350,2429],{},[883,2430],{"alt":2353,"src":2354},[480,2432,2433,2434],{},"Select 'Everyone' under 'Policy rules'.\n",[883,2435],{"alt":2436,"src":2437},"Cloudflare Access policy rule configuration with Everyone selected to allow broad access for specific paths.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-everyone.webp",[480,2439,2440,2441],{},"Enter a name and select 'Bypass' under 'Policy details'.\n",[883,2442],{"alt":2443,"src":2444},"Cloudflare Access policy details for NodeWarden-API with the action set to Bypass.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-details-bypass.webp",[480,2446,2371],{},[480,2448,2449,2450],{},"Enter a name and select '1 month' for 'Session Duration'.\n",[883,2451],{"alt":2452,"src":2453},"Final configuration screen for the NodeWarden-API application in Cloudflare Access.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-api-application-final-details.webp",[480,2455,2456,2457],{},"You should have 2 applications created.\n",[883,2458],{"alt":2459,"src":2460},"The Cloudflare Access applications dashboard showing both the Web and API applications successfully created.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-applications-list-final.webp",[428,2462,2464],{"id":2463},"final-thought","Final thought",[433,2466,2467],{},"Just remember that Cloudflare is your outer shield. To maintain a truly secure vault, ensure you are still using a strong master password, utilising Two-Factor Authentication (2FA) , and keeping your Cloudflare account secure.",{"title":423,"searchDepth":514,"depth":520,"links":2469},[2470,2471,2476],{"id":2265,"depth":526,"text":2266},{"id":2279,"depth":514,"text":2280,"children":2472},[2473,2474,2475],{"id":2286,"depth":520,"text":2287},{"id":2320,"depth":520,"text":2321},{"id":2394,"depth":520,"text":2395},{"id":2463,"depth":514,"text":2464},[998,999],"2026-05-27","The moment your NodeWarden is exposed to the public on the Internet, it starts attracting thousands of automated bots scrapping for vulnerabilities 24\u002F7.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fsecure-nodewarden-cloudflare-integration-guide.webp","Step-by-step guide thumbnail for securing a NodeWarden vault with Cloudflare integration, featuring a digital safe with a padlock and a server rack protected by Cloudflare security.",{"schemaOrg":2483,"robots":1010,"sitemap":2485},[2484],{"@type":2228,"headline":370,"description":2479},{"lastmod":2478},{"title":370,"description":2479,"ogTitle":370,"ogDescription":2479,"twitterTitle":370,"twitterDescription":2479},[],"skmetmxWa0gDtpaRa9Xx9U_NHD-GMsL2p17SMSYYpWY",{"id":2490,"title":386,"author":1017,"body":2491,"category":3034,"date":3035,"description":3036,"extension":1002,"image":3037,"imageAlt":3038,"isPublished":1005,"meta":3039,"minRead":550,"navigation":1005,"path":387,"seo":3044,"stem":388,"tags":3045,"updatedAt":1017,"__hash__":3046},"article\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare.md",{"type":425,"value":2492,"toc":3021},[2493,2496,2502,2506,2696,2700,2719,2723,2749,2753,2807,2811,2852,2856,2886,2890,2893,2897,2922,2926,2945,2949,2952,2969,2974,2977,2980,2992,2996,3009,3012],[433,2494,2495],{},"Your passwords are your most critical digital property, and keeping them secure means keeping them in your own hands. By self-hosting your password manager; you take control of your own security.",[433,2497,2498,2501],{},[440,2499,2500],{},"BitWarden"," is widely regarded as one of most trusted in password management domain and its source code is made available under AGPL-3.0 licence. An unofficial BitWarden compatible server, NodeWarden, is written in Typescript and can be deployed for free on Cloudflare.",[2072,2503,2505],{"id":2504},"feature-comparison-with-the-official-bitwarden-server","Feature Comparison with the Official BitWarden Server",[2507,2508,2509,2527],"table",{},[2510,2511,2512],"thead",{},[2513,2514,2515,2519,2521,2524],"tr",{},[2516,2517,2518],"th",{},"Capability",[2516,2520,2500],{},[2516,2522,2523],{},"NodeWarden",[2516,2525,2526],{},"Notes",[2528,2529,2530,2546,2561,2573,2585,2600,2617,2632,2648,2660,2672,2685],"tbody",{},[2513,2531,2532,2536,2539,2541],{},[2533,2534,2535],"td",{},"Web Vault",[2533,2537,2538],{},"✅",[2533,2540,2538],{},[2533,2542,2543],{},[440,2544,2545],{},"Original Web Vault interface",[2513,2547,2548,2554,2556,2558],{},[2533,2549,2550,2551],{},"Full sync ",[472,2552,2553],{},"\u002Fapi\u002Fsync",[2533,2555,2538],{},[2533,2557,2538],{},[2533,2559,2560],{},"Compatibility optimised for official clients",[2513,2562,2563,2566,2568,2570],{},[2533,2564,2565],{},"Attachment upload \u002F download",[2533,2567,2538],{},[2533,2569,2538],{},[2533,2571,2572],{},"Cloudflare R2 or KV",[2513,2574,2575,2578,2580,2582],{},[2533,2576,2577],{},"Send",[2533,2579,2538],{},[2533,2581,2538],{},[2533,2583,2584],{},"Supports both text and file Sends",[2513,2586,2587,2590,2592,2594],{},[2533,2588,2589],{},"Import \u002F Export",[2533,2591,2538],{},[2533,2593,2538],{},[2533,2595,2596,2597],{},"Supports BitWarden JSON \u002F CSV \u002F ",[440,2598,2599],{},"ZIP import with attachments",[2513,2601,2602,2607,2610,2612],{},[2533,2603,2604],{},[440,2605,2606],{},"Cloud Backup Center",[2533,2608,2609],{},"❌",[2533,2611,2538],{},[2533,2613,2614],{},[440,2615,2616],{},"Scheduled backup to WebDAV \u002F S3",[2513,2618,2619,2622,2625,2627],{},[2533,2620,2621],{},"Password hint (web)",[2533,2623,2624],{},"⚠️ Limited",[2533,2626,2538],{},[2533,2628,2629],{},[440,2630,2631],{},"No email required",[2513,2633,2634,2637,2639,2641],{},[2533,2635,2636],{},"TOTP \u002F Steam TOTP",[2533,2638,2538],{},[2533,2640,2538],{},[2533,2642,2643,2644,2647],{},"Includes ",[472,2645,2646],{},"steam:\u002F\u002F"," support",[2513,2649,2650,2653,2655,2657],{},[2533,2651,2652],{},"Multi-user",[2533,2654,2538],{},[2533,2656,2538],{},[2533,2658,2659],{},"Invite-based registration",[2513,2661,2662,2665,2667,2669],{},[2533,2663,2664],{},"Organizations \u002F Collections \u002F Member roles",[2533,2666,2538],{},[2533,2668,2609],{},[2533,2670,2671],{},"Not implemented",[2513,2673,2674,2677,2679,2682],{},[2533,2675,2676],{},"Login 2FA",[2533,2678,2538],{},[2533,2680,2681],{},"⚠️ Partial",[2533,2683,2684],{},"Currently only user-level TOTP",[2513,2686,2687,2690,2692,2694],{},[2533,2688,2689],{},"SSO \u002F SCIM \u002F Enterprise directory",[2533,2691,2538],{},[2533,2693,2609],{},[2533,2695,2671],{},[1149,2697,2699],{"id":2698},"what-we-need","What we need:",[1154,2701,2702,2707,2713],{},[480,2703,2704],{},[440,2705,2706],{},"A GitHub Account",[480,2708,2709,2712],{},[440,2710,2711],{},"A Cloudflare Account"," (Free) with R2 Storage enabled.",[480,2714,2715,2718],{},[1187,2716,2717],{},"Optional:"," A custom domain name managed in Cloudflare.",[1149,2720,2722],{"id":2721},"phase-1-prepare-the-code","Phase 1: Prepare the Code:",[1154,2724,2725,2742],{},[480,2726,2727,2728,2732,2733,2737,2738],{},"Fork the NodeWarden repository from ",[483,2729,2730],{"href":2730,"rel":2731},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fnodewarden",[487]," or original repository, ",[483,2734,2735],{"href":2735,"rel":2736},"https:\u002F\u002Fgithub.com\u002Fshuaiplus\u002Fnodewarden",[487]," in GitHub\n",[883,2739],{"alt":2740,"src":2741},"Forking the NodeWarden repository on GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Ffork-nodewarden-repo.webp",[480,2743,2744,2745],{},"Enable the Sync Upstream Workflow\n",[883,2746],{"alt":2747,"src":2748},"Enabling the Sync Upstream workflow in GitHub Actions","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fenable-sync-upstream.webp",[1149,2750,2752],{"id":2751},"phase-2-deploy-to-cloudflare","Phase 2: Deploy to Cloudflare",[1154,2754,2755,2762,2773],{},[480,2756,2757,2758],{},"Create a Worker Application in Cloudflare\n",[883,2759],{"alt":2760,"src":2761},"Creating a new Worker application in the Cloudflare dashboard","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcreate-cloudflare-worker.webp",[480,2763,2764,2765,2769],{},"Select 'Continue with GitHub' to deploy the app.\n",[883,2766],{"alt":2767,"src":2768},"Deploying the NodeWarden app by connecting to GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fdeploy-github-repo.webp",[883,2770],{"alt":2771,"src":2772},"Cloudflare Worker build and deployment progress","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-deploy-status.webp",[480,2774,2775,2776,2779,2780,2783,2784,2787,2788],{},"Wait a few moments for Cloudflare to build and deploy your app. It will give you a default ",[472,2777,2778],{},"worker.dev"," URL.\n",[440,2781,2782],{},"(Optional) Add a Custom Domain:"," * In your Cloudflare Worker settings, go to the ",[440,2785,2786],{},"Settings"," tab.\n",[477,2789,2790,2796],{},[480,2791,2792,2793,454],{},"Click ",[440,2794,2795],{},"+ Add",[480,2797,2798,2799,2803],{},"Type in your preferred domain and follow the prompts.\n",[883,2800],{"alt":2801,"src":2802},"Navigating to custom domain settings in Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fworker-settings-custom-domain.webp",[883,2804],{"alt":2805,"src":2806},"Adding a custom domain to the Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fadd-custom-domain.webp",[1149,2808,2810],{"id":2809},"phase-3-secure-your-server-the-jwt-secret","Phase 3: Secure Your Server (The JWT Secret)",[1154,2812,2813,2816,2827,2845],{},[480,2814,2815],{},"Head to the web browser and enter the custom domain name or the generated 'worker.dev' domain.",[480,2817,2818,2819,2822,2823],{},"You will get '",[440,2820,2821],{},"JWT_SECRET is missing'",".\n",[883,2824],{"alt":2825,"src":2826},"JWT_SECRET is missing error message on NodeWarden server","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fjwt-secret-missing-error.webp",[480,2828,2829,2830,2832,2833,2836,2837,2841],{},"Copy the generated secret key and head back to the Settings tab on the NodeWarden Worker, then click on '",[440,2831,2795],{},"' button on '",[440,2834,2835],{},"Variables and Secrets","' section.\n",[883,2838],{"alt":2839,"src":2840},"Variables and Secrets section in Cloudflare Worker settings","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fworker-variables-secrets.webp",[883,2842],{"alt":2843,"src":2844},"Adding the generated JWT secret to Cloudflare Worker variables","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fadd-jwt-secret.webp",[480,2846,2847,2848,2851],{},"Enter the generated secret and click on the '",[440,2849,2850],{},"Deploy \u002F Save","' button.",[1149,2853,2855],{"id":2854},"phase-4-create-your-admin-account","Phase 4: Create Your Admin Account",[1154,2857,2858,2865,2876,2883],{},[480,2859,2860,2861],{},"Go back to the web browser and refresh the page, you will get the following login page.\n",[883,2862],{"alt":2863,"src":2864},"NodeWarden server login page","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fnodewarden-login.webp",[480,2866,2867,2868,2871,2872],{},"Click on '",[440,2869,2870],{},"Create Account","' to create the admin account.\n",[883,2873],{"alt":2874,"src":2875},"Clicking the Create Account button on NodeWarden login page","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcreate-account-button.webp",[480,2877,2878,2879],{},"Login using the created admin account to the Dashboard.\n",[883,2880],{"alt":2881,"src":2882},"NodeWarden admin dashboard overview","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fnodewarden-dashboard.webp",[480,2884,2885],{},"Now we have the server deployed and running. We start configuring the BitWarden clients.",[1149,2887,2889],{"id":2888},"phase-5-connect-your-devices","Phase 5: Connect Your Devices",[433,2891,2892],{},"You can use the official BitWarden apps on all your devices.",[2072,2894,2896],{"id":2895},"chrome-extension","Chrome Extension",[1154,2898,2899,2902,2905,2912,2919],{},[480,2900,2901],{},"Install the BitWarden Chrome extension",[480,2903,2904],{},"Open the extension.",[480,2906,2907,2908],{},"Click the link next to 'Accessing:' at the bottom of the popup.\n",[883,2909],{"alt":2910,"src":2911},"Selecting self-hosted option in Bitwarden Chrome extension","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-extension-self-hosted.webp",[480,2913,2914,2915],{},"Enter the domain name of the NodeWarden server.\n",[883,2916],{"alt":2917,"src":2918},"Entering server URL in Bitwarden Chrome extension","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-extension-domain.webp",[480,2920,2921],{},"Save the settings and log in with your account.",[2072,2923,2925],{"id":2924},"ios-app","iOS App",[1154,2927,2928,2931,2938],{},[480,2929,2930],{},"Install the BitWarden app from the App Store",[480,2932,2933,2934],{},"Open the app and click on 'Self-hosted' next to 'Logging in on:'\n",[883,2935],{"alt":2936,"src":2937},"Accessing self-hosted settings in Bitwarden iOS app","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-ios-self-hosted.webp",[480,2939,2940,2941],{},"Enter the domain name of the NodeWarden server and click on '✓' button.\n",[883,2942],{"alt":2943,"src":2944},"Configuring server URL in Bitwarden iOS app","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-ios-domain.webp",[2072,2946,2948],{"id":2947},"other-clients","Other Clients",[433,2950,2951],{},"NodeWarden has been tested and confirmed compatible with these official BitWarden clients:",[477,2953,2954,2957,2960,2963,2966],{},[480,2955,2956],{},"✅ Windows desktop",[480,2958,2959],{},"✅ Android\u002FiOS mobile apps",[480,2961,2962],{},"✅ Browser extensions",[480,2964,2965],{},"✅ Linux desktop",[480,2967,2968],{},"⚠️ macOS desktop (not fully verified)",[2970,2971,2973],"h1",{"id":2972},"vault-backup","Vault Backup",[433,2975,2976],{},"NodeWarden allows you to back up your vault to a local computer or remote storage (WebDAV or S3-compatible storage).",[433,2978,2979],{},"To automate remote backups:",[477,2981,2982,2985],{},[480,2983,2984],{},"Configure the remote storage details inside the NodeWarden dashboard.",[480,2986,2987,2988],{},"Make sure the Cron task is set on Cloudflare Worker settings for auto remote backup.\n",[883,2989],{"alt":2990,"src":2991},"Configuring Cron triggers for automatic vault backups in Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-worker-cron.webp",[2970,2993,2995],{"id":2994},"final-security-thoughts","Final Security thoughts",[477,2997,2998,3001,3004],{},[480,2999,3000],{},"Secure the Cloudflare account access, otherwise the data can be compromised. Enable the Two-Factor Authentication (2FA) or Passkey on your Cloudflare account immediately.",[480,3002,3003],{},"Host the NodeWarden on a dedicated Cloudflare account. Do not share resources with other web apps to minimise the security risks.",[480,3005,3006],{},[483,3007,3008],{"href":371},"Secure NodeWarden with Cloudflare",[2970,3010,3011],{"id":2163},"Reference",[477,3013,3014],{},[480,3015,3016],{},[483,3017,3020],{"href":3018,"rel":3019},"https:\u002F\u002Fnodewarden.app\u002Fguide\u002Fstart",[487],"Official NodeWarden Start Guide",{"title":423,"searchDepth":514,"depth":520,"links":3022},[3023,3024,3025,3026,3027,3028,3029],{"id":2504,"depth":526,"text":2505},{"id":2698,"depth":520,"text":2699},{"id":2721,"depth":520,"text":2722},{"id":2751,"depth":520,"text":2752},{"id":2809,"depth":520,"text":2810},{"id":2854,"depth":520,"text":2855},{"id":2888,"depth":520,"text":2889,"children":3030},[3031,3032,3033],{"id":2895,"depth":526,"text":2896},{"id":2924,"depth":526,"text":2925},{"id":2947,"depth":526,"text":2948},[998,999],"2026-05-25","Your passwords are your most critical digital property, and keeping them secure means keeping them in your own hands.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fself-hosting-bitwarden-vault.webp","Thumbnail for self-hosting Bitwarden compatible server tutorial, showing a digital vault and a secure server rack.",{"schemaOrg":3040,"robots":1010,"sitemap":3043},[3041],{"@type":2228,"headline":3042,"description":3036},"How to Lock Passwords in Your Own Vault by Self Hosting BitWarden Compatible Server",{"lastmod":3035},{"title":3042,"description":3036,"ogTitle":3042,"ogDescription":3036,"twitterTitle":3042,"twitterDescription":3036},[],"OlnbweB6youyilckmZZDqy3do1DqY_IXZlCI7uMXhuI",{"id":3048,"title":362,"author":423,"body":3049,"category":3924,"date":3925,"description":3926,"extension":1002,"image":3927,"imageAlt":3928,"isPublished":1005,"meta":3929,"minRead":550,"navigation":1005,"path":363,"seo":3964,"stem":364,"tags":3966,"updatedAt":3963,"__hash__":3969},"article\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md",{"type":425,"value":3050,"toc":3906},[3051,3065,3074,3078,3081,3093,3097,3105,3109,3113,3160,3164,3298,3302,3335,3339,3342,3408,3411,3447,3450,3477,3481,3491,3495,3534,3621,3625,3630,3645,3654,3729,3734,3780,3784,3829,3843,3847,3891,3893,3903],[433,3052,3053,3054,3057,3058,3060,3061,3064],{},"A common challenge arises when you want to access your ",[440,3055,3056],{},"Hermes Agent"," from other devices such as laptops, tablets, or phones without exposing it to the public internet. Utilizing ",[440,3059,924],{}," with ",[440,3062,3063],{},"Cloudflare Zero Trust"," allows you to expose the Hermes Agent globally without opening a single inbound port on your firewall.",[433,3066,3067,3068,3070,3071,3073],{},"If you followed our previous guide, '",[483,3069,374],{"href":375},"', a Hermes Agent is already up and running 24\u002F7. Instead of dealing with the overhead of traditional VPNs, we will use the ",[440,3072,924],{}," client to expose the Hermes Agent to a private network over the internet.",[428,3075,3077],{"id":3076},"understanding-the-architecture","Understanding the Architecture",[433,3079,3080],{},"The components at play:",[1154,3082,3083,3088],{},[480,3084,3085,3087],{},[440,3086,3063],{},": The dashboard at Cloudflare where you define routing rules and access policies.",[480,3089,3090,3092],{},[440,3091,924],{},": The client application installed on your devices (VPS, laptops, phones). It intercepts traffic destined for your private network and routes it securely.",[1149,3094,3096],{"id":3095},"prerequisites","Prerequisites",[477,3098,3099,3102],{},[480,3100,3101],{},"A running Hermes Agent on your VPS.",[480,3103,3104],{},"A free Cloudflare account.",[428,3106,3108],{"id":3107},"step-by-step-guide","Step-by-Step Guide",[1149,3110,3112],{"id":3111},"step-1-set-up-cloudflare-zero-trust","Step 1: Set Up Cloudflare Zero Trust",[1154,3114,3115,3123,3130,3141,3148,3154],{},[480,3116,3117,3118,454],{},"Log in to your ",[483,3119,3122],{"href":3120,"rel":3121},"https:\u002F\u002Fdash.cloudflare.com\u002F",[487],"Cloudflare Dashboard",[480,3124,3125,3126],{},"Click on 'Zero Trust' from the left menu.\n",[883,3127],{"alt":3128,"src":3129},"Cloudflare dashboard left sidebar navigation menu with Zero Trust option","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[480,3131,3132,3133,3136,3137],{},"If this is your first time, you will be prompted to choose a plan (the Free tier is perfectly fine for this setup) and name your team (e.g., ",[472,3134,3135],{},"ai-team",").\n",[883,3138],{"alt":3139,"src":3140},"Setting up first-time Cloudflare Zero Trust account and naming the team","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[480,3142,3143,3144],{},"Click on 'Access' then 'Policies' to create an access policy defining who has access to the network.\n",[883,3145],{"alt":3146,"src":3147},"Cloudflare Zero Trust Access Policies page showing newly configured access rules","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[480,3149,3150,3151],{},"Click on 'Create new policy'.\n",[883,3152],{"alt":2353,"src":3153},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.png",[480,3155,3156,3157],{},"Select 'Emails' and enter your email under 'Policy rules'.\n",[883,3158],{"alt":2360,"src":3159},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.png",[1149,3161,3163],{"id":3162},"step-2-set-up-cloudflare-warp-client-on-vps","Step 2: Set Up Cloudflare WARP Client on VPS",[1154,3165,3166,3176,3182,3189,3192,3206,3209,3291],{},[480,3167,3168,3169,834,3172,3175],{},"Run ",[472,3170,3171],{},"sudo apt update",[472,3173,3174],{},"sudo apt install cloudflare-warp"," in the terminal on your VPS.",[480,3177,3168,3178,3181],{},[472,3179,3180],{},"warp-cli registration new \u003CTEAM-NAME>"," in the terminal on your VPS, which will print out a URL.",[480,3183,3184,3185,3188],{},"Copy the printed URL, which will look like ",[472,3186,3187],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp",", and paste it in your browser for authentication.",[480,3190,3191],{},"Since email authentication is used in the policy rule setup above, enter your email to authenticate.",[480,3193,3194,3195,3198,3199,3202,3203,2851],{},"On the '",[440,3196,3197],{},"Success","' page in the browser, right-click and select '",[440,3200,3201],{},"Inspect","' on the blue '",[440,3204,3205],{},"Open Cloudflare WARP",[480,3207,3208],{},"Copy the long token that is shown in the button's link.",[480,3210,3168,3211,3214,3215,3217,3218],{},[472,3212,3213],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\""," in the terminal on your VPS to connect it to Cloudflare Zero Trust.",[880,3216],{},"If the 'Error: Failed to communicate with the WARP API' is encounter on Ubuntu 26, run the following commands:",[497,3219,3223],{"className":3220,"code":3221,"language":3222,"meta":423,"style":423},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","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","bash",[472,3224,3225,3239,3243,3249,3260,3264,3269],{"__ignoreMap":423},[505,3226,3227,3230,3233,3236],{"class":507,"line":508},[505,3228,3229],{"class":1062},"sudo",[505,3231,3232],{"class":1076}," systemctl",[505,3234,3235],{"class":1076}," restart",[505,3237,3238],{"class":1076}," warp-svc.service\n",[505,3240,3241],{"class":507,"line":514},[505,3242,1096],{"emptyLinePlaceholder":1005},[505,3244,3245],{"class":507,"line":520},[505,3246,3248],{"class":3247},"sHwdD","# Check status\n",[505,3250,3251,3253,3255,3258],{"class":507,"line":526},[505,3252,3229],{"class":1062},[505,3254,3232],{"class":1076},[505,3256,3257],{"class":1076}," status",[505,3259,3238],{"class":1076},[505,3261,3262],{"class":507,"line":532},[505,3263,1096],{"emptyLinePlaceholder":1005},[505,3265,3266],{"class":507,"line":538},[505,3267,3268],{"class":3247},"# Run the warp-cli registration token again\n",[505,3270,3271,3274,3277,3280,3283,3286,3289],{"class":507,"line":544},[505,3272,3273],{"class":1062},"warp-cli",[505,3275,3276],{"class":1076}," --accept-tos",[505,3278,3279],{"class":1076}," registration",[505,3281,3282],{"class":1076}," token",[505,3284,3285],{"class":1072},"   \"",[505,3287,3288],{"class":1076},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[505,3290,1752],{"class":1072},[480,3292,3293,3294],{},"Head back to the Cloudflare Zero Trust dashboard, and click on 'Devices'. Your VPS device should now be displayed.\n",[883,3295],{"alt":3296,"src":3297},"Zero Trust Devices dashboard confirming the Linux VPS is connected","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-devices-vps-connected.webp",[1149,3299,3301],{"id":3300},"step-3-set-up-traffic-routing","Step 3: Set Up Traffic Routing",[1154,3303,3304,3311,3318,3325],{},[480,3305,3306,3307],{},"Click the profile for your VPS on the Devices dashboard.\n",[883,3308],{"alt":3309,"src":3310},"Accessing details and split tunnel settings for the registered VPS device","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[480,3312,3313,3314],{},"Scroll down to the 'Split Tunnels' section.\n",[883,3315],{"alt":3316,"src":3317},"Split Tunnels section under VPS profile settings","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-split-tunnels-section.webp",[480,3319,3320,3321],{},"Click the 'Manage' button and configure the settings as shown below. Replace the IP address if necessary.\n",[883,3322],{"alt":3323,"src":3324},"Managing Split Tunnels IP and hostname exclusions in Cloudflare settings","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[480,3326,3327,3328,834,3331,3334],{},"Exposing the ",[472,3329,3330],{},"address",[472,3332,3333],{},"host"," will route traffic to your services over the same private network.",[1149,3336,3338],{"id":3337},"step-4-configure-firewall-on-the-vps","Step 4: Configure Firewall on the VPS",[433,3340,3341],{},"Enable the firewall to allow the '100.96.0.0\u002F12' subnet only, blocking all other public incoming access.",[497,3343,3345],{"className":3220,"code":3344,"language":3222,"meta":423,"style":423},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[472,3346,3347,3360,3377,3391],{"__ignoreMap":423},[505,3348,3349,3351,3354,3357],{"class":507,"line":508},[505,3350,3229],{"class":1062},[505,3352,3353],{"class":1076}," ufw",[505,3355,3356],{"class":1076}," enable",[505,3358,3359],{"class":1666}," \n",[505,3361,3362,3364,3366,3369,3372,3375],{"class":507,"line":514},[505,3363,3229],{"class":1062},[505,3365,3353],{"class":1076},[505,3367,3368],{"class":1076}," default",[505,3370,3371],{"class":1076}," allow",[505,3373,3374],{"class":1076}," outgoing",[505,3376,3359],{"class":1666},[505,3378,3379,3381,3383,3385,3388],{"class":507,"line":520},[505,3380,3229],{"class":1062},[505,3382,3353],{"class":1076},[505,3384,3368],{"class":1076},[505,3386,3387],{"class":1076}," deny",[505,3389,3390],{"class":1076}," incoming\n",[505,3392,3393,3395,3397,3399,3402,3405],{"class":507,"line":526},[505,3394,3229],{"class":1062},[505,3396,3353],{"class":1076},[505,3398,3371],{"class":1076},[505,3400,3401],{"class":1076}," in",[505,3403,3404],{"class":1076}," from",[505,3406,3407],{"class":1076}," 100.96.0.0\u002F12\n",[433,3409,3410],{},"Allow loopback traffic to avoid breaking local services:",[497,3412,3414],{"className":3220,"code":3413,"language":3222,"meta":423,"style":423},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[472,3415,3416,3432],{"__ignoreMap":423},[505,3417,3418,3420,3422,3424,3426,3429],{"class":507,"line":508},[505,3419,3229],{"class":1062},[505,3421,3353],{"class":1076},[505,3423,3371],{"class":1076},[505,3425,3401],{"class":1076},[505,3427,3428],{"class":1076}," on",[505,3430,3431],{"class":1076}," lo\n",[505,3433,3434,3436,3438,3440,3443,3445],{"class":507,"line":514},[505,3435,3229],{"class":1062},[505,3437,3353],{"class":1076},[505,3439,3371],{"class":1076},[505,3441,3442],{"class":1076}," out",[505,3444,3428],{"class":1076},[505,3446,3431],{"class":1076},[433,3448,3449],{},"Reload the firewall and verify status:",[497,3451,3453],{"className":3220,"code":3452,"language":3222,"meta":423,"style":423},"sudo ufw reload \nsudo ufw status verbose\n",[472,3454,3455,3466],{"__ignoreMap":423},[505,3456,3457,3459,3461,3464],{"class":507,"line":508},[505,3458,3229],{"class":1062},[505,3460,3353],{"class":1076},[505,3462,3463],{"class":1076}," reload",[505,3465,3359],{"class":1666},[505,3467,3468,3470,3472,3474],{"class":507,"line":514},[505,3469,3229],{"class":1062},[505,3471,3353],{"class":1076},[505,3473,3257],{"class":1076},[505,3475,3476],{"class":1076}," verbose\n",[1149,3478,3480],{"id":3479},"step-5-expose-hermes-agent-to-the-private-network","Step 5: Expose Hermes Agent to the Private Network",[433,3482,3483,3484,3487,3488,454],{},"We will expose the ",[440,3485,3486],{},"Hermes Agent Web Dashboard"," to our private network and use the default authentication provider, ",[440,3489,3490],{},"Nous Research",[2072,3492,3494],{"id":3493},"set-up-the-auth-provider","Set Up the Auth Provider",[1154,3496,3497,3506,3513,3520,3527],{},[480,3498,3499,3500,3505],{},"Head to ",[483,3501,3504],{"href":3502,"rel":3503},"https:\u002F\u002Fportal.nousresearch.com",[487],"portal.nousresearch.com"," to register an account.",[480,3507,3508,3509],{},"Select 'Local Dashboards'.\n",[883,3510],{"alt":3511,"src":3512},"Selecting Local Dashboards option in the Nous Research portal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-local-dashboards-selection.webp",[480,3514,3515,3516],{},"Click 'Register Dashboard'.\n",[883,3517],{"alt":3518,"src":3519},"Clicking Register Dashboard button to create a new dashboard entry","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[480,3521,3522,3523],{},"Enter the private network IP address of your VPS as the 'Dashboard redirect URI' and click 'Save'.\n",[883,3524],{"alt":3525,"src":3526},"Registering the private network VPS IP address as redirect URI in Nous Research portal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-redirect-uri.webp",[480,3528,3529,3530,3533],{},"Copy the 'OAuth client ID' and paste it in your ",[472,3531,3532],{},"config.yaml"," file:",[497,3535,3537],{"className":1053,"code":3536,"language":1055,"meta":423,"style":423},"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",[472,3538,3539,3547,3557,3568,3575,3585,3595,3602,3612],{"__ignoreMap":423},[505,3540,3541,3544],{"class":507,"line":508},[505,3542,3543],{"class":1068},"dashboard",[505,3545,3546],{"class":1072},":\n",[505,3548,3549,3552,3554],{"class":507,"line":514},[505,3550,3551],{"class":1068},"  theme",[505,3553,1073],{"class":1072},[505,3555,3556],{"class":1076}," default\n",[505,3558,3559,3562,3564],{"class":507,"line":520},[505,3560,3561],{"class":1068},"  show_token_analytics",[505,3563,1073],{"class":1072},[505,3565,3567],{"class":3566},"sfNiH"," false\n",[505,3569,3570,3573],{"class":507,"line":526},[505,3571,3572],{"class":1068},"  oauth",[505,3574,3546],{"class":1072},[505,3576,3577,3580,3582],{"class":507,"line":532},[505,3578,3579],{"class":1068},"    client_id",[505,3581,1073],{"class":1072},[505,3583,3584],{"class":1076}," agent:cmq02x7ha0002jk0ba3kfnb\n",[505,3586,3587,3590,3592],{"class":507,"line":538},[505,3588,3589],{"class":1068},"    portal_url",[505,3591,1073],{"class":1072},[505,3593,3594],{"class":1076}," https:\u002F\u002Fportal.nousresearch.com\n",[505,3596,3597,3600],{"class":507,"line":544},[505,3598,3599],{"class":1068},"  basic_auth",[505,3601,3546],{"class":1072},[505,3603,3604,3607,3609],{"class":507,"line":550},[505,3605,3606],{"class":1068},"    username",[505,3608,1073],{"class":1072},[505,3610,3611],{"class":1072}," ''\n",[505,3613,3614,3617,3619],{"class":507,"line":556},[505,3615,3616],{"class":1068},"    password_hash",[505,3618,1073],{"class":1072},[505,3620,3611],{"class":1072},[2072,3622,3624],{"id":3623},"set-up-systemd-to-autostart-the-hermes-dashboard","Set Up Systemd to Autostart the Hermes Dashboard",[1154,3626,3627],{},[480,3628,3629],{},"Create a service file:",[497,3631,3633],{"className":1785,"code":3632,"language":1787,"meta":423,"style":423},"sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[472,3634,3635],{"__ignoreMap":423},[505,3636,3637,3639,3642],{"class":507,"line":508},[505,3638,3229],{"class":1062},[505,3640,3641],{"class":1076}," nano",[505,3643,3644],{"class":1076}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[1154,3646,3647],{"start":514},[480,3648,3649,3650,3653],{},"Paste the following configuration, ensuring ",[472,3651,3652],{},"--host 0.0.0.0"," is part of the command:",[497,3655,3659],{"className":3656,"code":3657,"language":3658,"meta":423,"style":423},"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",[472,3660,3661,3666,3671,3676,3680,3685,3690,3695,3700,3705,3710,3715,3719,3724],{"__ignoreMap":423},[505,3662,3663],{"class":507,"line":508},[505,3664,3665],{},"[Unit]\n",[505,3667,3668],{"class":507,"line":514},[505,3669,3670],{},"Description=Hermes Dashboard\n",[505,3672,3673],{"class":507,"line":520},[505,3674,3675],{},"After=network.target\n",[505,3677,3678],{"class":507,"line":526},[505,3679,1096],{"emptyLinePlaceholder":1005},[505,3681,3682],{"class":507,"line":532},[505,3683,3684],{},"[Service]\n",[505,3686,3687],{"class":507,"line":538},[505,3688,3689],{},"User=hermes\n",[505,3691,3692],{"class":507,"line":544},[505,3693,3694],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[505,3696,3697],{"class":507,"line":550},[505,3698,3699],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[505,3701,3702],{"class":507,"line":556},[505,3703,3704],{},"Restart=always\n",[505,3706,3707],{"class":507,"line":562},[505,3708,3709],{},"RestartSec=10\n",[505,3711,3712],{"class":507,"line":568},[505,3713,3714],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[505,3716,3717],{"class":507,"line":574},[505,3718,1096],{"emptyLinePlaceholder":1005},[505,3720,3721],{"class":507,"line":580},[505,3722,3723],{},"[Install]\n",[505,3725,3726],{"class":507,"line":586},[505,3727,3728],{},"WantedBy=multi-user.target\n",[1154,3730,3731],{"start":520},[480,3732,3733],{},"Enable and start the service:",[497,3735,3737],{"className":1785,"code":3736,"language":1787,"meta":423,"style":423},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[472,3738,3739,3748,3759,3770],{"__ignoreMap":423},[505,3740,3741,3743,3745],{"class":507,"line":508},[505,3742,3229],{"class":1062},[505,3744,3232],{"class":1076},[505,3746,3747],{"class":1076}," daemon-reload\n",[505,3749,3750,3752,3754,3756],{"class":507,"line":514},[505,3751,3229],{"class":1062},[505,3753,3232],{"class":1076},[505,3755,3356],{"class":1076},[505,3757,3758],{"class":1076}," hermes-dashboard\n",[505,3760,3761,3763,3765,3768],{"class":507,"line":520},[505,3762,3229],{"class":1062},[505,3764,3232],{"class":1076},[505,3766,3767],{"class":1076}," start",[505,3769,3758],{"class":1076},[505,3771,3772,3774,3776,3778],{"class":507,"line":526},[505,3773,3229],{"class":1062},[505,3775,3232],{"class":1076},[505,3777,3257],{"class":1076},[505,3779,3758],{"class":1076},[1149,3781,3783],{"id":3782},"step-6-install-cloudflare-warp-client-on-desktop","Step 6: Install Cloudflare WARP Client on Desktop",[1154,3785,3786,3794,3797,3804,3811,3818],{},[480,3787,3788,3789,454],{},"Download the Cloudflare WARP client from ",[483,3790,3793],{"href":3791,"rel":3792},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[487],"Cloudflare's portal",[480,3795,3796],{},"Open and launch the Cloudflare WARP client after installation.",[480,3798,3799,3800],{},"Log in when prompted.\n",[883,3801],{"alt":3802,"src":3803},"Cloudflare WARP client login prompt on desktop machine","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[480,3805,3806,3807],{},"A 'Success' page will be displayed after a successful login.\n",[883,3808],{"alt":3809,"src":3810},"Authentication success webpage after logging in to Cloudflare Zero Trust on desktop","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[480,3812,3813,3814],{},"The WARP client should now show it is connected to your Zero Trust team.\n",[883,3815],{"alt":3816,"src":3817},"Desktop Cloudflare WARP client confirming active connection to Zero Trust private network","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-client-connected.webp",[480,3819,3820,3821,3824,3825],{},"Navigate to your web browser and enter your private IP (e.g., ",[472,3822,3823],{},"100.96.0.3","). The Hermes Web Dashboard should load successfully.\n",[883,3826],{"alt":3827,"src":3828},"Accessing the private Hermes Agent Web Dashboard in browser on desktop","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[3830,3831,3832],"blockquote",{},[433,3833,3834,3837,3838,3842],{},[440,3835,3836],{},"Pro Tip for macOS Users:"," If you are using the WARP client to access multiple Cloudflare accounts, check out our quick guide on ",[440,3839,3840],{},[483,3841,398],{"href":399}," to make switching between accounts seamless.",[1149,3844,3846],{"id":3845},"step-7-install-cloudflare-warp-client-on-ios-devices","Step 7: Install Cloudflare WARP Client on iOS Devices",[1154,3848,3849,3856,3864,3872,3880],{},[480,3850,3851,3852,3855],{},"Install ",[440,3853,3854],{},"Cloudflare One"," from the App Store.",[480,3857,3858,3859],{},"Open the Cloudflare One app and enter your team name when prompted.\n",[883,3860],{"alt":3861,"src":3862,"width":3863},"Entering Cloudflare Zero Trust team name in Cloudflare One app on iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-team-name-prompt.webp",239,[480,3865,3866,3867],{},"Log in using the same email address that was configured in the policy rule above.\n",[883,3868],{"alt":3869,"src":3870,"width":3871},"Email authentication prompt for Cloudflare Zero Trust on iOS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-email-login.webp",229,[480,3873,3874,3875],{},"Once it is connected, it should look like the following:\n",[883,3876],{"alt":3877,"src":3878,"width":3879},"Cloudflare One app showing connected status on iOS mobile device","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-client-connected.webp",322,[480,3881,3882,3883,3885,3886],{},"Navigate to your web browser and enter the private IP ",[472,3884,3823],{}," to access the Hermes Web Dashboard on your mobile device.\n",[883,3887],{"alt":3888,"src":3889,"width":3890},"Accessing Hermes Agent Web Dashboard interface on mobile phone browser","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[428,3892,948],{"id":947},[433,3894,3895,3896,3898,3899,3902],{},"With ",[440,3897,3063],{}," handling identity policies and the ",[440,3900,3901],{},"WARP"," client routing traffic over an encrypted tunnel, your Hermes Agent is securely reachable from your devices globally. This setup lays a secure, robust foundation for building and accessing a fully remote, private AI infrastructure.",[987,3904,3905],{},"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":423,"searchDepth":514,"depth":520,"links":3907},[3908,3911,3923],{"id":3076,"depth":514,"text":3077,"children":3909},[3910],{"id":3095,"depth":520,"text":3096},{"id":3107,"depth":514,"text":3108,"children":3912},[3913,3914,3915,3916,3917,3921,3922],{"id":3111,"depth":520,"text":3112},{"id":3162,"depth":520,"text":3163},{"id":3300,"depth":520,"text":3301},{"id":3337,"depth":520,"text":3338},{"id":3479,"depth":520,"text":3480,"children":3918},[3919,3920],{"id":3493,"depth":526,"text":3494},{"id":3623,"depth":526,"text":3624},{"id":3782,"depth":520,"text":3783},{"id":3845,"depth":520,"text":3846},{"id":947,"depth":514,"text":948},[1408,998],"2026-07-09","Learn how to securely expose and access your Hermes Agent globally using Cloudflare WARP and Zero Trust without opening inbound firewall ports.","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","Securely exposing Hermes Agent to a private network using Cloudflare Zero Trust and WARP tunnel",{"schemaOrg":3930,"robots":1010,"sitemap":3962},[3931],{"@type":1009,"headline":362,"description":3926,"name":362,"image":3927,"step":3932},[3933,3938,3942,3946,3950,3954,3958],{"@type":3934,"name":3935,"text":3936,"url":3937,"image":3129},"HowToStep","Set Up Cloudflare Zero Trust","Log in to your Cloudflare Dashboard. Click on 'Zero Trust' from the left menu. If this is your first time, you will be prompted to choose a plan (the Free tier is perfectly fine for this setup) and name your team (e.g., ai-team). Click on 'Access' th","#step-1",{"@type":3934,"name":3939,"text":3940,"url":3941,"image":3297},"Set Up Cloudflare WARP Client on VPS","Run sudo apt update and sudo apt install cloudflare-warp in the terminal on your VPS. Run warp-cli registration new \u003CTEAM-NAME> in the terminal on your VPS, which will print out a URL. Copy the printed URL, which will look like https:\u002F\u002F\u003Cteam>.cloudfl","#step-2",{"@type":3934,"name":3943,"text":3944,"url":3945,"image":3310},"Set Up Traffic Routing","Click the profile for your VPS on the Devices dashboard. Scroll down to the 'Split Tunnels' section. Click the 'Manage' button and configure the settings as shown below. Replace the IP address if necessary. Exposing the address and host will route tr","#step-3",{"@type":3934,"name":3947,"text":3948,"url":3949},"Configure Firewall on the VPS","Enable the firewall to allow the '100.96.0.0\u002F12' subnet only, blocking all other public incoming access. bash Allow loopback traffic to avoid breaking local services: bash Reload the firewall and verify status: bash","#step-4",{"@type":3934,"name":3951,"text":3952,"url":3953},"Expose Hermes Agent to the Private Network","We will expose the Hermes Agent Web Dashboard to our private network and use the default authentication provider, Nous Research.","#step-5",{"@type":3934,"name":3955,"text":3956,"url":3957,"image":3803},"Install Cloudflare WARP Client on Desktop","Download the Cloudflare WARP client from Cloudflare's portal. Open and launch the Cloudflare WARP client after installation. Log in when prompted. A 'Success' page will be displayed after a successful login. The WARP client should now show it is conn","#step-6",{"@type":3934,"name":3959,"text":3960,"url":3961,"image":3862},"Install Cloudflare WARP Client on iOS Devices","Install Cloudflare One from the App Store. Open the Cloudflare One app and enter your team name when prompted. Log in using the same email address that was configured in the policy rule above. Once it is connected, it should look like the following:","#step-7",{"lastmod":3963},"2026-09-28",{"title":3965,"description":3926,"ogTitle":362,"ogDescription":3926,"twitterTitle":362,"twitterDescription":3926},"Secure Hermes Agent Access with Cloudflare Zero Trust",[924,1016,3056,3967,3968],"VPN","Tutorial","7w7yHDwhXSX7-e5xSvZ3rQ_6OcpB47010zvSqV1GJ9M",1792489981901]