[{"data":1,"prerenderedAt":5987},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts":421,"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts-surround":1061},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"id":422,"title":423,"author":424,"body":425,"category":1038,"date":1040,"description":1041,"extension":1042,"image":1043,"imageAlt":1044,"isPublished":487,"meta":1045,"minRead":536,"navigation":487,"path":81,"seo":1051,"stem":1053,"tags":1054,"updatedAt":1059,"__hash__":1060},"article\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md","Cómo las habilidades de IA reemplazan scripts de Nuxt","",{"type":426,"value":427,"toc":1031},"minimark",[428,446,451,454,579,582,612,619,623,639,656,660,672,840,844,932,936,945,966,974,989,1001,1004,1010,1013,1019,1027],[429,430,431,432,436,437,440,441,445],"p",{},"Cuando iniciamos una nueva aplicación utilizando el framework Nuxt, tenemos que pasar por pasos tediosos como instalar módulos y establecer configuraciones como ",[433,434,435],"code",{},"nuxt.config.ts"," y ",[433,438,439],{},"wrangler.jsonc",". Un script puede resolver este problema, pero alcanza sus límites a medida que aumentan las variaciones. Por eso exploramos y reemplazamos los scripts con una ",[442,443,444],"strong",{},"habilidad de agente"," (agent skill).",[447,448,450],"h2",{"id":449},"en-qué-destacan-los-scripts-de-shell-tradicionales","En qué destacan los scripts de shell tradicionales",[429,452,453],{},"Un script es ideal para ejecutar un conjunto fijo de instrucciones en secuencia con decisiones predefinidas en el código.",[455,456,460],"pre",{"className":457,"code":458,"language":459,"meta":424,"style":424},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#!\u002Fusr\u002Fbin\u002Fenv bash\nset -e\n\nnpx nuxi@latest init \"$1\" --template minimal --packageManager pnpm --no-gitInit -M @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n\ncd \"$1\"\n\ncp ~\u002Ftemplates\u002Fnuxt.config.ts .\ncp ~\u002Ftemplates\u002Fwrangler.jsonc .\n","bash",[433,461,462,471,482,489,534,539,552,557,569],{"__ignoreMap":424},[463,464,467],"span",{"class":465,"line":466},"line",1,[463,468,470],{"class":469},"sHwdD","#!\u002Fusr\u002Fbin\u002Fenv bash\n",[463,472,474,478],{"class":465,"line":473},2,[463,475,477],{"class":476},"s2Zo4","set",[463,479,481],{"class":480},"sfazB"," -e\n",[463,483,485],{"class":465,"line":484},3,[463,486,488],{"emptyLinePlaceholder":487},true,"\n",[463,490,492,496,499,502,506,510,513,516,519,522,525,528,531],{"class":465,"line":491},4,[463,493,495],{"class":494},"sBMFI","npx",[463,497,498],{"class":480}," nuxi@latest",[463,500,501],{"class":480}," init",[463,503,505],{"class":504},"sMK4o"," \"",[463,507,509],{"class":508},"sHdIc","$1",[463,511,512],{"class":504},"\"",[463,514,515],{"class":480}," --template",[463,517,518],{"class":480}," minimal",[463,520,521],{"class":480}," --packageManager",[463,523,524],{"class":480}," pnpm",[463,526,527],{"class":480}," --no-gitInit",[463,529,530],{"class":480}," -M",[463,532,533],{"class":480}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[463,535,537],{"class":465,"line":536},5,[463,538,488],{"emptyLinePlaceholder":487},[463,540,542,545,547,549],{"class":465,"line":541},6,[463,543,544],{"class":476},"cd",[463,546,505],{"class":504},[463,548,509],{"class":508},[463,550,551],{"class":504},"\"\n",[463,553,555],{"class":465,"line":554},7,[463,556,488],{"emptyLinePlaceholder":487},[463,558,560,563,566],{"class":465,"line":559},8,[463,561,562],{"class":494},"cp",[463,564,565],{"class":480}," ~\u002Ftemplates\u002Fnuxt.config.ts",[463,567,568],{"class":480}," .\n",[463,570,572,574,577],{"class":465,"line":571},9,[463,573,562],{"class":494},[463,575,576],{"class":480}," ~\u002Ftemplates\u002Fwrangler.jsonc",[463,578,568],{"class":480},[429,580,581],{},"Este script funciona hasta que ocurre lo siguiente:",[583,584,585,592,602],"ul",{},[586,587,588,591],"li",{},[442,589,590],{},"Valores predeterminados fijos."," El script incluye de forma fija el módulo Nuxt UI; ¿qué pasa si queremos el módulo Ant Design UI? Cada nueva opción de módulo requiere otro argumento por parte del usuario.",[586,593,594,597,598,601],{},[442,595,596],{},"No puede leer la intención del usuario."," \"Construye un blog\" necesita ",[433,599,600],{},"@nuxt\u002Fcontent","; \"construye un sitio web con boletines informativos\" necesita Cloudflare D1 + Drizzle. Un script no puede distinguir la diferencia: cada variación requiere un nuevo script.",[586,603,604,607,608,611],{},[442,605,606],{},"Se vuelve obsoleto silenciosamente."," Las convenciones de Nuxt cambian entre versiones principales. Nuxt 4 cambió el directorio de origen a ",[433,609,610],{},"app\u002F",". Un script escrito para Nuxt 3 realiza el andamiaje (scaffolding) de la estructura incorrecta sin alertar nunca al usuario.",[429,613,614,615,618],{},"La ",[442,616,617],{},"inicialización de proyectos"," (app scaffolding) es un problema de decisión, no de ejecución. El script no escalará cuando aumente el número de decisiones.",[447,620,622],{"id":621},"por-qué-usar-una-habilidad-de-agente-de-ia-en-lugar-de-scripts-tradicionales","¿Por qué usar una habilidad de agente de IA en lugar de scripts tradicionales?",[429,624,625,626,629,630,633,634,638],{},"Una habilidad de agente de IA no es un conjunto de código que se ejecuta, sino un ",[442,627,628],{},"conjunto de conocimientos que el agente de IA sigue",". Contiene un archivo ",[433,631,632],{},"SKILL.md"," y puede empaquetar cualquier otro archivo que requiera la tarea (como documentos de referencia, plantillas y scripts ejecutables). El artículo, ",[635,636,637],"a",{"href":351},"Habilidades de los agentes de IA: qué son y cómo crearlas",", explica cómo funciona una habilidad de agente. Una habilidad mantiene la diligencia de un script mientras agrega el juicio razonable del que carece un script:",[583,640,641,644,647,650,653],{},[586,642,643],{},"Infiere la intención del usuario para determinar si la aplicación necesita una base de datos.",[586,645,646],{},"Decide qué módulos opcionales se necesitan a partir de la lista especificada. Por ejemplo, Nuxt Content, i18n y analíticas son opcionales según lo solicite el usuario.",[586,648,649],{},"Se adapta al ecosistema actual utilizando el último framework Nuxt, NuxtHub para los enlaces de Cloudflare y Wrangler para el despliegue.",[586,651,652],{},"Se recupera cuando un paso falla.",[586,654,655],{},"Realiza una verificación final con una lista de control antes de entregar el proyecto.",[447,657,659],{"id":658},"detrás-de-escena-de-nuestra-habilidad-de-scaffolding-para-nuxt-y-cloudflare","Detrás de escena de nuestra habilidad de scaffolding para Nuxt y Cloudflare",[429,661,662,663,671],{},"La habilidad, ",[635,664,668],{"href":665,"rel":666},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[667],"nofollow",[433,669,670],{},"scaffold-nuxt-cloudflare-app-skill",", guía a través de una inicialización orientada a producción:",[673,674,675,707,729,755,785,820,826],"ol",{},[586,676,677,680,681],{},[442,678,679],{},"Clarifica cualquier aspecto"," que no pueda inferirse:\n",[583,682,683,694,697],{},[586,684,685,686,689,690,693],{},"El kit de interfaz de usuario (",[442,687,688],{},"Nuxt UI"," por defecto o ",[442,691,692],{},"Antdv Next",");",[586,695,696],{},"Si se requiere una base de datos (como Cloudflare D1);",[586,698,699,700,703,704,706],{},"Módulos adicionales como ",[433,701,702],{},"@nuxtjs\u002Fi18n"," o ",[433,705,600],{}," para funciones de CMS.",[586,708,709,712,713,716,717,720,721,724,725,728],{},[442,710,711],{},"Inicializa la aplicación base"," con ",[433,714,715],{},"pnpm dlx nuxi@latest init"," para obtener la última versión del framework Nuxt con ",[433,718,719],{},"pnpm"," como gestor de paquetes. Luego configura las listas de permitidos para compilaciones nativas de modo que el entorno de compilación de Cloudflare pueda compilar ",[433,722,723],{},"better-sqlite3","\u002F",[433,726,727],{},"sharp",".",[586,730,731,734,735,703,738,741,742,741,745,741,748,741,751,754],{},[442,732,733],{},"Instala módulos a partir de una tabla de decisiones",": ",[433,736,737],{},"@nuxt\u002Fui",[433,739,740],{},"@antdv-next\u002Fnuxt",", ",[433,743,744],{},"@nuxt\u002Fimage",[433,746,747],{},"@nuxtjs\u002Fseo",[433,749,750],{},"@nuxthub\u002Fcore",[433,752,753],{},"@vueuse\u002Fnuxt",", además de Drizzle\u002FD1, Nuxt Content e i18n solo cuando se seleccionan.",[586,756,757,760,761],{},[442,758,759],{},"Organiza la estructura de directorios",":\n",[583,762,763,767,772,777,782],{},[586,764,765],{},[433,766,610],{},[586,768,769],{},[433,770,771],{},"server\u002F",[586,773,774],{},[433,775,776],{},"shared\u002F",[586,778,779],{},[433,780,781],{},"tests\u002F",[586,783,784],{},"archivos de configuración en la raíz.",[586,786,787,760,792],{},[442,788,789,790],{},"Configura ",[433,791,435],{},[583,793,794,803,810,815],{},[586,795,796,724,799,802],{},[433,797,798],{},"site.url",[433,800,801],{},"site.name"," para SEO",[586,804,805,806,809],{},"El bloque ",[433,807,808],{},"hub"," de NuxtHub para Cloudflare",[586,811,812],{},[433,813,814],{},"routeRules",[586,816,817],{},[433,818,819],{},"compatibilityDate",[586,821,822],{},[442,823,789,824],{},[433,825,439],{},[586,827,828,831,832,835,836,839],{},[442,829,830],{},"Configura Vitest y ESLint",", luego ejecuta una ",[442,833,834],{},"lista de verificación final"," que incluye ",[433,837,838],{},"pnpm install && pnpm dev"," antes de considerar el trabajo terminado.",[447,841,843],{"id":842},"scripts-de-shell-frente-a-habilidades-de-agentes-de-ia-una-comparación-directa","Scripts de shell frente a habilidades de agentes de IA: una comparación directa",[845,846,847,862],"table",{},[848,849,850],"thead",{},[851,852,853,856,859],"tr",{},[854,855],"th",{},[854,857,858],{},"Script",[854,860,861],{},"Habilidad",[863,864,865,877,888,899,910,921],"tbody",{},[851,866,867,871,874],{},[868,869,870],"td",{},"Intención del usuario",[868,872,873],{},"❌ valores fijos",[868,875,876],{},"✅ se adapta a la solicitud",[851,878,879,882,885],{},[868,880,881],{},"Toma de decisiones",[868,883,884],{},"solo con flags predefinidos",[868,886,887],{},"✅ evaluado en tiempo de ejecución",[851,889,890,893,896],{},[868,891,892],{},"Cambios de versión",[868,894,895],{},"reescritura manual",[868,897,898],{},"✅ verifica el estado actual",[851,900,901,904,907],{},[868,902,903],{},"Recuperación de errores",[868,905,906],{},"se detiene",[868,908,909],{},"✅ corrige y continúa",[851,911,912,915,918],{},[868,913,914],{},"Verificación de resultados",[868,916,917],{},"❌",[868,919,920],{},"✅ lista de verificación final",[851,922,923,926,929],{},[868,924,925],{},"Costo de mantenimiento",[868,927,928],{},"proliferación de flags, actualizaciones de versiones",[868,930,931],{},"editar Markdown, no código",[447,933,935],{"id":934},"cómo-instalar-habilidades-de-agentes-de-ia-con-la-cli-npx-skills","Cómo instalar habilidades de agentes de IA con la CLI npx skills",[429,937,938,939,944],{},"La instalación se realiza con un único comando utilizando la ",[635,940,943],{"href":941,"rel":942},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[667],"CLI de skills",":",[455,946,948],{"className":457,"code":947,"language":459,"meta":424,"style":424},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[433,949,950],{"__ignoreMap":424},[463,951,952,954,957,960,963],{"class":465,"line":466},[463,953,495],{"class":494},[463,955,956],{"class":480}," skills",[463,958,959],{"class":480}," add",[463,961,962],{"class":480}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[463,964,965],{"class":480}," -g\n",[429,967,968,969],{},"La CLI clona el repositorio, encuentra la habilidad y pregunta a cuál de los 77 agentes compatibles debe asignarse:\n",[970,971],"img",{"alt":972,"src":973},"Interfaz de línea de comandos que muestra la instalación de la habilidad de andamiaje de Nuxt usando el comando CLI npx skills add","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-add-scaffold-nuxt-installation.webp",[429,975,976,977,980,981,984,985],{},"Optamos por ",[442,978,979],{},"Symlink"," (el método recomendado), que instala la habilidad una vez en ",[433,982,983],{},"~\u002F.agents\u002Fskills"," y apunta cada agente seleccionado a esta copia única.\n",[970,986],{"alt":987,"src":988},"Pantalla de terminal que muestra el resumen de instalación y la configuración del enlace simbólico para las habilidades de agentes centralizadas","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-installation-summary-details.webp",[583,990,991],{},[586,992,993],{},[994,995,996,997,1000],"em",{},"Consulte este artículo, ",[635,998,999],{"href":359},"Evita fragmentar habilidades de agentes usando npx skills",", sobre cómo centralizar las habilidades de agentes en una única fuente de verdad.",[429,1002,1003],{},"Al abrir Claude Code se confirma que la habilidad se ha instalado correctamente.",[429,1005,1006],{},[970,1007],{"alt":1008,"src":1009},"Interfaz de línea de comandos de Claude Code que muestra el comando de barra diagonal scaffold-nuxt recién instalado, activo y listo para usar","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fclaude-code-scaffold-nuxt-slash-command-active.webp",[429,1011,1012],{},"A partir de ahí, una solicitud en lenguaje natural es todo lo que se necesita:",[1014,1015,1016],"blockquote",{},[429,1017,1018],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"",[429,1020,1021,1022,1026],{},"La habilidad es de código abierto; visite el ",[635,1023,1025],{"href":665,"rel":1024},[667],"repositorio de GitHub"," y pruébela.",[1028,1029,1030],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":424,"searchDepth":473,"depth":484,"links":1032},[1033,1034,1035,1036,1037],{"id":449,"depth":473,"text":450},{"id":621,"depth":473,"text":622},{"id":658,"depth":473,"text":659},{"id":842,"depth":473,"text":843},{"id":934,"depth":473,"text":935},[1039],"ai-agents","2026-08-25","Crea proyectos Nuxt en Cloudflare fácilmente. Descubre por qué los scripts tradicionales se quedan cortos ante las habilidades dinámicas de agentes de IA.","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002FES-How-AI-Agent-Skills-Replace-Nuxt-App-Scaffolding-Scripts.webp","Nuxt en Cloudflare: Habilidades de IA frente a Scripts - Comparación de scripts tradicionales y habilidades de agentes de IA para el andamiaje de Nuxt.",{"schemaOrg":1046,"robots":1049,"sitemap":1050},[1047],{"@type":1048,"headline":423,"description":1041,"image":1043},"TechArticle","index, follow",{"lastmod":1040},{"title":1052,"description":1041,"ogTitle":423,"ogDescription":1041,"twitterTitle":423,"twitterDescription":1041},"Nuxt en Cloudflare: Habilidades de IA frente a Scripts","es\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",[1055,1056,1057,1058],"Nuxt","Cloudflare","AI Agent","Scaffolding",null,"dZ-kSJrrj6PNvVF8SkUu7_xRh4n4upXy9IRbnb5aodM",{"surround":1062,"related":3821},[1063,1880],{"id":1064,"title":1065,"author":1059,"body":1066,"category":1862,"date":1864,"description":1865,"extension":1042,"image":1866,"imageAlt":1867,"isPublished":487,"meta":1868,"minRead":559,"navigation":487,"path":105,"seo":1873,"stem":1874,"tags":1875,"updatedAt":1059,"__hash__":1879},"article\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","Construir memoria persistente de IA con Cloudflare y MCP",{"type":426,"value":1067,"toc":1844},[1068,1072,1075,1078,1082,1085,1099,1103,1110,1124,1127,1130,1174,1179,1262,1266,1292,1404,1415,1419,1424,1468,1492,1496,1501,1574,1579,1583,1617,1625,1663,1667,1699,1703,1711,1716,1746,1750,1790,1794,1797,1800,1803,1807,1841],[447,1069,1071],{"id":1070},"la-importancia-de-la-memoria-persistente-de-ia-para-los-agentes","La importancia de la memoria persistente de IA para los agentes",[429,1073,1074],{},"A medida que los asistentes de IA se integran en nuestro día a día, nos encontramos con frecuencia con el problema del contexto en blanco. Las decisiones tomadas la semana pasada se olvidan, lo que nos obliga a introducir los mismos detalles del stack tecnológico y configurar las preferencias del usuario una y otra vez.",[429,1076,1077],{},"En lugar de empezar de cero cada vez, necesitamos construir un sistema de memoria que evolucione, comprenda continuamente las decisiones del usuario y elimine la necesidad de repetir el contexto.",[447,1079,1081],{"id":1080},"sistemas-de-memoria-autohospedados-frente-a-integrados","Sistemas de memoria autohospedados frente a integrados",[429,1083,1084],{},"Muchos agentes de IA vienen con memoria integrada, pero no usamos solo un agente para todo. Usamos Claude para diseñar y estructurar un proyecto, Kimi para programar y ChatGPT para investigar. El contexto no se comparte entre estos agentes; permanece aislado en cada uno de ellos.",[429,1086,1087,1088,1093,1094,1098],{},"Desde el punto de vista de la ingeniería de software, no confiamos en las cajas negras. Necesitamos un sistema de memoria de IA que sea observable, auditable y que esté bajo nuestro control. El proyecto de código abierto ",[635,1089,1092],{"href":1090,"rel":1091},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[667],"Second Brain",", un fork de ",[635,1095,1096],{"href":1096,"rel":1097},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare",[667],", proporciona un sistema de memoria persistente y autoalojado con soporte para Model Context Protocol (MCP). Cualquier agente de IA compatible, como Claude, ChatGPT o Kimi Code, puede compartir el mismo contexto.",[447,1100,1102],{"id":1101},"cómo-construir-un-second-brain-de-memoria-de-ia-en-cloudflare","Cómo construir un Second Brain de memoria de IA en Cloudflare",[429,1104,1105,1106,1109],{},"El sistema de memoria Second Brain se despliega en ",[442,1107,1108],{},"Cloudflare Workers",", lo que proporciona una infraestructura de servidores de ejecución de baja latencia y distribución global. Esto permite que la recuperación de memoria y otras operaciones se ejecuten con una latencia mínima para el bucle de razonamiento de la IA.",[429,1111,1112,1113,1116,1117,1120,1121,1123],{},"Se utiliza el modelo de embeddings de ",[442,1114,1115],{},"Workers AI"," para generar los vectores. Estos embeddings se almacenan en ",[442,1118,1119],{},"Cloudflare Vectorize",", que es una base de datos vectorial distribuida globalmente. ",[442,1122,1119],{}," realiza la búsqueda de similitud de coseno para encontrar memorias relacionadas semánticamente.",[429,1125,1126],{},"En Second Brain se implementan mecanismos de detección de duplicados y fusión inteligente. Se almacena el contenido con menos de un 85% de similitud; de lo contrario, se bloquea o se marca como candidato a duplicado. El texto que supera los 1.600 caracteres se divide en los límites de las oraciones o saltos de línea con un solapamiento de 200 caracteres para evitar la pérdida de contexto. Luego, cada fragmento se incrusta como un vector, lo que permite una coincidencia precisa.",[429,1128,1129],{},"Las siguientes herramientas se exponen como interfaces MCP para ser utilizadas en agentes de IA:",[583,1131,1132,1138,1144,1150,1156,1162,1168],{},[586,1133,1134,1137],{},[433,1135,1136],{},"remember",": Almacena ideas, decisiones, preferencias y contexto del proyecto.",[586,1139,1140,1143],{},[433,1141,1142],{},"append",": Añade una actualización a una memoria existente.",[586,1145,1146,1149],{},[433,1147,1148],{},"update",": Reemplaza una memoria existente.",[586,1151,1152,1155],{},[433,1153,1154],{},"recall",": Busca memorias por significado en lugar de por redacción exacta.",[586,1157,1158,1161],{},[433,1159,1160],{},"list_recent",": Explora las memorias guardadas recientemente.",[586,1163,1164,1167],{},[433,1165,1166],{},"forget",": Elimina permanentemente una memoria.",[586,1169,1170,1173],{},[433,1171,1172],{},"link\u002Fconnections",": Conecta memorias relacionadas (función de grafo de la v2).",[1175,1176,1178],"h3",{"id":1177},"configuración-de-second-brain-en-cloudflare","Configuración de Second Brain en Cloudflare",[673,1180,1181,1199,1206,1213,1220,1227,1238,1245,1248,1255],{},[586,1182,1183,1184,1187,1188,1193,1194,1198],{},"Haz clic en ",[433,1185,1186],{},"Deploy to Cloudflare"," en la página del ",[635,1189,1192],{"href":1190,"rel":1191},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[667],"Github repo",". [[",[970,1195],{"alt":1196,"src":1197},"Página de GitHub con el botón Deploy to Cloudflare destacado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[586,1200,1201,1202],{},"Completa el formulario de Cloudflare Worker.\n",[970,1203],{"alt":1204,"src":1205},"Formulario de configuración de despliegue de Cloudflare Workers","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[586,1207,1208,1209],{},"Introduce '384' para Dimensions, selecciona 'cosine' para Metric y haz clic en el botón Deploy.\n",[970,1210],{"alt":1211,"src":1212},"Pantalla de configuración para la creación de base de datos de Cloudflare Vectorize","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[586,1214,1215,1216],{},"A continuación se muestra la vista general de Second Brain en Cloudflare Worker:\n",[970,1217],{"alt":1218,"src":1219},"Panel de control general del worker de Second Brain desplegado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[586,1221,1222,1223],{},"Haz clic en 'Settings' y luego en el icono de edición de 'AUTH_TOKEN' para crear un token:\n",[970,1224],{"alt":1225,"src":1226},"Configuración de variables de Cloudflare Worker destacando AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[586,1228,1229,1230,1234],{},"Haz clic en el enlace 'Rotate' para introducir un nuevo valor: ",[970,1231],{"alt":1232,"src":1233},"Pantalla de modificación y rotación de la variable AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[970,1235],{"alt":1236,"src":1237},"Introduciendo la cadena aleatoria generada en el campo de valor AUTH_TOKEN","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[586,1239,1240,1241,1244],{},"Ejecuta el comando ",[433,1242,1243],{},"openssl rand -base64 32"," en la terminal de macOS para crear un valor aleatorio y pégalo en el campo de entrada 'Value'.",[586,1246,1247],{},"Haz clic en el botón 'Deploy' para actualizar el nuevo valor de 'AUTH_TOKEN'.",[586,1249,1250,1251],{},"Abre la URL del worker de Second Brain en el navegador web:\n",[970,1252],{"alt":1253,"src":1254},"Pantalla de inicio de sesión de la interfaz web de Second Brain con entrada de token Bearer","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[586,1256,1257,1258,1261],{},"Introduce el 'AUTH_TOKEN' creado en el campo de entrada ",[433,1259,1260],{},"Bearer token"," y haz clic en el botón 'Connect' para iniciar sesión en la interfaz web.",[1175,1263,1265],{"id":1264},"integración-de-claude-desktop-a-través-de-mcp","Integración de Claude Desktop a través de MCP",[673,1267,1268,1275,1282],{},[586,1269,1270,1271],{},"Haz clic en 'Customize' en Claude Desktop.\n",[970,1272],{"alt":1273,"src":1274},"Interfaz de Claude Desktop señalando el botón Customize","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[586,1276,1277,1278],{},"Haz clic en 'Developer' para editar manualmente el archivo de configuración de los servidores MCP:\n",[970,1279],{"alt":1280,"src":1281},"Menú de configuración de desarrollador de Claude Desktop para acceder a la configuración de MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[586,1283,1284,1285,1288,1289,944],{},"Añade el siguiente código a la sección ",[433,1286,1287],{},"mcpServers"," en ",[433,1290,1291],{},"claude_desktop_config.json",[455,1293,1297],{"className":1294,"code":1295,"language":1296,"meta":424,"style":424},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","    \"second-brain\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n        \"--header\",\n        \"Authorization: Bearer \u003Cyour-token>\"\n      ]\n    }\n","json",[433,1298,1299,1315,1337,1351,1363,1374,1385,1394,1399],{"__ignoreMap":424},[463,1300,1301,1304,1307,1309,1312],{"class":465,"line":466},[463,1302,1303],{"class":504},"    \"",[463,1305,1306],{"class":480},"second-brain",[463,1308,512],{"class":504},[463,1310,734],{"class":1311},"sTEyZ",[463,1313,1314],{"class":504},"{\n",[463,1316,1317,1320,1324,1326,1328,1330,1332,1334],{"class":465,"line":473},[463,1318,1319],{"class":504},"      \"",[463,1321,1323],{"class":1322},"spNyl","command",[463,1325,512],{"class":504},[463,1327,944],{"class":504},[463,1329,505],{"class":504},[463,1331,495],{"class":480},[463,1333,512],{"class":504},[463,1335,1336],{"class":504},",\n",[463,1338,1339,1341,1344,1346,1348],{"class":465,"line":484},[463,1340,1319],{"class":504},[463,1342,1343],{"class":1322},"args",[463,1345,512],{"class":504},[463,1347,944],{"class":504},[463,1349,1350],{"class":504}," [\n",[463,1352,1353,1356,1359,1361],{"class":465,"line":491},[463,1354,1355],{"class":504},"        \"",[463,1357,1358],{"class":480},"mcp-remote",[463,1360,512],{"class":504},[463,1362,1336],{"class":504},[463,1364,1365,1367,1370,1372],{"class":465,"line":536},[463,1366,1355],{"class":504},[463,1368,1369],{"class":480},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[463,1371,512],{"class":504},[463,1373,1336],{"class":504},[463,1375,1376,1378,1381,1383],{"class":465,"line":541},[463,1377,1355],{"class":504},[463,1379,1380],{"class":480},"--header",[463,1382,512],{"class":504},[463,1384,1336],{"class":504},[463,1386,1387,1389,1392],{"class":465,"line":554},[463,1388,1355],{"class":504},[463,1390,1391],{"class":480},"Authorization: Bearer \u003Cyour-token>",[463,1393,551],{"class":504},[463,1395,1396],{"class":465,"line":559},[463,1397,1398],{"class":504},"      ]\n",[463,1400,1401],{"class":465,"line":571},[463,1402,1403],{"class":504},"    }\n",[429,1405,1406,1410,1411],{},[970,1407],{"alt":1408,"src":1409},"JSON de configuración de MCP de Claude Desktop que contiene el servidor de Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. Reinicia Claude Desktop y verifica los 'Local MCP servers'. El estado debería ser 'running':\n",[970,1412],{"alt":1413,"src":1414},"Claude Desktop mostrando el estado activo para el servidor MCP de Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[1175,1416,1418],{"id":1417},"integración-de-claude-code-a-través-de-mcp","Integración de Claude Code a través de MCP",[583,1420,1421],{},[586,1422,1423],{},"Ejecuta el siguiente comando para añadir el MCP:",[455,1425,1429],{"className":1426,"code":1427,"language":1428,"meta":424,"style":424},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n","shell",[433,1430,1431],{"__ignoreMap":424},[463,1432,1433,1436,1439,1441,1444,1447,1450,1453,1456,1459,1462,1465],{"class":465,"line":466},[463,1434,1435],{"class":494},"claude",[463,1437,1438],{"class":480}," mcp",[463,1440,959],{"class":480},[463,1442,1443],{"class":480}," --transport",[463,1445,1446],{"class":480}," http",[463,1448,1449],{"class":480}," second-brain",[463,1451,1452],{"class":480}," https:\u002F\u002F",[463,1454,1455],{"class":504},"\u003C",[463,1457,1458],{"class":480},"your-worker-ur",[463,1460,1461],{"class":1311},"l",[463,1463,1464],{"class":504},">",[463,1466,1467],{"class":480},"\u002Fmcp\n",[583,1469,1470,1476],{},[586,1471,1472,1473,728],{},"Claude Code detectará que el endpoint requiere OAuth y abrirá la página de inicio de sesión en el navegador web para introducir el ",[433,1474,1475],{},"AUTH_TOKEN",[586,1477,1478,1479,1482,1483,1486,1487,728],{},"Crea el archivo ",[433,1480,1481],{},"CLAUDE.md"," en la carpeta ",[433,1484,1485],{},"~\u002F.claude"," con las instrucciones de ",[635,1488,1491],{"href":1489,"rel":1490},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[667],"CLAUDE_INSTRUCTIONS.md",[1175,1493,1495],{"id":1494},"integración-de-gemini-cli-a-través-de-mcp","Integración de Gemini CLI a través de MCP",[673,1497,1498],{},[586,1499,1500],{},"Añade los siguientes ajustes del servidor MCP a '.\u002F.gemini\u002Fsettings.json':",[455,1502,1504],{"className":1294,"code":1503,"language":1296,"meta":424,"style":424},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[433,1505,1506,1518,1537,1551,1565,1570],{"__ignoreMap":424},[463,1507,1508,1510,1512,1514,1516],{"class":465,"line":466},[463,1509,1303],{"class":504},[463,1511,1306],{"class":480},[463,1513,512],{"class":504},[463,1515,734],{"class":1311},[463,1517,1314],{"class":504},[463,1519,1520,1522,1525,1527,1529,1531,1533,1535],{"class":465,"line":473},[463,1521,1319],{"class":504},[463,1523,1524],{"class":1322},"httpUrl",[463,1526,512],{"class":504},[463,1528,944],{"class":504},[463,1530,505],{"class":504},[463,1532,1369],{"class":480},[463,1534,512],{"class":504},[463,1536,1336],{"class":504},[463,1538,1539,1541,1544,1546,1548],{"class":465,"line":484},[463,1540,1319],{"class":504},[463,1542,1543],{"class":1322},"oauth",[463,1545,512],{"class":504},[463,1547,944],{"class":504},[463,1549,1550],{"class":504}," {\n",[463,1552,1553,1555,1558,1560,1562],{"class":465,"line":491},[463,1554,1355],{"class":504},[463,1556,1557],{"class":494},"enabled",[463,1559,512],{"class":504},[463,1561,944],{"class":504},[463,1563,1564],{"class":504}," true\n",[463,1566,1567],{"class":465,"line":536},[463,1568,1569],{"class":504},"      }\n",[463,1571,1572],{"class":465,"line":541},[463,1573,1403],{"class":504},[673,1575,1576],{"start":473},[586,1577,1578],{},"Inicia Gemini CLI.",[1175,1580,1582],{"id":1581},"prueba-de-second-brain-en-agentes-de-ia","Prueba de Second Brain en agentes de IA",[673,1584,1585,1596,1610],{},[586,1586,1587,1588,1591,1592],{},"Al empezar con una configuración sencilla de paleta de colores de marca en ",[442,1589,1590],{},"Claude Desktop",", no se llama a Second Brain.\n",[970,1593],{"alt":1594,"src":1595},"Primera prueba en Claude Desktop sin la capa de memoria de Second Brain activa","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[586,1597,1598,1599,1602,1603,1605,1606],{},"Al probar con la palabra clave 'remember', solo se utilizan las herramientas ",[433,1600,1601],{},"memory_user-edits"," integradas en ",[442,1604,1590],{},", pero no Second Brain.\n",[970,1607],{"alt":1608,"src":1609},"Claude Desktop recurriendo a las ediciones de usuario integradas locales en lugar de Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[586,1611,1612,1613,1616],{},"Al probar el siguiente prompt en ",[442,1614,1615],{},"Claude Code",", se llamó a Second Brain:",[455,1618,1623],{"className":1619,"code":1621,"language":1622},[1620],"language-text","Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n","text",[433,1624,1621],{"__ignoreMap":424},[429,1626,1627,1631,1632,760,1635,1639,1640,1643,1644,1646,1647,1651,1652,1655,1656,1639,1660],{},[970,1628],{"alt":1629,"src":1630},"Ventana de terminal de Claude Code mostrando el activador exitoso de Second Brain MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. Se verificó la configuración de colores en ",[442,1633,1634],{},"Second Brain en Cloudflare",[970,1636],{"alt":1637,"src":1638},"Verificando los códigos de color de marca guardados en la interfaz web de la base de datos de Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[994,1641,1642],{},"La razón por la que funcionó en Claude Code fue porque CLAUDE_INSTRUCTIONS.md contiene las palabras clave de 'Second Brain'.","\n5. Al incluir 'Second Brain' como palabras clave en ",[442,1645,1590],{},", es necesario especificarlas explícitamente para almacenar y recuperar de la capa de memoria de Second Brain.\n",[970,1648],{"alt":1649,"src":1650},"Activando Second Brain en Claude Desktop mencionando explícitamente palabras clave","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. También es necesario mencionar las palabras clave 'Second Brain' en ",[442,1653,1654],{},"Gemini CLI"," para activar el MCP de Second Brain.\n",[970,1657],{"alt":1658,"src":1659},"Ventana de terminal de Gemini CLI demostrando llamadas exitosas a Second Brain MCP","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[994,1661,1662],{},"Añadir instrucciones similares a GEMINI.md, al igual que se hizo en CLAUDE_INSTRUCTIONS.md, activará Second Brain sin necesidad de mencionar las palabras clave de forma explícita.",[1175,1664,1666],{"id":1665},"extensiones-para-navegadores-web","Extensiones para navegadores web",[583,1668,1669,1672],{},[586,1670,1671],{},"Hay extensiones disponibles para los navegadores Chrome, Firefox y Microsoft Edge.",[586,1673,1674,1675],{},"Estas extensiones sirven para:\n",[583,1676,1677,1683,1689],{},[586,1678,1679,1682],{},[442,1680,1681],{},"Capturar la página actual",": guarda el título y la URL en Second Brain.",[586,1684,1685,1688],{},[442,1686,1687],{},"Capturar texto resaltado",": selecciona cualquier texto en una página antes de hacer clic en capturar; el fragmento se guarda junto con el título y la URL.",[586,1690,1691,1694,1695,1698],{},[442,1692,1693],{},"Añadir una nota",": escribe contexto o ",[433,1696,1697],{},"#hashtags"," en la ventana emergente antes de guardar; los hashtags se extraen automáticamente como etiquetas.",[1175,1700,1702],{"id":1701},"sincronización-del-conocimiento-personal-con-el-plugin-de-obsidian","Sincronización del conocimiento personal con el plugin de Obsidian",[583,1704,1705,1708],{},[586,1706,1707],{},"Existe un plugin de Obsidian disponible para sincronizar las notas de tu Obsidian Vault con tu Second Brain en Cloudflare.",[586,1709,1710],{},"Las notas pueden ser etiquetadas para su sincronización con Second Brain.",[1712,1713,1715],"h4",{"id":1714},"instalar-el-plugin-de-obsidian","Instalar el plugin de Obsidian",[673,1717,1718,1725,1732,1739],{},[586,1719,1720,1721],{},"Abre Obsidian → Settings → Community Plugins\n",[970,1722],{"alt":1723,"src":1724},"Panel de configuración de Obsidian navegando a la sección Community Plugins","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[586,1726,1727,1728],{},"Haz clic en el botón 'Browse'.\n",[970,1729],{"alt":1730,"src":1731},"Página de búsqueda de plugins de comunidad de Obsidian mostrando el botón Browse","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[586,1733,1734,1735],{},"Busca 'Second Brain Sync'.\n",[970,1736],{"alt":1737,"src":1738},"Buscando el plugin Second Brain Sync en la tienda de plugins de Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[586,1740,1741,1742],{},"Haz clic en el botón 'Install' y luego en 'Enable'.\n",[970,1743],{"alt":1744,"src":1745},"Instalando y activando el plugin Second Brain Sync en Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[1712,1747,1749],{"id":1748},"configurar-el-plugin-de-obsidian","Configurar el plugin de Obsidian",[673,1751,1752,1755,1762,1769,1776,1783],{},[586,1753,1754],{},"Abre Obsidian → Settings → Second Brain Sync",[586,1756,1757,1758],{},"Introduce la 'URL' y el 'Auth token'.\n",[970,1759],{"alt":1760,"src":1761},"Introduciendo la URL del Worker y el Token de autorización en la configuración de Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[586,1763,1764,1765],{},"Haz clic en el botón 'Test' para verificar la conexión.\n",[970,1766],{"alt":1767,"src":1768},"Prueba de conexión del plugin de Obsidian mostrando una verificación exitosa","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[586,1770,1771,1772],{},"Configura los comportamientos de sincronización. Establece la 'Sync tag' y habilita 'Auto-sync on save'.\n",[970,1773],{"alt":1774,"src":1775},"Configurando el Sync Tag y activando Auto-sync on save en Obsidian","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[586,1777,1778,1779],{},"Crea una nota en Obsidian con la etiqueta 'second-brain', tal como se configuró en 'Sync tag'.\n",[970,1780],{"alt":1781,"src":1782},"Creando una nueva nota en Obsidian etiquetada con second-brain para su sincronización","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[586,1784,1785,1786],{},"La nota se ha guardado y sincronizado con el Second Brain desplegado en Cloudflare.\n",[970,1787],{"alt":1788,"src":1789},"Verificando la nota de Obsidian sincronizada con éxito en la interfaz web de Second Brain","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[447,1791,1793],{"id":1792},"conclusión","Conclusión",[429,1795,1796],{},"Second Brain proporciona una solución de código abierto a uno de los problemas más frustrantes de la IA: la memoria persistente. Al combinarlo con la infraestructura de Cloudflare, ofrece una capa de memoria totalmente autoalojada y distribuida globalmente con baja latencia. Las herramientas MCP integradas en Second Brain hacen que esta memoria sea portátil entre todos los agentes de IA.",[429,1798,1799],{},"El plugin de Obsidian extiende Second Brain a la gestión del conocimiento personal. Las notas de un vault de Obsidian se pueden sincronizar de forma selectiva con Second Brain, transformando notas sin procesar en un contexto estructurado que los agentes de IA pueden comprender y recuperar semánticamente.",[429,1801,1802],{},"Al combinar autohospedaje, búsqueda semántica e integración MCP basada en estándares, Second Brain demuestra ser más que una simple capa de memoria: es una base práctica para construir un ecosistema de IA.",[447,1804,1806],{"id":1805},"referencias","Referencias:",[583,1808,1809,1815,1821,1828,1835],{},[586,1810,1811],{},[635,1812,1813],{"href":1813,"rel":1814},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[667],[586,1816,1817],{},[635,1818,1819],{"href":1819,"rel":1820},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[667],[586,1822,1823],{},[635,1824,1827],{"href":1825,"rel":1826},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[667],"Connect to AI Clients",[586,1829,1830],{},[635,1831,1834],{"href":1832,"rel":1833},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[667],"Second Brain Obsidian Plugin",[586,1836,1837],{},[635,1838,1839],{"href":1839,"rel":1840},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[667],[1028,1842,1843],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":424,"searchDepth":473,"depth":484,"links":1845},[1846,1847,1848,1860,1861],{"id":1070,"depth":473,"text":1071},{"id":1080,"depth":473,"text":1081},{"id":1101,"depth":473,"text":1102,"children":1849},[1850,1851,1852,1853,1854,1855,1856],{"id":1177,"depth":484,"text":1178},{"id":1264,"depth":484,"text":1265},{"id":1417,"depth":484,"text":1418},{"id":1494,"depth":484,"text":1495},{"id":1581,"depth":484,"text":1582},{"id":1665,"depth":484,"text":1666},{"id":1701,"depth":484,"text":1702,"children":1857},[1858,1859],{"id":1714,"depth":491,"text":1715},{"id":1748,"depth":491,"text":1749},{"id":1792,"depth":473,"text":1793},{"id":1805,"depth":473,"text":1806},[1863,1039],"cloudflare","2026-08-07","Crea un sistema de memoria IA persistente y autoalojado en Cloudflare con Second Brain y MCP. Comparte el contexto entre Claude, Gemini y Obsidian hoy mismo.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FES-Use-Cloudflare-as-AI-memory.webp","Un sistema de memoria de IA persistente y autoalojado en Cloudflare Workers y Vectorize con soporte de MCP y sincronización de Obsidian.",{"schemaOrg":1869,"robots":1049,"sitemap":1872},[1870],{"@type":1048,"headline":1871,"description":1865},"Sistema de memoria persistente de IA con Cloudflare y MCP",{"lastmod":1864},{"title":1871,"description":1865,"ogTitle":1065,"ogDescription":1865,"twitterTitle":1065,"twitterDescription":1865},"es\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[1056,1876,1877,1092,1878],"MCP","Memoria de IA","Obsidian","-wBuyPnmI3SkMsaQHsQngMepodb3zL1KLOZkrSblLew",{"id":1881,"title":1882,"author":1059,"body":1883,"category":3798,"date":3800,"description":3801,"extension":1042,"image":3802,"imageAlt":3803,"isPublished":487,"meta":3804,"minRead":3812,"navigation":487,"path":87,"seo":3813,"stem":3814,"tags":3815,"updatedAt":3819,"__hash__":3820},"article\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek.md","Aloja tus propios itinerarios de viaje con TREK y Docker",{"type":426,"value":1884,"toc":3757},[1885,1888,1891,1894,1898,1902,2090,2094,2102,2122,2125,2129,2234,2245,2248,2253,2256,2268,2272,2276,2279,2282,2320,2324,2327,2361,2364,2406,2409,2414,2425,2429,2436,2440,2443,2537,2541,2547,2551,2558,2562,2565,2583,2593,2597,2600,2610,2614,2618,2625,2629,2633,2636,2640,2644,2647,2652,2655,2660,2666,2670,2674,2677,2681,2695,2700,2706,2711,2715,2718,2723,2728,2731,2738,2742,2745,2748,2758,2765,2770,2776,2781,2785,2790,2795,2798,2803,2807,2813,2817,2822,2826,2829,2832,2837,2842,2847,2851,2858,2863,2868,2873,2878,2882,2887,2892,2898,2902,2905,2909,2915,2920,2925,2931,2936,2941,2946,2959,2963,2968,2989,2994,2997,3001,3004,3009,3012,3060,3064,3071,3077,3082,3088,3093,3099,3104,3110,3113,3118,3124,3129,3135,3139,3145,3150,3155,3159,3163,3166,3170,3173,3180,3184,3191,3195,3207,3216,3220,3224,3234,3242,3247,3254,3259,3266,3270,3273,3425,3431,3435,3438,3443,3446,3452,3456,3463,3467,3470,3475,3482,3487,3491,3501,3568,3584,3587,3592,3596,3600,3609,3686,3696,3699,3703,3707,3710,3714,3717,3720,3729,3731,3754],[429,1886,1887],{},"La parte más tediosa de planificar un viaje es que los PDFs de las reservas de vuelos, las confirmaciones de hoteles, las conversaciones con los compañeros de viaje y las listas de lugares para visitar suelen estar dispersos por todas partes. Y cuando llega el momento de calcular el gasto total y dividir las cuentas, se requiere un esfuerzo enorme para revisar todo ese historial de datos.",[429,1889,1890],{},"TREK es un planificador de viajes de código abierto que puedes autohospedar, reuniendo tu itinerario, reservas, presupuesto y listas de equipaje en un solo lugar. Su servidor MCP integrado permite que los agentes de IA (como Claude Desktop) gestionen directamente los datos de tus viajes.",[429,1892,1893],{},"Esta guía te acompañará paso a paso, desde el despliegue hasta la gestión completa de un viaje real de principio a fin.",[1175,1895,1897],{"id":1896},"_1-cómo-desplegar-el-planificador-de-viajes-trek-usando-docker","1. Cómo desplegar el planificador de viajes TREK usando Docker",[1712,1899,1901],{"id":1900},"instalar-docker-en-un-vps-ubuntu","Instalar Docker en un VPS Ubuntu",[455,1903,1905],{"className":457,"code":1904,"language":459,"meta":424,"style":424},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Verify docker is installed\ndocker --version\n\n# Starts automatically when your system boots\nsudo systemctl enable docker\n",[433,1906,1907,1912,1941,1945,1950,1993,1997,2002,2013,2017,2023,2045,2050,2056,2065,2070,2076],{"__ignoreMap":424},[463,1908,1909],{"class":465,"line":466},[463,1910,1911],{"class":469},"# Add Docker's official GPG key and set up the Docker repository\n",[463,1913,1914,1917,1920,1923,1926,1929,1932,1935,1938],{"class":465,"line":473},[463,1915,1916],{"class":494},"curl",[463,1918,1919],{"class":480}," -fsSL",[463,1921,1922],{"class":480}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[463,1924,1925],{"class":504}," |",[463,1927,1928],{"class":494}," sudo",[463,1930,1931],{"class":480}," gpg",[463,1933,1934],{"class":480}," --dearmor",[463,1936,1937],{"class":480}," -o",[463,1939,1940],{"class":480}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[463,1942,1943],{"class":465,"line":484},[463,1944,488],{"emptyLinePlaceholder":487},[463,1946,1947],{"class":465,"line":491},[463,1948,1949],{"class":469},"# Add the official Docker repository\n",[463,1951,1952,1955,1957,1960,1963,1966,1969,1972,1975,1977,1979,1981,1984,1987,1990],{"class":465,"line":536},[463,1953,1954],{"class":476},"echo",[463,1956,505],{"class":504},[463,1958,1959],{"class":480},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[463,1961,1962],{"class":504},"$(",[463,1964,1965],{"class":494},"lsb_release",[463,1967,1968],{"class":480}," -cs",[463,1970,1971],{"class":504},")",[463,1973,1974],{"class":480}," stable",[463,1976,512],{"class":504},[463,1978,1925],{"class":504},[463,1980,1928],{"class":494},[463,1982,1983],{"class":480}," tee",[463,1985,1986],{"class":480}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[463,1988,1989],{"class":504}," >",[463,1991,1992],{"class":480}," \u002Fdev\u002Fnull\n",[463,1994,1995],{"class":465,"line":541},[463,1996,488],{"emptyLinePlaceholder":487},[463,1998,1999],{"class":465,"line":554},[463,2000,2001],{"class":469},"# Update package list\n",[463,2003,2004,2007,2010],{"class":465,"line":559},[463,2005,2006],{"class":494},"sudo",[463,2008,2009],{"class":480}," apt",[463,2011,2012],{"class":480}," update\n",[463,2014,2015],{"class":465,"line":571},[463,2016,488],{"emptyLinePlaceholder":487},[463,2018,2020],{"class":465,"line":2019},10,[463,2021,2022],{"class":469},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[463,2024,2026,2028,2030,2033,2036,2039,2042],{"class":465,"line":2025},11,[463,2027,2006],{"class":494},[463,2029,2009],{"class":480},[463,2031,2032],{"class":480}," install",[463,2034,2035],{"class":480}," docker-ce",[463,2037,2038],{"class":480}," docker-ce-cli",[463,2040,2041],{"class":480}," containerd.io",[463,2043,2044],{"class":480}," -y\n",[463,2046,2048],{"class":465,"line":2047},12,[463,2049,488],{"emptyLinePlaceholder":487},[463,2051,2053],{"class":465,"line":2052},13,[463,2054,2055],{"class":469},"# Verify docker is installed\n",[463,2057,2059,2062],{"class":465,"line":2058},14,[463,2060,2061],{"class":494},"docker",[463,2063,2064],{"class":480}," --version\n",[463,2066,2068],{"class":465,"line":2067},15,[463,2069,488],{"emptyLinePlaceholder":487},[463,2071,2073],{"class":465,"line":2072},16,[463,2074,2075],{"class":469},"# Starts automatically when your system boots\n",[463,2077,2079,2081,2084,2087],{"class":465,"line":2078},17,[463,2080,2006],{"class":494},[463,2082,2083],{"class":480}," systemctl",[463,2085,2086],{"class":480}," enable",[463,2088,2089],{"class":480}," docker\n",[1712,2091,2093],{"id":2092},"generar-la-clave-de-cifrado","Generar la clave de cifrado",[429,2095,2096,2097,2101],{},"TREK utiliza una clave para cifrar datos confidenciales. Usa el siguiente comando o esta ",[635,2098,2100],{"href":2099},"\u002Fes\u002Ftools\u002Fsecret-key-hex","herramienta en línea"," para generar tu clave de cifrado:",[455,2103,2105],{"className":457,"code":2104,"language":459,"meta":424,"style":424},"openssl rand -hex 32\n",[433,2106,2107],{"__ignoreMap":424},[463,2108,2109,2112,2115,2118],{"class":465,"line":466},[463,2110,2111],{"class":494},"openssl",[463,2113,2114],{"class":480}," rand",[463,2116,2117],{"class":480}," -hex",[463,2119,2121],{"class":2120},"sbssI"," 32\n",[429,2123,2124],{},"Guárdala en un lugar seguro; si la pierdes, no podrás acceder a los datos cifrados.",[1712,2126,2128],{"id":2127},"iniciar-el-contenedor","Iniciar el contenedor",[455,2130,2132],{"className":457,"code":2131,"language":459,"meta":424,"style":424},"docker run -d \\\n  --name trek \\\n  -p 3000:3000 \\\n  -e ENCRYPTION_KEY=\"\u003Cgenerated_key>\" \\\n  -e APP_URL=\"https:\u002F\u002Ftrek.pafor.me\" \\\n  -v .\u002Fdata:\u002Fapp\u002Fdata \\\n  -v .\u002Fuploads:\u002Fapp\u002Fuploads \\\n  --restart unless-stopped \\\n  mauriceboe\u002Ftrek:latest\n",[433,2133,2134,2147,2157,2167,2184,2200,2210,2219,2229],{"__ignoreMap":424},[463,2135,2136,2138,2141,2144],{"class":465,"line":466},[463,2137,2061],{"class":494},[463,2139,2140],{"class":480}," run",[463,2142,2143],{"class":480}," -d",[463,2145,2146],{"class":1311}," \\\n",[463,2148,2149,2152,2155],{"class":465,"line":473},[463,2150,2151],{"class":480},"  --name",[463,2153,2154],{"class":480}," trek",[463,2156,2146],{"class":1311},[463,2158,2159,2162,2165],{"class":465,"line":484},[463,2160,2161],{"class":480},"  -p",[463,2163,2164],{"class":480}," 3000:3000",[463,2166,2146],{"class":1311},[463,2168,2169,2172,2175,2177,2180,2182],{"class":465,"line":491},[463,2170,2171],{"class":480},"  -e",[463,2173,2174],{"class":480}," ENCRYPTION_KEY=",[463,2176,512],{"class":504},[463,2178,2179],{"class":480},"\u003Cgenerated_key>",[463,2181,512],{"class":504},[463,2183,2146],{"class":1311},[463,2185,2186,2188,2191,2193,2196,2198],{"class":465,"line":536},[463,2187,2171],{"class":480},[463,2189,2190],{"class":480}," APP_URL=",[463,2192,512],{"class":504},[463,2194,2195],{"class":480},"https:\u002F\u002Ftrek.pafor.me",[463,2197,512],{"class":504},[463,2199,2146],{"class":1311},[463,2201,2202,2205,2208],{"class":465,"line":541},[463,2203,2204],{"class":480},"  -v",[463,2206,2207],{"class":480}," .\u002Fdata:\u002Fapp\u002Fdata",[463,2209,2146],{"class":1311},[463,2211,2212,2214,2217],{"class":465,"line":554},[463,2213,2204],{"class":480},[463,2215,2216],{"class":480}," .\u002Fuploads:\u002Fapp\u002Fuploads",[463,2218,2146],{"class":1311},[463,2220,2221,2224,2227],{"class":465,"line":559},[463,2222,2223],{"class":480},"  --restart",[463,2225,2226],{"class":480}," unless-stopped",[463,2228,2146],{"class":1311},[463,2230,2231],{"class":465,"line":571},[463,2232,2233],{"class":480},"  mauriceboe\u002Ftrek:latest\n",[583,2235,2236],{},[586,2237,2238,2244],{},[442,2239,2240,2243],{},[433,2241,2242],{},"APP_URL"," debe estar configurado correctamente"," — el flujo de descubrimiento OAuth del servidor MCP depende de ello. Establécelo con tu dirección HTTPS pública definitiva desde el principio.",[429,2246,2247],{},"La primera ejecución tardará un poco mientras descarga la imagen:",[970,2249],{"src":2250,"alt":2251,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-pull-image.webp","Logs de docker pull y run para TREK","max-width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2254,2255],{},"Verifica que esté funcionando:",[455,2257,2259],{"className":457,"code":2258,"language":459,"meta":424,"style":424},"docker ps\n",[433,2260,2261],{"__ignoreMap":424},[463,2262,2263,2265],{"class":465,"line":466},[463,2264,2061],{"class":494},[463,2266,2267],{"class":480}," ps\n",[970,2269],{"src":2270,"alt":2271,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-ps-status.webp","Verificación del estado del contenedor en ejecución mediante docker ps",[1175,2273,2275],{"id":2274},"_2-configuración-de-enrutamiento-de-dominio-y-ssl-con-caddy-reverse-proxy","2. Configuración de enrutamiento de dominio y SSL con Caddy Reverse Proxy",[429,2277,2278],{},"Se requiere HTTPS para las llaves de acceso (passkeys) y OAuth para MCP. El nombre de dominio se aloja en Cloudflare, que incluye un certificado SSL gratuito y protección contra DDoS.",[429,2280,2281],{},"Caddy se configura como el servidor proxy inverso seguro apuntando al puerto 3000. Un ejemplo de Caddyfile es el siguiente:",[455,2283,2285],{"className":1294,"code":2284,"language":1296,"meta":424,"style":424},"{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n",[433,2286,2287,2300,2305,2315],{"__ignoreMap":424},[463,2288,2289,2292,2295,2298],{"class":465,"line":466},[463,2290,2291],{"class":504},"{",[463,2293,2294],{"class":1311},"$TREK_DOMAIN",[463,2296,2297],{"class":504},"}",[463,2299,1550],{"class":504},[463,2301,2302],{"class":465,"line":473},[463,2303,2304],{"class":1311},"  encode zstd gzip\n",[463,2306,2307,2310,2312],{"class":465,"line":484},[463,2308,2309],{"class":1311},"  reverse_proxy host.docker.internal",[463,2311,944],{"class":504},[463,2313,2314],{"class":2120},"3000\n",[463,2316,2317],{"class":465,"line":491},[463,2318,2319],{"class":504},"}\n",[1175,2321,2323],{"id":2322},"_3-configuración-inicial-y-creación-del-administrador-seguro","3. Configuración inicial y creación del administrador seguro",[429,2325,2326],{},"Hay dos formas de crear la cuenta de administrador:",[583,2328,2329,2340],{},[586,2330,2331,2339],{},[442,2332,2333,436,2336],{},[433,2334,2335],{},"ADMIN_EMAIL",[433,2337,2338],{},"ADMIN_PASSWORD"," se configuran como variables de entorno; estos valores se usarán directamente.",[586,2341,2342],{},[442,2343,2344,2345,2348,2349,2352,2353,2356,2357,2360],{},"TREK crea el correo ",[433,2346,2347],{},"admin@trek.local",", el usuario ",[433,2350,2351],{},"admin"," y una ",[433,2354,2355],{},"contraseña generada aleatoriamente que se imprime en los registros del contenedor",". Ejecuta ",[433,2358,2359],{},"docker logs trek"," para obtenerla.",[429,2362,2363],{},"Si no puedes encontrar la contraseña en los registros, puedes restablecerla con:",[455,2365,2367],{"className":457,"code":2366,"language":459,"meta":424,"style":424},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[433,2368,2369],{"__ignoreMap":424},[463,2370,2371,2373,2376,2379,2382,2385,2387,2390,2393,2396,2398,2400,2403],{"class":465,"line":466},[463,2372,2061],{"class":494},[463,2374,2375],{"class":480}," exec",[463,2377,2378],{"class":480}," -it",[463,2380,2381],{"class":480}," -e",[463,2383,2384],{"class":480}," RESET_ADMIN_EMAIL=admin@trek.local",[463,2386,2381],{"class":480},[463,2388,2389],{"class":480}," RESET_ADMIN_PASSWORD=",[463,2391,2392],{"class":504},"'",[463,2394,2395],{"class":480},"YourNewPassword",[463,2397,2392],{"class":504},[463,2399,2154],{"class":480},[463,2401,2402],{"class":480}," node",[463,2404,2405],{"class":480}," server\u002Freset-admin.js\n",[429,2407,2408],{},"Se te pedirá que cambies la contraseña la primera vez que inicies sesión.",[970,2410],{"src":2411,"alt":2412,"style":2413},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-initial-login-password-prompt.webp","Solicitud de inicio de sesión inicial y restablecimiento de contraseña de administrador","max-width: 215px; width:100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2415,1183,2416,2419,2420],{},[442,2417,2418],{},"Admin"," y actualiza el correo electrónico:",[970,2421],{"src":2422,"alt":2423,"style":2424},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-email-update-panel.webp","Configuración de correo electrónico personalizado en los ajustes de administración de TREK","max-width: 700px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2426,2428],{"id":2427},"_31-copias-de-seguridad-backups","3.1 Copias de seguridad (Backups)",[429,2430,2431,2432],{},"Configura las copias de seguridad automáticas con una política de retención en el panel de administración:\n",[970,2433],{"src":2434,"alt":2435,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-backup-retention-policy.webp","Configuración de programaciones de respaldo automatizadas y reglas de retención",[1712,2437,2439],{"id":2438},"_32-almacenar-archivos-subidos-en-cloudflare-r2","3.2 Almacenar archivos subidos en Cloudflare R2",[429,2441,2442],{},"Almacenar archivos subidos, fotos y copias de seguridad en Cloudflare R2 mantiene el disco del VPS limpio y ligero. TREK admite backends compatibles con S3, y Cloudflare R2 se adapta a esto a la perfección.",[673,2444,2445,2451,2464,2474,2485,2499,2511,2526],{},[586,2446,2447,2448,728],{},"Crea un cubo (bucket) R2 llamado ",[433,2449,2450],{},"trek",[586,2452,2453,2454,2457,2458,2459],{},"En la sección ",[442,2455,2456],{},"Account Details",", busca tu ID de cuenta:","\n  ",[970,2460],{"src":2461,"alt":2462,"style":2463},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-account-details-id.webp","Localización del ID de cuenta de Cloudflare en el portal","max-width: 325px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2465,1183,2466,944,2458,2469],{},[442,2467,2468],{},"Manage API Tokens",[970,2470],{"src":2471,"alt":2472,"style":2473},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-manage-api-tokens-button.webp","Pantalla de administración de tokens de API en el portal de Cloudflare","max-width: 282px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2475,1183,2476,2479,2458,2480],{},[442,2477,2478],{},"Create Account API token"," con permisos de lectura\u002Fescrita para el bucket:",[970,2481],{"src":2482,"alt":2483,"style":2484},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-create-token-permissions.webp","Creación de un token de acceso R2 con permisos de lectura y escritura","max-width: 360px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2486,1183,2487,2490,2491,944,2458,2494],{},[442,2488,2489],{},"Storage"," en el panel de ",[442,2492,2493],{},"ADMINISTRATION",[970,2495],{"src":2496,"alt":2497,"style":2498},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-administration-storage-menu.webp","Navegación a los ajustes de almacenamiento en el panel de control de TREK","max-width: 539px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2500,2501,2502,2505,2458,2506],{},"Haz clic en el botón ",[442,2503,2504],{},"Add Backend"," y rellena el endpoint, el bucket y las credenciales:",[970,2507],{"src":2508,"alt":2509,"style":2510},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-storage-backend-credentials.webp","Configuración del backend de almacenamiento Cloudflare R2 compatible con S3","max-width: 445px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2512,1183,2513,2516,2517,2520,2458,2521],{},[442,2514,2515],{},"Apply",", y luego en el botón ",[442,2518,2519],{},"Test",". Deberías ver \"Connection OK\":",[970,2522],{"src":2523,"alt":2524,"style":2525},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-test-storage-backend-connection-ok.webp","Prueba de conexión de almacenamiento exitosa que muestra Connection OK","max-width: 677px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[586,2527,2528,2529,944,2458,2532],{},"Cambia todas las categorías de almacenamiento a Cloudflare R2 y haz clic en ",[442,2530,2531],{},"Save changes",[970,2533],{"src":2534,"alt":2535,"style":2536},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-switch-storage-categories-r2.webp","Enrutamiento de todas las categorías de almacenamiento de archivos a Cloudflare R2","max-width: 653px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2538,2540],{"id":2539},"_33-inicio-de-sesión-con-llaves-de-acceso-passkeys","3.3 Inicio de sesión con llaves de acceso (Passkeys)",[429,2542,2543,2544,944],{},"TREK admite llaves de acceso, autenticación de dos factores (2FA) y SSO mediante OIDC. Para las llaves de acceso, introduce tu nombre de dominio y los orígenes permitidos en la configuración, y luego haz clic en ",[442,2545,2546],{},"Save",[970,2548],{"src":2549,"alt":2550,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-passkey-allowed-origins-settings.webp","Registro de orígenes permitidos para la autenticación segura mediante llave de acceso",[429,2552,2553,2554,2557],{},"Si no configuras los ",[442,2555,2556],{},"allowed origins",", el registro de las llaves de acceso fallará.",[1712,2559,2561],{"id":2560},"_34-clave-de-api-de-google-maps","3.4 Clave de API de Google Maps",[429,2563,2564],{},"Una clave de Google Maps enriquece la búsqueda de lugares con calificaciones, horarios de apertura y fotos. Si no tienes una, TREK usará OpenStreetMap automáticamente sin coste alguno, aunque no mostrará calificaciones ni fotos.",[429,2566,2567,2568,2573,2574,2577,2578],{},"Sigue este ",[635,2569,2572],{"href":2570,"rel":2571},"https:\u002F\u002Fmapsplatform.google.com\u002Fmaps-demo-key\u002F",[667],"enlace"," y haz clic en ",[442,2575,2576],{},"Get demo key"," para solicitar una:                                                  ",[970,2579],{"src":2580,"alt":2581,"style":2582},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgoogle-maps-get-demo-api-key.webp","Solicitud de clave de API de Google Maps Platform","max-width: 176px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2584,2585,2586,2588,2589],{},"Pega la clave en la configuración y haz clic en ",[442,2587,2519],{}," para confirmar la conexión:\n",[970,2590],{"src":2591,"alt":2592,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-key-test-connection.webp","Verificación de la conectividad de la clave de API de Google Maps en los ajustes",[1712,2594,2596],{"id":2595},"_35-integración-de-ia","3.5 Integración de IA",[429,2598,2599],{},"El modelo de IA se utiliza para analizar correos de confirmación y PDFs de reservas, transformándolos en reservas estructuradas.",[429,2601,1183,2602,2605,2606,2609],{},[442,2603,2604],{},"Addons"," en el menú de la izquierda y activa ",[442,2607,2608],{},"AI Parsing",". Selecciona \"OpenAI\" (u otro proveedor compatible) y rellena los datos correspondientes:",[970,2611],{"src":2612,"alt":2613,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-ai-parsing-openai.webp","Habilitación del complemento de análisis de IA con integración de OpenAI",[1712,2615,2617],{"id":2616},"_36-acceso-mcp","3.6 Acceso MCP",[429,2619,2453,2620,2622,2623,944],{},[442,2621,2604],{},", activa ",[442,2624,1876],{},[970,2626],{"src":2627,"alt":2628,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-mcp.webp","Activación del complemento de servidor MCP de Model Context Protocol",[1712,2630,2632],{"id":2631},"_37-plugins","3.7 Plugins",[429,2634,2635],{},"Se recomienda activar los siguientes plugins:",[970,2637],{"src":2638,"alt":2639,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","Lista de complementos y extensiones recomendados activos",[1712,2641,2643],{"id":2642},"_38-crear-tu-usuario-de-uso-diario","3.8 Crear tu usuario de uso diario",[429,2645,2646],{},"Planifica tus viajes como un usuario estándar, no como administrador. Crea un usuario normal e inicia sesión con él:",[970,2648],{"src":2649,"alt":2650,"style":2651},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-regular-user-form.webp","Creación de una cuenta de usuario normal en el panel de TREK","max-width: 420px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2653,2654],{},"Una vez dentro, añade una llave de acceso o configura 2FA para proteger tu cuenta:",[970,2656],{"src":2657,"alt":2658,"style":2659},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-user-security-passkey-2fa-setup.webp","Configuración de los ajustes de seguridad del usuario con llaves de acceso y 2FA","max-width: 381px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2661,1183,2662,2665],{},[442,2663,2664],{},"+ Add a passkey",", escribe tu contraseña actual y confirma:",[970,2667],{"src":2668,"alt":2669,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-passkey-confirm-password.webp","Confirmación de la contraseña para registrar una nueva llave de acceso de hardware",[1175,2671,2673],{"id":2672},"_4-probar-el-despliegue-importar-datos-de-viajes-pasados","4. Probar el despliegue: importar datos de viajes pasados",[429,2675,2676],{},"Una excelente forma de familiarizarse con TREK es registrar tu historial de viajes.",[1712,2678,2680],{"id":2679},"_41-crear-el-viaje","4.1 Crear el viaje",[429,2682,1183,2683,2686,2687,2690,2691,2694],{},[442,2684,2685],{},"+ New Trip"," y define la fecha de inicio (",[442,2688,2689],{},"Start Date",") y finalización (",[442,2692,2693],{},"End Date",") con las fechas pasadas de tu viaje:",[970,2696],{"src":2697,"alt":2698,"style":2699},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-trip-details.webp","Creación de un nuevo viaje con rangos de fechas personalizados","max-width: 334px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2701,2702,2703,944],{},"Añade una foto de portada (arrastrándola o pegándola desde el portapapeles) y haz clic en ",[442,2704,2705],{},"Create New Trip",[970,2707],{"src":2708,"alt":2709,"style":2710},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-cover-image-upload.webp","Configuración de una imagen de portada de viaje de alta calidad","max-width: 608px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2712,2714],{"id":2713},"_42-importar-las-reservas","4.2 Importar las reservas",[429,2716,2717],{},"Arrastra y suelta todos los archivos de tus vuelos, trenes y transportes:",[970,2719],{"src":2720,"alt":2721,"style":2722},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-travel-booking-files.webp","Área de arrastrar y soltar para importar PDF de viajes y reservas","max-width: 570px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2724],{"src":2725,"alt":2726,"style":2727},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-booking-pdf-processing-status.webp","Ventana de procesamiento de la reserva cargada que muestra la extracción","max-width: 377px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2729,2730],{},"Con el modelo de IA activado, los PDFs de confirmación de reserva se analizan y extraen de forma estructurada.",[429,2732,2733,2734,2737],{},"Revisa el resultado del análisis y haz clic en ",[442,2735,2736],{},"Add"," para registrar los detalles de la reserva:",[970,2739],{"src":2740,"alt":2741,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-review-parsed-booking-details.webp","Revisión de los detalles de reserva estructurados extraídos por la IA",[429,2743,2744],{},"Si la reserva solo está en un correo electrónico, expórtalo como PDF y súbelo; se aplicará el mismo proceso de extracción automática.",[429,2746,2747],{},"Las siguientes capturas de pantalla muestran cómo se presentan las reservas:",[429,2749,2750,2754],{},[970,2751],{"src":2752,"alt":2753,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-bookings-timeline-view.webp","Visualización completa de la línea de tiempo de las reservas de viaje",[970,2755],{"src":2756,"alt":2757,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-booking-confirmation-details.webp","Vista detallada de una reserva de transporte confirmada",[429,2759,2760,2761,2764],{},"En la página ",[442,2762,2763],{},"Plan",", todos los alojamientos se mostrarán en el mapa:",[970,2766],{"src":2767,"alt":2768,"style":2769},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-plan-accommodations-map-display.webp","Mapa interactivo que representa todos los alojamientos hoteleros","max-width: 546px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2771,1183,2772,2775],{},[442,2773,2774],{},"Atlas"," en la barra de menú superior para ver la lista y el mapa de todos los países que has visitado:",[970,2777],{"src":2778,"alt":2779,"style":2780},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-atlas-countries-visited-summary.webp","Resumen del historial de viajes en el rastreador personal del Atlas","max-width: 407px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2782,2784],{"id":2783},"_43-añadir-compañeros-de-viaje","4.3 Añadir compañeros de viaje",[429,2786,2501,2787,944],{},[442,2788,2789],{},"Share",[970,2791],{"src":2792,"alt":2793,"style":2794},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-share-options-button.webp","Apertura del diálogo para compartir viajes en TREK","max-width: 224px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2796,2797],{},"En la parte inferior de la ventana, puedes añadir invitados:",[970,2799],{"src":2800,"alt":2801,"style":2802},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-add-companions-guests.webp","Adición de acompañantes de viaje y huéspedes personalizados","max-width: 635px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2804,2806],{"id":2805},"_44-registrar-los-gastos","4.4 Registrar los gastos",[429,2808,1183,2809,2812],{},[442,2810,2811],{},"Add expense"," para añadir gastos distintos a las reservas, como seguro médico, transporte local o tarjetas SIM:",[970,2814],{"src":2815,"alt":2816,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-custom-expense-form.webp","Introducción de datos de gastos detallados en el formulario de gastos",[970,2818],{"src":2819,"alt":2820,"style":2821},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-expenses-list-billing-split.webp","Desglose de factura dividida y libro de seguimiento de costes","max-width: 526px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2823,2825],{"id":2824},"_45-segmentos-del-viaje","4.5 Segmentos del viaje",[429,2827,2828],{},"Esta función requiere que el plugin Trip Segment esté instalado.",[429,2830,2831],{},"Los viajes largos se dividen de forma ordenada en segmentos, mostrando para cada etapa sus propias reservas, lugares y gastos:",[970,2833],{"src":2834,"alt":2835,"style":2836},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-overview-display.webp","Desglose de un itinerario complejo en segmentos de viaje","max-width: 465px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2838],{"src":2839,"alt":2840,"style":2841},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segment-itinerary-details.webp","Segmento de viaje activo que muestra lugares y horarios","max-width: 596px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2843],{"src":2844,"alt":2845,"style":2846},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-interactive-map.webp","Mapeo de distintos trayectos de viaje en la línea de tiempo","max-width: 605px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,2848,2850],{"id":2849},"_46-crear-un-diario-de-viaje-journey-y-consultar-tu-atlas","4.6 Crear un diario de viaje (Journey) y consultar tu atlas",[429,2852,2853,2854,2857],{},"Agrupa varios viajes en un ",[442,2855,2856],{},"Journey"," (diario de ruta) y redacta relatos para compartir la aventura con tus amigos:",[970,2859],{"src":2860,"alt":2861,"style":2862},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-journey-group.webp","Consolidación de múltiples viajes en un viaje visual (Journey)","max-width: 441px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2864],{"src":2865,"alt":2866,"style":2867},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-timeline-story-writing.webp","Redacción de historias visuales en el panel de viajes (Journey)","max-width: 443px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2869],{"src":2870,"alt":2871,"style":2872},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-gallery-media-grid.webp","Colección de medios y cuadrícula de galería dentro de un viaje (Journey)","max-width: 440px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2874],{"src":2875,"alt":2876,"style":2877},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-public-share-link.webp","Generación de enlaces públicos para compartir viajes colaborativos","max-width: 532px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1175,2879,2881],{"id":2880},"_5-diseñar-itinerarios-personalizados-y-listas-de-equipaje","5. Diseñar itinerarios personalizados y listas de equipaje",[429,2883,1183,2884,2886],{},[442,2885,2685],{},", introduce un nombre y define las fechas:",[970,2888],{"src":2889,"alt":2890,"style":2891},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-planning-new-trip-setup.webp","Diálogo de solicitud inicial para crear un viaje sin fecha","max-width: 432px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2893,2894,2897],{},[442,2895,2896],{},"Si aún no tienes las fechas confirmadas, déjalas vacías."," Aparecerá un campo de \"número de días\" (hasta 365). Planifica primero, programa las fechas después.",[1712,2899,2901],{"id":2900},"_51-añadir-lugares","5.1 Añadir lugares",[429,2903,2904],{},"Este suele ser el paso que más tiempo toma al planificar, y TREK ofrece varias formas de agilizarlo:",[970,2906],{"src":2907,"alt":2908,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-places-methods-overview.webp","Métodos multicanal para agregar nuevos lugares a los itinerarios",[429,2910,2911,2914],{},[442,2912,2913],{},"1. Clic derecho en el mapa"," para crear un lugar en esa ubicación exacta (la dirección se geocodifica a la inversa de forma automática):",[970,2916],{"src":2917,"alt":2918,"style":2919},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-map-location.webp","Hacer clic derecho en el mapa para ubicar ubicaciones","max-width: 632px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2921],{"src":2922,"alt":2923,"style":2924},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-reverse-geocode-address.webp","Geocodificación inversa automática de las coordenadas del mapa seleccionadas","max-width: 628px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2926,2927,2930],{},[442,2928,2929],{},"2. Haz clic en + Add Place\u002FActivity"," y busca por nombre:",[970,2932],{"src":2933,"alt":2934,"style":2935},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-search-place-by-name-input.webp","Búsqueda de lugares del mundo real mediante entradas de texto","max-width: 642px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2937],{"src":2938,"alt":2939,"style":2940},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-select-place-search-results-list.webp","Visualización de resultados de búsqueda de lugares con capas de dirección","max-width: 594px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,2942],{"src":2943,"alt":2944,"style":2945},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-place-details-rich-info-card.webp","Tarjeta de información del lugar completa con reseñas y calificaciones","max-width: 568px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2947,2948,2951,2952,703,2955,2958],{},[442,2949,2950],{},"3. Pega una URL de Google Maps"," (",[433,2953,2954],{},"maps.app.goo.gl\u002F…",[433,2956,2957],{},"maps.google.com\u002F…",") en el campo de búsqueda. TREK extraerá automáticamente el nombre, la dirección y las coordenadas:",[970,2960],{"src":2961,"alt":2962,"style":2525},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-paste-google-maps-share-link.webp","Análisis de ubicaciones directamente desde enlaces para compartir de Google Maps pegados",[970,2964],{"src":2965,"alt":2966,"style":2967},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-parsed-location.webp","Extracción exitosa de coordenadas de la URL de mapas","max-width: 543px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2969,2970,2973,2974,2977,2978,436,2981,2984,2985,2988],{},[442,2971,2972],{},"4. Importación masiva"," — la opción más sencilla de todas. Si ya tienes una lista de lugares pendientes en Google Maps, expórtala como ",[433,2975,2976],{},".gpx"," (también sirven ",[433,2979,2980],{},".kml",[433,2982,2983],{},".kmz",") y haz clic en ",[442,2986,2987],{},"Import file"," en el panel derecho para importarlo todo de golpe:",[970,2990],{"src":2991,"alt":2992,"style":2993},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-bulk-import-places-gpx-file.webp","Realización de importaciones masivas de lugares utilizando archivos GPX o KML","max-width: 389px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,2995,2996],{},"Añade primero todos los lugares interesantes, sin preocuparte de si encajan en tu calendario. Ya los asignarás a días específicos más adelante.",[1712,2998,3000],{"id":2999},"_52-planes-diarios-y-notas","5.2 Planes diarios y notas",[429,3002,3003],{},"El plan diario organiza los lugares por días en orden secuencial. Es una lista desplegable para cada día y todo funciona arrastrando y soltando:",[970,3005],{"src":3006,"alt":3007,"style":3008},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-drag-drop-ordering.webp","Personalización de rutas diarias con acciones de arrastrar y soltar","max-width: 496px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3010,3011],{},"Los detalles que marcan la diferencia:",[583,3013,3014,3024,3034,3044],{},[586,3015,3016,3019,3020],{},[442,3017,3018],{},"Transporte entre paradas",": el icono de autobús en la esquina superior izquierda de un día permite añadir transportes intermedios (trenes, autobuses o vuelos en el mismo día):\n",[970,3021],{"src":3022,"alt":3023,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-commuting-transport-button.webp","Registro de transporte de enlace entre segmentos del día",[586,3025,3026,3029,3030],{},[442,3027,3028],{},"Notas del día",": el icono de notas en la esquina inferior izquierda añade comentarios etiquetados con un icono, como \"madrugar hoy\" o \"este museo requiere reserva previa\":\n",[970,3031],{"src":3032,"alt":3033,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-icon-tagged-notes-button.webp","Adición de notas personalizadas marcadas con iconos y muy visibles a los días",[586,3035,3036,3039,3040],{},[442,3037,3038],{},"Horarios asignados",": arrastra un lugar del panel derecho a un día y asígnale una hora. Los lugares con hora fija se conectan automáticamente en el mapa:\n",[970,3041],{"src":3042,"alt":3043,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-timed-places-routing.webp","Rutas de tránsito calculadas automáticamente entre ubicaciones programadas",[586,3045,3046,3047,3052,3053,3056,3057,728],{},"Consulta la ",[635,3048,3051],{"href":3049,"rel":3050},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[667],"página wiki de Planes Diarios y Notas"," para saber más sobre ",[442,3054,3055],{},"Optimización de rutas"," y el ",[442,3058,3059],{},"Clima",[1712,3061,3063],{"id":3062},"_53-colecciones-listas-de-lugares-reutilizables","5.3 Colecciones: listas de lugares reutilizables",[429,3065,3066,3067,3070],{},"Las Colecciones permiten guardar listas de lugares de forma independiente a cualquier viaje. Se pueden compartir con amigos y tener listas para la próxima aventura. Los lugares se ",[442,3068,3069],{},"copian"," al añadirse a un viaje, por lo que editar un punto en un viaje no alterará tu colección ni viceversa.",[429,3072,1183,3073,3076],{},[442,3074,3075],{},"Collections"," en la barra de menú superior:",[970,3078],{"src":3079,"alt":3080,"style":3081},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-dashboard-view.webp","Acceso a las colecciones de usuario personalizadas de lugares guardados","max-width: 495px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3083,1183,3084,3087],{},[442,3085,3086],{},"+ New list"," para crear una nueva:",[970,3089],{"src":3090,"alt":3091,"style":3092},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-create-new-list.webp","Creación de listas personalizadas en las colecciones del usuario","max-width: 269px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3094,1183,3095,3098],{},[442,3096,3097],{},"+ Add a place"," y rellena los datos:",[970,3100],{"src":3101,"alt":3102,"style":3103},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-add-place-manually-form.webp","Entrada de formulario manual para completar las listas de colección","max-width: 271px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3105,3106,3109],{},[442,3107,3108],{},"Nota:"," el buscador del diálogo \"Add a place\" parece no funcionar, por lo que deberás introducir los detalles de forma manual.",[429,3111,3112],{},"Si las coordenadas geográficas de los lugares están disponibles, aparecerán en el mapa:",[970,3114],{"src":3115,"alt":3116,"style":3117},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-map-places-display.webp","Visualización de lugares de colecciones personalizadas en un mapa interactivo","max-width: 592px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3119,3120,3121,944],{},"Para organizar los lugares mediante etiquetas, haz clic en el icono de la ",[442,3122,3123],{},"casilla de verificación",[970,3125],{"src":3126,"alt":3127,"style":3128},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-select-places-tickbox.webp","Modo de selección para el etiquetado masivo de lugares guardados","max-width: 662px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3130,3131,3132,944],{},"Selecciona los lugares que quieres agrupar y haz clic en ",[442,3133,3134],{},"Assign label",[970,3136],{"src":3137,"alt":3138,"style":2967},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","Asignación de etiquetas descriptivas a los lugares de la colección seleccionados",[429,3140,1183,3141,3144],{},[442,3142,3143],{},"Manage labels"," para crear las etiquetas de antemano:",[970,3146],{"src":3147,"alt":3148,"style":3149},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-manage-custom-labels.webp","Creación y gestión de etiquetas personalizadas","max-width: 411px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3151,3152,3153,944],{},"Selecciona una etiqueta y haz clic en ",[442,3154,3134],{},[970,3156],{"src":3157,"alt":3158,"style":2780},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","Aplicación de etiquetas personalizadas a lugares agrupados",[1712,3160,3162],{"id":3161},"_54-costes-y-presupuesto","5.4 Costes y presupuesto",[429,3164,3165],{},"Podemos registrar el resto de gastos del viaje en la pestaña 'Costs'.",[970,3167],{"src":3168,"alt":3169,"style":3008},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-budget-overall-expenses-list.webp","Tabla de gastos completa y libro de liquidación de saldos",[429,3171,3172],{},"Los pagos realizados por tus compañeros de viaje se pueden añadir y dividir en esta misma página.",[429,3174,3175,3176,3179],{},"El panel de liquidación ejecuta un algoritmo voraz (greedy) para calcular el ",[442,3177,3178],{},"número mínimo de transferencias"," necesarias para saldar las cuentas entre los miembros.",[1175,3181,3183],{"id":3182},"_6-aprovechar-model-context-protocol-mcp-para-planificar-viajes-con-ia","6. Aprovechar Model Context Protocol (MCP) para planificar viajes con IA",[429,3185,3186,3187,3190],{},"TREK dispone de un ",[442,3188,3189],{},"servidor MCP integrado",", lo que permite a agentes de IA leer y escribir directamente tus datos de viaje a través de más de 150 herramientas y 30 recursos que cubren itinerarios, lugares, presupuestos, equipaje, reservas y colaboración.",[1712,3192,3194],{"id":3193},"_61-cloudflare-zero-trust","6.1 Cloudflare Zero Trust",[429,3196,3197,3198,3201,3202,728],{},"Dado que TREK se ejecuta detrás de una red de ",[635,3199,3200],{"href":363},"Cloudflare Zero Trust",", tendrás que añadir el dominio a la lista de inclusión de Split Tunnels. De lo contrario, tendrás problemas con la autorización OAuth. Puedes consultar este problema de GitHub: ",[635,3203,3206],{"href":3204,"rel":3205},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[667],"issue de github",[3208,3209],"article-card",{"description":3210,"image":3211,"image-alt":3212,"label":3213,"min-read":3214,"title":3215,"to":363},"Aprenda a exponer y acceder globalmente a su Hermes Agent de forma segura con Cloudflare WARP y Zero Trust, sin abrir puertos de entrada en el firewall.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FES-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","Exponer de forma segura Hermes Agent a una red privada mediante Cloudflare Zero Trust y el túnel WARP","Guía relacionada","9","Cómo exponer Hermes Agent de forma privada con WARP",[970,3217],{"src":3218,"alt":3219,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-zero-trust-split-tunnels-domain.webp","Adición de dominios personalizados a Cloudflare Warp Split Tunnels",[1712,3221,3223],{"id":3222},"_62-claude-desktop","6.2 Claude Desktop",[429,3225,1183,3226,3229,3230],{},[442,3227,3228],{},"+ New Client"," para crear un nuevo cliente de agente de IA:\n",[970,3231],{"src":3232,"alt":3233,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-register-new-mcp-client.webp","Registro de un nuevo token de cliente personalizado en los ajustes",[429,3235,3236,3237,2573,3239,944],{},"Selecciona la pestaña ",[442,3238,1590],{},[442,3240,3241],{},"Register Client",[970,3243],{"src":3244,"alt":3245,"style":3246},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-claude-desktop-client-credentials.webp","Generación de credenciales de cliente para Claude Desktop","max-width: 354px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3248,3249,3250,3253],{},"Se mostrará un par de ID de cliente y secreto de cliente. Cópialos en un lugar seguro. A continuación, haz clic en ",[442,3251,3252],{},"Client Configuration"," para ver la configuración de MCP:",[970,3255],{"src":3256,"alt":3257,"style":3258},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-client-configuration-block.webp","Recuperación del bloque de configuración formateado del servidor MCP","max-width: 508px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3260,3261,3262,3265],{},"En Claude Desktop, haz clic en ",[442,3263,3264],{},"Edit Config"," para abrir el archivo local de configuración de servidores MCP:",[970,3267],{"src":3268,"alt":3269,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-config-json.webp","Edición del archivo json de configuración local de MCP de Claude Desktop",[429,3271,3272],{},"Pega la configuración de TREK, sustituyendo los marcadores por tus credenciales:",[455,3274,3276],{"className":1294,"code":3275,"language":1296,"meta":424,"style":424},"  \"mcpServers\": {\n    \"trek\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n        \"--static-oauth-client-info\",\n        \"{\\\"client_id\\\": \\\"\u003Cyour_client_id>\\\", \\\"client_secret\\\": \\\"\u003Cyour_client_secret>\\\"}\"\n      ]\n    }\n  },\n",[433,3277,3278,3291,3303,3321,3333,3343,3354,3365,3410,3414,3418],{"__ignoreMap":424},[463,3279,3280,3283,3285,3287,3289],{"class":465,"line":466},[463,3281,3282],{"class":504},"  \"",[463,3284,1287],{"class":480},[463,3286,512],{"class":504},[463,3288,734],{"class":1311},[463,3290,1314],{"class":504},[463,3292,3293,3295,3297,3299,3301],{"class":465,"line":473},[463,3294,1303],{"class":504},[463,3296,2450],{"class":1322},[463,3298,512],{"class":504},[463,3300,944],{"class":504},[463,3302,1550],{"class":504},[463,3304,3305,3307,3309,3311,3313,3315,3317,3319],{"class":465,"line":484},[463,3306,1319],{"class":504},[463,3308,1323],{"class":494},[463,3310,512],{"class":504},[463,3312,944],{"class":504},[463,3314,505],{"class":504},[463,3316,495],{"class":480},[463,3318,512],{"class":504},[463,3320,1336],{"class":504},[463,3322,3323,3325,3327,3329,3331],{"class":465,"line":491},[463,3324,1319],{"class":504},[463,3326,1343],{"class":494},[463,3328,512],{"class":504},[463,3330,944],{"class":504},[463,3332,1350],{"class":504},[463,3334,3335,3337,3339,3341],{"class":465,"line":536},[463,3336,1355],{"class":504},[463,3338,1358],{"class":480},[463,3340,512],{"class":504},[463,3342,1336],{"class":504},[463,3344,3345,3347,3350,3352],{"class":465,"line":541},[463,3346,1355],{"class":504},[463,3348,3349],{"class":480},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[463,3351,512],{"class":504},[463,3353,1336],{"class":504},[463,3355,3356,3358,3361,3363],{"class":465,"line":554},[463,3357,1355],{"class":504},[463,3359,3360],{"class":480},"--static-oauth-client-info",[463,3362,512],{"class":504},[463,3364,1336],{"class":504},[463,3366,3367,3369,3371,3374,3377,3379,3381,3383,3386,3388,3390,3392,3395,3397,3399,3401,3404,3406,3408],{"class":465,"line":559},[463,3368,1355],{"class":504},[463,3370,2291],{"class":480},[463,3372,3373],{"class":1311},"\\\"",[463,3375,3376],{"class":480},"client_id",[463,3378,3373],{"class":1311},[463,3380,734],{"class":480},[463,3382,3373],{"class":1311},[463,3384,3385],{"class":480},"\u003Cyour_client_id>",[463,3387,3373],{"class":1311},[463,3389,741],{"class":480},[463,3391,3373],{"class":1311},[463,3393,3394],{"class":480},"client_secret",[463,3396,3373],{"class":1311},[463,3398,734],{"class":480},[463,3400,3373],{"class":1311},[463,3402,3403],{"class":480},"\u003Cyour_client_secret>",[463,3405,3373],{"class":1311},[463,3407,2297],{"class":480},[463,3409,551],{"class":504},[463,3411,3412],{"class":465,"line":571},[463,3413,1398],{"class":504},[463,3415,3416],{"class":465,"line":2019},[463,3417,1403],{"class":504},[463,3419,3420,3423],{"class":465,"line":2025},[463,3421,3422],{"class":504},"  }",[463,3424,1336],{"class":1311},[429,3426,3427,3428,944],{},"Reinicia Claude Desktop y el servidor de TREK aparecerá conectado bajo la sección de ",[442,3429,3430],{},"Local MCP servers",[970,3432],{"src":3433,"alt":3434,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-trek-server-connected.webp","Verificación del estado de conexión activa de TREK en la interfaz de Claude",[429,3436,3437],{},"Ahora prueba con una instrucción (prompt):",[970,3439],{"src":3440,"alt":3441,"style":3442},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-natural-language-prompt.webp","Dar indicaciones a Claude en lenguaje natural para manipular datos de viajes","max-width: 550px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3444,3445],{},"Añadamos un gasto usando lenguaje natural:",[455,3447,3450],{"className":3448,"code":3449,"language":1622,"meta":424},[1620],"For the West Europe trip, the Grab from KLIA1 to the hotel cost RM115.90 on 26\u002F4\u002F2025. Please add it as an expense without split to the trip.\n",[433,3451,3449],{"__ignoreMap":424},[970,3453],{"src":3454,"alt":3455,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-expense-response.webp","Claude utiliza herramientas para registrar un gasto de forma automática",[429,3457,3458,3459,3462],{},"Al revisar la pestaña de ",[442,3460,3461],{},"Costs",", se comprueba que el gasto se ha creado indicando que \"nadie ha pagado aún\", ya que no se especificó un pagador en la orden:",[970,3464],{"src":3465,"alt":3466,"style":2424},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-page-mcp-parsed-expense.webp","Confirmación del gasto de IA recién analizado en la vista de Costes",[429,3468,3469],{},"Añadir elementos a la lista de equipaje funciona exactamente igual:",[970,3471],{"src":3472,"alt":3473,"style":3474},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-packing-items.webp","Claude agrega artículos de empaque usando indicaciones en lenguaje natural","max-width: 631px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3476,3477,3478,3481],{},"Actualiza la página ",[442,3479,3480],{},"Packing List"," y verás que los tres elementos ya están registrados:",[970,3483],{"src":3484,"alt":3485,"style":3486},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-packing-list-mcp-parsed-items.webp","Confirmación de los artículos de empaque recién analizados en la página de lista de empaque","max-width: 312px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[1712,3488,3490],{"id":3489},"_63-gemini-cli-registro-dinámico","6.3 Gemini CLI (registro dinámico)",[429,3492,3493,3494,3497,3498,944],{},"Gemini CLI admite ",[442,3495,3496],{},"registro dinámico",", lo que significa que no necesitas crear un cliente con antelación. Añade esto a ",[433,3499,3500],{},".gemini\u002Fsettings.json",[455,3502,3504],{"className":1294,"code":3503,"language":1296,"meta":424,"style":424},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[433,3505,3506,3518,3536,3548,3560,3564],{"__ignoreMap":424},[463,3507,3508,3510,3512,3514,3516],{"class":465,"line":466},[463,3509,1303],{"class":504},[463,3511,2450],{"class":480},[463,3513,512],{"class":504},[463,3515,734],{"class":1311},[463,3517,1314],{"class":504},[463,3519,3520,3522,3524,3526,3528,3530,3532,3534],{"class":465,"line":473},[463,3521,1319],{"class":504},[463,3523,1524],{"class":1322},[463,3525,512],{"class":504},[463,3527,944],{"class":504},[463,3529,505],{"class":504},[463,3531,3349],{"class":480},[463,3533,512],{"class":504},[463,3535,1336],{"class":504},[463,3537,3538,3540,3542,3544,3546],{"class":465,"line":484},[463,3539,1319],{"class":504},[463,3541,1543],{"class":1322},[463,3543,512],{"class":504},[463,3545,944],{"class":504},[463,3547,1550],{"class":504},[463,3549,3550,3552,3554,3556,3558],{"class":465,"line":491},[463,3551,1355],{"class":504},[463,3553,1557],{"class":494},[463,3555,512],{"class":504},[463,3557,944],{"class":504},[463,3559,1564],{"class":504},[463,3561,3562],{"class":465,"line":536},[463,3563,1569],{"class":504},[463,3565,3566],{"class":465,"line":541},[463,3567,1403],{"class":504},[429,3569,3570,3571,3574,3575,3578,3579],{},"Ejecuta ",[433,3572,3573],{},"gemini"," en la terminal y haz clic en ",[442,3576,3577],{},"Approve"," cuando aparezca la solicitud de autorización:\n",[970,3580],{"src":3581,"alt":3582,"style":3583},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fmcp-client-oauth-authorization-prompt.webp","Aprobación del acceso OAuth para el servidor MCP de TREK","max-width: 488px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3585,3586],{},"Luego, empieza con una instrucción simple:",[970,3588],{"src":3589,"alt":3590,"style":3591},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-prompt-itinerary.webp","Dar indicaciones a Gemini CLI para recuperar itinerarios de viaje","max-width: 415px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[970,3593],{"src":3594,"alt":3595,"style":2872},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-display-itinerary.webp","Gemini CLI muestra con éxito información estructurada del viaje",[1712,3597,3599],{"id":3598},"_64-kimi-cli-registro-dinámico","6.4 Kimi CLI (registro dinámico)",[429,3601,3602,3603,1482,3606,944],{},"El mismo enfoque — añade a ",[433,3604,3605],{},"mcp.json",[433,3607,3608],{},"\u002FUsers\u002F\u003Cuser>\u002F.kimi\u002F",[455,3610,3612],{"className":1294,"code":3611,"language":1296,"meta":424,"style":424},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[433,3613,3614,3626,3646,3665,3682],{"__ignoreMap":424},[463,3615,3616,3618,3620,3622,3624],{"class":465,"line":466},[463,3617,1303],{"class":504},[463,3619,2450],{"class":480},[463,3621,512],{"class":504},[463,3623,734],{"class":1311},[463,3625,1314],{"class":504},[463,3627,3628,3630,3633,3635,3637,3639,3642,3644],{"class":465,"line":473},[463,3629,1319],{"class":504},[463,3631,3632],{"class":1322},"type",[463,3634,512],{"class":504},[463,3636,944],{"class":504},[463,3638,505],{"class":504},[463,3640,3641],{"class":480},"http",[463,3643,512],{"class":504},[463,3645,1336],{"class":504},[463,3647,3648,3650,3653,3655,3657,3659,3661,3663],{"class":465,"line":484},[463,3649,1319],{"class":504},[463,3651,3652],{"class":1322},"url",[463,3654,512],{"class":504},[463,3656,944],{"class":504},[463,3658,505],{"class":504},[463,3660,3349],{"class":480},[463,3662,512],{"class":504},[463,3664,1336],{"class":504},[463,3666,3667,3669,3672,3674,3676,3678,3680],{"class":465,"line":491},[463,3668,1319],{"class":504},[463,3670,3671],{"class":1322},"auth",[463,3673,512],{"class":504},[463,3675,944],{"class":504},[463,3677,505],{"class":504},[463,3679,1543],{"class":480},[463,3681,551],{"class":504},[463,3683,3684],{"class":465,"line":536},[463,3685,1403],{"class":504},[429,3687,3570,3688,3574,3691,760,3693],{},[433,3689,3690],{},"kimi mcp auth trek",[442,3692,3577],{},[970,3694],{"src":3581,"alt":3582,"style":3695},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[429,3697,3698],{},"Una vez autorizado, se mostrarán las herramientas disponibles:",[970,3700],{"src":3701,"alt":3702,"style":2252},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fkimi-cli-mcp-authorized-tools-list.webp","Kimi CLI muestra las herramientas disponibles tras una autorización exitosa",[1175,3704,3706],{"id":3705},"_7-experiencia-móvil","7. Experiencia móvil",[429,3708,3709],{},"TREK es una PWA (aplicación web progresiva) en dispositivos móviles. Un service worker almacena en caché los mapas y los datos de las API, por lo que podrás leer tu itinerario sin conexión a Internet. Sin embargo, las notificaciones push pueden sufrir cierta latencia comparadas con las de una aplicación nativa.",[1175,3711,3713],{"id":3712},"reflexiones-finales","Reflexiones finales",[429,3715,3716],{},"Conectar agentes de IA mediante MCP ahorra gran parte del tedioso trabajo de introducir reservas de vuelos y hoteles. Además, los agentes pueden sugerir puntos de interés según las fechas del viaje y la temporada. Una única conversación con un agente de IA puede cubrir todo el proceso: desde la investigación y la creación del itinerario hasta el control del presupuesto y el equipaje.",[429,3718,3719],{},"Hay algunos pequeños detalles técnicos por pulir. Por ejemplo, al importar reservas desde un PDF, la moneda se establece de forma predeterminada en la moneda base del viaje en lugar de la moneda pagada realmente. Asimismo, al crear una nueva lista en las Colecciones, la imagen de portada añadida desaparece al guardar, aunque se puede volver a añadir manualmente al editar.",[429,3721,3722,3723,3728],{},"Existe una pequeña barrera técnica, ya que necesitas alojar esto en tu propio servidor. TREK está pensado principalmente para personas que viajan con frecuencia y tienen altas expectativas sobre cómo organizar la información de sus viajes. Sugerimos probar la demo oficial en ",[635,3724,3727],{"href":3725,"rel":3726},"https:\u002F\u002Fdemo.liketrek.com\u002F",[667],"demo.liketrek.com"," antes de plantearse el autohospedaje.",[1175,3730,1806],{"id":1805},[583,3732,3733,3740,3747],{},[586,3734,3735],{},[635,3736,3739],{"href":3737,"rel":3738},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[667],"Inicio rápido de TREK",[586,3741,3742],{},[635,3743,3746],{"href":3744,"rel":3745},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[667],"Solución de problemas de TREK",[586,3748,3749],{},[635,3750,3753],{"href":3751,"rel":3752},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[667],"Ámbitos MCP de TREK",[1028,3755,3756],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":424,"searchDepth":473,"depth":484,"links":3758},[3759,3764,3765,3775,3783,3789,3795,3796,3797],{"id":1896,"depth":484,"text":1897,"children":3760},[3761,3762,3763],{"id":1900,"depth":491,"text":1901},{"id":2092,"depth":491,"text":2093},{"id":2127,"depth":491,"text":2128},{"id":2274,"depth":484,"text":2275},{"id":2322,"depth":484,"text":2323,"children":3766},[3767,3768,3769,3770,3771,3772,3773,3774],{"id":2427,"depth":491,"text":2428},{"id":2438,"depth":491,"text":2439},{"id":2539,"depth":491,"text":2540},{"id":2560,"depth":491,"text":2561},{"id":2595,"depth":491,"text":2596},{"id":2616,"depth":491,"text":2617},{"id":2631,"depth":491,"text":2632},{"id":2642,"depth":491,"text":2643},{"id":2672,"depth":484,"text":2673,"children":3776},[3777,3778,3779,3780,3781,3782],{"id":2679,"depth":491,"text":2680},{"id":2713,"depth":491,"text":2714},{"id":2783,"depth":491,"text":2784},{"id":2805,"depth":491,"text":2806},{"id":2824,"depth":491,"text":2825},{"id":2849,"depth":491,"text":2850},{"id":2880,"depth":484,"text":2881,"children":3784},[3785,3786,3787,3788],{"id":2900,"depth":491,"text":2901},{"id":2999,"depth":491,"text":3000},{"id":3062,"depth":491,"text":3063},{"id":3161,"depth":491,"text":3162},{"id":3182,"depth":484,"text":3183,"children":3790},[3791,3792,3793,3794],{"id":3193,"depth":491,"text":3194},{"id":3222,"depth":491,"text":3223},{"id":3489,"depth":491,"text":3490},{"id":3598,"depth":491,"text":3599},{"id":3705,"depth":484,"text":3706},{"id":3712,"depth":484,"text":3713},{"id":1805,"depth":484,"text":1806},[3799,1039],"travel","2026-09-01","Aprende a desplegar TREK con Docker, protegerlo con Cloudflare R2 y Caddy, y usar agentes de IA vía MCP para planificar todos tus itinerarios sin problemas.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002FES-Self-hosted-travel-planner-TREK.webp","Una ilustración 3D minimalista y de alta calidad del panel del planificador de viajes autohospedado TREK sobre un fondo de pergamino cálido.",{"schemaOrg":3805,"robots":1049,"sitemap":3811},[3806,3808],{"@type":3807,"headline":1882,"description":3801},"HowTo",{"@type":3809,"headline":3810,"description":3801},"Article","Guía para alojar TREK, el planificador de viajes con IA",{"lastmod":3800},25,{"title":3810,"description":3801,"ogTitle":1882,"ogDescription":3801,"twitterTitle":1882,"twitterDescription":3801},"es\u002Farticle\u002Fself-hosted-travel-planner-trek",[3816,3817,3818,1056,1876],"Docker","TREK","Caddy","2026-09-03","qKvrSb1XZOooEfCsfqoDg2lYS54cWv-HGkb_snF4UPE",[3822,5985,5986],{"id":3823,"title":3824,"author":424,"body":3825,"category":5951,"date":5953,"description":5954,"extension":1042,"image":5955,"imageAlt":5956,"isPublished":487,"meta":5957,"minRead":4238,"navigation":487,"path":383,"seo":5979,"stem":5981,"tags":5982,"updatedAt":1059,"__hash__":5984},"article\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md","Cómo autoalojar Buzz de Block: Espacio de trabajo para agentes IA",{"type":426,"value":3826,"toc":5921},[3827,3830,3836,3842,3846,3849,3887,3891,3897,3935,3939,3943,3957,3963,3968,3972,3976,3989,3995,4043,4069,4073,4081,4087,4091,4094,4278,4282,4326,4333,4340,4346,4394,4400,4428,4432,4436,4463,4491,4496,4538,4547,4826,4830,4875,4880,4887,4892,4896,4919,4922,4928,4931,4935,4943,4949,4952,4958,4965,4993,4999,5005,5008,5014,5018,5021,5024,5027,5033,5036,5042,5048,5054,5059,5063,5074,5081,5087,5090,5096,5100,5107,5113,5120,5124,5131,5194,5206,5260,5263,5332,5338,5354,5360,5364,5410,5416,5419,5425,5428,5434,5438,5454,5470,5475,5572,5575,5581,5592,5641,5647,5653,5665,5681,5684,5690,5694,5701,5723,5732,5830,5841,5847,5854,5860,5863,5869,5872,5878,5882,5885,5888,5918],[429,3828,3829],{},"La fragmentación del contexto es un obstáculo frustrante cuando se trabaja con múltiples agentes de IA. Con conversaciones dispersas en diferentes herramientas, terminas actuando como un enrutador humano copiando conversaciones de Claude Code para pegarlas en Gemini CLI, luego copiando de Gemini CLI para pegarlas en Hermes Agent. Esta fricción aumenta cuando hay colegas humanos en el mismo equipo.",[429,3831,3832],{},[970,3833],{"alt":3834,"src":3835},"La interfaz de usuario del espacio de trabajo colaborativo Buzz mostrando canales de chat y agentes de IA activos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[429,3837,3838,3841],{},[442,3839,3840],{},"Buzz",", un espacio de trabajo colaborativo de código abierto, reúne a equipos humanos y agentes de IA en un entorno único y unificado. Aquí, los colegas humanos y los agentes de IA comparten el mismo historial de tareas y proyectos, delegando el trabajo entre sí de manera fluida.",[447,3843,3845],{"id":3844},"qué-es-blocks-buzz-el-espacio-de-trabajo-colaborativo-para-agentes-de-ia","¿Qué es Block's Buzz? El espacio de trabajo colaborativo para agentes de IA",[429,3847,3848],{},"Buzz es un espacio de trabajo colaborativo de código abierto de Block (la empresa de Jack Dorsey) donde los humanos y los agentes de IA comparten los mismos canales y proyectos. Ofrece las siguientes características clave:",[583,3850,3851,3857,3863,3869,3875,3881],{},[586,3852,3853,3856],{},[442,3854,3855],{},"Contexto compartido:"," Los canales son el lugar donde los humanos y los agentes colaboran entre sí. Todo el historial de conversaciones y proyectos se encuentra dentro del canal.",[586,3858,3859,3862],{},[442,3860,3861],{},"Comunicación entre agentes:"," Los agentes pueden comunicarse entre sí, incluso en diferentes máquinas. Un agente puede @-mencionar a otro agente para delegar trabajo o verificar código.",[586,3864,3865,3868],{},[442,3866,3867],{},"Activación guiada por menciones:"," Los agentes solo actúan cuando se les @-menciona; de lo contrario, permanecen en silencio. Al ser mencionado, un agente lee el contexto relevante en el canal y comienza a trabajar.",[586,3870,3871,3874],{},[442,3872,3873],{},"Sistema de identidad unificado:"," Los humanos y los agentes utilizan el mismo sistema de identidad, autenticado mediante claves criptográficas.",[586,3876,3877,3880],{},[442,3878,3879],{},"Comandos delegados:"," Puedes otorgar permisos a tus colegas humanos para controlar a tus agentes, lo que permite a todo el equipo dar instrucciones y aprovechar los asistentes digitales de los demás.",[586,3882,3883,3886],{},[442,3884,3885],{},"Servidores autoalojados:"," Al alojar tú mismo el servidor, tus datos permanecen completamente bajo tu control. Tú eliges quién se une y defines tus propias reglas de funcionamiento.",[447,3888,3890],{"id":3889},"la-arquitectura-criptográfica-basada-en-nostr-de-buzz","La arquitectura criptográfica basada en Nostr de Buzz",[429,3892,3893],{},[970,3894],{"alt":3895,"src":3896},"Diagrama arquitectónico criptográfico basado en Nostr del espacio de trabajo de colaboración Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[583,3898,3899,3905,3911,3917,3923,3929],{},[586,3900,3901,3904],{},[442,3902,3903],{},"El relay de Nostr actúa como servidor:"," Los mensajes, flujos de trabajo, repositorios y otros eventos se firman criptográficamente, se verifican y se almacenan en un servidor relay de Nostr. El protocolo Nostr admite de forma nativa la comunicación a través de WebSockets y API REST.",[586,3906,3907,3910],{},[442,3908,3909],{},"Identidad criptográfica unificada:"," Tanto los humanos como los agentes se autentican utilizando sus propias claves criptográficas. Esta identidad permanece en el lado del cliente y nunca se almacena en el servidor.",[586,3912,3913,3916],{},[442,3914,3915],{},"Membresía de agentes de primer nivel:"," Cada agente posee su propia identidad, membresía en canales e historial de auditoría. Los agentes se conectan al espacio de trabajo utilizando el Protocolo de Comunicación de Agentes (ACP).",[586,3918,3919,3922],{},[442,3920,3921],{},"Repositorios Git descentralizados:"," Los repositorios de código se almacenan en un almacenamiento de objetos compatible con S3, mientras que las tareas, pull requests y revisiones de código se rastrean dentro del registro de eventos de Nostr. En consecuencia, un repositorio Git de Buzz se aloja en el relay de Nostr en lugar de GitHub.",[586,3924,3925,3928],{},[442,3926,3927],{},"La aplicación Buzz es un cliente Nostr:"," Buzz es independiente del relay de Nostr; es una aplicación de cliente móvil o de escritorio que se conecta a la URL del relay.",[586,3930,3931,3934],{},[442,3932,3933],{},"Pila de infraestructura:"," Una base de datos PostgreSQL maneja el almacenamiento de eventos y la búsqueda de texto completo, Redis gestiona la mensajería pub\u002Fsub y MinIO compatible con S3 se utiliza para el almacenamiento de archivos multimedia.",[447,3936,3938],{"id":3937},"cómo-autoalojar-el-relay-de-buzz-de-block-en-un-vps-linux","Cómo autoalojar el relay de Buzz de Block en un VPS Linux",[1175,3940,3942],{"id":3941},"_0-requisitos-previos","0. Requisitos previos",[583,3944,3945,3948,3951,3954],{},[586,3946,3947],{},"Un VPS Linux",[586,3949,3950],{},"Un dominio que apunte a tu servidor",[586,3952,3953],{},"Docker y el plugin Docker Compose",[586,3955,3956],{},"Cuenta de Cloudflare (plan gratuito)",[429,3958,3959,3960,3962],{},"En esta guía, ejecutaremos el relay de Nostr en un VPS con Ubuntu detrás de una red privada de ",[635,3961,3215],{"href":363},". La pila consta de cuatro servicios en Docker Compose (relay, PostgreSQL, Redis y MinIO) además de Caddy para HTTPS.",[3208,3964],{"description":3965,"image":3211,"image-alt":3966,"label":3213,"min-read":3967,"title":3215,"to":363},"Aprende a exponer y acceder de forma segura a tu Hermes Agent globalmente usando Cloudflare WARP y Zero Trust sin abrir puertos entrantes en el firewall.","Exposición segura de Hermes Agent a una red privada mediante Cloudflare Zero Trust y túnel WARP","8",[1175,3969,3971],{"id":3970},"_1-dns-de-cloudflare-y-token-de-api","1. DNS de Cloudflare y token de API",[1712,3973,3975],{"id":3974},"crear-un-token-de-api-de-cloudflare","Crear un token de API de Cloudflare",[673,3977,3978,3984],{},[586,3979,2501,3980,3983],{},[442,3981,3982],{},"Profile"," en la esquina superior derecha desde el menú desplegable del icono de usuario.",[586,3985,1183,3986,728],{},[442,3987,3988],{},"API Tokens",[429,3990,3991],{},[970,3992],{"alt":3993,"src":3994},"Página de perfil de usuario de Cloudflare mostrando el menú de creación de tokens de API","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[673,3996,3997,4002,4008,4028,4033,4037,4040],{"start":484},[586,3998,1183,3999,728],{},[442,4000,4001],{},"Create Token",[586,4003,4004,4005,728],{},"Usa la plantilla ",[442,4006,4007],{},"Edit zone DNS",[586,4009,4010,4011],{},"Configura la plantilla de la siguiente manera:\n",[583,4012,4013,4019],{},[586,4014,4015,4018],{},[442,4016,4017],{},"Permissions",": Zone — DNS — Edit",[586,4020,4021,4024,4025],{},[442,4022,4023],{},"Zone Resources",": Include — Specific zone — ",[433,4026,4027],{},"example.com",[586,4029,1183,4030,728],{},[442,4031,4032],{},"Continue to summary",[586,4034,1183,4035,728],{},[442,4036,4001],{},[586,4038,4039],{},"Copia el token generado, ya que no se volverá a mostrar una vez cerrada la página.",[586,4041,4042],{},"Prueba el token generado en tu terminal para asegurarte de que funciona correctamente:",[455,4044,4046],{"className":457,"code":4045,"language":459,"meta":424,"style":424},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[433,4047,4048],{"__ignoreMap":424},[463,4049,4050,4052,4054,4057,4059,4062,4064,4067],{"class":465,"line":466},[463,4051,1916],{"class":494},[463,4053,505],{"class":504},[463,4055,4056],{"class":480},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[463,4058,512],{"class":504},[463,4060,4061],{"class":480}," -H",[463,4063,505],{"class":504},[463,4065,4066],{"class":480},"Authorization: Bearer YOUR_TOKEN_HERE",[463,4068,551],{"class":504},[1712,4070,4072],{"id":4071},"registros-dns","Registros DNS",[583,4074,4075],{},[586,4076,4077,4078,728],{},"Crea un registro A y establécelo como ",[442,4079,4080],{},"DNS only",[429,4082,4083],{},[970,4084],{"alt":4085,"src":4086},"Configurando un registro DNS A para el dominio de Buzz en el panel de Cloudflare con estado de proxy como solo DNS","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[1175,4088,4090],{"id":4089},"_2-instalar-docker-en-ubuntu","2. Instalar Docker en Ubuntu",[429,4092,4093],{},"Ejecuta los siguientes comandos para instalar Docker en Ubuntu:",[455,4095,4097],{"className":457,"code":4096,"language":459,"meta":424,"style":424},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[433,4098,4099,4103,4123,4127,4131,4163,4167,4171,4179,4183,4187,4203,4207,4212,4222,4226,4230,4236,4241,4256,4261,4267],{"__ignoreMap":424},[463,4100,4101],{"class":465,"line":466},[463,4102,1911],{"class":469},[463,4104,4105,4107,4109,4111,4113,4115,4117,4119,4121],{"class":465,"line":473},[463,4106,1916],{"class":494},[463,4108,1919],{"class":480},[463,4110,1922],{"class":480},[463,4112,1925],{"class":504},[463,4114,1928],{"class":494},[463,4116,1931],{"class":480},[463,4118,1934],{"class":480},[463,4120,1937],{"class":480},[463,4122,1940],{"class":480},[463,4124,4125],{"class":465,"line":484},[463,4126,488],{"emptyLinePlaceholder":487},[463,4128,4129],{"class":465,"line":491},[463,4130,1949],{"class":469},[463,4132,4133,4135,4137,4139,4141,4143,4145,4147,4149,4151,4153,4155,4157,4159,4161],{"class":465,"line":536},[463,4134,1954],{"class":476},[463,4136,505],{"class":504},[463,4138,1959],{"class":480},[463,4140,1962],{"class":504},[463,4142,1965],{"class":494},[463,4144,1968],{"class":480},[463,4146,1971],{"class":504},[463,4148,1974],{"class":480},[463,4150,512],{"class":504},[463,4152,1925],{"class":504},[463,4154,1928],{"class":494},[463,4156,1983],{"class":480},[463,4158,1986],{"class":480},[463,4160,1989],{"class":504},[463,4162,1992],{"class":480},[463,4164,4165],{"class":465,"line":541},[463,4166,488],{"emptyLinePlaceholder":487},[463,4168,4169],{"class":465,"line":554},[463,4170,2001],{"class":469},[463,4172,4173,4175,4177],{"class":465,"line":559},[463,4174,2006],{"class":494},[463,4176,2009],{"class":480},[463,4178,2012],{"class":480},[463,4180,4181],{"class":465,"line":571},[463,4182,488],{"emptyLinePlaceholder":487},[463,4184,4185],{"class":465,"line":2019},[463,4186,2022],{"class":469},[463,4188,4189,4191,4193,4195,4197,4199,4201],{"class":465,"line":2025},[463,4190,2006],{"class":494},[463,4192,2009],{"class":480},[463,4194,2032],{"class":480},[463,4196,2035],{"class":480},[463,4198,2038],{"class":480},[463,4200,2041],{"class":480},[463,4202,2044],{"class":480},[463,4204,4205],{"class":465,"line":2047},[463,4206,488],{"emptyLinePlaceholder":487},[463,4208,4209],{"class":465,"line":2052},[463,4210,4211],{"class":469},"# Start automatically when the system boots\n",[463,4213,4214,4216,4218,4220],{"class":465,"line":2058},[463,4215,2006],{"class":494},[463,4217,2083],{"class":480},[463,4219,2086],{"class":480},[463,4221,2089],{"class":480},[463,4223,4224],{"class":465,"line":2067},[463,4225,488],{"emptyLinePlaceholder":487},[463,4227,4228],{"class":465,"line":2072},[463,4229,2055],{"class":469},[463,4231,4232,4234],{"class":465,"line":2078},[463,4233,2061],{"class":494},[463,4235,2064],{"class":480},[463,4237,4239],{"class":465,"line":4238},18,[463,4240,488],{"emptyLinePlaceholder":487},[463,4242,4244,4246,4248,4250,4253],{"class":465,"line":4243},19,[463,4245,2006],{"class":494},[463,4247,2009],{"class":480},[463,4249,2032],{"class":480},[463,4251,4252],{"class":480}," -y",[463,4254,4255],{"class":480}," docker-compose-plugin\n",[463,4257,4259],{"class":465,"line":4258},20,[463,4260,488],{"emptyLinePlaceholder":487},[463,4262,4264],{"class":465,"line":4263},21,[463,4265,4266],{"class":469},"# Verify the compose plugin is installed\n",[463,4268,4270,4272,4275],{"class":465,"line":4269},22,[463,4271,2061],{"class":494},[463,4273,4274],{"class":480}," compose",[463,4276,4277],{"class":480}," version\n",[1175,4279,4281],{"id":4280},"_3-clonar-y-configurar","3. Clonar y configurar",[455,4283,4285],{"className":457,"code":4284,"language":459,"meta":424,"style":424},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[433,4286,4287,4298,4302,4309,4319],{"__ignoreMap":424},[463,4288,4289,4292,4295],{"class":465,"line":466},[463,4290,4291],{"class":494},"git",[463,4293,4294],{"class":480}," clone",[463,4296,4297],{"class":480}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[463,4299,4300],{"class":465,"line":473},[463,4301,488],{"emptyLinePlaceholder":487},[463,4303,4304,4306],{"class":465,"line":484},[463,4305,544],{"class":476},[463,4307,4308],{"class":480}," buzz\u002Fdeploy\u002Fcompose\n",[463,4310,4311,4313,4316],{"class":465,"line":491},[463,4312,562],{"class":494},[463,4314,4315],{"class":480}," .env.example",[463,4317,4318],{"class":480}," .env\n",[463,4320,4321,4324],{"class":465,"line":536},[463,4322,4323],{"class":494},"nano",[463,4325,4318],{"class":480},[429,4327,4328,4329,4332],{},"Edita ",[433,4330,4331],{},".env"," en grupos:",[583,4334,4335],{},[586,4336,4337],{},[442,4338,4339],{},"Dominio:",[455,4341,4344],{"className":4342,"code":4343,"language":1622},[1620],"BUZZ_DOMAIN=buzz.pafor.me\nRELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\nBUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_MEDIA_BASE_URL=https:\u002F\u002Fbuzz.pafor.me\u002Fmedia\nBUZZ_MEDIA_SERVER_DOMAIN=buzz.pafor.me\nBUZZ_CORS_ORIGINS=https:\u002F\u002Fbuzz.pafor.me\n",[433,4345,4343],{"__ignoreMap":424},[583,4347,4348,4358],{},[586,4349,4350,4353,4354,4357],{},[442,4351,4352],{},"Clave del propietario:"," ",[433,4355,4356],{},"RELAY_OWNER_PUBKEY"," requiere tu clave pública hexadecimal de 64 caracteres. Genera una identidad en la aplicación de escritorio primero ('Create a new identity key' → copia tu ID público, que está en formato npub), luego conviértela a hexadecimal.",[586,4359,4360,4363],{},[442,4361,4362],{},"Secretos (Secrets):",[583,4364,4365,4375,4388],{},[586,4366,4367,4368,4370,4371,4374],{},"Genera secretos usando esta ",[635,4369,2100],{"href":2099}," o con ",[433,4372,4373],{},"openssl rand -hex 32"," (ejecútalo siete veces)",[586,4376,4377,4378,734,4381,741,4384,4387],{},"Reemplaza cada marcador ",[433,4379,4380],{},"CHANGE_ME",[433,4382,4383],{},"BUZZ_RELAY_PRIVATE_KEY",[433,4385,4386],{},"BUZZ_GIT_HOOK_HMAC_SECRET",", las contraseñas de Postgres\u002FRedis\u002FTypesense y las claves de acceso\u002Fsecretas de S3.",[586,4389,4390,4391,728],{},"Los marcadores sobrantes son la causa más común de bucles de reinicio de contenedores; verifica los tuyos con ",[433,4392,4393],{},"grep CHANGE_ME .env",[455,4395,4398],{"className":4396,"code":4397,"language":1622},[1620],"    BUZZ_RELAY_PRIVATE_KEY=CHANGE_ME_64_HEX_PRIVATE_KEY\n    BUZZ_GIT_HOOK_HMAC_SECRET=CHANGE_ME_RANDOM_64_HEX\n    POSTGRES_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    REDIS_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    TYPESENSE_API_KEY=CHANGE_ME_RANDOM_API_KEY\n    BUZZ_S3_ACCESS_KEY=CHANGE_ME_RANDOM_ACCESS_KEY\n    BUZZ_S3_SECRET_KEY=CHANGE_ME_RANDOM_SECRET_KEY\n",[433,4399,4397],{"__ignoreMap":424},[583,4401,4402],{},[586,4403,4404,4407],{},[442,4405,4406],{},"Otros:",[583,4408,4409,4416],{},[586,4410,4411,4412,4415],{},"Agrega ",[433,4413,4414],{},"CLOUDFLARE_API_TOKEN"," como una variable de entorno y asígnale el token de API generado anteriormente. Esto es obligatorio para Caddy.",[586,4417,4418,4419,741,4421,4424,4425,728],{},"Buzz se distribuye con valores predeterminados abiertos: cualquiera que conozca la URL de tu relay puede autenticarse y unirse. Configura ",[433,4420,4356],{},[433,4422,4423],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",", y ",[433,4426,4427],{},"BUZZ_REQUIRE_AUTH_TOKEN=true",[1175,4429,4431],{"id":4430},"_4-habilitar-https-con-caddy","4. Habilitar HTTPS con Caddy",[1712,4433,4435],{"id":4434},"construir-una-imagen-personalizada-de-caddy-con-el-módulo-dns-de-cloudflare","Construir una imagen personalizada de Caddy con el módulo DNS de Cloudflare",[583,4437,4438,4449,4460],{},[586,4439,4440,4441,4444,4445,4448],{},"Configuramos DNS-01 con Cloudflare para Caddy. DNS-01 funciona haciendo que el complemento escriba un registro TXT ",[433,4442,4443],{},"_acme-challenge.buzz.pafor.me"," en el ",[442,4446,4447],{},"DNS público",";",[586,4450,4451,4452,4455,4456,4459],{},"Let's Encrypt luego busca el registro en el internet público para verificar el control del dominio. Esto significa que ",[433,4453,4454],{},"pafor.me"," debe ser una zona pública en tu cuenta de Cloudflare, no solo un nombre de host privado que solo existe en el DNS privado de Zero Trust \u002F WARP. Si ",[433,4457,4458],{},"buzz.pafor.me"," solo se resuelve de forma privada y no hay una zona pública, DNS-01 fallará, lo que requerirá un enfoque diferente.",[586,4461,4462],{},"Agrega lo siguiente al Caddyfile:",[455,4464,4468],{"className":4465,"code":4466,"language":4467,"meta":424,"style":424},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n","yml",[433,4469,4470,4474,4487],{"__ignoreMap":424},[463,4471,4472],{"class":465,"line":466},[463,4473,1314],{"class":504},[463,4475,4476,4479,4482,4485],{"class":465,"line":473},[463,4477,4478],{"class":480},"  acme_dns cloudflare",[463,4480,4481],{"class":504}," {",[463,4483,4484],{"class":480},"env.CLOUDFLARE_API_TOKEN",[463,4486,2319],{"class":504},[463,4488,4489],{"class":465,"line":484},[463,4490,2319],{"class":504},[583,4492,4493],{},[586,4494,4495],{},"Crea un Dockerfile.caddy con el siguiente contenido, el cual es requerido por compose.caddy.yml:",[455,4497,4499],{"className":4465,"code":4498,"language":4467,"meta":424,"style":424},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[433,4500,4501,4506,4510,4515,4520,4524,4529,4533],{"__ignoreMap":424},[463,4502,4503],{"class":465,"line":466},[463,4504,4505],{"class":480},"FROM caddy:2-builder AS builder\n",[463,4507,4508],{"class":465,"line":473},[463,4509,488],{"emptyLinePlaceholder":487},[463,4511,4512],{"class":465,"line":484},[463,4513,4514],{"class":480},"RUN xcaddy build \\\n",[463,4516,4517],{"class":465,"line":491},[463,4518,4519],{"class":480},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[463,4521,4522],{"class":465,"line":536},[463,4523,488],{"emptyLinePlaceholder":487},[463,4525,4526],{"class":465,"line":541},[463,4527,4528],{"class":480},"FROM caddy:2-alpine\n",[463,4530,4531],{"class":465,"line":554},[463,4532,488],{"emptyLinePlaceholder":487},[463,4534,4535],{"class":465,"line":559},[463,4536,4537],{"class":480},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[583,4539,4540],{},[586,4541,4542,4543,4546],{},"Modifica ",[433,4544,4545],{},"compose.caddy.yml"," para usar la imagen con el módulo de Cloudflare y pasar el token de API de Cloudflare:",[455,4548,4550],{"className":4465,"code":4549,"language":4467,"meta":424,"style":424},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[433,4551,4552,4560,4567,4580,4584,4591,4598,4607,4617,4627,4634,4641,4651,4658,4668,4678,4684,4696,4707,4714,4721,4728,4735,4746,4754,4761,4766,4774,4782,4790,4801,4809,4816],{"__ignoreMap":424},[463,4553,4554,4558],{"class":465,"line":466},[463,4555,4557],{"class":4556},"swJcz","services",[463,4559,760],{"class":504},[463,4561,4562,4565],{"class":465,"line":473},[463,4563,4564],{"class":4556},"  relay",[463,4566,760],{"class":504},[463,4568,4569,4572,4574,4577],{"class":465,"line":484},[463,4570,4571],{"class":4556},"    ports",[463,4573,944],{"class":504},[463,4575,4576],{"class":1322}," !reset",[463,4578,4579],{"class":504}," []\n",[463,4581,4582],{"class":465,"line":491},[463,4583,488],{"emptyLinePlaceholder":487},[463,4585,4586,4589],{"class":465,"line":536},[463,4587,4588],{"class":4556},"  caddy",[463,4590,760],{"class":504},[463,4592,4593,4596],{"class":465,"line":541},[463,4594,4595],{"class":4556},"    build",[463,4597,760],{"class":504},[463,4599,4600,4603,4605],{"class":465,"line":554},[463,4601,4602],{"class":4556},"      context",[463,4604,944],{"class":504},[463,4606,568],{"class":2120},[463,4608,4609,4612,4614],{"class":465,"line":559},[463,4610,4611],{"class":4556},"      dockerfile",[463,4613,944],{"class":504},[463,4615,4616],{"class":480}," Dockerfile.caddy\n",[463,4618,4619,4622,4624],{"class":465,"line":571},[463,4620,4621],{"class":4556},"    image",[463,4623,944],{"class":504},[463,4625,4626],{"class":480}," buzz-caddy:cloudflare\n",[463,4628,4629,4632],{"class":465,"line":2019},[463,4630,4631],{"class":4556},"    depends_on",[463,4633,760],{"class":504},[463,4635,4636,4639],{"class":465,"line":2025},[463,4637,4638],{"class":4556},"      relay",[463,4640,760],{"class":504},[463,4642,4643,4646,4648],{"class":465,"line":2047},[463,4644,4645],{"class":4556},"        condition",[463,4647,944],{"class":504},[463,4649,4650],{"class":480}," service_healthy\n",[463,4652,4653,4656],{"class":465,"line":2052},[463,4654,4655],{"class":4556},"    environment",[463,4657,760],{"class":504},[463,4659,4660,4663,4665],{"class":465,"line":2058},[463,4661,4662],{"class":4556},"      BUZZ_DOMAIN",[463,4664,944],{"class":504},[463,4666,4667],{"class":480}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[463,4669,4670,4673,4675],{"class":465,"line":2067},[463,4671,4672],{"class":4556},"      CLOUDFLARE_API_TOKEN",[463,4674,944],{"class":504},[463,4676,4677],{"class":480}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[463,4679,4680,4682],{"class":465,"line":2072},[463,4681,4571],{"class":4556},[463,4683,760],{"class":504},[463,4685,4686,4689,4691,4694],{"class":465,"line":2078},[463,4687,4688],{"class":504},"      -",[463,4690,505],{"class":504},[463,4692,4693],{"class":480},"${CADDY_HTTP_PORT:-80}:80",[463,4695,551],{"class":504},[463,4697,4698,4700,4702,4705],{"class":465,"line":4238},[463,4699,4688],{"class":504},[463,4701,505],{"class":504},[463,4703,4704],{"class":480},"${CADDY_HTTPS_PORT:-443}:443",[463,4706,551],{"class":504},[463,4708,4709,4712],{"class":465,"line":4243},[463,4710,4711],{"class":4556},"    volumes",[463,4713,760],{"class":504},[463,4715,4716,4718],{"class":465,"line":4258},[463,4717,4688],{"class":504},[463,4719,4720],{"class":480}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[463,4722,4723,4725],{"class":465,"line":4263},[463,4724,4688],{"class":504},[463,4726,4727],{"class":480}," buzz-caddy-data:\u002Fdata\n",[463,4729,4730,4732],{"class":465,"line":4269},[463,4731,4688],{"class":504},[463,4733,4734],{"class":480}," buzz-caddy-config:\u002Fconfig\n",[463,4736,4738,4741,4743],{"class":465,"line":4737},23,[463,4739,4740],{"class":4556},"    restart",[463,4742,944],{"class":504},[463,4744,4745],{"class":480}," unless-stopped\n",[463,4747,4749,4752],{"class":465,"line":4748},24,[463,4750,4751],{"class":4556},"    networks",[463,4753,760],{"class":504},[463,4755,4756,4758],{"class":465,"line":3812},[463,4757,4688],{"class":504},[463,4759,4760],{"class":480}," buzz-net\n",[463,4762,4764],{"class":465,"line":4763},26,[463,4765,488],{"emptyLinePlaceholder":487},[463,4767,4769,4772],{"class":465,"line":4768},27,[463,4770,4771],{"class":4556},"volumes",[463,4773,760],{"class":504},[463,4775,4777,4780],{"class":465,"line":4776},28,[463,4778,4779],{"class":4556},"  buzz-caddy-data",[463,4781,760],{"class":504},[463,4783,4785,4788],{"class":465,"line":4784},29,[463,4786,4787],{"class":4556},"    labels",[463,4789,760],{"class":504},[463,4791,4793,4796,4798],{"class":465,"line":4792},30,[463,4794,4795],{"class":4556},"      com.buzz.volume",[463,4797,944],{"class":504},[463,4799,4800],{"class":480}," caddy-data\n",[463,4802,4804,4807],{"class":465,"line":4803},31,[463,4805,4806],{"class":4556},"  buzz-caddy-config",[463,4808,760],{"class":504},[463,4810,4812,4814],{"class":465,"line":4811},32,[463,4813,4787],{"class":4556},[463,4815,760],{"class":504},[463,4817,4819,4821,4823],{"class":465,"line":4818},33,[463,4820,4795],{"class":4556},[463,4822,944],{"class":504},[463,4824,4825],{"class":480}," caddy-config\n",[1712,4827,4829],{"id":4828},"iniciar-los-contenedores-de-docker","Iniciar los contenedores de Docker",[455,4831,4833],{"className":457,"code":4832,"language":459,"meta":424,"style":424},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[433,4834,4835,4858,4862,4867],{"__ignoreMap":424},[463,4836,4837,4839,4841,4844,4847,4849,4852,4855],{"class":465,"line":466},[463,4838,2061],{"class":494},[463,4840,4274],{"class":480},[463,4842,4843],{"class":480}," -f",[463,4845,4846],{"class":480}," compose.yml",[463,4848,4843],{"class":480},[463,4850,4851],{"class":480}," compose.caddy.yml",[463,4853,4854],{"class":480}," up",[463,4856,4857],{"class":480}," -d\n",[463,4859,4860],{"class":465,"line":473},[463,4861,488],{"emptyLinePlaceholder":487},[463,4863,4864],{"class":465,"line":484},[463,4865,4866],{"class":469},"#Check the Docker status\n",[463,4868,4869,4871,4873],{"class":465,"line":491},[463,4870,2061],{"class":494},[463,4872,4274],{"class":480},[463,4874,2267],{"class":480},[970,4876],{"src":4877,"alt":4878,"style":4879},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","Ventana de terminal mostrando los contenedores en ejecución para los servicios de Buzz mediante docker compose ps","max-width: 700px; width: 100%; height: auto;",[429,4881,4882,4883,4886],{},"Abre tu navegador web y navega a ",[433,4884,4885],{},"http:\u002F\u002Fbuzz.pafor.me"," para verificar que el relay esté funcionando.",[970,4888],{"src":4889,"alt":4890,"style":4891},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","Verificación en el navegador mostrando respuesta exitosa del relay autoalojado de Buzz de Block","max-width: 500px; width: 100%; height: auto;",[1175,4893,4895],{"id":4894},"paso-5-copias-de-seguridad-desde-el-primer-día","Paso 5: Copias de seguridad desde el primer día",[455,4897,4899],{"className":457,"code":4898,"language":459,"meta":424,"style":424},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[433,4900,4901,4912],{"__ignoreMap":424},[463,4902,4903,4906,4909],{"class":465,"line":466},[463,4904,4905],{"class":494},"mkdir",[463,4907,4908],{"class":480}," -p",[463,4910,4911],{"class":480}," \u002Fbuzz_backups\n",[463,4913,4914,4917],{"class":465,"line":473},[463,4915,4916],{"class":494},"crontab",[463,4918,481],{"class":480},[429,4920,4921],{},"Agrega una tarea cron nocturna para el volcado de la base de datos:",[455,4923,4926],{"className":4924,"code":4925,"language":1622},[1620],"0 3 * * * cd \u002Fhome\u002F\u003Cuser>\u002Fbuzz\u002Fdeploy\u002Fcompose && docker compose exec -T postgres pg_dump -U buzz buzz > \u002Fbuzz_backups\u002Fbuzz-$(date +\\%Y\\%m\\%d).sql\n",[433,4927,4925],{"__ignoreMap":424},[429,4929,4930],{},"Nota: Trata BUZZ_RELAY_PRIVATE_KEY como permanente. Los eventos firmados por ella fallarán en la verificación si la clave cambia; una base de datos restaurada emparejada con una clave nueva no se tratará como el mismo relay.",[447,4932,4934],{"id":4933},"configuración-del-cliente-de-escritorio-buzz-y-las-identidades-de-nostr","Configuración del cliente de escritorio Buzz y las identidades de Nostr",[429,4936,4937,4938,4942],{},"Descarga la aplicación de escritorio Buzz desde ",[635,4939,4940],{"href":4940,"rel":4941},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[667]," e iníciala. Completa los detalles del perfil hasta llegar a la página \"Join or create a community\".",[429,4944,4945],{},[970,4946],{"alt":4947,"src":4948},"Pantalla de configuración inicial del cliente de escritorio Buzz para unirse o crear una comunidad","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[429,4950,4951],{},"Haz clic en \"Join a community\" y copia tu clave pública.",[429,4953,4954],{},[970,4955],{"alt":4956,"src":4957},"Visualización del cliente Buzz mostrando la identidad de clave pública antes de unirse a la comunidad","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[429,4959,4960,4961,4964],{},"Ejecuta el siguiente comando en el ",[442,4962,4963],{},"VPS"," para agregarte como primer miembro:",[455,4966,4968],{"className":457,"code":4967,"language":459,"meta":424,"style":424},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[433,4969,4970],{"__ignoreMap":424},[463,4971,4972,4974,4976,4978,4981,4984,4987,4990],{"class":465,"line":466},[463,4973,2061],{"class":494},[463,4975,4274],{"class":480},[463,4977,2375],{"class":480},[463,4979,4980],{"class":480}," relay",[463,4982,4983],{"class":480}," buzz-admin",[463,4985,4986],{"class":480}," add-member",[463,4988,4989],{"class":480}," --pubkey",[463,4991,4992],{"class":480}," npub1yourkeyhere\n",[429,4994,4411,4995,4998],{},[433,4996,4997],{},"wss:\u002F\u002Fbuzz.pafor.me"," como la URL de la comunidad y haz clic en \"Next\".",[429,5000,5001],{},[970,5002],{"alt":5003,"src":5004},"Ingresando la URL del relay de la comunidad autoalojada en la aplicación de escritorio Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[429,5006,5007],{},"Ingresa un nombre y haz clic en el botón Next.",[429,5009,5010],{},[970,5011],{"alt":5012,"src":5013},"Pantalla de configuración de perfil en la aplicación Buzz para ingresar el nombre de pantalla","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-profile-name-input.webp",[1175,5015,5017],{"id":5016},"canales-y-agentes","Canales y agentes",[429,5019,5020],{},"Los canales son grupos de tareas o grupos de proyectos. Crea un canal por tarea o proyecto e incorpora a los humanos y agentes.",[429,5022,5023],{},"Todo lo que está dentro de un canal se comparte automáticamente, lo que elimina la necesidad de instruir a cada miembro individualmente. Cada agente se puede mencionar usando @ y lee los mensajes relevantes. Además, los agentes pueden @-mencionarse entre sí.",[429,5025,5026],{},"Enviemos un mensaje directo a un agente preconfigurado",[429,5028,5029],{},[970,5030],{"alt":5031,"src":5032},"Enviando mensaje directo a un agente de IA en el cliente de escritorio colaborativo Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[429,5034,5035],{},"Creemos un canal y agreguemos algunos agentes a él",[429,5037,5038],{},[970,5039],{"alt":5040,"src":5041},"Creando un nuevo canal de tarea o proyecto dentro de la aplicación de escritorio Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[429,5043,5044],{},[970,5045],{"alt":5046,"src":5047},"Agregando miembros humanos y agentes de IA al canal recién creado","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[429,5049,5050],{},[970,5051],{"alt":5052,"src":5053},"Vista de canal activo que muestra el historial de chat unificado y las tareas del proyecto","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[970,5055],{"src":5056,"alt":5057,"style":5058},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-active-agents.webp","Vista detallada de los agentes de IA activos integrados en el canal del proyecto colaborativo","max-width: 367px; width: 100%; height: auto;",[1175,5060,5062],{"id":5061},"habilitar-runtimes-de-agentes","Habilitar runtimes de agentes",[429,5064,5065,5066,5069,5070,5073],{},"Los runtimes predeterminados dependen de la autodetección que busca binarios de ejecución (como ",[433,5067,5068],{},"hermes-acp",") en directorios estándar como ",[433,5071,5072],{},"~\u002F.local\u002Fbin",". Si una herramienta se instaló en una ubicación no estándar, Buzz no podrá resolverla.",[429,5075,5076,5077,5080],{},"Para Kimi Code, el ID del agente es kimi, y Buzz busca su binario en ",[433,5078,5079],{},"~\u002F.local\u002Fbin\u002Fkimi",". Un enlace simbólico servirá:",[455,5082,5085],{"className":5083,"code":5084,"language":1622},[1620],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[433,5086,5084],{"__ignoreMap":424},[429,5088,5089],{},"Kimi Code ahora aparece en los runtimes de agentes.",[429,5091,5092],{},[970,5093],{"alt":5094,"src":5095},"Configuración de la aplicación Buzz mostrando los runtimes de agentes de IA configurados, incluyendo Kimi","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[1175,5097,5099],{"id":5098},"proyectos-y-repositorios","Proyectos y repositorios",[429,5101,5102,5103,5106],{},"Habilita primero la función '",[442,5104,5105],{},"Projects","' en Settings → Experiments:",[429,5108,5109],{},[970,5110],{"alt":5111,"src":5112},"Habilitando la función experimental Projects en la pestaña de configuración de Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[429,5114,5115,5116,5119],{},"Actualmente, un proyecto debe crearse utilizando la herramienta ",[433,5117,5118],{},"buzz-cli"," (aunque se planea la creación directa de proyectos desde la interfaz de usuario para una versión futura).",[1712,5121,5123],{"id":5122},"instalar-buzz-cli","Instalar buzz-cli",[429,5125,5126,5127,4444,5129,944],{},"Ejecuta los siguientes comandos para instalar ",[433,5128,5118],{},[442,5130,4963],{},[455,5132,5134],{"className":457,"code":5133,"language":459,"meta":424,"style":424},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[433,5135,5136,5147,5154,5167],{"__ignoreMap":424},[463,5137,5138,5140,5142,5144],{"class":465,"line":466},[463,5139,2006],{"class":494},[463,5141,2009],{"class":480},[463,5143,2032],{"class":480},[463,5145,5146],{"class":480}," cargo\n",[463,5148,5149,5151],{"class":465,"line":473},[463,5150,544],{"class":476},[463,5152,5153],{"class":480}," ~\u002Fbuzz\n",[463,5155,5156,5159,5161,5164],{"class":465,"line":484},[463,5157,5158],{"class":494},"cargo",[463,5160,2032],{"class":480},[463,5162,5163],{"class":480}," --path",[463,5165,5166],{"class":480}," crates\u002Fbuzz-cli\n",[463,5168,5169,5171,5174,5177,5179,5182,5185,5188,5191],{"class":465,"line":491},[463,5170,1954],{"class":476},[463,5172,5173],{"class":504}," '",[463,5175,5176],{"class":480},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[463,5178,2392],{"class":504},[463,5180,5181],{"class":504}," >>",[463,5183,5184],{"class":480}," ~\u002F.bashrc",[463,5186,5187],{"class":504}," &&",[463,5189,5190],{"class":476}," source",[463,5192,5193],{"class":480}," ~\u002F.bashrc\n",[429,5195,5196,5197,703,5200,5202,5203,5205],{},"Genera un par de claves privada y pública usando la ",[635,5198,2100],{"href":5199},"\u002Fes\u002Ftools\u002Fnostr-key-generator",[433,5201,5118],{},". Este par constituirá la identidad de ",[433,5204,5118],{}," en el relay de Nostr.",[455,5207,5209],{"className":457,"code":5208,"language":459,"meta":424,"style":424},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[433,5210,5211,5232,5236,5241],{"__ignoreMap":424},[463,5212,5213,5215,5217,5220,5223,5226,5229],{"class":465,"line":466},[463,5214,2061],{"class":494},[463,5216,2140],{"class":480},[463,5218,5219],{"class":480}," --rm",[463,5221,5222],{"class":480}," --entrypoint",[463,5224,5225],{"class":480}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[463,5227,5228],{"class":480}," ghcr.io\u002Fblock\u002Fbuzz:main",[463,5230,5231],{"class":480}," generate-key\n",[463,5233,5234],{"class":465,"line":473},[463,5235,488],{"emptyLinePlaceholder":487},[463,5237,5238],{"class":465,"line":484},[463,5239,5240],{"class":469},"# Use the generated Public Key\n",[463,5242,5243,5245,5247,5249,5251,5253,5255,5257],{"class":465,"line":491},[463,5244,2061],{"class":494},[463,5246,4274],{"class":480},[463,5248,2375],{"class":480},[463,5250,4980],{"class":480},[463,5252,4983],{"class":480},[463,5254,4986],{"class":480},[463,5256,4989],{"class":480},[463,5258,5259],{"class":480}," generated_Public_key\n",[429,5261,5262],{},"Configura la CLI:",[455,5264,5266],{"className":457,"code":5265,"language":459,"meta":424,"style":424},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[433,5267,5268,5273,5303,5307],{"__ignoreMap":424},[463,5269,5270],{"class":465,"line":466},[463,5271,5272],{"class":469},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[463,5274,5275,5277,5279,5282,5284,5287,5290,5292,5295,5298,5300],{"class":465,"line":473},[463,5276,1954],{"class":476},[463,5278,5173],{"class":504},[463,5280,5281],{"class":480},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[463,5283,2392],{"class":504},[463,5285,5286],{"class":504},"  >>",[463,5288,5289],{"class":480}," \u002Fhome\u002F",[463,5291,1455],{"class":504},[463,5293,5294],{"class":480},"use",[463,5296,5297],{"class":1311},"r",[463,5299,1464],{"class":504},[463,5301,5302],{"class":480},"\u002F.bashrc\n",[463,5304,5305],{"class":465,"line":484},[463,5306,488],{"emptyLinePlaceholder":487},[463,5308,5309,5311,5313,5316,5318,5320,5322,5324,5326,5328,5330],{"class":465,"line":491},[463,5310,1954],{"class":476},[463,5312,5173],{"class":504},[463,5314,5315],{"class":480},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[463,5317,2392],{"class":504},[463,5319,5286],{"class":504},[463,5321,5289],{"class":480},[463,5323,1455],{"class":504},[463,5325,5294],{"class":480},[463,5327,5297],{"class":1311},[463,5329,1464],{"class":504},[463,5331,5302],{"class":480},[429,5333,5334,5335,5337],{},"Ejecuta el siguiente comando para verificar que ",[433,5336,5118],{}," esté configurado correctamente:",[455,5339,5341],{"className":457,"code":5340,"language":459,"meta":424,"style":424},"buzz channels list\n",[433,5342,5343],{"__ignoreMap":424},[463,5344,5345,5348,5351],{"class":465,"line":466},[463,5346,5347],{"class":494},"buzz",[463,5349,5350],{"class":480}," channels",[463,5352,5353],{"class":480}," list\n",[429,5355,5356],{},[970,5357],{"alt":5358,"src":5359},"Ejecución de comando en terminal verificando la configuración de buzz-cli al listar los canales activos","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-cli-channels-list-terminal.webp",[1712,5361,5363],{"id":5362},"crear-un-proyecto-con-buzz-cli","Crear un proyecto con buzz-cli",[455,5365,5367],{"className":457,"code":5366,"language":459,"meta":424,"style":424},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[433,5368,5369,5374],{"__ignoreMap":424},[463,5370,5371],{"class":465,"line":466},[463,5372,5373],{"class":469},"# --channel refers to the UUID of the channel\n",[463,5375,5376,5378,5381,5384,5387,5390,5393,5395,5398,5400,5403,5405,5408],{"class":465,"line":473},[463,5377,5347],{"class":494},[463,5379,5380],{"class":480}," repos",[463,5382,5383],{"class":480}," create",[463,5385,5386],{"class":480}," --id",[463,5388,5389],{"class":480}," TestKOA",[463,5391,5392],{"class":480}," --name",[463,5394,5173],{"class":504},[463,5396,5397],{"class":480},"Display Name",[463,5399,2392],{"class":504},[463,5401,5402],{"class":480}," --channel",[463,5404,505],{"class":504},[463,5406,5407],{"class":480},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[463,5409,551],{"class":504},[429,5411,5412,5413,5415],{},"Un proyecto solo puede ser eliminado por su propietario. Dado que el proyecto \"Display Name\" fue creado por ",[433,5414,5118],{},", que carece de un comando de eliminación, no se puede borrar de esta manera.",[429,5417,5418],{},"Vuelve a consultar la aplicación de escritorio Buzz para verificar que el proyecto se haya creado.",[429,5420,5421],{},[970,5422],{"alt":5423,"src":5424},"Vista de proyectos de la aplicación Buzz confirmando la creación exitosa del proyecto","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[429,5426,5427],{},"Una vez que un proyecto está disponible en Projects, se pueden agregar más proyectos usando el botón \"+\" en la esquina superior derecha.",[429,5429,5430],{},[970,5431],{"alt":5432,"src":5433},"Agregando nuevos proyectos de desarrollador usando el icono más en el cliente Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-project-button.webp",[1712,5435,5437],{"id":5436},"vincular-repositorios-git-existentes","Vincular repositorios Git existentes",[429,5439,5440,5441,5444,5445,5448,5449,944],{},"Instala ",[433,5442,5443],{},"git-credential-nostr"," en la máquina donde están los repositorios de git. Requiere ",[442,5446,5447],{},"git 2.46+"," y el conjunto de herramientas Rust. Consulta este archivo ",[635,5450,5453],{"href":5451,"rel":5452},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[667],"Readme",[455,5455,5457],{"className":457,"code":5456,"language":459,"meta":424,"style":424},"cargo install --path crates\u002Fgit-credential-nostr\n",[433,5458,5459],{"__ignoreMap":424},[463,5460,5461,5463,5465,5467],{"class":465,"line":466},[463,5462,5158],{"class":494},[463,5464,2032],{"class":480},[463,5466,5163],{"class":480},[463,5468,5469],{"class":480}," crates\u002Fgit-credential-nostr\n",[429,5471,789,5472,5474],{},[433,5473,5443],{}," para la autorización del relay de Buzz:",[455,5476,5478],{"className":457,"code":5477,"language":459,"meta":424,"style":424},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[433,5479,5480,5485,5501,5514,5518,5523,5532,5559],{"__ignoreMap":424},[463,5481,5482],{"class":465,"line":466},[463,5483,5484],{"class":469},"# 1. Register the helper and enable per-path credentials.\n",[463,5486,5487,5489,5492,5495,5498],{"class":465,"line":473},[463,5488,4291],{"class":494},[463,5490,5491],{"class":480}," config",[463,5493,5494],{"class":480}," --global",[463,5496,5497],{"class":480}," credential.helper",[463,5499,5500],{"class":480}," nostr\n",[463,5502,5503,5505,5507,5509,5512],{"class":465,"line":484},[463,5504,4291],{"class":494},[463,5506,5491],{"class":480},[463,5508,5494],{"class":480},[463,5510,5511],{"class":480}," credential.useHttpPath",[463,5513,1564],{"class":504},[463,5515,5516],{"class":465,"line":491},[463,5517,488],{"emptyLinePlaceholder":487},[463,5519,5520],{"class":465,"line":536},[463,5521,5522],{"class":469},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[463,5524,5525,5527,5529],{"class":465,"line":541},[463,5526,4905],{"class":494},[463,5528,4908],{"class":480},[463,5530,5531],{"class":480}," ~\u002F.nostr\n",[463,5533,5534,5536,5538,5541,5543,5545,5548,5550,5553,5556],{"class":465,"line":554},[463,5535,1954],{"class":476},[463,5537,505],{"class":504},[463,5539,5540],{"class":480},"nsec1...",[463,5542,512],{"class":504},[463,5544,1989],{"class":504},[463,5546,5547],{"class":480}," ~\u002F.nostr\u002Fkey",[463,5549,5187],{"class":504},[463,5551,5552],{"class":494}," chmod",[463,5554,5555],{"class":2120}," 600",[463,5557,5558],{"class":480}," ~\u002F.nostr\u002Fkey\n",[463,5560,5561,5563,5565,5567,5570],{"class":465,"line":559},[463,5562,4291],{"class":494},[463,5564,5491],{"class":480},[463,5566,5494],{"class":480},[463,5568,5569],{"class":480}," nostr.keyfile",[463,5571,5558],{"class":480},[429,5573,5574],{},"Crea un repositorio en el relay de Buzz:",[455,5576,5579],{"className":5577,"code":5578,"language":1622},[1620],"buzz repos create --id koa-email-routing --name \"KOA Email Routing\" --clone \"https:\u002F\u002Fbuzz.pafor.me\u002Fgit\u002F\u003Cpub_key>\u002Fkoa-email-routing\" --nostr-relay \"wss:\u002F\u002Fbuzz.pafor.me\"\n",[433,5580,5578],{"__ignoreMap":424},[429,5582,5583,5584,5587,5588,5591],{},"En tu primer ",[433,5585,5586],{},"git push",", te encontrarás con un error ",[433,5589,5590],{},"remote: missing Authorization header",". Para resolver esto, debes vincular el ID del repositorio a un canal de Buzz, ya que la membresía del canal determina los permisos de escritura de Git (ACL):",[455,5593,5595],{"className":457,"code":5594,"language":459,"meta":424,"style":424},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[433,5596,5597,5625,5629,5634],{"__ignoreMap":424},[463,5598,5599,5601,5603,5606,5608,5611,5613,5616,5619,5622],{"class":465,"line":466},[463,5600,5347],{"class":494},[463,5602,5380],{"class":480},[463,5604,5605],{"class":480}," bind",[463,5607,5386],{"class":480},[463,5609,5610],{"class":480}," koa-email-routing",[463,5612,5402],{"class":480},[463,5614,5615],{"class":504}," \u003C",[463,5617,5618],{"class":480},"CHANNEL_UUI",[463,5620,5621],{"class":1311},"D",[463,5623,5624],{"class":504},">\n",[463,5626,5627],{"class":465,"line":473},[463,5628,488],{"emptyLinePlaceholder":487},[463,5630,5631],{"class":465,"line":484},[463,5632,5633],{"class":469},"# push the code again\n",[463,5635,5636,5638],{"class":465,"line":491},[463,5637,4291],{"class":494},[463,5639,5640],{"class":480}," push\n",[429,5642,5643,5644,5646],{},"Al verificar el proyecto en la aplicación de escritorio Buzz se muestra lo siguiente, porque la aplicación necesita ",[442,5645,5447],{}," — al iniciar la aplicación directamente puede que se use una versión anterior de Git:",[429,5648,5649],{},[970,5650],{"alt":5651,"src":5652},"El cliente Buzz muestra error de carga de Git debido a una versión local de Git desactualizada inferior a 2.46","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[429,5654,5655,5656,5659,5660,728],{},"Exporta el PATH mediante ",[433,5657,5658],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\""," en el perfil de la shell e inicia la aplicación Buzz desde la shell. Consulta esta ",[635,5661,5664],{"href":5662,"rel":5663},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[667],"incidencia",[455,5666,5668],{"className":457,"code":5667,"language":459,"meta":424,"style":424},"open -a Buzz\n",[433,5669,5670],{"__ignoreMap":424},[463,5671,5672,5675,5678],{"class":465,"line":466},[463,5673,5674],{"class":494},"open",[463,5676,5677],{"class":480}," -a",[463,5679,5680],{"class":480}," Buzz\n",[429,5682,5683],{},"Vuelve a consultar los Proyectos en la aplicación Buzz, los detalles del repositorio ahora están cargados.",[429,5685,5686],{},[970,5687],{"alt":5688,"src":5689},"Interfaz de escritorio Buzz con detalles del repositorio Git y registros de commits cargados correctamente","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-repository-details-loaded.webp",[447,5691,5693],{"id":5692},"sincronización-de-agentes-de-ia-con-la-aplicación-móvil-buzz-mediante-código-qr","Sincronización de agentes de IA con la aplicación móvil Buzz mediante código QR",[429,5695,5696,5697,5700],{},"El emparejamiento de la aplicación móvil Buzz solo acepta el protocolo HTTPS y el servicio ",[433,5698,5699],{},"buzz-pair-relay"," no se inicia de forma predeterminada en el VPS.",[455,5702,5704],{"className":457,"code":5703,"language":459,"meta":424,"style":424},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[433,5705,5706,5712],{"__ignoreMap":424},[463,5707,5708,5710],{"class":465,"line":466},[463,5709,544],{"class":476},[463,5711,5153],{"class":480},[463,5713,5714,5716,5718,5720],{"class":465,"line":473},[463,5715,5158],{"class":494},[463,5717,2032],{"class":480},[463,5719,5163],{"class":480},[463,5721,5722],{"class":480}," crates\u002Fbuzz-pair-relay\n",[429,5724,5725,5726,5729,5730,944],{},"Agrega lo siguiente a ",[433,5727,5728],{},"compose.yml"," para iniciar el servicio ",[433,5731,5699],{},[455,5733,5735],{"className":4465,"code":5734,"language":4467,"meta":424,"style":424},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[433,5736,5737,5744,5753,5773,5779,5789,5795,5806,5814,5820],{"__ignoreMap":424},[463,5738,5739,5742],{"class":465,"line":466},[463,5740,5741],{"class":4556},"  pair",[463,5743,760],{"class":504},[463,5745,5746,5748,5750],{"class":465,"line":473},[463,5747,4621],{"class":4556},[463,5749,944],{"class":504},[463,5751,5752],{"class":480}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[463,5754,5755,5758,5760,5763,5765,5768,5770],{"class":465,"line":484},[463,5756,5757],{"class":4556},"    entrypoint",[463,5759,944],{"class":504},[463,5761,5762],{"class":504}," [",[463,5764,512],{"class":504},[463,5766,5767],{"class":480},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[463,5769,512],{"class":504},[463,5771,5772],{"class":504},"]\n",[463,5774,5775,5777],{"class":465,"line":491},[463,5776,4655],{"class":4556},[463,5778,760],{"class":504},[463,5780,5781,5784,5786],{"class":465,"line":536},[463,5782,5783],{"class":4556},"      BUZZ_PAIR_RELAY_BIND_ADDR",[463,5785,944],{"class":504},[463,5787,5788],{"class":480}," 0.0.0.0:5000\n",[463,5790,5791,5793],{"class":465,"line":541},[463,5792,4571],{"class":4556},[463,5794,760],{"class":504},[463,5796,5797,5799,5801,5804],{"class":465,"line":554},[463,5798,4688],{"class":504},[463,5800,505],{"class":504},[463,5802,5803],{"class":480},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[463,5805,551],{"class":504},[463,5807,5808,5810,5812],{"class":465,"line":559},[463,5809,4740],{"class":4556},[463,5811,944],{"class":504},[463,5813,4745],{"class":480},[463,5815,5816,5818],{"class":465,"line":571},[463,5817,4751],{"class":4556},[463,5819,760],{"class":504},[463,5821,5822,5825,5828],{"class":465,"line":2019},[463,5823,5824],{"class":504},"      [",[463,5826,5827],{"class":480},"buzz-net",[463,5829,5772],{"class":504},[429,5831,4411,5832,436,5835,5838,5839,944],{},[433,5833,5834],{},"BUZZ_PAIRING_RELAY_URL",[433,5836,5837],{},"BUZZ_PAIR_RELAY_PORT"," al archivo ",[433,5840,4331],{},[455,5842,5845],{"className":5843,"code":5844,"language":1622},[1620],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[433,5846,5844],{"__ignoreMap":424},[429,5848,5849,5850,5853],{},"Dirígete a '",[442,5851,5852],{},"Mobile","' en la configuración de la aplicación de escritorio Buzz:",[429,5855,5856],{},[970,5857],{"alt":5858,"src":5859},"Diálogo de configuración en la aplicación Buzz mostrando la pestaña de configuración de dispositivos móviles","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[429,5861,5862],{},"Haz clic en \"Start pairing\": se generará un código QR; escanea este código QR con la aplicación Buzz en el dispositivo móvil. Se emparejará después de hacer clic en \"Code Match\".",[429,5864,5865],{},[970,5866],{"alt":5867,"src":5868},"Generando código QR de emparejamiento seguro en el cliente de escritorio para sincronización móvil Buzz","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[429,5870,5871],{},"Los agentes en la aplicación móvil de Buzz solo están disponibles si se están ejecutando en la aplicación de escritorio de Buzz. La máquina de escritorio debe estar encendida para que los agentes funcionen.",[429,5873,5874],{},[970,5875],{"alt":5876,"src":5877},"Interfaz de la aplicación móvil Buzz mostrando los agentes de IA activos sincronizados","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[447,5879,5881],{"id":5880},"reflexión-final","Reflexión final",[429,5883,5884],{},"Aunque Buzz todavía se encuentra en una etapa muy temprana para entornos de producción a gran escala, con varios errores y limitaciones en la interfaz de usuario, es una experiencia emocionante para equipos pequeños y desarrolladores individuales. Ofrece un adelanto de cómo se siente realmente un espacio de trabajo colaborativo diseñado especialmente para la inteligencia artificial.",[447,5886,5887],{"id":1805},"Referencias",[583,5889,5890,5897,5904,5911],{},[586,5891,5892],{},[635,5893,5896],{"href":5894,"rel":5895},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[667],"Buzz releases",[586,5898,5899],{},[635,5900,5903],{"href":5901,"rel":5902},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[667],"Introducing Buzz",[586,5905,5906],{},[635,5907,5910],{"href":5908,"rel":5909},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[667],"What is buzz",[586,5912,5913],{},[635,5914,5917],{"href":5915,"rel":5916},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[667],"How to self-host Buzz (Miget)",[1028,5919,5920],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":424,"searchDepth":473,"depth":484,"links":5922},[5923,5924,5925,5939,5948,5949,5950],{"id":3844,"depth":473,"text":3845},{"id":3889,"depth":473,"text":3890},{"id":3937,"depth":473,"text":3938,"children":5926},[5927,5928,5932,5933,5934,5938],{"id":3941,"depth":484,"text":3942},{"id":3970,"depth":484,"text":3971,"children":5929},[5930,5931],{"id":3974,"depth":491,"text":3975},{"id":4071,"depth":491,"text":4072},{"id":4089,"depth":484,"text":4090},{"id":4280,"depth":484,"text":4281},{"id":4430,"depth":484,"text":4431,"children":5935},[5936,5937],{"id":4434,"depth":491,"text":4435},{"id":4828,"depth":491,"text":4829},{"id":4894,"depth":484,"text":4895},{"id":4933,"depth":473,"text":4934,"children":5940},[5941,5942,5943],{"id":5016,"depth":484,"text":5017},{"id":5061,"depth":484,"text":5062},{"id":5098,"depth":484,"text":5099,"children":5944},[5945,5946,5947],{"id":5122,"depth":491,"text":5123},{"id":5362,"depth":491,"text":5363},{"id":5436,"depth":491,"text":5437},{"id":5692,"depth":473,"text":5693},{"id":5880,"depth":473,"text":5881},{"id":1805,"depth":473,"text":5887},[5952,1039,5347],"collaboration","2026-09-08","Aprende a autoalojar el relay de Buzz en un VPS con Ubuntu detrás de Cloudflare. Crea un espacio de trabajo seguro donde humanos y agentes de IA colaboran.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FES-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","Tarjeta tecnológica premium de 16:9 con detalles en azul profundo y naranja que ilustra cómo autoalojar el relay de Buzz de Block en un VPS Ubuntu, con un panel de estilo glassmorphic limpio con tipografía centrada.",{"schemaOrg":5958,"robots":1049,"sitemap":5978},[5959,5960],{"@type":1048,"headline":3824,"description":5954,"image":5955},{"@type":3807,"name":3824,"description":5954,"image":5955,"step":5961},[5962,5966,5969,5972,5975],{"@type":5963,"name":5964,"text":5965},"HowToStep","Fase 1: Configuración de Cloudflare","Crear un token de API de Cloudflare y configurar los ajustes de DNS.",{"@type":5963,"name":5967,"text":5968},"Fase 2: Instalar Docker","Configurar e instalar Docker Engine en el VPS Ubuntu.",{"@type":5963,"name":5970,"text":5971},"Fase 3: Clonar y configurar","Clonar el repositorio y configurar las variables de compose.",{"@type":5963,"name":5973,"text":5974},"Fase 4: Integración de Caddy","Compilar un Caddy personalizado con el módulo de desafío de DNS de Cloudflare.",{"@type":5963,"name":5976,"text":5977},"Fase 5: Copia de seguridad automatizada","Configurar una tarea cron para respaldar automáticamente PostgreSQL.",{"lastmod":3819},{"title":5980,"description":5954,"ogTitle":3824,"ogDescription":5954,"twitterTitle":3824,"twitterDescription":5954},"Cómo instalar y autoalojar el relay de Buzz de Block en VPS","es\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[5983,3816,3840,3818,1056],"Nostr","lURqc67rsxryYNK-aIxLymy3oKyalHndZyE0VbcVtWc",{"id":1881,"title":1882,"author":1059,"body":1883,"category":3798,"date":3800,"description":3801,"extension":1042,"image":3802,"imageAlt":3803,"isPublished":487,"meta":3804,"minRead":3812,"navigation":487,"path":379,"seo":3813,"stem":3814,"tags":3815,"updatedAt":3819,"__hash__":3820},{"id":1064,"title":1065,"author":1059,"body":1066,"category":1862,"date":1864,"description":1865,"extension":1042,"image":1866,"imageAlt":1867,"isPublished":487,"meta":1868,"minRead":559,"navigation":487,"path":415,"seo":1873,"stem":1874,"tags":1875,"updatedAt":1059,"__hash__":1879},1792489988226]