<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bitwarden on recca0120 Tech Notes</title><link>https://recca0120.github.io/en/tags/bitwarden/</link><description>Recent content in Bitwarden on recca0120 Tech Notes</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 07 Apr 2026 17:34:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/en/tags/bitwarden/index.xml" rel="self" type="application/rss+xml"/><item><title>NodeWarden: Bitwarden on Cloudflare Workers — No Server Required</title><link>https://recca0120.github.io/en/2026/04/07/nodewarden-bitwarden-cloudflare-workers/</link><pubDate>Tue, 07 Apr 2026 17:34:00 +0800</pubDate><guid>https://recca0120.github.io/en/2026/04/07/nodewarden-bitwarden-cloudflare-workers/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post NodeWarden: Bitwarden on Cloudflare Workers — No Server Required" /&gt;&lt;p&gt;Self-hosting Bitwarden gives you two paths. The official version requires Docker and eats memory. &lt;a class="link" href="https://github.com/dani-garcia/vaultwarden" target="_blank" rel="noopener"
 &gt;Vaultwarden&lt;/a&gt; rewrites it in Rust, much lighter, but you still need a VPS, HTTPS configuration, regular updates, and database backups.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/shuaiplus/nodewarden" target="_blank" rel="noopener"
 &gt;NodeWarden&lt;/a&gt; takes a third path: run directly on Cloudflare Workers. No VPS, no SSL management, no uptime monitoring. Cloudflare&amp;rsquo;s free tier is enough.&lt;/p&gt;
&lt;h2 id="how-it-differs-from-vaultwarden"&gt;&lt;a href="#how-it-differs-from-vaultwarden" class="header-anchor"&gt;&lt;/a&gt;How It Differs from Vaultwarden
&lt;/h2&gt;&lt;p&gt;Vaultwarden is the most popular third-party Bitwarden server, written in Rust, running in Docker. NodeWarden is written in TypeScript, running on Cloudflare Workers.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;Vaultwarden&lt;/th&gt;
 &lt;th&gt;NodeWarden&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Language&lt;/td&gt;
 &lt;td&gt;Rust&lt;/td&gt;
 &lt;td&gt;TypeScript&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Deployment&lt;/td&gt;
 &lt;td&gt;Docker / VPS&lt;/td&gt;
 &lt;td&gt;Cloudflare Workers&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Database&lt;/td&gt;
 &lt;td&gt;SQLite / MySQL / PostgreSQL&lt;/td&gt;
 &lt;td&gt;Cloudflare D1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Attachment storage&lt;/td&gt;
 &lt;td&gt;Local filesystem&lt;/td&gt;
 &lt;td&gt;R2 or KV&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;SSL&lt;/td&gt;
 &lt;td&gt;Self-configured&lt;/td&gt;
 &lt;td&gt;Cloudflare handles it&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Maintenance&lt;/td&gt;
 &lt;td&gt;Manual updates and backups&lt;/td&gt;
 &lt;td&gt;Fork + auto-sync upstream&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Cost&lt;/td&gt;
 &lt;td&gt;VPS monthly fee&lt;/td&gt;
 &lt;td&gt;Cloudflare free tier&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Organizations/Collections&lt;/td&gt;
 &lt;td&gt;Supported&lt;/td&gt;
 &lt;td&gt;Not supported&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The biggest difference is operational burden. Vaultwarden needs you to maintain a VPS. NodeWarden is fully serverless. The downside is no organization or collection features, making it unsuitable for teams.&lt;/p&gt;
&lt;h2 id="technical-architecture"&gt;&lt;a href="#technical-architecture" class="header-anchor"&gt;&lt;/a&gt;Technical Architecture
&lt;/h2&gt;&lt;p&gt;NodeWarden is built entirely on Cloudflare&amp;rsquo;s infrastructure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compute&lt;/strong&gt;: Cloudflare Workers (serverless)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database&lt;/strong&gt;: D1 (Cloudflare&amp;rsquo;s SQLite)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attachment storage&lt;/strong&gt;: R2 (object storage) or KV (key-value)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frontend&lt;/strong&gt;: Preact (original Web Vault interface)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Two storage options:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Option&lt;/th&gt;
 &lt;th&gt;Credit card required&lt;/th&gt;
 &lt;th&gt;Max attachment size&lt;/th&gt;
 &lt;th&gt;Free quota&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;R2&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;100 MB (adjustable)&lt;/td&gt;
 &lt;td&gt;10 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;KV&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;25 MiB (hard limit)&lt;/td&gt;
 &lt;td&gt;1 GB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you don&amp;rsquo;t want to add a credit card, use KV mode. 1 GB free quota is more than enough for personal password management. Only consider R2 if you need large attachments.&lt;/p&gt;
