[{"data":1,"prerenderedAt":1324},["ShallowReactive",2],{"search-navigation":3,"\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare":36,"\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare-surround":304},[4,8,12,16,20,24,28,32],{"title":5,"path":6,"stem":7},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":9,"path":10,"stem":11},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":13,"path":14,"stem":15},"How to Self-Host a BitWarden Compatible Password Vault","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":17,"path":18,"stem":19},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":21,"path":22,"stem":23},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":25,"path":26,"stem":27},"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":29,"path":30,"stem":31},"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":33,"path":34,"stem":35},"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":37,"title":9,"author":38,"body":39,"category":38,"date":288,"description":289,"extension":290,"image":291,"imageAlt":292,"isPublished":293,"meta":294,"minRead":300,"navigation":293,"path":301,"seo":302,"stem":11,"__hash__":303},"article\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare.md",null,{"type":40,"value":41,"toc":277},"minimark",[42,46,49,66,71,78,81,86,89,94,126,130,133,200,204,207,270,274],[43,44,45],"p",{},"The moment your NodeWarden is exposed to the public on the Internet, it starts attracting thousands of automated bots scrapping for vulnerabilities 24\u002F7. To protect your sensitive data, You need to put NodeWarden instance in the maximum lockdown possible.",[43,47,48],{},"To secure your NodeWarden instance, you can use one of two Cloudflare features:",[50,51,52,60],"ul",{},[53,54,55,59],"li",{},[56,57,58],"strong",{},"Cloudflare IP Access Rules:"," Allows you to block, challenge, or permit traffic based on specific IP addresses or countries.",[53,61,62,65],{},[56,63,64],{},"Cloudflare Zero Trust (Recommend):"," Acts as a secure gateway that makes your NodeWarden instance completely invisible to the public, only letting authorised users through.",[67,68,70],"h4",{"id":69},"why-we-recommend-cloudflare-zero-trust","Why we recommend Cloudflare Zero Trust",[43,72,73,74,77],{},"We strongly advise using Cloudflare Zero Trust since IP Access Rules are tied to IP addresses or countries, meaning you need to manually update the your rules every time you travel or if you have a dynamic IP address. Cloudflare Zero Trust on the other hand relies on your ",[56,75,76],{},"identity",", not your location—giving you seamless, secure access to NodeWarden.",[79,80],"hr",{},[82,83,85],"h2",{"id":84},"configuration-guide","Configuration Guide",[43,87,88],{},"Follow these steps to configure Cloudflare Zero Trust for NodeWarden.",[90,91,93],"h3",{"id":92},"phase-1-getting-started","Phase 1: Getting Started",[95,96,97,105,112,119],"ol",{},[53,98,99,100],{},"In your Cloudflare dashboard, click on 'Zero Trust' from left menu\n",[101,102],"img",{"alt":103,"src":104},"Cloudflare dashboard sidebar showing the Zero Trust option selected in the navigation menu.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-dashboard-zero-trust-sidebar.webp",[53,106,107,108],{},"Click on 'Access controls' then click on 'Applications'\n",[101,109],{"alt":110,"src":111},"Cloudflare Zero Trust navigation menu with Access controls section expanded.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-access-controls-menu.webp",[53,113,114,115],{},"You may be asked to 'Choose a plan'.\n",[101,116],{"alt":117,"src":118},"Cloudflare Zero Trust account setup screen prompting the user to choose a subscription plan.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-choose-plan-setup.webp",[53,120,121,122],{},"Click on the 'Choose a plan' button and choose the 'Zero Trust Free'.\n",[101,123],{"alt":124,"src":125},"The Zero Trust Free plan details page on Cloudflare, highlighting the Select plan button.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-zero-trust-free-plan-selection.webp",[90,127,129],{"id":128},"phase-2-secure-your-web-interface","Phase 2: Secure Your Web Interface",[43,131,132],{},"First, we will create an application to protect the NodeWarden web dashboard.",[95,134,135,142,149,156,163,170,177,180,187,190],{},[53,136,137,138],{},"Click on 'Create new application' to create the first application\n",[101,139],{"alt":140,"src":141},"Cloudflare Access Applications dashboard featuring the Create new application button.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-create-new-application.webp",[53,143,144,145],{},"Choose the 'Self-hosted and private'\n",[101,146],{"alt":147,"src":148},"The Add an application modal in Cloudflare Access with Self-hosted and private application type selected.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-add-self-hosted-application.webp",[53,150,151,152],{},"Enter the domain name of the NodeWarden.\n",[101,153],{"alt":154,"src":155},"Cloudflare Access application configuration screen showing the public hostname set to warden.techvoyage.dev.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-application-public-hostname.webp",[53,157,158,159],{},"Click on 'Create new policy' to create a policy.\n",[101,160],{"alt":161,"src":162},"Cloudflare Access policies page showing no policies added and a button to create a new policy.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.webp",[53,164,165,166],{},"Select 'Emails' and enter an email under 'Policy rules'.\n",[101,167],{"alt":168,"src":169},"Cloudflare Access policy rule configuration screen with an email address specified as the inclusion criteria.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.webp",[53,171,172,173],{},"Enter a name and select 'Allow' under 'Policy details'.\n",[101,174],{"alt":175,"src":176},"Cloudflare Access policy details screen showing the policy name NodeWarden-Web and the action set to Allow.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-details-allow.webp",[53,178,179],{},"Click 'Save Policy' to create the policy.",[53,181,182,183],{},"Enter a name and select '1 month' under the 'Details' section.\n",[101,184],{"alt":185,"src":186},"Final configuration summary for a Cloudflare Access application named NodeWarden-Web with a one-month session duration.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-application-final-details.webp",[53,188,189],{},"Click on 'Create' to create the application.",[53,191,192,195,196],{},[56,193,194],{},"Test it:"," Open the domain on the web browser, you will see the 'Cloudflare Access' asking for email.\n",[101,197],{"alt":198,"src":199},"A preview of the Cloudflare Access login screen for NodeWarden-Web, prompting for an email address.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-login-screen-preview.webp",[90,201,203],{"id":202},"phase-3-allow-bitwarden-clients-syncing-api-bypass","Phase 3: Allow BitWarden Clients Syncing (API Bypass)",[43,205,206],{},"The desktop and mobile BitWarden apps cannot process Cloudflare's email login screen, we need to create a second application that allows traffic to bypass the login screen specifically for API syncing.",[95,208,209,220,236,240,247,254,256,263],{},[53,210,211,212,215,216,219],{},"Go back to Applications and click ",[56,213,214],{},"Create new application",", choosing ",[56,217,218],{},"Self-hosted and private"," again.",[53,221,222,223,227,228,231,232],{},"Enter the 'api\u002F",[224,225,226],"em",{},"', 'identity\u002F","', 'notifications\u002F",[224,229,230],{},"', and 'icons\u002F","' in the Destinations.\n",[101,233],{"alt":234,"src":235},"Configuring multiple public hostnames for API bypass in Cloudflare Access, including api, identity, notifications, and icons paths.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-api-bypass-destinations.webp",[53,237,158,238],{},[101,239],{"alt":161,"src":162},[53,241,242,243],{},"Select 'Everyone' under 'Policy rules'.\n",[101,244],{"alt":245,"src":246},"Cloudflare Access policy rule configuration with Everyone selected to allow broad access for specific paths.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-everyone.webp",[53,248,249,250],{},"Enter a name and select 'Bypass' under 'Policy details'.\n",[101,251],{"alt":252,"src":253},"Cloudflare Access policy details for NodeWarden-API with the action set to Bypass.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-details-bypass.webp",[53,255,179],{},[53,257,258,259],{},"Enter a name and select '1 month' for 'Session Duration'.\n",[101,260],{"alt":261,"src":262},"Final configuration screen for the NodeWarden-API application in Cloudflare Access.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-api-application-final-details.webp",[53,264,265,266],{},"You should have 2 applications created.\n",[101,267],{"alt":268,"src":269},"The Cloudflare Access applications dashboard showing both the Web and API applications successfully created.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-applications-list-final.webp",[82,271,273],{"id":272},"final-thought","Final thought",[43,275,276],{},"Just remember that Cloudflare is your outer shield. To maintain a truly secure vault, ensure you are still using a strong master password, utilising Two-Factor Authentication (2FA) , and keeping your Cloudflare account secure.",{"title":278,"searchDepth":279,"depth":279,"links":280},"",2,[281,287],{"id":84,"depth":279,"text":85,"children":282},[283,285,286],{"id":92,"depth":284,"text":93},3,{"id":128,"depth":284,"text":129},{"id":202,"depth":284,"text":203},{"id":272,"depth":279,"text":273},"2026-05-27","The moment your NodeWarden is exposed to the public on the Internet, it starts attracting thousands of automated bots scrapping for vulnerabilities 24\u002F7.","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fsecure-nodewarden-cloudflare-integration-guide.webp","Step-by-step guide thumbnail for securing a NodeWarden vault with Cloudflare integration, featuring a digital safe with a padlock and a server rack protected by Cloudflare security.",true,{"schemaOrg":295,"robots":298,"sitemap":299},[296],{"@type":297,"headline":9,"description":289},"TechArticle","index, follow",{"lastmod":288},8,"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":9,"description":289,"ogTitle":9,"ogDescription":289,"twitterTitle":9,"twitterDescription":289},"xtXEwIvRit22QP7fb6fzAxG3CnL8OCgJlj1CMY8ctWg",[305,861],{"id":306,"title":13,"author":38,"body":307,"category":38,"date":850,"description":851,"extension":290,"image":852,"imageAlt":853,"isPublished":293,"meta":854,"minRead":300,"navigation":293,"path":14,"seo":859,"stem":15,"__hash__":860},"article\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare.md",{"type":40,"value":308,"toc":842},[309,312,318,322,513,517,536,540,568,572,627,631,672,676,706,710,713,717,742,746,765,769,772,789,794,797,800,812,816,829,833],[43,310,311],{},"Your passwords are your most critical digital property, and keeping them secure means keeping them in your own hands. By self-hosting your password manager; you take control of your own security.",[43,313,314,317],{},[56,315,316],{},"BitWarden"," is widely regarded as one of most trusted in password management domain and its source code is made available under AGPL-3.0 licence. An unofficial BitWarden compatible server, NodeWarden, is written in Typescript and can be deployed for free on Cloudflare.",[67,319,321],{"id":320},"feature-comparison-with-the-official-bitwarden-server","Feature Comparison with the Official BitWarden Server",[323,324,325,343],"table",{},[326,327,328],"thead",{},[329,330,331,335,337,340],"tr",{},[332,333,334],"th",{},"Capability",[332,336,316],{},[332,338,339],{},"NodeWarden",[332,341,342],{},"Notes",[344,345,346,362,378,390,402,417,434,449,465,477,489,502],"tbody",{},[329,347,348,352,355,357],{},[349,350,351],"td",{},"Web Vault",[349,353,354],{},"✅",[349,356,354],{},[349,358,359],{},[56,360,361],{},"Original Web Vault interface",[329,363,364,371,373,375],{},[349,365,366,367],{},"Full sync ",[368,369,370],"code",{},"\u002Fapi\u002Fsync",[349,372,354],{},[349,374,354],{},[349,376,377],{},"Compatibility optimised for official clients",[329,379,380,383,385,387],{},[349,381,382],{},"Attachment upload \u002F download",[349,384,354],{},[349,386,354],{},[349,388,389],{},"Cloudflare R2 or KV",[329,391,392,395,397,399],{},[349,393,394],{},"Send",[349,396,354],{},[349,398,354],{},[349,400,401],{},"Supports both text and file Sends",[329,403,404,407,409,411],{},[349,405,406],{},"Import \u002F Export",[349,408,354],{},[349,410,354],{},[349,412,413,414],{},"Supports BitWarden JSON \u002F CSV \u002F ",[56,415,416],{},"ZIP import with attachments",[329,418,419,424,427,429],{},[349,420,421],{},[56,422,423],{},"Cloud Backup Center",[349,425,426],{},"❌",[349,428,354],{},[349,430,431],{},[56,432,433],{},"Scheduled backup to WebDAV \u002F S3",[329,435,436,439,442,444],{},[349,437,438],{},"Password hint (web)",[349,440,441],{},"⚠️ Limited",[349,443,354],{},[349,445,446],{},[56,447,448],{},"No email required",[329,450,451,454,456,458],{},[349,452,453],{},"TOTP \u002F Steam TOTP",[349,455,354],{},[349,457,354],{},[349,459,460,461,464],{},"Includes ",[368,462,463],{},"steam:\u002F\u002F"," support",[329,466,467,470,472,474],{},[349,468,469],{},"Multi-user",[349,471,354],{},[349,473,354],{},[349,475,476],{},"Invite-based registration",[329,478,479,482,484,486],{},[349,480,481],{},"Organizations \u002F Collections \u002F Member roles",[349,483,354],{},[349,485,426],{},[349,487,488],{},"Not implemented",[329,490,491,494,496,499],{},[349,492,493],{},"Login 2FA",[349,495,354],{},[349,497,498],{},"⚠️ Partial",[349,500,501],{},"Currently only user-level TOTP",[329,503,504,507,509,511],{},[349,505,506],{},"SSO \u002F SCIM \u002F Enterprise directory",[349,508,354],{},[349,510,426],{},[349,512,488],{},[90,514,516],{"id":515},"what-we-need","What we need:",[95,518,519,524,530],{},[53,520,521],{},[56,522,523],{},"A GitHub Account",[53,525,526,529],{},[56,527,528],{},"A Cloudflare Account"," (Free) with R2 Storage enabled.",[53,531,532,535],{},[224,533,534],{},"Optional:"," A custom domain name managed in Cloudflare.",[90,537,539],{"id":538},"phase-1-prepare-the-code","Phase 1: Prepare the Code:",[95,541,542,561],{},[53,543,544,545,551,552,556,557],{},"Fork the NodeWarden repository from ",[546,547,548],"a",{"href":548,"rel":549},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fnodewarden",[550],"nofollow"," or original repository, ",[546,553,554],{"href":554,"rel":555},"https:\u002F\u002Fgithub.com\u002Fshuaiplus\u002Fnodewarden",[550]," in GitHub\n",[101,558],{"alt":559,"src":560},"Forking the NodeWarden repository on GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Ffork-nodewarden-repo.webp",[53,562,563,564],{},"Enable the Sync Upstream Workflow\n",[101,565],{"alt":566,"src":567},"Enabling the Sync Upstream workflow in GitHub Actions","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fenable-sync-upstream.webp",[90,569,571],{"id":570},"phase-2-deploy-to-cloudflare","Phase 2: Deploy to Cloudflare",[95,573,574,581,592],{},[53,575,576,577],{},"Create a Worker Application in Cloudflare\n",[101,578],{"alt":579,"src":580},"Creating a new Worker application in the Cloudflare dashboard","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcreate-cloudflare-worker.webp",[53,582,583,584,588],{},"Select 'Continue with GitHub' to deploy the app.\n",[101,585],{"alt":586,"src":587},"Deploying the NodeWarden app by connecting to GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fdeploy-github-repo.webp",[101,589],{"alt":590,"src":591},"Cloudflare Worker build and deployment progress","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-deploy-status.webp",[53,593,594,595,598,599,602,603,606,607],{},"Wait a few moments for Cloudflare to build and deploy your app. It will give you a default ",[368,596,597],{},"worker.dev"," URL.\n",[56,600,601],{},"(Optional) Add a Custom Domain:"," * In your Cloudflare Worker settings, go to the ",[56,604,605],{},"Settings"," tab.\n",[50,608,609,616],{},[53,610,611,612,615],{},"Click ",[56,613,614],{},"+ Add",".",[53,617,618,619,623],{},"Type in your preferred domain and follow the prompts.\n",[101,620],{"alt":621,"src":622},"Navigating to custom domain settings in Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fworker-settings-custom-domain.webp",[101,624],{"alt":625,"src":626},"Adding a custom domain to the Cloudflare Worker","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fadd-custom-domain.webp",[90,628,630],{"id":629},"phase-3-secure-your-server-the-jwt-secret","Phase 3: Secure Your Server (The JWT Secret)",[95,632,633,636,647,665],{},[53,634,635],{},"Head to the web browser and enter the custom domain name or the generated 'worker.dev' domain.",[53,637,638,639,642,643],{},"You will get '",[56,640,641],{},"JWT_SECRET is missing'",".\n",[101,644],{"alt":645,"src":646},"JWT_SECRET is missing error message on NodeWarden server","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fjwt-secret-missing-error.webp",[53,648,649,650,652,653,656,657,661],{},"Copy the generated secret key and head back to the Settings tab on the NodeWarden Worker, then click on '",[56,651,614],{},"' button on '",[56,654,655],{},"Variables and Secrets","' section.\n",[101,658],{"alt":659,"src":660},"Variables and Secrets section in Cloudflare Worker settings","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fworker-variables-secrets.webp",[101,662],{"alt":663,"src":664},"Adding the generated JWT secret to Cloudflare Worker variables","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fadd-jwt-secret.webp",[53,666,667,668,671],{},"Enter the generated secret and click on the '",[56,669,670],{},"Deploy \u002F Save","' button.",[90,673,675],{"id":674},"phase-4-create-your-admin-account","Phase 4: Create Your Admin Account",[95,677,678,685,696,703],{},[53,679,680,681],{},"Go back to the web browser and refresh the page, you will get the following login page.\n",[101,682],{"alt":683,"src":684},"NodeWarden server login page","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fnodewarden-login.webp",[53,686,687,688,691,692],{},"Click on '",[56,689,690],{},"Create Account","' to create the admin account.\n",[101,693],{"alt":694,"src":695},"Clicking the Create Account button on NodeWarden login page","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcreate-account-button.webp",[53,697,698,699],{},"Login using the created admin account to the Dashboard.\n",[101,700],{"alt":701,"src":702},"NodeWarden admin dashboard overview","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fnodewarden-dashboard.webp",[53,704,705],{},"Now we have the server deployed and running. We start configuring the BitWarden clients.",[90,707,709],{"id":708},"phase-5-connect-your-devices","Phase 5: Connect Your Devices",[43,711,712],{},"You can use the official BitWarden apps on all your devices.",[67,714,716],{"id":715},"chrome-extension","Chrome Extension",[95,718,719,722,725,732,739],{},[53,720,721],{},"Install the BitWarden Chrome extension",[53,723,724],{},"Open the extension.",[53,726,727,728],{},"Click the link next to 'Accessing:' at the bottom of the popup.\n",[101,729],{"alt":730,"src":731},"Selecting self-hosted option in Bitwarden Chrome extension","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-extension-self-hosted.webp",[53,733,734,735],{},"Enter the domain name of the NodeWarden server.\n",[101,736],{"alt":737,"src":738},"Entering server URL in Bitwarden Chrome extension","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-extension-domain.webp",[53,740,741],{},"Save the settings and log in with your account.",[67,743,745],{"id":744},"ios-app","iOS App",[95,747,748,751,758],{},[53,749,750],{},"Install the BitWarden app from the App Store",[53,752,753,754],{},"Open the app and click on 'Self-hosted' next to 'Logging in on:'\n",[101,755],{"alt":756,"src":757},"Accessing self-hosted settings in Bitwarden iOS app","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-ios-self-hosted.webp",[53,759,760,761],{},"Enter the domain name of the NodeWarden server and click on '✓' button.\n",[101,762],{"alt":763,"src":764},"Configuring server URL in Bitwarden iOS app","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fbitwarden-ios-domain.webp",[67,766,768],{"id":767},"other-clients","Other Clients",[43,770,771],{},"NodeWarden has been tested and confirmed compatible with these official BitWarden clients:",[50,773,774,777,780,783,786],{},[53,775,776],{},"✅ Windows desktop",[53,778,779],{},"✅ Android\u002FiOS mobile apps",[53,781,782],{},"✅ Browser extensions",[53,784,785],{},"✅ Linux desktop",[53,787,788],{},"⚠️ macOS desktop (not fully verified)",[790,791,793],"h1",{"id":792},"vault-backup","Vault Backup",[43,795,796],{},"NodeWarden allows you to back up your vault to a local computer or remote storage (WebDAV or S3-compatible storage).",[43,798,799],{},"To automate remote backups:",[50,801,802,805],{},[53,803,804],{},"Configure the remote storage details inside the NodeWarden dashboard.",[53,806,807,808],{},"Make sure the Cron task is set on Cloudflare Worker settings for auto remote backup.\n",[101,809],{"alt":810,"src":811},"Configuring Cron triggers for automatic vault backups in Cloudflare","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-worker-cron.webp",[790,813,815],{"id":814},"final-security-thoughts","Final Security thoughts",[50,817,818,821,824],{},[53,819,820],{},"Secure the Cloudflare account access, otherwise the data can be compromised. Enable the Two-Factor Authentication (2FA) or Passkey on your Cloudflare account immediately.",[53,822,823],{},"Host the NodeWarden on a dedicated Cloudflare account. Do not share resources with other web apps to minimise the security risks.",[53,825,826],{},[546,827,828],{"href":10},"Secure NodeWarden with Cloudflare",[790,830,832],{"id":831},"reference","Reference",[50,834,835],{},[53,836,837],{},[546,838,841],{"href":839,"rel":840},"https:\u002F\u002Fnodewarden.app\u002Fguide\u002Fstart",[550],"Official NodeWarden Start Guide",{"title":278,"searchDepth":279,"depth":279,"links":843},[844,845,846,847,848,849],{"id":515,"depth":284,"text":516},{"id":538,"depth":284,"text":539},{"id":570,"depth":284,"text":571},{"id":629,"depth":284,"text":630},{"id":674,"depth":284,"text":675},{"id":708,"depth":284,"text":709},"2026-05-25","Your passwords are your most critical digital property, and keeping them secure means keeping them in your own hands.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosting%20NodeWarden%20at%20Cloudflare\u002Fself-hosting-bitwarden-vault.webp","Thumbnail for self-hosting Bitwarden compatible server tutorial, showing a digital vault and a secure server rack.",{"schemaOrg":855,"robots":298,"sitemap":858},[856],{"@type":297,"headline":857,"description":851},"How to Lock Passwords in Your Own Vault by Self Hosting BitWarden Compatible Server",{"lastmod":850},{"title":857,"description":851,"ogTitle":857,"ogDescription":851,"twitterTitle":857,"twitterDescription":851},"WBOKFlSD1GZLEL8XT8ri6y7GEfqUNtI9Rmp48F1YVRI",{"id":862,"title":5,"author":38,"body":863,"category":38,"date":1312,"description":1313,"extension":290,"image":1314,"imageAlt":1315,"isPublished":293,"meta":1316,"minRead":1195,"navigation":293,"path":6,"seo":1322,"stem":7,"__hash__":1323},"article\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents.md",{"type":40,"value":864,"toc":1302},[865,876,879,902,919,923,933,950,960,967,970,1003,1009,1020,1039,1048,1059,1063,1070,1091,1094,1102,1112,1119,1122,1142,1152,1156,1162,1246,1252,1256,1292,1298],[43,866,867,868,871,872,875],{},"If you run multiple AI agents or CLIs on your computer—whether it's Hermes, Claude Code, Codex, Antigravity, Kimi, or other supported tools—you've probably hit a frustrating issue: ",[56,869,870],{},"skills fragmentation",". Every agent or CLI maintains its own separate ",[368,873,874],{},"skills"," folder, which leads to duplicate installations, version drift, and management overhead.",[43,877,878],{},"In our work with AI agents, we frequently ran into the following issues:",[50,880,881,887,893],{},[53,882,883,886],{},[56,884,885],{},"Multiple installs",": Installing a new skill for one agent, then install it again and again for others.",[53,888,889,892],{},[56,890,891],{},"Version drift",": Customising or fixing a skill for one agent, forgetting to update the rest, and ending up with agents behaving differently.",[53,894,895,898,899,901],{},[56,896,897],{},"Skills management",": Having to go through every ",[368,900,874],{}," folder for each agent across our system to see what skills were actually installed.",[43,903,904,905,908,909,911,912,615],{},"The ",[368,906,907],{},"npx skills"," CLI, an open-source CLI from Vercel,  solves the issue by letting you manage one centralised ",[368,910,874],{}," folder and share it across all your agents. You can check out the ",[546,913,916,918],{"href":914,"rel":915},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[550],[368,917,907],{},"GitHub repo",[82,920,922],{"id":921},"centralised-folder","Centralised Folder",[43,924,925,926,928,929,932],{},"The concept is simple: if we point every agent's ",[368,927,874],{}," folder to the ",[56,930,931],{},"same physical folder",", the fragmentation problem completely disappears.",[43,934,935,936,938,939,942,943,946,947,949],{},"When you install a skill using ",[368,937,907],{}," CLI, the skill is downloaded to the centralised folder on your machine (",[368,940,941],{},"~\u002F.agents\u002Fskills","). The CLI then creates a ",[56,944,945],{},"symlink"," (which is just a pointer) from each agent's ",[368,948,874],{}," folder back to that centralised folder.",[43,951,952,953,956,957,959],{},"For example, when Claude Code looks for skills in ",[368,954,955],{},"~\u002F.claude\u002Fskills\u002F",", it gets transparently redirected to ",[368,958,941],{},". If you make a tweak to a skill in that centralised folder, every single agent sees the update instantly. No manual copying, no sync scripts, and no wasted disk storage.",[82,961,963,964,966],{"id":962},"installing-npx-skills-and-adding-a-skill","Installing ",[368,965,907],{}," and Adding a Skill",[43,968,969],{},"Run the following command to get it started, and add our first skill:",[971,972,976],"pre",{"className":973,"code":974,"language":975,"meta":278,"style":278},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx skills add https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill --skill excalidraw-diagram\n","bash",[368,977,978],{"__ignoreMap":278},[979,980,983,987,991,994,997,1000],"span",{"class":981,"line":982},"line",1,[979,984,986],{"class":985},"sBMFI","npx",[979,988,990],{"class":989},"sfazB"," skills",[979,992,993],{"class":989}," add",[979,995,996],{"class":989}," https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[979,998,999],{"class":989}," --skill",[979,1001,1002],{"class":989}," excalidraw-diagram\n",[43,1004,1005],{},[101,1006],{"alt":1007,"src":1008},"Using npx skills add command to install a skill from GitHub","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-add-command.webp",[43,1010,1011,1012,1015,1016],{},"The CLI will ask whether to set this up for a specific project or globally. We usually recommend choosing ",[56,1013,1014],{},"global"," so all supported agents can access it:\n",[101,1017],{"alt":1018,"src":1019},"Selecting global installation option in npx skills CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-install-global-prompt.webp",[43,1021,1022,1023,1026,1027,1030,1031,1035],{},"Next, make sure to select ",[368,1024,1025],{},"Symlink"," to ensure a ",[56,1028,1029],{},"single source of truth",":\n",[101,1032],{"alt":1033,"src":1034},"Choosing symlink method for skill synchronization","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-symlink-option.webp",[101,1036],{"alt":1037,"src":1038},"Successful installation and symlink creation confirmation in CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-installation-completed.webp",[43,1040,1041,1042,1030,1044],{},"Once done, we can verify that the skill is installed in the centralised folder at ",[368,1043,941],{},[101,1045],{"alt":1046,"src":1047},"Verifying installed skills in the centralized directory","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-directory-verification.webp",[43,1049,1050,1051,1054,1055],{},"Open up the Kimi CLI (or any other agent), and the ",[368,1052,1053],{},"excalidraw-diagram"," skill is available and ready to use!\n",[101,1056],{"alt":1057,"src":1058},"Kimi CLI showing loaded and ready centralized skills","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skills-integration.webp",[82,1060,1062],{"id":1061},"creating-a-skill-from-scratch","Creating a Skill from Scratch",[43,1064,1065,1066,1069],{},"To build your own skills, you can use Anthropic's ",[368,1067,1068],{},"skill-creator"," tool. Install it like this:",[971,1071,1073],{"className":973,"code":1072,"language":975,"meta":278,"style":278},"npx skills add https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills --skill skill-creator\n",[368,1074,1075],{"__ignoreMap":278},[979,1076,1077,1079,1081,1083,1086,1088],{"class":981,"line":982},[979,1078,986],{"class":985},[979,1080,990],{"class":989},[979,1082,993],{"class":989},[979,1084,1085],{"class":989}," https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills",[979,1087,999],{"class":989},[979,1089,1090],{"class":989}," skill-creator\n",[43,1092,1093],{},"Now, in Kimi or any other agent, enter the following prompt:",[971,1095,1100],{"className":1096,"code":1098,"language":1099},[1097],"language-text","Use the skill-creator to help me build a skill for creating a product landing page\n","text",[368,1101,1098],{"__ignoreMap":278},[43,1103,1104,1105,1107,1108],{},"Kimi or your agent will automatically pick up the ",[368,1106,1068],{}," and walk you through the process step-by-step:\n",[101,1109],{"alt":1110,"src":1111},"Interactive skill-creator wizard executing in Kimi CLI","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skill-creator-setup.webp",[82,1113,1115,1116,1118],{"id":1114},"other-handy-npx-skills-commands","Other Handy ",[368,1117,907],{}," Commands",[43,1120,1121],{},"Here are some other handy commands:",[50,1123,1124,1130,1136],{},[53,1125,1126,1129],{},[368,1127,1128],{},"npx skills ls -g",": List all globally installed skills",[53,1131,1132,1135],{},[368,1133,1134],{},"npx skills update",": Keep all skills up to date with one command",[53,1137,1138,1141],{},[368,1139,1140],{},"npx skills remove",": Interactively uninstall\u002Fremove a skill",[43,1143,1144,1145,1151],{},"Please refer to the ",[546,1146,1148,1150],{"href":914,"rel":1147},[550],[368,1149,907],{}," GitHub repo"," for more commands and reference.",[82,1153,1155],{"id":1154},"taking-it-a-step-further","Taking It a Step Further",[43,1157,1158,1159,1161],{},"Since all skills are now in one place (",[368,1160,941],{},"), we can initialise it as a Git repository and push it to GitHub or GitLab.",[971,1163,1165],{"className":973,"code":1164,"language":975,"meta":278,"style":278},"cd ~\u002F.agents\u002Fskills\ngit init\ngit add .\ngit commit -m \"Initial skills folder\"\ngit remote add origin https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\ngit push -u origin main\n",[368,1166,1167,1176,1184,1193,1214,1230],{"__ignoreMap":278},[979,1168,1169,1173],{"class":981,"line":982},[979,1170,1172],{"class":1171},"s2Zo4","cd",[979,1174,1175],{"class":989}," ~\u002F.agents\u002Fskills\n",[979,1177,1178,1181],{"class":981,"line":279},[979,1179,1180],{"class":985},"git",[979,1182,1183],{"class":989}," init\n",[979,1185,1186,1188,1190],{"class":981,"line":284},[979,1187,1180],{"class":985},[979,1189,993],{"class":989},[979,1191,1192],{"class":989}," .\n",[979,1194,1196,1198,1201,1204,1208,1211],{"class":981,"line":1195},4,[979,1197,1180],{"class":985},[979,1199,1200],{"class":989}," commit",[979,1202,1203],{"class":989}," -m",[979,1205,1207],{"class":1206},"sMK4o"," \"",[979,1209,1210],{"class":989},"Initial skills folder",[979,1212,1213],{"class":1206},"\"\n",[979,1215,1217,1219,1222,1224,1227],{"class":981,"line":1216},5,[979,1218,1180],{"class":985},[979,1220,1221],{"class":989}," remote",[979,1223,993],{"class":989},[979,1225,1226],{"class":989}," origin",[979,1228,1229],{"class":989}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\n",[979,1231,1233,1235,1238,1241,1243],{"class":981,"line":1232},6,[979,1234,1180],{"class":985},[979,1236,1237],{"class":989}," push",[979,1239,1240],{"class":989}," -u",[979,1242,1226],{"class":989},[979,1244,1245],{"class":989}," main\n",[43,1247,1248,1249,615],{},"Now, we have a complete history of all skill changes, meaning we can easily roll back if an update breaks something. Plus, we can seamlessly sync the skills across multiple machines (like a laptop and desktop) by running a quick ",[368,1250,1251],{},"git pull",[82,1253,1255],{"id":1254},"a-few-things-to-keep-in-mind-security-risks","A Few Things to Keep in Mind (Security & Risks)",[50,1257,1258,1264,1270,1280,1286],{},[53,1259,1260,1263],{},[56,1261,1262],{},"Compatibility varies",": Not all agent platforms support every feature (like custom hooks or specific allowed tools) yet. A skill might work great in one agent but fall short in another.",[53,1265,1266,1269],{},[56,1267,1268],{},"Trust the source",": Only install skills from trusted sources.",[53,1271,1272,1275,1276,1279],{},[56,1273,1274],{},"Review before running",": If you are using a custom or third-party skill, review the files (especially in the ",[368,1277,1278],{},"scripts\u002F"," folder) before letting your agent run it.",[53,1281,1282,1285],{},[56,1283,1284],{},"Least privilege",": Try not to give a skill more tool permissions or access than it absolutely needs to do its job.",[53,1287,1288,1291],{},[56,1289,1290],{},"Never hardcode secrets",": Keep your API keys and secrets out of your skill files.",[43,1293,1294,1295,1297],{},"Setting up a centralised \"single source of truth\" with ",[368,1296,907],{}," has saved our team from frustration and duplicate work. It is highly recommended to give it a try—the AI capabilities scale as skills grow!",[1299,1300,1301],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":278,"searchDepth":279,"depth":279,"links":1303},[1304,1305,1307,1308,1310,1311],{"id":921,"depth":279,"text":922},{"id":962,"depth":279,"text":1306},"Installing npx skills and Adding a Skill",{"id":1061,"depth":279,"text":1062},{"id":1114,"depth":279,"text":1309},"Other Handy npx skills Commands",{"id":1154,"depth":279,"text":1155},{"id":1254,"depth":279,"text":1255},"2026-06-04","Running multiple AI agents like Claude Code or Kimi? Learn how to fix skills fragmentation and manage a single, centralized skills folder using npx skills CLI.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002FSolving-AI-Agent-Skills-Fragmentation-with-npx-skills.webp","How to solve AI agent skills fragmentation using npx skills",{"schemaOrg":1317,"robots":298,"sitemap":1320},[1318],{"@type":297,"headline":1319,"description":1313},"How to Solve AI Agent Skills Fragmentation Using npx skills",{"lastmod":1321},"2026-06-03",{"title":1319,"description":1313,"ogTitle":5,"ogDescription":1313,"twitterTitle":5,"twitterDescription":1313},"NwxIwYRWVSTBGttk2H6IRhsFpEvLEQrNCbTpGUkF58A",1781435112363]