[{"data":1,"prerenderedAt":4676},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server":421,"\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server-surround":1129},[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":374,"author":423,"body":424,"category":1096,"date":1098,"description":1099,"extension":1100,"image":1101,"imageAlt":1102,"isPublished":962,"meta":1103,"minRead":966,"navigation":962,"path":49,"seo":1120,"stem":376,"tags":1122,"updatedAt":1127,"__hash__":1128},"article\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server.md","",{"type":425,"value":426,"toc":1085},"minimark",[427,432,436,439,443,448,451,473,480,483,514,521,551,558,565,580,593,601,607,625,629,632,654,660,663,675,686,697,728,732,743,753,764,774,781,791,797,826,842,846,852,864,869,906,910,913,929,935,1023,1026,1074,1078,1081],[428,429,431],"h2",{"id":430},"why-host-hermes-agent-on-a-remote-vps","Why Host Hermes Agent on a Remote VPS?",[433,434,435],"p",{},"Since the Hermes Agent is capable of running background tasks, scheduling tasks, and responding to webhook calls, we need a machine to be on standby 24\u002F7. Local machines can lose power, get disconnected from Internet or having the resources maxed out. A remote server guarantees 99% uptime and makes it easy to scale computation resources when needed.",[433,437,438],{},"There are several affordable virtual private server(VPS)) providers out there such as Hetzner, Hostinger and Contabo. We have been using Contabo for a while, and so far so good.",[428,440,442],{"id":441},"how-to-set-up-hermes-agent-on-a-linux-vps","How to Set Up Hermes Agent on a Linux VPS",[444,445,447],"h3",{"id":446},"step-1-connect-to-your-vps","Step 1: Connect to Your VPS",[433,449,450],{},"Open the terminal and SSH into your remote machine:",[452,453,457],"pre",{"className":454,"code":455,"language":456,"meta":423,"style":423},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ssh root@your_server_ip\n","bash",[458,459,460],"code",{"__ignoreMap":423},[461,462,465,469],"span",{"class":463,"line":464},"line",1,[461,466,468],{"class":467},"sBMFI","ssh",[461,470,472],{"class":471},"sfazB"," root@your_server_ip\n",[433,474,475],{},[476,477],"img",{"alt":478,"src":479},"SSH connection to the Linux VPS server in terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fvps-terminal-ssh-connection.webp",[433,481,482],{},"Ensure your server packages are up to date:",[452,484,486],{"className":454,"code":485,"language":456,"meta":423,"style":423},"sudo apt update && sudo apt upgrade -y\n",[458,487,488],{"__ignoreMap":423},[461,489,490,493,496,499,503,506,508,511],{"class":463,"line":464},[461,491,492],{"class":467},"sudo",[461,494,495],{"class":471}," apt",[461,497,498],{"class":471}," update",[461,500,502],{"class":501},"sMK4o"," &&",[461,504,505],{"class":467}," sudo",[461,507,495],{"class":471},[461,509,510],{"class":471}," upgrade",[461,512,513],{"class":471}," -y\n",[433,515,516,517,520],{},"Add a new user, ",[458,518,519],{},"hermes",", or your preferred username:",[452,522,524],{"className":454,"code":523,"language":456,"meta":423,"style":423},"sudo adduser hermes \nsudo passwd hermes\n",[458,525,526,540],{"__ignoreMap":423},[461,527,528,530,533,536],{"class":463,"line":464},[461,529,492],{"class":467},[461,531,532],{"class":471}," adduser",[461,534,535],{"class":471}," hermes",[461,537,539],{"class":538},"sTEyZ"," \n",[461,541,543,545,548],{"class":463,"line":542},2,[461,544,492],{"class":467},[461,546,547],{"class":471}," passwd",[461,549,550],{"class":471}," hermes\n",[433,552,553,554,557],{},"Turn off ",[458,555,556],{},"root"," password login:",[559,560,561],"ol",{},[562,563,564],"li",{},"Open the SSH configuration file:",[452,566,568],{"className":454,"code":567,"language":456,"meta":423,"style":423},"sudo nano \u002Fetc\u002Fssh\u002Fsshd_config\n",[458,569,570],{"__ignoreMap":423},[461,571,572,574,577],{"class":463,"line":464},[461,573,492],{"class":467},[461,575,576],{"class":471}," nano",[461,578,579],{"class":471}," \u002Fetc\u002Fssh\u002Fsshd_config\n",[559,581,582],{"start":542},[562,583,584,585,588,589,592],{},"Locate the ",[458,586,587],{},"PermitRootLogin"," line and change its value to ",[458,590,591],{},"no",":",[452,594,599],{"className":595,"code":597,"language":598,"meta":423},[596],"language-text","PermitRootLogin no\n","text",[458,600,597],{"__ignoreMap":423},[559,602,604],{"start":603},3,[562,605,606],{},"Save the file and restart the SSH service:",[452,608,610],{"className":454,"code":609,"language":456,"meta":423,"style":423},"sudo systemctl restart ssh\n",[458,611,612],{"__ignoreMap":423},[461,613,614,616,619,622],{"class":463,"line":464},[461,615,492],{"class":467},[461,617,618],{"class":471}," systemctl",[461,620,621],{"class":471}," restart",[461,623,624],{"class":471}," ssh\n",[444,626,628],{"id":627},"step-2-install-hermes-agent","Step 2: Install Hermes Agent",[433,630,631],{},"Run the following command:",[452,633,635],{"className":454,"code":634,"language":456,"meta":423,"style":423},"curl -fsSL https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh | bash\n",[458,636,637],{"__ignoreMap":423},[461,638,639,642,645,648,651],{"class":463,"line":464},[461,640,641],{"class":467},"curl",[461,643,644],{"class":471}," -fsSL",[461,646,647],{"class":471}," https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh",[461,649,650],{"class":501}," |",[461,652,653],{"class":467}," bash\n",[433,655,656],{},[476,657],{"alt":658,"src":659},"Running the Hermes Agent installation script in terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-installation-terminal.webp",[433,661,662],{},"Once installed, verify the installation by typing:",[452,664,666],{"className":454,"code":665,"language":456,"meta":423,"style":423},"hermes --version\n",[458,667,668],{"__ignoreMap":423},[461,669,670,672],{"class":463,"line":464},[461,671,519],{"class":467},[461,673,674],{"class":471}," --version\n",[433,676,677,678,681,682],{},"Run ",[458,679,680],{},"hermes setup"," to configure the Hermes Agent:\n",[476,683],{"alt":684,"src":685},"Running the hermes setup command in terminal to start configuration","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-setup-wizard.webp",[433,687,688,689,692,693],{},"Select an LLM provider, start with ",[458,690,691],{},"DeepSeek"," and add others later.\n",[476,694],{"alt":695,"src":696},"Selecting DeepSeek as the LLM provider in Hermes setup","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-llm-provider-selection.webp",[433,698,699,700,702,703,707,711,712,715,716,711,720,723,724],{},"Enter ",[458,701,691],{},"API key:\n",[476,704],{"alt":705,"src":706},"Entering the DeepSeek API key in the terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-enter-api-key.webp",[476,708],{"alt":709,"src":710},"Successful confirmation of the LLM provider API key","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-api-key-success.webp","\nSelect ",[458,713,714],{},"local machine"," for running the Hermes Agent:\n",[476,717],{"alt":718,"src":719},"Selecting local machine for Hermes Agent execution environment","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-local-machine.webp",[458,721,722],{},"Telegram"," in the channels. Other channels can be configured later.\n",[476,725],{"alt":726,"src":727},"Selecting Telegram as the communication channel in Hermes setup","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-telegram-channel.webp",[444,729,731],{"id":730},"step-3-integrating-with-telegram","Step 3: Integrating with Telegram",[433,733,734,735,738,739],{},"Select ",[458,736,737],{},"[2]"," for using Telegram bot.\n",[476,740],{"alt":741,"src":742},"Selecting option to configure Telegram bot integration","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-bot-integration-option.webp",[433,744,745,746,748,749],{},"Head to ",[458,747,722],{}," and search for 'BotFather'.\n",[476,750],{"alt":751,"src":752},"Searching for BotFather in the Telegram application","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-botfather.webp",[433,754,755,756,759,760],{},"Click ",[458,757,758],{},"Open"," to open 'BotFather'.\n",[476,761],{"alt":762,"src":763},"Opening the chat interface with BotFather on Telegram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-open-botfather-chat.webp",[433,765,755,766,769,770],{},[458,767,768],{},"Create a New Bot",".\n",[476,771],{"alt":772,"src":773},"Sending newbot command to BotFather to create a new Telegram bot","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-create-new-bot.webp",[433,775,776,777],{},"Fill in the names and create the bot.\n",[476,778],{"alt":779,"src":780},"Configuring the name and username for the new Telegram bot","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-bot-details-configured.webp",[433,782,755,783,786,787],{},[458,784,785],{},"Copy"," to copy the token and paste it back to the terminal.\n",[476,788],{"alt":789,"src":790},"Copying the HTTP API token of the newly created Telegram bot","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-copy-http-api-token.webp",[433,792,793,794,796],{},"Find the ",[458,795,722],{}," user account ID and add it to the 'Allowed user list':",[798,799,800,809,823],"ul",{},[562,801,802,803,805],{},"Search '@raw_data_bot' on ",[458,804,722],{},[476,806],{"alt":807,"src":808},"Searching for raw data bot on Telegram to retrieve user ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-raw-data-bot.webp",[562,810,811,812,815,816,769,819],{},"Click on ",[458,813,814],{},"RawDataBot"," then click Start button. The user ID will be shown behind ",[458,817,818],{},"P.S. Your ID:",[476,820],{"alt":821,"src":822},"Starting RawDataBot to view the user account ID","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-raw-data-bot-user-id.webp",[562,824,825],{},"Copy the user ID and paste to the terminal.",[433,827,828,829,833,834,838],{},"Since we are running on the cloud, we want the service to be started automatically.\n",[476,830],{"alt":831,"src":832},"Configuring the autostart option for Hermes systemd service","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-autostart-service-option.webp","\nLeave everything as default:\n",[476,835],{"alt":836,"src":837},"Leaving setup configurations as default values in terminal","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-1.webp",[476,839],{"alt":840,"src":841},"Completing the default setup options in Hermes configuration","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-2.webp",[428,843,845],{"id":844},"testing-your-hermes-agent-with-telegram-bot","Testing Your Hermes Agent with Telegram Bot",[433,847,848,849,592],{},"Run the following command to start the ",[458,850,851],{},"hermes gateway",[452,853,855],{"className":454,"code":854,"language":456,"meta":423,"style":423},"hermes gateway\n",[458,856,857],{"__ignoreMap":423},[461,858,859,861],{"class":463,"line":464},[461,860,519],{"class":467},[461,862,863],{"class":471}," gateway\n",[433,865,745,866,868],{},[458,867,722],{}," and add the created bot, '@tech_cloud_hermes_bot', to our chats.",[798,870,871,885,896],{},[562,872,873,874,876,877,880,881],{},"type '\u002Fnew' in ",[458,875,722],{}," to start a new ",[458,878,879],{},"Hermes Agent"," session.\n",[476,882],{"alt":883,"src":884},"Typing new command in Telegram to start a new Hermes Agent session","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-new-session.webp",[562,886,887,888,891,892],{},"type ",[458,889,890],{},"\u002Fcommands"," will list all available commands.\n",[476,893],{"alt":894,"src":895},"Typing commands in Telegram to view available Hermes instructions","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-commands-list.webp",[562,897,887,898,901,902],{},[458,899,900],{},"\u002Fmodel"," to see a list of available LLMs.\n",[476,903],{"alt":904,"src":905},"Typing model in Telegram to see the list of active LLMs","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-model-selection.webp",[428,907,909],{"id":908},"running-hermes-gateway-as-a-background-service","Running Hermes Gateway as a Background Service",[433,911,912],{},"Create service file:",[452,914,918],{"className":915,"code":916,"language":917,"meta":423,"style":423},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n","shell",[458,919,920],{"__ignoreMap":423},[461,921,922,924,926],{"class":463,"line":464},[461,923,492],{"class":467},[461,925,576],{"class":471},[461,927,928],{"class":471}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[433,930,931,932,934],{},"Paste the following, replace ",[458,933,519],{}," in '\u002Fhome\u002Fhermes' with your preferred username:",[452,936,940],{"className":937,"code":938,"language":939,"meta":423,"style":423},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Hermes Gateway\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n","ini",[458,941,942,947,952,957,964,970,976,982,988,994,1000,1006,1011,1017],{"__ignoreMap":423},[461,943,944],{"class":463,"line":464},[461,945,946],{},"[Unit]\n",[461,948,949],{"class":463,"line":542},[461,950,951],{},"Description=Hermes Gateway\n",[461,953,954],{"class":463,"line":603},[461,955,956],{},"After=network.target\n",[461,958,960],{"class":463,"line":959},4,[461,961,963],{"emptyLinePlaceholder":962},true,"\n",[461,965,967],{"class":463,"line":966},5,[461,968,969],{},"[Service]\n",[461,971,973],{"class":463,"line":972},6,[461,974,975],{},"User=hermes\n",[461,977,979],{"class":463,"line":978},7,[461,980,981],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[461,983,985],{"class":463,"line":984},8,[461,986,987],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\n",[461,989,991],{"class":463,"line":990},9,[461,992,993],{},"Restart=always\n",[461,995,997],{"class":463,"line":996},10,[461,998,999],{},"RestartSec=10\n",[461,1001,1003],{"class":463,"line":1002},11,[461,1004,1005],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[461,1007,1009],{"class":463,"line":1008},12,[461,1010,963],{"emptyLinePlaceholder":962},[461,1012,1014],{"class":463,"line":1013},13,[461,1015,1016],{},"[Install]\n",[461,1018,1020],{"class":463,"line":1019},14,[461,1021,1022],{},"WantedBy=multi-user.target\n",[433,1024,1025],{},"Enable and start the service:",[452,1027,1029],{"className":915,"code":1028,"language":917,"meta":423,"style":423},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-gateway\nsudo systemctl start hermes-gateway\nsudo systemctl status hermes-gateway\n",[458,1030,1031,1040,1052,1063],{"__ignoreMap":423},[461,1032,1033,1035,1037],{"class":463,"line":464},[461,1034,492],{"class":467},[461,1036,618],{"class":471},[461,1038,1039],{"class":471}," daemon-reload\n",[461,1041,1042,1044,1046,1049],{"class":463,"line":542},[461,1043,492],{"class":467},[461,1045,618],{"class":471},[461,1047,1048],{"class":471}," enable",[461,1050,1051],{"class":471}," hermes-gateway\n",[461,1053,1054,1056,1058,1061],{"class":463,"line":603},[461,1055,492],{"class":467},[461,1057,618],{"class":471},[461,1059,1060],{"class":471}," start",[461,1062,1051],{"class":471},[461,1064,1065,1067,1069,1072],{"class":463,"line":959},[461,1066,492],{"class":467},[461,1068,618],{"class":471},[461,1070,1071],{"class":471}," status",[461,1073,1051],{"class":471},[428,1075,1077],{"id":1076},"conclusion","Conclusion",[433,1079,1080],{},"In this article, we focused on how to set up the Hermes Agent and use Telegram to communicate with it. Having the Hermes Agent running on a remote server provides a true digital assistant that runs 24\u002F7.",[1082,1083,1084],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":423,"searchDepth":542,"depth":603,"links":1086},[1087,1088,1093,1094,1095],{"id":430,"depth":542,"text":431},{"id":441,"depth":542,"text":442,"children":1089},[1090,1091,1092],{"id":446,"depth":603,"text":447},{"id":627,"depth":603,"text":628},{"id":730,"depth":603,"text":731},{"id":844,"depth":542,"text":845},{"id":908,"depth":542,"text":909},{"id":1076,"depth":542,"text":1077},[1097],"ai-agents","2026-06-19","Deploy the Hermes Agent on a remote VPS for 24\u002F7 uptime. Follow our step-by-step guide to integrate it with a custom Telegram bot.","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server.webp","A step-by-step guide to deploying Hermes Agent on a remote Linux VPS and integrating it with a custom Telegram bot for 24\u002F7 uptime.",{"schemaOrg":1104,"robots":1118,"sitemap":1119},[1105],{"@type":1106,"name":374,"description":1099,"image":1101,"step":1107},"HowTo",[1108,1112,1115],{"@type":1109,"name":447,"text":1110,"image":479,"url":1111},"HowToStep","Open the terminal and SSH into your remote machine: Ensure your server packages are up to date: Add a new user, `hermes`, or your preferred usernam...","#step-1-connect-to-your-vps",{"@type":1109,"name":628,"text":1113,"image":659,"url":1114},"Run the following command: Once installed, verify the installation by typing: Run `hermes setup` to configure the Hermes Agent: Select an LLM provi...","#step-2-install-hermes-agent",{"@type":1109,"name":731,"text":1116,"image":742,"url":1117},"Select `[2]` for using Telegram bot. Head to `Telegram` and search for 'BotFather'. Click `Open` to open 'BotFather'. Click `Create a New Bot`. Fil...","#step-3-integrating-with-telegram","index, follow",{"lastmod":1098},{"title":1121,"description":1099,"ogTitle":374,"ogDescription":1099,"twitterTitle":374,"twitterDescription":1099},"Hermes Agent VPS Setup: Telegram Bot Integration Guide",[879,1123,1124,1125,1126],"VPS Setup","Telegram Bot","Linux VPS","AI Agent",null,"gfsduy5l7mhQlgk1B5l15odagbzetTgFxjC5hIpUmKg",{"surround":1130,"related":1991},[1131,1597],{"id":1132,"title":394,"author":1127,"body":1133,"category":1580,"date":1581,"description":1582,"extension":1100,"image":1583,"imageAlt":1584,"isPublished":962,"meta":1585,"minRead":984,"navigation":962,"path":395,"seo":1590,"stem":396,"tags":1592,"updatedAt":1127,"__hash__":1596},"article\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude.md",{"type":425,"value":1134,"toc":1566},[1135,1138,1154,1158,1168,1184,1188,1324,1328,1382,1386,1438,1442,1446,1452,1457,1461,1467,1479,1483,1493,1509,1513,1519,1524,1528,1534,1537,1541],[433,1136,1137],{},"Oracle NetSuite has long been a cloud-based enterprise resource planning (ERP) platform for small to medium-sized businesses. However, its website UI is infamous for its steep learning curve, click-heavy navigation, and rigid reporting structures.",[433,1139,1140,1141,1145,1146,1149,1150,1153],{},"With the recent release of the ",[1142,1143,1144],"strong",{},"NetSuite AI Connector Service",", users can leverage the ",[1142,1147,1148],{},"Model Context Protocol (MCP)"," and ",[1142,1151,1152],{},"AI (Artificial Intelligence) Assistants"," to directly ask questions in plain language and get real-time answers from their financial and operational data.",[428,1155,1157],{"id":1156},"how-the-netsuite-mcp-ai-connector-works","How the NetSuite MCP AI Connector Works",[433,1159,1160,1163,1164,1167],{},[1142,1161,1162],{},"NetSuite’s MCP"," exposes a suite of tools to the ",[1142,1165,1166],{},"AI",", such as running SuiteQL queries, reading Saved Searches and reports, or executing record operations like creating a new customer record. All tools are governed by NetSuite’s native role-based permissions.",[433,1169,1170,1171,1173,1174,1176,1177,1180,1181,1183],{},"When a user asks a question in plain language, the ",[1142,1172,1166],{}," uses the ",[1142,1175,1148],{}," to translate the request into structured operations that NetSuite understands. ",[1142,1178,1179],{},"NetSuite"," executes the operations using the user's permissions, and the results are returned to the ",[1142,1182,1166],{}," for analysis and presentation.",[428,1185,1187],{"id":1186},"netsuite-ai-connector-setup-guide","NetSuite AI Connector Setup Guide",[559,1189,1190,1247,1261,1270,1277,1284,1305],{},[562,1191,1192,1193,1149,1196,1199],{},"Enable ",[1142,1194,1195],{},"Server SuiteScript",[1142,1197,1198],{},"REST Web Services",[559,1200,1201,1212,1240],{},[562,1202,1203,1204,769,1208],{},"Go to ",[1205,1206,1207],"em",{},"Setup > Company > Enable Features",[476,1209],{"alt":1210,"src":1211},"Oracle NetSuite Enable Features configuration interface for Company setup","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-setup-company-enable-features.webp",[562,1213,1214,1215,1218,1219],{},"On the ",[1142,1216,1217],{},"SuiteCloud"," subtab:\n",[798,1220,1221,1231],{},[562,1222,1223,1224,1226,1227],{},"Under SuiteScript, check the ",[1142,1225,1195],{}," box.\n",[476,1228],{"alt":1229,"src":1230},"Enabling Server SuiteScript in NetSuite SuiteCloud tab","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-server-suitescript.webp",[562,1232,1233,1234,1226,1236],{},"Under SuiteTalk (Web Services), check the ",[1142,1235,1198],{},[476,1237],{"alt":1238,"src":1239},"Enabling REST Web Services in NetSuite SuiteCloud tab","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-rest-web-services.webp",[562,1241,1242,1243,1246],{},"Click ",[1142,1244,1245],{},"Save",".",[562,1248,1249,1250,1253,1254,769,1257],{},"Install the ",[1142,1251,1252],{},"NetSuite MCP Standard Tools"," first. Click on ",[1205,1255,1256],{},"Customization > SuiteCloud Development > SuiteApp Marketplace",[476,1258],{"alt":1259,"src":1260},"Navigating to NetSuite SuiteApp Marketplace under Customization","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-navigation.webp",[562,1262,1263,1264,769,1266],{},"Search for ",[1142,1265,1252],{},[476,1267],{"alt":1268,"src":1269},"Searching for NetSuite MCP Standard Tools in the marketplace","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-search-mcp-tools.webp",[562,1271,1272,1273],{},"Once it is installed, you will see the status 'Installed' on the right.\n",[476,1274],{"alt":1275,"src":1276},"NetSuite MCP Standard Tools displayed as Installed in the marketplace","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-status-mcp-tools.webp",[562,1278,1279,1280],{},"Follow the same instructions to install the 'NetSuite AI Connector Service Companion'.\n",[476,1281],{"alt":1282,"src":1283},"NetSuite AI Connector Service Companion shown as Installed","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-ai-connector-companion.webp",[562,1285,1286,1287],{},"Set up an Integration Record\n",[559,1288,1289,1298],{},[562,1290,1203,1291,769,1294],{},[1205,1292,1293],{},"Setup > Integration > Manage Integrations",[476,1295],{"alt":1296,"src":1297},"Navigating to Manage Integrations in NetSuite Setup menu","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-integration-manage-integrations-navigation.webp",[562,1299,1300,1301],{},"Create an Integration Record for ChatGPT, and we will come back with the actual token_id:\n",[476,1302],{"alt":1303,"src":1304},"Creating a new integration record in NetSuite for ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-create-integration-record-chatgpt.webp",[562,1306,1307,1308,1312,1316,1320],{},"Create a custom role for MCP with the minimum permissions and assign it to users. e.g.,\n",[476,1309],{"alt":1310,"src":1311},"Configuring custom role permissions for NetSuite MCP - Part 1","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-1.webp",[476,1313],{"alt":1314,"src":1315},"Configuring custom role permissions for NetSuite MCP - Part 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-2.webp",[476,1317],{"alt":1318,"src":1319},"Configuring custom role permissions for NetSuite MCP - Part 3","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-3.webp",[476,1321],{"alt":1322,"src":1323},"Configuring custom role permissions for NetSuite MCP - Part 4","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-4.webp",[428,1325,1327],{"id":1326},"how-to-integrate-netsuite-mcp-with-chatgpt","How to Integrate NetSuite MCP with ChatGPT",[559,1329,1330,1337,1344,1351,1361,1368,1375],{},[562,1331,1332,1333],{},"Click on 'Settings'.\n",[476,1334],{"alt":1335,"src":1336},"Navigating to Settings in the ChatGPT user interface","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-settings-navigation.webp",[562,1338,1339,1340],{},"Click on 'Apps' > 'Advanced settings'.\n",[476,1341],{"alt":1342,"src":1343},"Navigating to Apps and Advanced Settings in ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-apps-advanced-settings.webp",[562,1345,1346,1347],{},"Turn on 'Developer mode', then click on 'Create app'.\n",[476,1348],{"alt":1349,"src":1350},"Enabling Developer Mode and clicking Create App in ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-developer-mode-create-app.webp",[562,1352,1353,1354,769,1357],{},"Enter the details. For Connection, enter ",[458,1355,1356],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fall",[476,1358],{"alt":1359,"src":1360},"Entering NetSuite MCP connection URL details to create app in ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-create-app-netsuite-mcp-connection.webp",[562,1362,1363,1364],{},"Click on 'Create'. Once it is integrated, you will see the following popup.\n",[476,1365],{"alt":1366,"src":1367},"Pop-up confirmation showing NetSuite MCP integrated in ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-mcp-integrated-popup.webp",[562,1369,1370,1371],{},"Click on 'Sign in with NetSuite MCP'.\n",[476,1372],{"alt":1373,"src":1374},"ChatGPT prompt to sign in with NetSuite MCP standard tools","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-sign-in-with-netsuite-mcp.webp",[562,1376,1377,1378],{},"Click the 'Continue' button to grant permissions.\n",[476,1379],{"alt":1380,"src":1381},"Granting connection permissions for NetSuite MCP in ChatGPT","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-grant-permissions-netsuite-mcp.webp",[428,1383,1385],{"id":1384},"how-to-integrate-netsuite-mcp-with-claude-ai","How to Integrate NetSuite MCP with Claude AI",[559,1387,1388,1395,1402,1409,1424,1431],{},[562,1389,1390,1391],{},"Click on 'Customize'.\n",[476,1392],{"alt":1393,"src":1394},"Clicking the Customize option in the Claude AI interface","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-customize-navigation.webp",[562,1396,1397,1398],{},"Click on 'Connect your apps'.\n",[476,1399],{"alt":1400,"src":1401},"Clicking Connect your apps in Claude AI customization settings","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-connect-your-apps.webp",[562,1403,1404,1405],{},"Search for 'NetSuite'.\n",[476,1406],{"alt":1407,"src":1408},"Searching for the NetSuite application in Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-search-netsuite-app.webp",[562,1410,1411,1412,1415,1416,1419,1420],{},"Click on 'NetSuite' and enter the server URL: ",[458,1413,1414],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fsuiteapp\u002Fcom.netsuite.mcpstandardtools",". Replace ",[458,1417,1418],{},"\u003Caccount_id>"," with your actual account ID.\n",[476,1421],{"alt":1422,"src":1423},"Entering NetSuite MCP server connection URL in Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-server-url-setup.webp",[562,1425,1426,1427],{},"Click the 'Continue' button.\n",[476,1428],{"alt":1429,"src":1430},"Clicking Continue to authenticate NetSuite MCP server in Claude","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-continue-authentication.webp",[562,1432,1433,1434],{},"Click 'Continue' to authenticate the connector.\n",[476,1435],{"alt":1436,"src":1437},"Final authentication verification for NetSuite MCP in Claude AI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-authenticate-connector.webp",[428,1439,1441],{"id":1440},"netsuite-ai-use-cases","NetSuite AI Use Cases",[444,1443,1445],{"id":1444},"use-case-in-chatgpt-show-overdue-invoices-over-30-days-in-netsuite","Use Case in ChatGPT: Show overdue invoices over 30 days in NetSuite",[433,1447,1448],{},[476,1449],{"alt":1450,"src":1451},"ChatGPT running a SuiteQL query to show overdue NetSuite invoices","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-overdue-invoices-query-result.webp",[798,1453,1454],{},[562,1455,1456],{},"ChatGPT created the SuiteQL query and ran it. This is very handy and saves a lot of time compared to creating a report using the NetSuite website UI.",[444,1458,1460],{"id":1459},"use-case-in-chatgpt-and-claude-can-you-draw-the-sales-of-the-last-30-days-in-a-line-graph","Use Case in ChatGPT and Claude: Can you draw the sales of the last 30 days in a line graph?",[433,1462,1463],{},[476,1464],{"alt":1465,"src":1466},"ChatGPT failing to render a sales line graph from NetSuite data","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-failed-render-netsuite-sales-line-graph.webp",[798,1468,1469,1472],{},[562,1470,1471],{},"ChatGPT wasn't able to generate the line graph.",[562,1473,1474,1475],{},"I tried on Claude, and it worked. The difference may be due to the large language model capabilities.\n",[476,1476],{"alt":1477,"src":1478},"Claude AI successfully rendering a visual line graph of NetSuite sales","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-successfully-rendered-netsuite-sales-line-graph.webp",[444,1480,1482],{"id":1481},"use-case-in-claude-create-a-customer-record","Use Case in Claude: Create a customer record",[433,1484,1485,1489],{},[476,1486],{"alt":1487,"src":1488},"Claude AI prompt to create a new customer record in NetSuite","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-prompt.webp",[476,1490],{"alt":1491,"src":1492},"Claude AI confirmation of successful creation of NetSuite customer record","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-success.webp",[798,1494,1495,1502],{},[562,1496,1497,1498],{},"Double-checking the NetSuite website UI confirms the record was created.\n",[476,1499],{"alt":1500,"src":1501},"Verifying newly created customer record in NetSuite user interface","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-ui-verify-new-customer-record-created.webp",[562,1503,1504,1505],{},"Running it in ChatGPT shows the record is available:\n",[476,1506],{"alt":1507,"src":1508},"ChatGPT confirming that the new NetSuite customer record is available","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-verify-netsuite-customer-record-available.webp",[444,1510,1512],{"id":1511},"use-case-in-claude-run-suiteql-query","Use Case in Claude: Run SuiteQL Query",[433,1514,1515],{},[476,1516],{"alt":1517,"src":1518},"Claude AI directly executing and displaying results of NetSuite SuiteQL query","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-run-suiteql-query-result.webp",[798,1520,1521],{},[562,1522,1523],{},"The SuiteQL query can be executed directly.",[428,1525,1527],{"id":1526},"final-thoughts-on-the-netsuite-ai-connector","Final Thoughts on the NetSuite AI Connector",[433,1529,1530,1531,1533],{},"The biggest win in using MCP is for users who are not technical enough to create complex reports. These users can use plain language to query the data and ask the ",[1142,1532,1166],{}," to present the report exactly the way they want.",[433,1535,1536],{},"To prevent prompt injection attacks and the misuse of 'write' operations, only grant write permissions to certain records and transactions. When the AI uses MCP to update or create a record, it executes this as server-side SuiteScript, which completely bypasses any client-side scripts or form validations.",[428,1538,1540],{"id":1539},"reference","Reference:",[798,1542,1543,1552,1559],{},[562,1544,1545],{},[1546,1547,1551],"a",{"href":1548,"rel":1549},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_0902023450.html#subsect_90090238176",[1550],"nofollow","Installing the MCP Standard Tools SuiteApp",[562,1553,1554],{},[1546,1555,1558],{"href":1556,"rel":1557},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_4160616848.html#subsect_0419123151",[1550],"NetSuite AI Connector Service FAQ",[562,1560,1561],{},[1546,1562,1565],{"href":1563,"rel":1564},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Fsection_0714082142.html#bridgehead_0804033331",[1550],"Connect to the NetSuite AI Connector Service",{"title":423,"searchDepth":542,"depth":603,"links":1567},[1568,1569,1570,1571,1572,1578,1579],{"id":1156,"depth":542,"text":1157},{"id":1186,"depth":542,"text":1187},{"id":1326,"depth":542,"text":1327},{"id":1384,"depth":542,"text":1385},{"id":1440,"depth":542,"text":1441,"children":1573},[1574,1575,1576,1577],{"id":1444,"depth":603,"text":1445},{"id":1459,"depth":603,"text":1460},{"id":1481,"depth":603,"text":1482},{"id":1511,"depth":603,"text":1512},{"id":1526,"depth":542,"text":1527},{"id":1539,"depth":542,"text":1540},[1097],"2026-06-13","Set up the NetSuite AI Connector (MCP) with ChatGPT and Claude. Discover how to query ERP data and automate tasks using plain language AI.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002FEN-Setup-NetSuite-MCP-on-ChatGPT-%26-Claude.webp","NetSuite MCP AI Integration thumbnail featuring dark blue corporate background with ChatGPT and Claude logos connected to NetSuite cloud database",{"schemaOrg":1586,"robots":1118,"sitemap":1589},[1587],{"@type":1588,"headline":394,"description":1582},"TechArticle",{"lastmod":1581},{"title":1591,"description":1582,"ogTitle":394,"ogDescription":1582,"twitterTitle":394,"twitterDescription":1582},"NetSuite MCP AI Integration: Connect ChatGPT & Claude",[1179,1593,1594,1595,1166],"MCP","ChatGPT","Claude","n1J7EtXz8z5uvCvRLH2MOq2iyQH1APdphDzNPW84yaE",{"id":1598,"title":350,"author":423,"body":1599,"category":1975,"date":1976,"description":1977,"extension":1100,"image":1978,"imageAlt":1979,"isPublished":962,"meta":1980,"minRead":959,"navigation":962,"path":351,"seo":1984,"stem":352,"tags":1985,"updatedAt":1127,"__hash__":1990},"article\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md",{"type":425,"value":1600,"toc":1965},[1601,1605,1616,1627,1691,1697,1701,1704,1713,1719,1723,1778,1789,1795,1798,1850,1854,1857,1864,1867,1878,1882,1926,1929,1946,1948,1959,1962],[428,1602,1604],{"id":1603},"what-is-an-ai-agent-skill","What Is an AI Agent Skill?",[433,1606,1607,1608,1611,1612,1615],{},"An agent skill is a reusable ",[1142,1609,1610],{},"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, ",[458,1613,1614],{},"SKILL.md",", and can bundle any other files the task requires, such as reference documents, templates, or executable scripts.",[433,1617,1618,1619,1626],{},"Take the ",[1546,1620,1623],{"href":1621,"rel":1622},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[1550],[458,1624,1625],{},"grill-me"," skill as an example:",[452,1628,1632],{"className":1629,"code":1630,"language":1631,"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",[458,1633,1634,1639,1650,1660,1664,1668,1673,1677,1682,1686],{"__ignoreMap":423},[461,1635,1636],{"class":463,"line":464},[461,1637,1638],{"class":467},"---\n",[461,1640,1641,1645,1647],{"class":463,"line":542},[461,1642,1644],{"class":1643},"swJcz","name",[461,1646,592],{"class":501},[461,1648,1649],{"class":471}," grill-me\n",[461,1651,1652,1655,1657],{"class":463,"line":603},[461,1653,1654],{"class":1643},"description",[461,1656,592],{"class":501},[461,1658,1659],{"class":471}," 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",[461,1661,1662],{"class":463,"line":959},[461,1663,1638],{"class":467},[461,1665,1666],{"class":463,"line":966},[461,1667,963],{"emptyLinePlaceholder":962},[461,1669,1670],{"class":463,"line":972},[461,1671,1672],{"class":471},"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",[461,1674,1675],{"class":463,"line":978},[461,1676,963],{"emptyLinePlaceholder":962},[461,1678,1679],{"class":463,"line":984},[461,1680,1681],{"class":471},"Ask the questions one at a time.\n",[461,1683,1684],{"class":463,"line":990},[461,1685,963],{"emptyLinePlaceholder":962},[461,1687,1688],{"class":463,"line":996},[461,1689,1690],{"class":471},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[433,1692,1693,1694,1696],{},"A ",[458,1695,1614],{}," 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,1698,1700],{"id":1699},"how-ai-agent-skills-work-progressive-disclosure","How AI Agent Skills Work: Progressive Disclosure",[433,1702,1703],{},"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,1705,1706,1707,1712],{},"Let's look at how the ",[1546,1708,1710],{"href":1621,"rel":1709},[1550],[458,1711,1625],{}," skill is used.",[433,1714,1715],{},[476,1716],{"alt":1717,"src":1718},"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",[444,1720,1722],{"id":1721},"step-by-step","Step-by-Step",[559,1724,1725,1731,1737,1743,1749,1762,1772],{},[562,1726,1727,1730],{},[1142,1728,1729],{},"Request"," — The user asks the agent for something (\"grill me on my workflow design\").",[562,1732,1733,1736],{},[1142,1734,1735],{},"Selection prompt"," — The user's request, along with the descriptions of all available skills, is sent to the LLM.",[562,1738,1739,1742],{},[1142,1740,1741],{},"LLM selects"," — The LLM compares the request to each description and returns the skill(s) that match.",[562,1744,1745,1748],{},[1142,1746,1747],{},"Confirmation"," — The agent surfaces the proposed skill(s) back to the user, who confirms (or rejects\u002Fadjusts) the choice.",[562,1750,1751,1754,1755,1758,1759,1761],{},[1142,1752,1753],{},"Instructions loaded"," — The agent fetches the ",[1205,1756,1757],{},"full"," instructions for the confirmed skill: the ",[458,1760,1614],{}," body.",[562,1763,1764,1767,1768,1771],{},[1142,1765,1766],{},"Execution prompt"," — The user's request ",[1142,1769,1770],{},"plus the selected skill's instructions"," is sent to the LLM.",[562,1773,1774,1777],{},[1142,1775,1776],{},"Response"," — The LLM produces the output, which is the first grilling question.",[433,1779,1780,1781,1788],{},"Now let's use ",[1546,1782,1785],{"href":1783,"rel":1784},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[1550],[458,1786,1787],{},"excalidraw-diagram-skill"," to illustrate how a skill with a reference document is used:",[433,1790,1791],{},[476,1792],{"alt":1793,"src":1794},"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",[444,1796,1722],{"id":1797},"step-by-step-1",[559,1799,1800,1805,1809,1818,1822,1834,1841],{},[562,1801,1802,1804],{},[1142,1803,1729],{}," — The user asks the agent for something (\"draw the workflow of the deployment process\").",[562,1806,1807,1736],{},[1142,1808,1735],{},[562,1810,1811,1813,1814,1817],{},[1142,1812,1741],{}," — The LLM compares the request to each description and returns the skill(s) that match. Here, \"draw the workflow\" matches the ",[458,1815,1816],{},"excalidraw-diagram"," description, so it is selected.",[562,1819,1820,1748],{},[1142,1821,1747],{},[562,1823,1824,1754,1826,1758,1828,1830,1831,1833],{},[1142,1825,1753],{},[1205,1827,1757],{},[458,1829,1614],{}," body and any referenced files (for ",[458,1832,1816],{},", that includes the colour palette, JSON schema, and element templates).",[562,1835,1836,1767,1838,1840],{},[1142,1837,1766],{},[1142,1839,1770],{}," is sent to the LLM. The model now has the detailed methodology it needs.",[562,1842,1843,1845,1846,1849],{},[1142,1844,1776],{}," — The LLM produces the output (an ",[458,1847,1848],{},".excalidraw"," JSON file), which the agent returns to the user.",[428,1851,1853],{"id":1852},"ai-agent-skills-vs-tools-and-mcp","AI Agent Skills vs. Tools and MCP",[433,1855,1856],{},"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,1858,1859,1860,1863],{},"An MCP such as the ",[1546,1861,1862],{"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,1865,1866],{},"Some scenarios for using skills include:",[798,1868,1869,1872,1875],{},[562,1870,1871],{},"Multi-step workflows",[562,1873,1874],{},"Processing documents, such as extracting data from PDFs",[562,1876,1877],{},"Code-generation standards",[428,1879,1881],{"id":1880},"how-to-create-ai-agent-skills","How to Create AI Agent Skills",[559,1883,1884,1894,1908,1917],{},[562,1885,1886,1889,1890,1893],{},[1142,1887,1888],{},"Create a folder"," named for the skill (e.g. ",[458,1891,1892],{},"netsuite-operation-report\u002F",").",[562,1895,1896,1901,1902,1904,1905,1907],{},[1142,1897,1898,1899],{},"Write ",[458,1900,1614],{}," with a ",[458,1903,1644],{},", a sharp ",[458,1906,1654],{},", and a concise body of instructions (under 200 words).",[562,1909,1910,1913,1914,1916],{},[1142,1911,1912],{},"Add resources"," the task needs — reference docs, templates, scripts. Keep ",[458,1915,1614],{}," short and link out to the details.",[562,1918,1919,1922,1923,1925],{},[1142,1920,1921],{},"Install it"," where agents will discover it. Refer to ",[1546,1924,358],{"href":359}," for how to manage skills across multiple agents.",[433,1927,1928],{},"A few tips for writing good skills:",[798,1930,1931,1934,1940,1943],{},[562,1932,1933],{},"Write the description for the trigger, not the human.",[562,1935,1936,1937,1939],{},"Keep ",[458,1938,1614],{}," lean — under 200 words. Put the general case in the body; leave the edge cases to reference documents.",[562,1941,1942],{},"Use scripts for anything deterministic. Don't ask the LLM to do arithmetic.",[562,1944,1945],{},"Version it. Check it into git.",[428,1947,1077],{"id":1076},[433,1949,1950,1951,1954,1955,1958],{},"Unlike tools and MCP, which define ",[1205,1952,1953],{},"what to connect to",", agent skills package ",[1205,1956,1957],{},"how to do the work",". They are an essential complement, not a replacement.",[433,1960,1961],{},"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.",[1082,1963,1964],{},"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":542,"depth":603,"links":1966},[1967,1968,1972,1973,1974],{"id":1603,"depth":542,"text":1604},{"id":1699,"depth":542,"text":1700,"children":1969},[1970,1971],{"id":1721,"depth":603,"text":1722},{"id":1797,"depth":603,"text":1722},{"id":1852,"depth":542,"text":1853},{"id":1880,"depth":542,"text":1881},{"id":1076,"depth":542,"text":1077},[1097],"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":1981,"robots":1118,"sitemap":1983},[1982],{"@type":1106,"headline":350,"description":1977},{"lastmod":1976},{"title":1979,"description":1977,"ogTitle":350,"ogDescription":1977,"twitterTitle":350,"twitterDescription":1977},[1986,1987,1988,1989],"AI Agents","Agent Skills","Reusable Workflows","AI Tutorial","KB_UqaFeAxxEkCKJGNsZFWECf41haD9D0uv9jcvrFz8",[1992,2896,3482],{"id":1993,"title":362,"author":423,"body":1994,"category":2849,"date":2851,"description":2852,"extension":1100,"image":2853,"imageAlt":2854,"isPublished":962,"meta":2855,"minRead":984,"navigation":962,"path":363,"seo":2889,"stem":364,"tags":2891,"updatedAt":2888,"__hash__":2895},"article\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md",{"type":425,"value":1995,"toc":2831},[1996,2010,2019,2023,2026,2038,2042,2050,2054,2058,2107,2111,2241,2245,2278,2282,2285,2349,2352,2388,2391,2418,2422,2432,2437,2475,2562,2566,2571,2585,2594,2657,2661,2705,2709,2754,2768,2772,2816,2818,2828],[433,1997,1998,1999,2001,2002,2005,2006,2009],{},"A common challenge arises when you want to access your ",[1142,2000,879],{}," from other devices such as laptops, tablets, or phones without exposing it to the public internet. Utilizing ",[1142,2003,2004],{},"Cloudflare WARP"," with ",[1142,2007,2008],{},"Cloudflare Zero Trust"," allows you to expose the Hermes Agent globally without opening a single inbound port on your firewall.",[433,2011,2012,2013,2015,2016,2018],{},"If you followed our previous guide, '",[1546,2014,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 ",[1142,2017,2004],{}," client to expose the Hermes Agent to a private network over the internet.",[428,2020,2022],{"id":2021},"understanding-the-architecture","Understanding the Architecture",[433,2024,2025],{},"The components at play:",[559,2027,2028,2033],{},[562,2029,2030,2032],{},[1142,2031,2008],{},": The dashboard at Cloudflare where you define routing rules and access policies.",[562,2034,2035,2037],{},[1142,2036,2004],{},": The client application installed on your devices (VPS, laptops, phones). It intercepts traffic destined for your private network and routes it securely.",[444,2039,2041],{"id":2040},"prerequisites","Prerequisites",[798,2043,2044,2047],{},[562,2045,2046],{},"A running Hermes Agent on your VPS.",[562,2048,2049],{},"A free Cloudflare account.",[428,2051,2053],{"id":2052},"step-by-step-guide","Step-by-Step Guide",[444,2055,2057],{"id":2056},"step-1-set-up-cloudflare-zero-trust","Step 1: Set Up Cloudflare Zero Trust",[559,2059,2060,2068,2075,2086,2093,2100],{},[562,2061,2062,2063,1246],{},"Log in to your ",[1546,2064,2067],{"href":2065,"rel":2066},"https:\u002F\u002Fdash.cloudflare.com\u002F",[1550],"Cloudflare Dashboard",[562,2069,2070,2071],{},"Click on 'Zero Trust' from the left menu.\n",[476,2072],{"alt":2073,"src":2074},"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",[562,2076,2077,2078,2081,2082],{},"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., ",[458,2079,2080],{},"ai-team",").\n",[476,2083],{"alt":2084,"src":2085},"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",[562,2087,2088,2089],{},"Click on 'Access' then 'Policies' to create an access policy defining who has access to the network.\n",[476,2090],{"alt":2091,"src":2092},"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",[562,2094,2095,2096],{},"Click on 'Create new policy'.\n",[476,2097],{"alt":2098,"src":2099},"Cloudflare Access policies page showing no policies added and a button to create a new policy.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.png",[562,2101,2102,2103],{},"Select 'Emails' and enter your email under 'Policy rules'.\n",[476,2104],{"alt":2105,"src":2106},"Cloudflare Access policy rule configuration screen with an email address specified as the inclusion criteria.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.png",[444,2108,2110],{"id":2109},"step-2-set-up-cloudflare-warp-client-on-vps","Step 2: Set Up Cloudflare WARP Client on VPS",[559,2112,2113,2122,2128,2135,2138,2153,2156,2234],{},[562,2114,677,2115,1149,2118,2121],{},[458,2116,2117],{},"sudo apt update",[458,2119,2120],{},"sudo apt install cloudflare-warp"," in the terminal on your VPS.",[562,2123,677,2124,2127],{},[458,2125,2126],{},"warp-cli registration new \u003CTEAM-NAME>"," in the terminal on your VPS, which will print out a URL.",[562,2129,2130,2131,2134],{},"Copy the printed URL, which will look like ",[458,2132,2133],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp",", and paste it in your browser for authentication.",[562,2136,2137],{},"Since email authentication is used in the policy rule setup above, enter your email to authenticate.",[562,2139,2140,2141,2144,2145,2148,2149,2152],{},"On the '",[1142,2142,2143],{},"Success","' page in the browser, right-click and select '",[1142,2146,2147],{},"Inspect","' on the blue '",[1142,2150,2151],{},"Open Cloudflare WARP","' button.",[562,2154,2155],{},"Copy the long token that is shown in the button's link.",[562,2157,677,2158,2161,2162,2165,2166],{},[458,2159,2160],{},"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.",[2163,2164],"br",{},"If the 'Error: Failed to communicate with the WARP API' is encounter on Ubuntu 26, run the following commands:",[452,2167,2169],{"className":454,"code":2168,"language":456,"meta":423,"style":423},"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",[458,2170,2171,2182,2186,2192,2202,2206,2211],{"__ignoreMap":423},[461,2172,2173,2175,2177,2179],{"class":463,"line":464},[461,2174,492],{"class":467},[461,2176,618],{"class":471},[461,2178,621],{"class":471},[461,2180,2181],{"class":471}," warp-svc.service\n",[461,2183,2184],{"class":463,"line":542},[461,2185,963],{"emptyLinePlaceholder":962},[461,2187,2188],{"class":463,"line":603},[461,2189,2191],{"class":2190},"sHwdD","# Check status\n",[461,2193,2194,2196,2198,2200],{"class":463,"line":959},[461,2195,492],{"class":467},[461,2197,618],{"class":471},[461,2199,1071],{"class":471},[461,2201,2181],{"class":471},[461,2203,2204],{"class":463,"line":966},[461,2205,963],{"emptyLinePlaceholder":962},[461,2207,2208],{"class":463,"line":972},[461,2209,2210],{"class":2190},"# Run the warp-cli registration token again\n",[461,2212,2213,2216,2219,2222,2225,2228,2231],{"class":463,"line":978},[461,2214,2215],{"class":467},"warp-cli",[461,2217,2218],{"class":471}," --accept-tos",[461,2220,2221],{"class":471}," registration",[461,2223,2224],{"class":471}," token",[461,2226,2227],{"class":501},"   \"",[461,2229,2230],{"class":471},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[461,2232,2233],{"class":501},"\"\n",[562,2235,2236,2237],{},"Head back to the Cloudflare Zero Trust dashboard, and click on 'Devices'. Your VPS device should now be displayed.\n",[476,2238],{"alt":2239,"src":2240},"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",[444,2242,2244],{"id":2243},"step-3-set-up-traffic-routing","Step 3: Set Up Traffic Routing",[559,2246,2247,2254,2261,2268],{},[562,2248,2249,2250],{},"Click the profile for your VPS on the Devices dashboard.\n",[476,2251],{"alt":2252,"src":2253},"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",[562,2255,2256,2257],{},"Scroll down to the 'Split Tunnels' section.\n",[476,2258],{"alt":2259,"src":2260},"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",[562,2262,2263,2264],{},"Click the 'Manage' button and configure the settings as shown below. Replace the IP address if necessary.\n",[476,2265],{"alt":2266,"src":2267},"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",[562,2269,2270,2271,1149,2274,2277],{},"Exposing the ",[458,2272,2273],{},"address",[458,2275,2276],{},"host"," will route traffic to your services over the same private network.",[444,2279,2281],{"id":2280},"step-4-configure-firewall-on-the-vps","Step 4: Configure Firewall on the VPS",[433,2283,2284],{},"Enable the firewall to allow the '100.96.0.0\u002F12' subnet only, blocking all other public incoming access.",[452,2286,2288],{"className":454,"code":2287,"language":456,"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",[458,2289,2290,2301,2318,2332],{"__ignoreMap":423},[461,2291,2292,2294,2297,2299],{"class":463,"line":464},[461,2293,492],{"class":467},[461,2295,2296],{"class":471}," ufw",[461,2298,1048],{"class":471},[461,2300,539],{"class":538},[461,2302,2303,2305,2307,2310,2313,2316],{"class":463,"line":542},[461,2304,492],{"class":467},[461,2306,2296],{"class":471},[461,2308,2309],{"class":471}," default",[461,2311,2312],{"class":471}," allow",[461,2314,2315],{"class":471}," outgoing",[461,2317,539],{"class":538},[461,2319,2320,2322,2324,2326,2329],{"class":463,"line":603},[461,2321,492],{"class":467},[461,2323,2296],{"class":471},[461,2325,2309],{"class":471},[461,2327,2328],{"class":471}," deny",[461,2330,2331],{"class":471}," incoming\n",[461,2333,2334,2336,2338,2340,2343,2346],{"class":463,"line":959},[461,2335,492],{"class":467},[461,2337,2296],{"class":471},[461,2339,2312],{"class":471},[461,2341,2342],{"class":471}," in",[461,2344,2345],{"class":471}," from",[461,2347,2348],{"class":471}," 100.96.0.0\u002F12\n",[433,2350,2351],{},"Allow loopback traffic to avoid breaking local services:",[452,2353,2355],{"className":454,"code":2354,"language":456,"meta":423,"style":423},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[458,2356,2357,2373],{"__ignoreMap":423},[461,2358,2359,2361,2363,2365,2367,2370],{"class":463,"line":464},[461,2360,492],{"class":467},[461,2362,2296],{"class":471},[461,2364,2312],{"class":471},[461,2366,2342],{"class":471},[461,2368,2369],{"class":471}," on",[461,2371,2372],{"class":471}," lo\n",[461,2374,2375,2377,2379,2381,2384,2386],{"class":463,"line":542},[461,2376,492],{"class":467},[461,2378,2296],{"class":471},[461,2380,2312],{"class":471},[461,2382,2383],{"class":471}," out",[461,2385,2369],{"class":471},[461,2387,2372],{"class":471},[433,2389,2390],{},"Reload the firewall and verify status:",[452,2392,2394],{"className":454,"code":2393,"language":456,"meta":423,"style":423},"sudo ufw reload \nsudo ufw status verbose\n",[458,2395,2396,2407],{"__ignoreMap":423},[461,2397,2398,2400,2402,2405],{"class":463,"line":464},[461,2399,492],{"class":467},[461,2401,2296],{"class":471},[461,2403,2404],{"class":471}," reload",[461,2406,539],{"class":538},[461,2408,2409,2411,2413,2415],{"class":463,"line":542},[461,2410,492],{"class":467},[461,2412,2296],{"class":471},[461,2414,1071],{"class":471},[461,2416,2417],{"class":471}," verbose\n",[444,2419,2421],{"id":2420},"step-5-expose-hermes-agent-to-the-private-network","Step 5: Expose Hermes Agent to the Private Network",[433,2423,2424,2425,2428,2429,1246],{},"We will expose the ",[1142,2426,2427],{},"Hermes Agent Web Dashboard"," to our private network and use the default authentication provider, ",[1142,2430,2431],{},"Nous Research",[2433,2434,2436],"h4",{"id":2435},"set-up-the-auth-provider","Set Up the Auth Provider",[559,2438,2439,2447,2454,2461,2468],{},[562,2440,745,2441,2446],{},[1546,2442,2445],{"href":2443,"rel":2444},"https:\u002F\u002Fportal.nousresearch.com",[1550],"portal.nousresearch.com"," to register an account.",[562,2448,2449,2450],{},"Select 'Local Dashboards'.\n",[476,2451],{"alt":2452,"src":2453},"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",[562,2455,2456,2457],{},"Click 'Register Dashboard'.\n",[476,2458],{"alt":2459,"src":2460},"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",[562,2462,2463,2464],{},"Enter the private network IP address of your VPS as the 'Dashboard redirect URI' and click 'Save'.\n",[476,2465],{"alt":2466,"src":2467},"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",[562,2469,2470,2471,2474],{},"Copy the 'OAuth client ID' and paste it in your ",[458,2472,2473],{},"config.yaml"," file:",[452,2476,2478],{"className":1629,"code":2477,"language":1631,"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",[458,2479,2480,2488,2498,2509,2516,2526,2536,2543,2553],{"__ignoreMap":423},[461,2481,2482,2485],{"class":463,"line":464},[461,2483,2484],{"class":1643},"dashboard",[461,2486,2487],{"class":501},":\n",[461,2489,2490,2493,2495],{"class":463,"line":542},[461,2491,2492],{"class":1643},"  theme",[461,2494,592],{"class":501},[461,2496,2497],{"class":471}," default\n",[461,2499,2500,2503,2505],{"class":463,"line":603},[461,2501,2502],{"class":1643},"  show_token_analytics",[461,2504,592],{"class":501},[461,2506,2508],{"class":2507},"sfNiH"," false\n",[461,2510,2511,2514],{"class":463,"line":959},[461,2512,2513],{"class":1643},"  oauth",[461,2515,2487],{"class":501},[461,2517,2518,2521,2523],{"class":463,"line":966},[461,2519,2520],{"class":1643},"    client_id",[461,2522,592],{"class":501},[461,2524,2525],{"class":471}," agent:cmq02x7ha0002jk0ba3kfnb\n",[461,2527,2528,2531,2533],{"class":463,"line":972},[461,2529,2530],{"class":1643},"    portal_url",[461,2532,592],{"class":501},[461,2534,2535],{"class":471}," https:\u002F\u002Fportal.nousresearch.com\n",[461,2537,2538,2541],{"class":463,"line":978},[461,2539,2540],{"class":1643},"  basic_auth",[461,2542,2487],{"class":501},[461,2544,2545,2548,2550],{"class":463,"line":984},[461,2546,2547],{"class":1643},"    username",[461,2549,592],{"class":501},[461,2551,2552],{"class":501}," ''\n",[461,2554,2555,2558,2560],{"class":463,"line":990},[461,2556,2557],{"class":1643},"    password_hash",[461,2559,592],{"class":501},[461,2561,2552],{"class":501},[2433,2563,2565],{"id":2564},"set-up-systemd-to-autostart-the-hermes-dashboard","Set Up Systemd to Autostart the Hermes Dashboard",[559,2567,2568],{},[562,2569,2570],{},"Create a service file:",[452,2572,2574],{"className":915,"code":2573,"language":917,"meta":423,"style":423},"sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[458,2575,2576],{"__ignoreMap":423},[461,2577,2578,2580,2582],{"class":463,"line":464},[461,2579,492],{"class":467},[461,2581,576],{"class":471},[461,2583,2584],{"class":471}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[559,2586,2587],{"start":542},[562,2588,2589,2590,2593],{},"Paste the following configuration, ensuring ",[458,2591,2592],{},"--host 0.0.0.0"," is part of the command:",[452,2595,2597],{"className":937,"code":2596,"language":939,"meta":423,"style":423},"[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",[458,2598,2599,2603,2608,2612,2616,2620,2624,2628,2633,2637,2641,2645,2649,2653],{"__ignoreMap":423},[461,2600,2601],{"class":463,"line":464},[461,2602,946],{},[461,2604,2605],{"class":463,"line":542},[461,2606,2607],{},"Description=Hermes Dashboard\n",[461,2609,2610],{"class":463,"line":603},[461,2611,956],{},[461,2613,2614],{"class":463,"line":959},[461,2615,963],{"emptyLinePlaceholder":962},[461,2617,2618],{"class":463,"line":966},[461,2619,969],{},[461,2621,2622],{"class":463,"line":972},[461,2623,975],{},[461,2625,2626],{"class":463,"line":978},[461,2627,981],{},[461,2629,2630],{"class":463,"line":984},[461,2631,2632],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[461,2634,2635],{"class":463,"line":990},[461,2636,993],{},[461,2638,2639],{"class":463,"line":996},[461,2640,999],{},[461,2642,2643],{"class":463,"line":1002},[461,2644,1005],{},[461,2646,2647],{"class":463,"line":1008},[461,2648,963],{"emptyLinePlaceholder":962},[461,2650,2651],{"class":463,"line":1013},[461,2652,1016],{},[461,2654,2655],{"class":463,"line":1019},[461,2656,1022],{},[559,2658,2659],{"start":603},[562,2660,1025],{},[452,2662,2664],{"className":915,"code":2663,"language":917,"meta":423,"style":423},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[458,2665,2666,2674,2685,2695],{"__ignoreMap":423},[461,2667,2668,2670,2672],{"class":463,"line":464},[461,2669,492],{"class":467},[461,2671,618],{"class":471},[461,2673,1039],{"class":471},[461,2675,2676,2678,2680,2682],{"class":463,"line":542},[461,2677,492],{"class":467},[461,2679,618],{"class":471},[461,2681,1048],{"class":471},[461,2683,2684],{"class":471}," hermes-dashboard\n",[461,2686,2687,2689,2691,2693],{"class":463,"line":603},[461,2688,492],{"class":467},[461,2690,618],{"class":471},[461,2692,1060],{"class":471},[461,2694,2684],{"class":471},[461,2696,2697,2699,2701,2703],{"class":463,"line":959},[461,2698,492],{"class":467},[461,2700,618],{"class":471},[461,2702,1071],{"class":471},[461,2704,2684],{"class":471},[444,2706,2708],{"id":2707},"step-6-install-cloudflare-warp-client-on-desktop","Step 6: Install Cloudflare WARP Client on Desktop",[559,2710,2711,2719,2722,2729,2736,2743],{},[562,2712,2713,2714,1246],{},"Download the Cloudflare WARP client from ",[1546,2715,2718],{"href":2716,"rel":2717},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[1550],"Cloudflare's portal",[562,2720,2721],{},"Open and launch the Cloudflare WARP client after installation.",[562,2723,2724,2725],{},"Log in when prompted.\n",[476,2726],{"alt":2727,"src":2728},"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",[562,2730,2731,2732],{},"A 'Success' page will be displayed after a successful login.\n",[476,2733],{"alt":2734,"src":2735},"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",[562,2737,2738,2739],{},"The WARP client should now show it is connected to your Zero Trust team.\n",[476,2740],{"alt":2741,"src":2742},"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",[562,2744,2745,2746,2749,2750],{},"Navigate to your web browser and enter your private IP (e.g., ",[458,2747,2748],{},"100.96.0.3","). The Hermes Web Dashboard should load successfully.\n",[476,2751],{"alt":2752,"src":2753},"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",[2755,2756,2757],"blockquote",{},[433,2758,2759,2762,2763,2767],{},[1142,2760,2761],{},"Pro Tip for macOS Users:"," If you are using the WARP client to access multiple Cloudflare accounts, check out our quick guide on ",[1142,2764,2765],{},[1546,2766,398],{"href":399}," to make switching between accounts seamless.",[444,2769,2771],{"id":2770},"step-7-install-cloudflare-warp-client-on-ios-devices","Step 7: Install Cloudflare WARP Client on iOS Devices",[559,2773,2774,2781,2789,2797,2805],{},[562,2775,2776,2777,2780],{},"Install ",[1142,2778,2779],{},"Cloudflare One"," from the App Store.",[562,2782,2783,2784],{},"Open the Cloudflare One app and enter your team name when prompted.\n",[476,2785],{"alt":2786,"src":2787,"width":2788},"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,[562,2790,2791,2792],{},"Log in using the same email address that was configured in the policy rule above.\n",[476,2793],{"alt":2794,"src":2795,"width":2796},"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,[562,2798,2799,2800],{},"Once it is connected, it should look like the following:\n",[476,2801],{"alt":2802,"src":2803,"width":2804},"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,[562,2806,2807,2808,2810,2811],{},"Navigate to your web browser and enter the private IP ",[458,2809,2748],{}," to access the Hermes Web Dashboard on your mobile device.\n",[476,2812],{"alt":2813,"src":2814,"width":2815},"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,2817,1077],{"id":1076},[433,2819,2820,2821,2823,2824,2827],{},"With ",[1142,2822,2008],{}," handling identity policies and the ",[1142,2825,2826],{},"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.",[1082,2829,2830],{},"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":542,"depth":603,"links":2832},[2833,2836,2848],{"id":2021,"depth":542,"text":2022,"children":2834},[2835],{"id":2040,"depth":603,"text":2041},{"id":2052,"depth":542,"text":2053,"children":2837},[2838,2839,2840,2841,2842,2846,2847],{"id":2056,"depth":603,"text":2057},{"id":2109,"depth":603,"text":2110},{"id":2243,"depth":603,"text":2244},{"id":2280,"depth":603,"text":2281},{"id":2420,"depth":603,"text":2421,"children":2843},[2844,2845],{"id":2435,"depth":959,"text":2436},{"id":2564,"depth":959,"text":2565},{"id":2707,"depth":603,"text":2708},{"id":2770,"depth":603,"text":2771},{"id":1076,"depth":542,"text":1077},[1097,2850],"security","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":2856,"robots":1118,"sitemap":2887},[2857],{"@type":1106,"headline":362,"description":2852,"name":362,"image":2853,"step":2858},[2859,2863,2867,2871,2875,2879,2883],{"@type":1109,"name":2860,"text":2861,"url":2862,"image":2074},"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":1109,"name":2864,"text":2865,"url":2866,"image":2240},"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":1109,"name":2868,"text":2869,"url":2870,"image":2253},"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":1109,"name":2872,"text":2873,"url":2874},"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":1109,"name":2876,"text":2877,"url":2878},"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":1109,"name":2880,"text":2881,"url":2882,"image":2728},"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":1109,"name":2884,"text":2885,"url":2886,"image":2787},"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":2888},"2026-09-28",{"title":2890,"description":2852,"ogTitle":362,"ogDescription":2852,"twitterTitle":362,"twitterDescription":2852},"Secure Hermes Agent Access with Cloudflare Zero Trust",[2004,2892,879,2893,2894],"Zero Trust","VPN","Tutorial","7w7yHDwhXSX7-e5xSvZ3rQ_6OcpB47010zvSqV1GJ9M",{"id":2897,"title":366,"author":423,"body":2898,"category":3466,"date":3467,"description":3468,"extension":1100,"image":3469,"imageAlt":3470,"isPublished":962,"meta":3471,"minRead":959,"navigation":962,"path":367,"seo":3475,"stem":368,"tags":3477,"updatedAt":1127,"__hash__":3481},"article\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md",{"type":425,"value":2899,"toc":3459},[2900,2913,2917,2920,3024,3027,3055,3061,3065,3078,3095,3099,3110,3274,3278,3366,3370,3378,3399,3406,3421,3431,3434,3440,3443,3448,3456],[433,2901,2902,2903,1149,2906,2909,2910,1246],{},"When we start a new app using the Nuxt framework, we have to go through tedious steps like installing modules and setting up configurations such as ",[458,2904,2905],{},"nuxt.config.ts",[458,2907,2908],{},"wrangler.jsonc",". A script can solve this problem, but it hits its limits as variations increase. This is why we explored and replaced scripts with an ",[1142,2911,2912],{},"agent skill",[428,2914,2916],{"id":2915},"what-traditional-shell-scripts-are-good-at","What Traditional Shell Scripts Are Good At",[433,2918,2919],{},"A script is good at executing a fixed set of instructions in sequence with hardcoded decisions.",[452,2921,2923],{"className":454,"code":2922,"language":456,"meta":423,"style":423},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -e\n\nnpx nuxi@latest init \"$1\" --template minimal --packageManager pnpm --no-gitInit -M @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n\ncd \"$1\"\n\ncp ~\u002Ftemplates\u002Fnuxt.config.ts .\ncp ~\u002Ftemplates\u002Fwrangler.jsonc .\n",[458,2924,2925,2930,2939,2943,2985,2989,3000,3004,3015],{"__ignoreMap":423},[461,2926,2927],{"class":463,"line":464},[461,2928,2929],{"class":2190},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[461,2931,2932,2936],{"class":463,"line":542},[461,2933,2935],{"class":2934},"s2Zo4","set",[461,2937,2938],{"class":471}," -e\n",[461,2940,2941],{"class":463,"line":603},[461,2942,963],{"emptyLinePlaceholder":962},[461,2944,2945,2948,2951,2954,2957,2961,2964,2967,2970,2973,2976,2979,2982],{"class":463,"line":959},[461,2946,2947],{"class":467},"npx",[461,2949,2950],{"class":471}," nuxi@latest",[461,2952,2953],{"class":471}," init",[461,2955,2956],{"class":501}," \"",[461,2958,2960],{"class":2959},"sHdIc","$1",[461,2962,2963],{"class":501},"\"",[461,2965,2966],{"class":471}," --template",[461,2968,2969],{"class":471}," minimal",[461,2971,2972],{"class":471}," --packageManager",[461,2974,2975],{"class":471}," pnpm",[461,2977,2978],{"class":471}," --no-gitInit",[461,2980,2981],{"class":471}," -M",[461,2983,2984],{"class":471}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[461,2986,2987],{"class":463,"line":966},[461,2988,963],{"emptyLinePlaceholder":962},[461,2990,2991,2994,2996,2998],{"class":463,"line":972},[461,2992,2993],{"class":2934},"cd",[461,2995,2956],{"class":501},[461,2997,2960],{"class":2959},[461,2999,2233],{"class":501},[461,3001,3002],{"class":463,"line":978},[461,3003,963],{"emptyLinePlaceholder":962},[461,3005,3006,3009,3012],{"class":463,"line":984},[461,3007,3008],{"class":467},"cp",[461,3010,3011],{"class":471}," ~\u002Ftemplates\u002Fnuxt.config.ts",[461,3013,3014],{"class":471}," .\n",[461,3016,3017,3019,3022],{"class":463,"line":990},[461,3018,3008],{"class":467},[461,3020,3021],{"class":471}," ~\u002Ftemplates\u002Fwrangler.jsonc",[461,3023,3014],{"class":471},[433,3025,3026],{},"This script works until the following occurs:",[798,3028,3029,3035,3045],{},[562,3030,3031,3034],{},[1142,3032,3033],{},"Fixed defaults."," The script hardcodes the Nuxt UI module; what if we want the Ant Design UI module? Every new module option requires another argument from the user.",[562,3036,3037,3040,3041,3044],{},[1142,3038,3039],{},"It can't read the user's intent."," \"Build me a blog\" needs ",[458,3042,3043],{},"@nuxt\u002Fcontent","; \"build me a website with newsletters\" needs Cloudflare D1 + Drizzle. A script can't tell the difference—each variation needs a new script.",[562,3046,3047,3050,3051,3054],{},[1142,3048,3049],{},"It goes stale silently."," Nuxt's conventions change between major versions. Nuxt 4 changed the source directory to ",[458,3052,3053],{},"app\u002F",". A script that is written for Nuxt 3 quietly scaffolds the wrong layout and never alerts the user.",[433,3056,3057,3060],{},[1142,3058,3059],{},"App scaffolding"," is a decision issue, not an execution issue. The script will not scale when the number of decisions increases.",[428,3062,3064],{"id":3063},"why-use-an-ai-agent-skill-over-traditional-scripts","Why Use an AI Agent Skill Over Traditional Scripts?",[433,3066,3067,3068,3071,3072,3074,3075,3077],{},"An agent skill is not a set of code that executes, but a ",[1142,3069,3070],{},"set of knowledge the AI agent follows",". It contains ",[458,3073,1614],{}," and can bundle any other files the task requires (such as reference documents, templates, and executable scripts). The article, ",[1546,3076,350],{"href":351},", explains how an agent skill works. A skill maintains a script's diligence while adding the reasonable judgements that a script lacks:",[798,3079,3080,3083,3086,3089,3092],{},[562,3081,3082],{},"Infers the user's intention to determine whether the app needs a database.",[562,3084,3085],{},"Decides which optional modules are needed from the specified list. For example, Nuxt Content, i18n, and analytics are opt-in when requested by the user.",[562,3087,3088],{},"Adapts to the current ecosystem using the latest Nuxt framework, NuxtHub for Cloudflare bindings, and Wrangler for deployment.",[562,3090,3091],{},"Recovers when a step fails.",[562,3093,3094],{},"Verifies against a final checklist before handing the project over.",[428,3096,3098],{"id":3097},"behind-the-scenes-of-our-nuxt-cloudflare-scaffolding-skill","Behind the Scenes of Our Nuxt & Cloudflare Scaffolding Skill",[433,3100,3101,3102,3109],{},"The skill, ",[1546,3103,3106],{"href":3104,"rel":3105},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[1550],[458,3107,3108],{},"scaffold-nuxt-cloudflare-app-skill",", walks through a production-oriented scaffold:",[559,3111,3112,3144,3164,3190,3219,3254,3260],{},[562,3113,3114,3117,3118],{},[1142,3115,3116],{},"Clarify anything"," that cannot be inferred:\n",[798,3119,3120,3131,3134],{},[562,3121,3122,3123,3126,3127,3130],{},"UI kit (",[1142,3124,3125],{},"Nuxt UI"," by default or ",[1142,3128,3129],{},"Antdv Next",");",[562,3132,3133],{},"Whether a database is required (such as Cloudflare D1);",[562,3135,3136,3137,3140,3141,3143],{},"Extra modules like ",[458,3138,3139],{},"@nuxtjs\u002Fi18n"," or ",[458,3142,3043],{}," for CMS features.",[562,3145,3146,2005,3149,3152,3153,3156,3157,3160,3161,1246],{},[1142,3147,3148],{},"Scaffolds the base app",[458,3150,3151],{},"pnpm dlx nuxi@latest init"," for the latest version of the Nuxt framework with ",[458,3154,3155],{},"pnpm"," as the package manager. It then sets native-build allowlists so Cloudflare's build environment can compile ",[458,3158,3159],{},"better-sqlite3","\u002F",[458,3162,3163],{},"sharp",[562,3165,3166,3169,3170,3140,3173,3176,3177,3176,3180,3176,3183,3176,3186,3189],{},[1142,3167,3168],{},"Installs modules from a decision table",": ",[458,3171,3172],{},"@nuxt\u002Fui",[458,3174,3175],{},"@antdv-next\u002Fnuxt",", ",[458,3178,3179],{},"@nuxt\u002Fimage",[458,3181,3182],{},"@nuxtjs\u002Fseo",[458,3184,3185],{},"@nuxthub\u002Fcore",[458,3187,3188],{},"@vueuse\u002Fnuxt",", plus Drizzle\u002FD1, Nuxt Content, and i18n only when selected.",[562,3191,3192,2487,3195],{},[1142,3193,3194],{},"Lays out the directory structure",[798,3196,3197,3201,3206,3211,3216],{},[562,3198,3199],{},[458,3200,3053],{},[562,3202,3203],{},[458,3204,3205],{},"server\u002F",[562,3207,3208],{},[458,3209,3210],{},"shared\u002F",[562,3212,3213],{},[458,3214,3215],{},"tests\u002F",[562,3217,3218],{},"root config files.",[562,3220,3221,2487,3226],{},[1142,3222,3223,3224],{},"Configures ",[458,3225,2905],{},[798,3227,3228,3237,3244,3249],{},[562,3229,3230,3160,3233,3236],{},[458,3231,3232],{},"site.url",[458,3234,3235],{},"site.name"," for SEO",[562,3238,3239,3240,3243],{},"NuxtHub ",[458,3241,3242],{},"hub"," block for Cloudflare",[562,3245,3246],{},[458,3247,3248],{},"routeRules",[562,3250,3251],{},[458,3252,3253],{},"compatibilityDate",[562,3255,3256],{},[1142,3257,3223,3258],{},[458,3259,2908],{},[562,3261,3262,3265,3266,3269,3270,3273],{},[1142,3263,3264],{},"Sets up Vitest and ESLint",", then runs a ",[1142,3267,3268],{},"final checklist"," including ",[458,3271,3272],{},"pnpm install && pnpm dev"," before considering the job done.",[428,3275,3277],{"id":3276},"shell-scripts-vs-ai-agent-skills-a-side-by-side-comparison","Shell Scripts vs AI Agent Skills: A Side-by-Side Comparison",[3279,3280,3281,3296],"table",{},[3282,3283,3284],"thead",{},[3285,3286,3287,3290,3293],"tr",{},[3288,3289],"th",{},[3288,3291,3292],{},"Script",[3288,3294,3295],{},"Skill",[3297,3298,3299,3311,3322,3333,3344,3355],"tbody",{},[3285,3300,3301,3305,3308],{},[3302,3303,3304],"td",{},"User's intent",[3302,3306,3307],{},"❌ fixed defaults",[3302,3309,3310],{},"✅ adapts to the request",[3285,3312,3313,3316,3319],{},[3302,3314,3315],{},"Decision making",[3302,3317,3318],{},"only if you pre-code flags",[3302,3320,3321],{},"✅ judged at runtime",[3285,3323,3324,3327,3330],{},[3302,3325,3326],{},"Version changes",[3302,3328,3329],{},"manual rewrite",[3302,3331,3332],{},"✅ checks the current state",[3285,3334,3335,3338,3341],{},[3302,3336,3337],{},"Error recovery",[3302,3339,3340],{},"halts",[3302,3342,3343],{},"✅ fixes and continues",[3285,3345,3346,3349,3352],{},[3302,3347,3348],{},"Result verification",[3302,3350,3351],{},"❌",[3302,3353,3354],{},"✅ final checklist",[3285,3356,3357,3360,3363],{},[3302,3358,3359],{},"Maintenance cost",[3302,3361,3362],{},"flags sprawl, version bumps",[3302,3364,3365],{},"editing Markdown, not code",[428,3367,3369],{"id":3368},"how-to-install-ai-agent-skills-with-the-npx-skills-cli","How to Install AI Agent Skills with the npx skills CLI",[433,3371,3372,3373,592],{},"Installation is a single command with the ",[1546,3374,3377],{"href":3375,"rel":3376},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[1550],"skills CLI",[452,3379,3381],{"className":454,"code":3380,"language":456,"meta":423,"style":423},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[458,3382,3383],{"__ignoreMap":423},[461,3384,3385,3387,3390,3393,3396],{"class":463,"line":464},[461,3386,2947],{"class":467},[461,3388,3389],{"class":471}," skills",[461,3391,3392],{"class":471}," add",[461,3394,3395],{"class":471}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[461,3397,3398],{"class":471}," -g\n",[433,3400,3401,3402],{},"The CLI clones the repo, finds the skill, and asks which of the 77 supported agents should get it:\n",[476,3403],{"alt":3404,"src":3405},"Command line interface showing the installation of the Nuxt scaffolding skill using the npx skills add CLI command","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-add-scaffold-nuxt-installation.webp",[433,3407,3408,3409,3412,3413,3416,3417],{},"We went with ",[1142,3410,3411],{},"Symlink"," (the recommended method), which installs the skill once in ",[458,3414,3415],{},"~\u002F.agents\u002Fskills"," and points every selected agent to this single copy.\n",[476,3418],{"alt":3419,"src":3420},"Terminal screen displaying the installation summary and symlink setup for the centralized agent skills","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-installation-summary-details.webp",[798,3422,3423],{},[562,3424,3425],{},[1205,3426,3427,3428,3430],{},"Please refer to this article, ",[1546,3429,358],{"href":359},", on how to centralise agent skills in a single source of truth.",[433,3432,3433],{},"Opening Claude Code confirms the skill is successfully installed.",[433,3435,3436],{},[476,3437],{"alt":3438,"src":3439},"Claude Code command line interface showing the newly installed scaffold-nuxt slash command active and ready for use","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fclaude-code-scaffold-nuxt-slash-command-active.webp",[433,3441,3442],{},"From there, a natural-language prompt is all it takes:",[2755,3444,3445],{},[433,3446,3447],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"",[433,3449,3450,3451,3455],{},"The skill is open source; check out the ",[1546,3452,3454],{"href":3104,"rel":3453},[1550],"GitHub repo"," and give it a try.",[1082,3457,3458],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":423,"searchDepth":542,"depth":603,"links":3460},[3461,3462,3463,3464,3465],{"id":2915,"depth":542,"text":2916},{"id":3063,"depth":542,"text":3064},{"id":3097,"depth":542,"text":3098},{"id":3276,"depth":542,"text":3277},{"id":3368,"depth":542,"text":3369},[1097],"2026-08-25","Scaffold Nuxt on Cloudflare Workers easily. Learn why we replaced brittle shell scripts with AI agent skills and how to install them with npx skills.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002FEN-How-AI-Agent-Skills-Replace-Nuxt-App-Scaffolding-Scripts.webp","Nuxt Scaffolding on Cloudflare: Scripts vs AI Skills - Comparing shell scripts and intelligent AI agent skills for scaffolding Nuxt applications.",{"schemaOrg":3472,"robots":1118,"sitemap":3474},[3473],{"@type":1588,"headline":366,"description":3468,"image":3469},{"lastmod":3467},{"title":3476,"description":3468,"ogTitle":366,"ogDescription":3468,"twitterTitle":366,"twitterDescription":3468},"Nuxt Scaffolding on Cloudflare: Scripts vs AI Skills",[3478,3479,1126,3480],"Nuxt","Cloudflare","Scaffolding","NXF2Lnd-1xZXVg9jQtNTE4K5fB8GBw1eOmA1GHAhr6s",{"id":3483,"title":354,"author":423,"body":3484,"category":4640,"date":4643,"description":4644,"extension":1100,"image":4645,"imageAlt":4646,"isPublished":962,"meta":4647,"minRead":990,"navigation":962,"path":355,"seo":4671,"stem":356,"tags":4673,"updatedAt":1127,"__hash__":4675},"article\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md",{"type":425,"value":3485,"toc":4624},[3486,3492,3513,3521,3524,3528,3534,3576,3579,3636,3640,3647,3903,3906,3910,3914,3921,3925,3938,3942,3953,3999,4006,4010,4013,4044,4048,4053,4093,4098,4104,4109,4115,4130,4143,4147,4156,4187,4209,4257,4265,4270,4276,4283,4289,4294,4301,4315,4321,4330,4367,4370,4376,4383,4389,4393,4396,4544,4548,4581,4585,4591,4595,4621],[433,3487,3488],{},[476,3489],{"alt":3490,"src":3491},"DeepSeek Harness message gateway connected to Block Buzz channel overview","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-nostr-gateway-overview.webp",[433,3493,3494,3495,3502,3503,3508,3509,1246],{},"The DeepSeek Harness (DSH) plugin, ",[1142,3496,3497],{},[1546,3498,3501],{"href":3499,"rel":3500},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway",[1550],"dsh-message-gateway",", extends the DeepSeek Harness assistant across messaging platforms such as Discord, Telegram, and WeChat. The plugin repository was forked and extended to add the ",[1142,3504,3505],{},[1546,3506,3507],{"href":383},"Buzz"," platform to the list. The forked repository is available on GitHub at ",[1546,3510,3511],{"href":3511,"rel":3512},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway",[1550],[3514,3515],"article-card",{"description":3516,"image":3517,"image-alt":3518,"label":3519,"min-read":3520,"title":382,"to":383},"Learn how to self-host Block's Buzz on a Linux VPS behind Cloudflare DNS. Run a secure, Nostr-powered workspace where humans and AI agents collaborate.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FEN-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","A premium 16:9 technology card with deep blue and orange accents illustrating how to self-host Block's Buzz relay on an Ubuntu VPS, featuring a clean glassmorphic panel with centered typography.","Prerequisite guide","12",[433,3522,3523],{},"The DSH assistant joins a Buzz relay as a member, receives direct messages (DMs) and channel messages where it is @mentioned, and responds through the same per-chat agent pipeline used by the Web UI.",[428,3525,3527],{"id":3526},"architecture-of-the-dsh-message-gateway-plugin","Architecture of the dsh-message-gateway Plugin",[433,3529,3530,3531,3533],{},"The architecture of the ",[1142,3532,3501],{}," plugin splits into two parts:",[798,3535,3536,3566],{},[562,3537,3538,3541,3542,3545,3546,3549,3550,3553,3554,3557,3558,3561,3562,3565],{},[1142,3539,3540],{},"Host"," (Node): ",[458,3543,3544],{},"gateway-store"," (credentials, ",[458,3547,3548],{},"~\u002F.dsh\u002Fgateway.json","), ",[458,3551,3552],{},"platforms.ts"," (platform definitions + connection tests), ",[458,3555,3556],{},"routes.ts"," (",[458,3559,3560],{},"\u002Fgateway\u002F*"," endpoints), and ",[458,3563,3564],{},"bridge-manager.ts"," (the resident bridges: per-chat independent agent sessions + streamed replies).",[562,3567,3568,3571,3572,3575],{},[1142,3569,3570],{},"Client"," (browser): the sidebar \"",[1142,3573,3574],{},"Message platforms","\" page where you save credentials, test connections, and monitor status.",[433,3577,3578],{},"Adding a new platform involves the following steps:",[559,3580,3581,3598,3612],{},[562,3582,3583,3586,3587,3590,3591,3594,3595,1246],{},[1142,3584,3585],{},"A bridge class"," — ",[458,3588,3589],{},"start\u002Fstop\u002Fstatus"," plus an ",[458,3592,3593],{},"onText(text, frame)"," callback, mirroring ",[458,3596,3597],{},"wecom-bridge.ts",[562,3599,3600,3603,3604,3607,3608,3611],{},[1142,3601,3602],{},"Bridge-manager wiring"," — reuse the existing per-chat pipeline (",[458,3605,3606],{},"ensureAgentForKey"," + ",[458,3609,3610],{},"pendingMap",") and swap in the platform's reply sink.",[562,3613,3614,3617,3618,1149,3621,3169,3624,3627,3628,3631,3632,3635],{},[1142,3615,3616],{},"Storage\u002Froute wiring"," — in ",[458,3619,3620],{},"\u002Fgateway\u002Fsave",[458,3622,3623],{},"\u002Fgateway\u002Fdelete",[1142,3625,3626],{},"saving credentials starts the bridge, deleting stops it"," — plus an ",[458,3629,3630],{},"autoStartXxx"," flag so ",[458,3633,3634],{},"dsh web"," reconnects on boot.",[428,3637,3639],{"id":3638},"building-the-buzz-bridge-nostr-protocol-event-lifecycle","Building the Buzz Bridge: Nostr Protocol & Event Lifecycle",[433,3641,3642,3643,3646],{},"The ",[1142,3644,3645],{},"DeepSeek Harness"," was used to implement the Buzz bridge. The implementation conforms to the following Nostr protocol specifications:",[3279,3648,3649,3672],{},[3282,3650,3651],{},[3285,3652,3653,3658],{},[3288,3654,3655],{},[1142,3656,3657],{},"Transport",[3288,3659,3660,3661,3664,3665,3668,3669],{},"One NIP-42-authenticated WebSocket; default ",[458,3662,3663],{},"ws:\u002F\u002Flocalhost:3000","; ",[458,3666,3667],{},"http(s):\u002F\u002F"," is normalised to ",[458,3670,3671],{},"ws(s):\u002F\u002F",[3297,3673,3674,3692,3720,3738,3762,3785,3806,3820,3833,3849,3866,3880],{},[3285,3675,3676,3681],{},[3302,3677,3678],{},[1142,3679,3680],{},"Auth",[3302,3682,3683,3684,3687,3688,3691],{},"AUTH event ",[458,3685,3686],{},"kind 22242",", tags ",[458,3689,3690],{},"[[\"relay\", url], [\"challenge\", challenge]]",", empty content, signed with the agent key",[3285,3693,3694,3699],{},[3302,3695,3696],{},[1142,3697,3698],{},"Subscriptions",[3302,3700,3701,3169,3704,3707,3708,3711,3712,3715,3716,3719],{},[1142,3702,3703],{},"Channel-scoped",[458,3705,3706],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}"," — one REQ per channel. A global ",[458,3709,3710],{},"kinds:[9]"," REQ gets EOSE but never fans out; multi-value ",[458,3713,3714],{},"#h"," does ",[1142,3717,3718],{},"not"," work",[3285,3721,3722,3727],{},[3302,3723,3724],{},[1142,3725,3726],{},"Discovery",[3302,3728,3729,3730,3733,3734,3737],{},"Historical ",[458,3731,3732],{},"REQ {kinds:[39000]}"," for channel metadata (",[458,3735,3736],{},"type == \"dm\""," marks a DM channel)",[3285,3739,3740,3745],{},[3302,3741,3742],{},[1142,3743,3744],{},"Membership",[3302,3746,3747,3748,3751,3752,3754,3755,3758,3759],{},"Live ",[458,3749,3750],{},"REQ {kinds:[44100,44101], \"#p\":[our pubkey], since: now-60s}"," — 44100 = added, 44101 = removed, each carrying ",[458,3753,433],{},"+",[458,3756,3757],{},"h","; membership changes update subscriptions ",[1142,3760,3761],{},"without reconnect",[3285,3763,3764,3769],{},[3302,3765,3766],{},[1142,3767,3768],{},"Chat events",[3302,3770,3771,3774,3775,3778,3779,3176,3782],{},[458,3772,3773],{},"kind 9"," with tags ",[458,3776,3777],{},"[\"h\", channel]",", optional ",[458,3780,3781],{},"[\"e\", replyTo]",[458,3783,3784],{},"[\"p\", mention]",[3285,3786,3787,3792],{},[3302,3788,3789],{},[1142,3790,3791],{},"In-place edits",[3302,3793,3794,2005,3797,3607,3799,3802,3803,3805],{},[458,3795,3796],{},"kind 40003",[458,3798,3757],{},[458,3800,3801],{},"e","→target; content replaces; 64 KB relay cap → keep payloads ≤ 60,000 B; oversized replies chunk — chunk 0 rides the edit, overflow chunks are appended as threaded kind-9 messages (",[458,3804,3801],{},"→thread root)",[3285,3807,3808,3813],{},[3302,3809,3810],{},[1142,3811,3812],{},"CLOSED frames",[3302,3814,3815,3816,3819],{},"Pre-AUTH ",[458,3817,3818],{},"auth-required"," is normal bootstrap (finish AUTH, reopen subs); post-AUTH → bounded resubscribe (3 attempts, 0\u002F1\u002F2 s backoff); reconnect rebuilds everything",[3285,3821,3822,3827],{},[3302,3823,3824],{},[1142,3825,3826],{},"Relay caps",[3302,3828,3829,3830],{},"≤ 2000 historical events per subscription, newest-first even with ",[458,3831,3832],{},"since",[3285,3834,3835,3840],{},[3302,3836,3837],{},[1142,3838,3839],{},"Mention gating",[3302,3841,3842,3843,3845,3846,3848],{},"Act on inbound kind-9 only when (a) ",[458,3844,433],{},"-tag includes our pubkey, (b) channel is a DM, or (c) the ",[458,3847,3801],{}," root is our own event (thread follow). Ignore our own pubkey — loop prevention",[3285,3850,3851,3856],{},[3302,3852,3853],{},[1142,3854,3855],{},"Outbound mentions",[3302,3857,3858,3859,3862,3863,3865],{},"Outbound text is published verbatim — the relay does not pre-check ",[458,3860,3861],{},"@"," tokens; ",[458,3864,433],{}," tags carry the inbound author + up to 7 other mentioned pubkeys (max 8)",[3285,3867,3868,3873],{},[3302,3869,3870],{},[1142,3871,3872],{},"DMs",[3302,3874,3875,3876,3879],{},"Relay-scoped plaintext channels (",[458,3877,3878],{},"type: \"dm\""," metadata) — no NIP-04\u002F44 encryption in this bridge",[3285,3881,3882,3887],{},[3302,3883,3884],{},[1142,3885,3886],{},"Attachments (inbound)",[3302,3888,3889,3890,3557,3893,3176,3896,3176,3899,3902],{},"NIP-92 ",[458,3891,3892],{},"imeta",[458,3894,3895],{},"url",[458,3897,3898],{},"sha256",[458,3900,3901],{},"m",") → plain http(s) download, verify SHA-256, 20 MB cap, max 4 per message; outbound images have no documented publish path → explicitly unsupported",[433,3904,3905],{},"The diagram below illustrates how the Buzz bridge bootstraps:",[476,3907],{"src":3908,"alt":3909},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-bootstrap.webp","Sequence diagram illustrating the Buzz bridge bootstrap and NIP-42 authentication process",[444,3911,3913],{"id":3912},"real-time-streaming-via-nostr-in-place-edits-kind-40003","Real-Time Streaming via Nostr In-Place Edits (Kind 40003)",[433,3915,3916,3917,3920],{},"Nostr has no native typing indicator, and events are append-only. To make replies feel responsive and alive, the Buzz bridge ",[1142,3918,3919],{},"simulates streaming using in-place edits"," as shown below:",[476,3922],{"src":3923,"alt":3924},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-reply.webp","Diagram of in-place editing flow simulating live streaming responses with kind 40003 events",[798,3926,3927],{},[562,3928,3929],{},[1205,3930,3931,3932,3934,3935,3937],{},"The Buzz bridge publishes a placeholder ",[458,3933,3773],{}," event, then progressively rewrites it with rate-limited ",[458,3936,3796],{}," in-place edits, before writing the final edit when the agent completes its run. This mirrors the \"send then edit\" pattern used by Telegram and Discord bridges.",[444,3939,3941],{"id":3940},"bridging-deepseek-harness-workspaces-via-chat-commands","Bridging DeepSeek Harness Workspaces via Chat Commands",[433,3943,3944,3945,3948,3949,3952],{},"The DSH \"Workspaces\" feature in the Web UI is backed by the ",[458,3946,3947],{},"workspaceRegistry"," service (",[458,3950,3951],{},"@deepseek-ai\u002Fdsh-workspace","):",[452,3954,3958],{"className":3955,"code":3956,"language":3957,"meta":423,"style":423},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const existing = await ctx.workspaceRegistry.resolveByPath(request.path);\n","typescript",[458,3959,3960],{"__ignoreMap":423},[461,3961,3962,3966,3969,3972,3976,3979,3981,3983,3985,3988,3991,3993,3996],{"class":463,"line":464},[461,3963,3965],{"class":3964},"spNyl","const",[461,3967,3968],{"class":538}," existing ",[461,3970,3971],{"class":501},"=",[461,3973,3975],{"class":3974},"s7zQu"," await",[461,3977,3978],{"class":538}," ctx",[461,3980,1246],{"class":501},[461,3982,3947],{"class":538},[461,3984,1246],{"class":501},[461,3986,3987],{"class":2934},"resolveByPath",[461,3989,3990],{"class":538},"(request",[461,3992,1246],{"class":501},[461,3994,3995],{"class":538},"path)",[461,3997,3998],{"class":501},";\n",[433,4000,4001,4002,4005],{},"The Buzz bridge exposes a chat command, ",[458,4003,4004],{},"\u002Fworkspace \u003Cfolder>",", which registers an existing folder in DSH. Any new session through the gateway attaches to it and appears in the Web UI.",[476,4007],{"src":4008,"alt":4009},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace.webp","Architecture of DeepSeek Harness workspace registration from chat commands via gateway",[433,4011,4012],{},"Three design considerations to note:",[798,4014,4015,4025,4034],{},[562,4016,4017,4020,4021,4024],{},[1142,4018,4019],{},"Switching folder = new session."," ",[458,4022,4023],{},"cwd"," is written into the session header at creation and cannot be mutated afterwards.",[562,4026,4027,4020,4030,4033],{},[1142,4028,4029],{},"Folder must already exist.",[458,4031,4032],{},"create"," rejects non-existent paths.",[562,4035,4036,4039,4040,4043],{},[1142,4037,4038],{},"Security-sensitive command."," Every session operates under an ",[1142,4041,4042],{},"auto-approve"," policy, granting file access to the target folder.",[428,4045,4047],{"id":4046},"step-by-step-installation-configuration-guide","Step-by-Step Installation & Configuration Guide",[559,4049,4050],{},[562,4051,4052],{},"Run the following commands:",[452,4054,4056],{"className":454,"code":4055,"language":456,"meta":423,"style":423},"dsh plugin --profile web add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n\n# Start DSH web\ndsh web\n",[458,4057,4058,4077,4081,4086],{"__ignoreMap":423},[461,4059,4060,4063,4066,4069,4072,4074],{"class":463,"line":464},[461,4061,4062],{"class":467},"dsh",[461,4064,4065],{"class":471}," plugin",[461,4067,4068],{"class":471}," --profile",[461,4070,4071],{"class":471}," web",[461,4073,3392],{"class":471},[461,4075,4076],{"class":471}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[461,4078,4079],{"class":463,"line":542},[461,4080,963],{"emptyLinePlaceholder":962},[461,4082,4083],{"class":463,"line":603},[461,4084,4085],{"class":2190},"# Start DSH web\n",[461,4087,4088,4090],{"class":463,"line":959},[461,4089,4062],{"class":467},[461,4091,4092],{"class":471}," web\n",[559,4094,4095],{"start":542},[562,4096,4097],{},"Once the DSH Web UI is opened in a web browser, click on the 'Message platforms' icon:",[433,4099,4100],{},[476,4101],{"alt":4102,"src":4103},"DeepSeek Harness Web UI sidebar highlighting the Message platforms configuration menu","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-message-platforms-sidebar-icon.webp",[559,4105,4106],{"start":603},[562,4107,4108],{},"Click on 'Buzz' on the left panel:",[433,4110,4111],{},[476,4112],{"alt":4113,"src":4114},"Buzz bridge configuration settings panel in DeepSeek Harness message gateway","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-message-gateway-buzz-config-panel.webp",[559,4116,4117,4124,4127],{"start":959},[562,4118,4119,4120,4123],{},"Click 'Generate keypair' to generate a Nostr key pair. Copy the ",[458,4121,4122],{},"npub"," public key somewhere safe, as you will need it later.",[562,4125,4126],{},"Enter the 'Relay URL' and 'Channels' (the allowlist of channel UUIDs to subscribe to).",[562,4128,4129],{},"Click the 'Save' button.",[433,4131,4132,4133,4136,4137,4140,4141,1246],{},"Saving the form stores the credentials and ",[1142,4134,4135],{},"starts the bridge",". The ",[458,4138,4139],{},"nsec"," private key is treated as a secret and stored exclusively in ",[458,4142,3548],{},[444,4144,4146],{"id":4145},"registering-the-dsh-assistant-keypair-on-the-buzz-nostr-relay","Registering the DSH Assistant Keypair on the Buzz Nostr Relay",[433,4148,4149,4152,4153,4155],{},[1142,4150,4151],{},"Add the DSH assistant to the relay as a member."," The pubkey will be the ",[458,4154,4122],{}," generated above:",[452,4157,4159],{"className":454,"code":4158,"language":456,"meta":423,"style":423},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[458,4160,4161],{"__ignoreMap":423},[461,4162,4163,4166,4169,4172,4175,4178,4181,4184],{"class":463,"line":464},[461,4164,4165],{"class":467},"docker",[461,4167,4168],{"class":471}," compose",[461,4170,4171],{"class":471}," exec",[461,4173,4174],{"class":471}," relay",[461,4176,4177],{"class":471}," buzz-admin",[461,4179,4180],{"class":471}," add-member",[461,4182,4183],{"class":471}," --pubkey",[461,4185,4186],{"class":471}," npub123123123\n",[433,4188,4189,4192,4193,4196,4197,4200,4201,4204,4205,4208],{},[1142,4190,4191],{},"Add the DSH assistant to a channel."," Adding a member registers it on the relay, but the member will not yet appear or be searchable within channels. To add the agent to a specific channel using ",[458,4194,4195],{},"buzz-cli",", note that the ",[458,4198,4199],{},"--pubkey"," parameter must be in ",[1142,4202,4203],{},"HEX"," format, not npub (the ",[458,4206,4207],{},"buzz-admin add-member"," command prints the member's HEX pubkey).",[452,4210,4212],{"className":454,"code":4211,"language":456,"meta":423,"style":423},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[458,4213,4214],{"__ignoreMap":423},[461,4215,4216,4219,4222,4224,4227,4230,4233,4236,4239,4241,4243,4246,4249,4251,4254],{"class":463,"line":464},[461,4217,4218],{"class":467},"buzz",[461,4220,4221],{"class":471}," channels",[461,4223,4180],{"class":471},[461,4225,4226],{"class":471}," --channel",[461,4228,4229],{"class":501}," \u003C",[461,4231,4232],{"class":471},"CHANNEL_UUI",[461,4234,4235],{"class":538},"D",[461,4237,4238],{"class":501},">",[461,4240,4183],{"class":471},[461,4242,4229],{"class":501},[461,4244,4245],{"class":471},"AGENT_HE",[461,4247,4248],{"class":538},"X",[461,4250,4238],{"class":501},[461,4252,4253],{"class":471}," --role",[461,4255,4256],{"class":471}," member\n",[3514,4258],{"description":4259,"image":3517,"image-alt":4260,"label":4261,"min-read":4262,"title":4263,"to":4264},"Step-by-step instructions to install and configure buzz-cli for managing Nostr channels, member keys, and AI agent permissions.","Configuring buzz-cli commands to manage Nostr channel members and agent roles","CLI guide","5","How to Install and Use buzz-cli","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#install-buzz-cli",[433,4266,4267,4268,592],{},"Update the DSH assistant's profile on the Nostr relay to a more meaningful display name using ",[458,4269,4195],{},[433,4271,4272],{},[476,4273],{"alt":4274,"src":4275},"Updating the DeepSeek Harness assistant display name on Nostr relay using buzz-cli","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-assistant-buzz-cli-profile-update.webp",[433,4277,4278,4279,4282],{},"Send a ",[1142,4280,4281],{},"Wave"," (Buzz's DM greeting) to the DSH assistant. The wave comes back:",[433,4284,4285],{},[476,4286],{"alt":4287,"src":4288},"Testing connection by sending a Wave DM to DeepSeek Harness assistant in Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-dm-wave-greeting-reply.webp",[433,4290,4291],{},[1205,4292,4293],{},"Sending a Wave as a DM to the DSH assistant — the bridge is alive.",[444,4295,4297,4298],{"id":4296},"enabling-workspace","Enabling ",[458,4299,4300],{},"\u002Fworkspace",[433,4302,4303,4304,4307,4308,4311,4312,4314],{},"Because the ",[458,4305,4306],{},"allowWorkspace"," setting defaults to ",[458,4309,4310],{},"false",", issuing the ",[458,4313,4300],{}," command is initially rejected:",[433,4316,4317],{},[476,4318],{"alt":4319,"src":4320},"Error notification showing workspace command rejected when allowWorkspace is disabled","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-rejected-error.webp",[433,4322,4323,4324,4327,4328,592],{},"Enable it in ",[458,4325,4326],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml",", then restart ",[458,4329,3634],{},[452,4331,4335],{"className":4332,"code":4333,"language":4334,"meta":423,"style":423},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- id: ui-message-gateway\n  config:\n    allowWorkspace: true\n","yml",[458,4336,4337,4350,4357],{"__ignoreMap":423},[461,4338,4339,4342,4345,4347],{"class":463,"line":464},[461,4340,4341],{"class":501},"-",[461,4343,4344],{"class":1643}," id",[461,4346,592],{"class":501},[461,4348,4349],{"class":471}," ui-message-gateway\n",[461,4351,4352,4355],{"class":463,"line":542},[461,4353,4354],{"class":1643},"  config",[461,4356,2487],{"class":501},[461,4358,4359,4362,4364],{"class":463,"line":603},[461,4360,4361],{"class":1643},"    allowWorkspace",[461,4363,592],{"class":501},[461,4365,4366],{"class":2507}," true\n",[433,4368,4369],{},"After the restart:",[433,4371,4372],{},[476,4373],{"alt":4374,"src":4375},"Successful confirmation message after executing workspace registration command in Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-success-confirmation.webp",[433,4377,4378,4379,4382],{},"One gotcha: this assumes the workspace folder (",[458,4380,4381],{},"TechVoyage"," in the screenshots) lives in the default user directory. Specify a full path otherwise. Any new session registered under this workspace via Buzz also appears in the DeepSeek Harness Web UI.",[433,4384,4385],{},[476,4386],{"alt":4387,"src":4388},"DeepSeek Harness Web UI displaying the active workspace session synchronized from Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-synced-workspace-session.webp",[444,4390,4392],{"id":4391},"available-commands","Available Commands",[433,4394,4395],{},"Everything that other supported platforms offer works seamlessly on Buzz:",[3279,4397,4398,4408],{},[3282,4399,4400],{},[3285,4401,4402,4405],{},[3288,4403,4404],{},"Command",[3288,4406,4407],{},"What it does",[3297,4409,4410,4419,4429,4439,4449,4459,4469,4479,4488,4508,4527],{},[3285,4411,4412,4416],{},[3302,4413,4414],{},[458,4415,4004],{},[3302,4417,4418],{},"Register an existing folder as the chat's workspace (config-gated)",[3285,4420,4421,4426],{},[3302,4422,4423],{},[458,4424,4425],{},"\u002Fhelp",[3302,4427,4428],{},"List available commands",[3285,4430,4431,4436],{},[3302,4432,4433],{},[458,4434,4435],{},"\u002Ftime",[3302,4437,4438],{},"Current time",[3285,4440,4441,4446],{},[3302,4442,4443],{},[458,4444,4445],{},"\u002Fnew",[3302,4447,4448],{},"Start a fresh session",[3285,4450,4451,4456],{},[3302,4452,4453],{},[458,4454,4455],{},"\u002Fclear",[3302,4457,4458],{},"Clear the conversation",[3285,4460,4461,4466],{},[3302,4462,4463],{},[458,4464,4465],{},"\u002Fstatus",[3302,4467,4468],{},"Bridge status",[3285,4470,4471,4476],{},[3302,4472,4473],{},[458,4474,4475],{},"\u002Fstats",[3302,4477,4478],{},"Chat count + per-bridge status lines (all platforms, incl. Buzz)",[3285,4480,4481,4485],{},[3302,4482,4483],{},[458,4484,890],{},[3302,4486,4487],{},"Every command descriptor",[3285,4489,4490,4495],{},[3302,4491,4492],{},[458,4493,4494],{},"@path\u002Fto\u002Ffile",[3302,4496,4497,4498,3176,4500,4503,4504,4507],{},"Works exactly like Web @ mentions — the model reads the file relative to the chat's workspace; a bare ",[458,4499,3861],{},[458,4501,4502],{},"@prefix",", or ",[458,4505,4506],{},"\u002Ffiles \u003Cprefix>"," replies with matching files\u002Ffolders from the same discovery source",[3285,4509,4510,4514],{},[3302,4511,4512],{},[458,4513,900],{},[3302,4515,4516,4519,4520,4522,4523,4526],{},[458,4517,4518],{},"[provider model effort]"," — validated against the live LLM catalog, switches that chat's model + effort; ",[458,4521,900],{}," alone lists options, ",[458,4524,4525],{},"\u002Fmodel reset"," restores defaults",[3285,4528,4529,4534],{},[3302,4530,4531],{},[458,4532,4533],{},"\u002Feffort",[3302,4535,4536,4539,4540,4543],{},[458,4537,4538],{},"\u003Cid>"," adjusts reasoning effort only; ",[458,4541,4542],{},"\u002Feffort reset"," restores the default",[444,4545,4547],{"id":4546},"security-in-snapshot","Security in Snapshot",[798,4549,4550,4562,4572],{},[562,4551,3642,4552,4554,4555,4557,4558,4561],{},[1142,4553,4139],{}," lives only in ",[458,4556,3548],{}," (0600, atomic write) — never in ",[458,4559,4560],{},"\u002Fgateway\u002Flist",", never in logs.",[562,4563,4564,4565,3557,4568,4571],{},"Every inbound event is ",[1142,4566,4567],{},"signature-verified",[458,4569,4570],{},"verifyEvent","), deduplicated, self-filtered, and mention-gated before it reaches the agent.",[562,4573,4574,3557,4577,4580],{},[1142,4575,4576],{},"Workspace registration is config-gated",[458,4578,4579],{},"allowWorkspace: false"," by default) since gateway sessions auto-approve.",[428,4582,4584],{"id":4583},"key-takeaways","Key Takeaways",[433,4586,4587,4588,4590],{},"The harder part of adding Buzz to ",[458,4589,3501],{}," was fulfilling the Nostr protocol contract. The existing plugin already provided a architectural foundation for per-chat sessions and command routing, making the bridge integration straightforward.",[428,4592,4594],{"id":4593},"references","References:",[798,4596,4597,4605,4613],{},[562,4598,4599,4604],{},[1546,4600,4603],{"href":4601,"rel":4602},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[1550],"dsh-message-gateway architecture guide"," — extension recipe, module map, security notes (bridges default to hidden)",[562,4606,4607,4612],{},[1546,4608,4611],{"href":4609,"rel":4610},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[1550],"nostr-tools"," — the Nostr library used under the hood",[562,4614,4615,4620],{},[1546,4616,4619],{"href":4617,"rel":4618},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[1550],"deer-flow IM channel connections"," — reference for IM channel connection patterns",[1082,4622,4623],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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}",{"title":423,"searchDepth":542,"depth":603,"links":4625},[4626,4627,4631,4638,4639],{"id":3526,"depth":542,"text":3527},{"id":3638,"depth":542,"text":3639,"children":4628},[4629,4630],{"id":3912,"depth":603,"text":3913},{"id":3940,"depth":603,"text":3941},{"id":4046,"depth":542,"text":4047,"children":4632},[4633,4634,4636,4637],{"id":4145,"depth":603,"text":4146},{"id":4296,"depth":603,"text":4635},"Enabling \u002Fworkspace",{"id":4391,"depth":603,"text":4392},{"id":4546,"depth":603,"text":4547},{"id":4583,"depth":542,"text":4584},{"id":4593,"depth":542,"text":4594},[1097,4641,4218,4642],"collaboration","deepseek-harness","2026-09-30","Integrate DeepSeek Harness with Block Buzz using a Nostr bridge. Configure NIP-42 auth, in-place message streaming, and per-channel agent workspaces.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002FEN-Bringing-Buzz-to-DeepSeek-Harness.webp","A premium 16:9 technology card with deep indigo and amber accents illustrating how to connect DeepSeek Harness to Block Buzz via a Nostr gateway, featuring a clean glassmorphic panel with centered typography.",{"schemaOrg":4648,"robots":1118,"sitemap":4670},[4649,4650],{"@type":1588,"headline":354,"description":4644,"image":4645},{"@type":1106,"name":354,"description":4644,"image":4645,"step":4651},[4652,4655,4658,4661,4664,4667],{"@type":1109,"name":4653,"text":4654},"Phase 1: Install Gateway Plugin","Install the dsh-message-gateway plugin and start the DSH web service.",{"@type":1109,"name":4656,"text":4657},"Phase 2: Access Message Platforms","Open the DSH Web UI and navigate to Message platforms settings.",{"@type":1109,"name":4659,"text":4660},"Phase 3: Configure Buzz Bridge","Generate a Nostr keypair, enter the Relay URL, and set channel subscriptions.",{"@type":1109,"name":4662,"text":4663},"Phase 4: Register Agent on Relay","Add the DSH assistant to the Buzz Nostr relay using buzz-admin.",{"@type":1109,"name":4665,"text":4666},"Phase 5: Assign Agent to Channel","Add the assistant HEX pubkey to designated channels using buzz-cli.",{"@type":1109,"name":4668,"text":4669},"Phase 6: Enable Workspace Access","Configure allowWorkspace in cordis.patch.yml to enable local folder commands.",{"lastmod":4643},{"title":4672,"description":4644,"ogTitle":354,"ogDescription":4644,"twitterTitle":354,"twitterDescription":4644},"DeepSeek Harness Buzz Plugin: Build a Nostr Bridge",[3645,3507,4674,1986,3501],"Nostr","3ILGY8-EUYBkB7RoFM4yH49qiefLt3OYDlH5S748n_g",1792489980150]