&lt;h2 id="feature-comparison"&gt;&lt;a href="#feature-comparison" class="header-anchor"&gt;&lt;/a&gt;Feature Comparison
&lt;/h2&gt;&lt;p&gt;Compared to official Bitwarden, everything needed for personal use is covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web Vault password manager interface&lt;/li&gt;
&lt;li&gt;Full sync (&lt;code&gt;/api/sync&lt;/code&gt;), compatible with official clients&lt;/li&gt;
&lt;li&gt;Attachment upload and download&lt;/li&gt;
&lt;li&gt;Send feature (text and files)&lt;/li&gt;
&lt;li&gt;Import/export (Bitwarden JSON/CSV, ZIP with attachments)&lt;/li&gt;
&lt;li&gt;TOTP and Steam TOTP&lt;/li&gt;
&lt;li&gt;Multi-user (invitation code registration)&lt;/li&gt;
&lt;li&gt;Password hints (viewable directly in web, no email required)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NodeWarden adds one feature the official version lacks: a &lt;strong&gt;cloud backup center&lt;/strong&gt;. Supports WebDAV and E3 protocol for scheduled backups, including &lt;code&gt;db.json&lt;/code&gt;, &lt;code&gt;manifest.json&lt;/code&gt;, and &lt;code&gt;attachments/&lt;/code&gt; directory. During restoration, missing attachments are safely skipped without leaving broken records.&lt;/p&gt;
&lt;p&gt;Not supported: organizations, collections, permission management, SSO, SCIM, enterprise directories. These are team features unnecessary for personal use.&lt;/p&gt;
&lt;h3 id="client-compatibility"&gt;&lt;a href="#client-compatibility" class="header-anchor"&gt;&lt;/a&gt;Client Compatibility
&lt;/h3&gt;&lt;p&gt;Tested and working:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows desktop&lt;/li&gt;
&lt;li&gt;Mobile apps (iOS / Android)&lt;/li&gt;
&lt;li&gt;Browser extensions&lt;/li&gt;
&lt;li&gt;Linux desktop&lt;/li&gt;
&lt;li&gt;macOS desktop (not fully verified)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deployment"&gt;&lt;a href="#deployment" class="header-anchor"&gt;&lt;/a&gt;Deployment
&lt;/h2&gt;&lt;h3 id="web-deployment-recommended"&gt;&lt;a href="#web-deployment-recommended" class="header-anchor"&gt;&lt;/a&gt;Web Deployment (Recommended)
&lt;/h3&gt;&lt;p&gt;The simplest approach, no local tools needed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fork the &lt;a class="link" href="https://github.com/shuaiplus/nodewarden" target="_blank" rel="noopener"
 &gt;NodeWarden repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Go to the &lt;a class="link" href="https://dash.cloudflare.com" target="_blank" rel="noopener"
 &gt;Cloudflare Workers console&lt;/a&gt; and create a new project&lt;/li&gt;
&lt;li&gt;Choose Continue with GitHub, point to your forked repo&lt;/li&gt;
&lt;li&gt;Keep default settings and deploy&lt;/li&gt;
&lt;li&gt;For KV mode, change the deploy command to &lt;code&gt;npm run deploy:kv&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Set the &lt;code&gt;JWT_SECRET&lt;/code&gt; environment variable (at least 32 random characters)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The whole process takes under five minutes.&lt;/p&gt;
&lt;h3 id="cli-deployment"&gt;&lt;a href="#cli-deployment" class="header-anchor"&gt;&lt;/a&gt;CLI Deployment
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/shuaiplus/NodeWarden.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; NodeWarden
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx wrangler login
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# R2 mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run deploy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# KV mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run deploy:kv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Local development:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev &lt;span class="c1"&gt;# R2 mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev:kv &lt;span class="c1"&gt;# KV mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="automatic-updates"&gt;&lt;a href="#automatic-updates" class="header-anchor"&gt;&lt;/a&gt;Automatic Updates
&lt;/h2&gt;&lt;p&gt;After forking, enable the &lt;code&gt;Sync upstream&lt;/code&gt; workflow in GitHub Actions. It auto-syncs with upstream daily at 3am. For manual updates, click Sync fork → Update branch on your fork page.&lt;/p&gt;
&lt;h2 id="nodewarden-or-vaultwarden"&gt;&lt;a href="#nodewarden-or-vaultwarden" class="header-anchor"&gt;&lt;/a&gt;NodeWarden or Vaultwarden
&lt;/h2&gt;&lt;p&gt;If you already have a stable VPS, Vaultwarden is more feature-complete with a larger community. Organizations, collections, and login 2FA are all supported.&lt;/p&gt;
&lt;p&gt;NodeWarden fits these scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No VPS management&lt;/strong&gt;. No server means no maintenance — no uptime worries, no expired SSL certs, no full disks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero budget&lt;/strong&gt;. Cloudflare&amp;rsquo;s free tier is plenty for personal use&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solo user&lt;/strong&gt;. No need for organizations and permission management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offsite backups&lt;/strong&gt;. Built-in WebDAV backup is more convenient than Vaultwarden&amp;rsquo;s approach&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main risk is that your password vault runs on Cloudflare&amp;rsquo;s infrastructure. D1 and Workers are relatively new services. While Cloudflare probably won&amp;rsquo;t shut them down suddenly, free tier limits and terms can change anytime. Regular WebDAV backups are essential.&lt;/p&gt;
&lt;p&gt;Also note that NodeWarden hasn&amp;rsquo;t undergone the same level of community security review as Vaultwarden. Password managers are high-sensitivity applications — assess the risk yourself before using it.&lt;/p&gt;
&lt;h2 id="references"&gt;&lt;a href="#references" class="header-anchor"&gt;&lt;/a&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/shuaiplus/nodewarden" target="_blank" rel="noopener"
 &gt;NodeWarden GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/dani-garcia/vaultwarden" target="_blank" rel="noopener"
 &gt;Vaultwarden — Rust-based Bitwarden-compatible Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.cloudflare.com/d1/" target="_blank" rel="noopener"
 &gt;Cloudflare D1 Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.cloudflare.com/r2/" target="_blank" rel="noopener"
 &gt;Cloudflare R2 Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://bitwarden.com/" target="_blank" rel="noopener"
 &gt;Bitwarden Official Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>