A zero-knowledge, client-side encrypted password manager β your secrets never leave your browser unencrypted.
Master's Vault stores passwords, secure notes, crypto wallets, and card details β all encrypted in your browser with Argon2id + AES-256-GCM before being synced to Supabase. Even if someone steals your database, they get nothing but random noise.
- π Zero-Knowledge Encryption β Argon2id key derivation + AES-256-GCM. Server never sees your data.
- π§ Panic Mode β Enter a decoy password to silently wipe your real vault from the server.
- π΅οΈ Auto-Lock β Locks after 2 minutes of inactivity or when tab loses focus.
- π Auto-Clear Clipboard β Copies auto-clear after 20 seconds.
- ποΈ 4 Vault Categories β Logins, Secure Notes, Crypto Wallets, Cards & IDs.
- π Password Change β Re-encrypts your entire vault under a new master password.
- π Works Offline (read-only) β In-memory cache survives brief disconnects.
## π Live Demo
**[master-vault-test.netlify.app](https://master-vault-test.netlify.app)**
| | |
|---|---|
| π Master Password | `testpassword` |
| π Panic Password | `panictest123` |
> β οΈ This is a shared demo vault. Do not store real passwords here.- A free Supabase account
- A free Netlify account (or any static host)
- A text editor (VS Code recommended)
- Go to supabase.com β Start your project β Sign in with GitHub.
- Click New Project, give it a name (e.g.,
masters-vault), set a database password, pick a region near you. - Wait ~2 minutes for the project to spin up.
- In your Supabase dashboard, click Project Settings (gear icon, bottom left).
- Click API in the left menu.
- Copy your Project URL and anon / public API Key. Keep this tab open.
- In your Supabase dashboard, click SQL Editor (the
</>icon in the left sidebar). - Click New Query.
- Open the
supabase_setup.sqlfile from this repo, copy all of it, paste it in, and click Run. - You should see
Success. No rows returned.β the table is ready.
- Open
src/store.jsin a text editor. - Find lines 4β5 at the top:
const SUPABASE_URL = 'https://YOUR_PROJECT_REF.supabase.co'; const SUPABASE_ANON_KEY = 'YOUR_ANON_KEY';
- Replace them with the values you copied in Step 2. Save the file.
- Go to netlify.com β Log in β Click Add new site β Deploy manually.
- Drag your entire project folder into the upload area.
- Done! Netlify gives you a live URL instantly.
- Push this repo to your GitHub account.
- Go to netlify.com β Add new site β Import from Git.
- Connect GitHub, select your repository.
- Leave all build settings blank (this is a static site β no build command needed).
- Click Deploy site. Done!
π‘ Custom Domain: In Netlify β Domain settings β Add custom domain. It's free with automatic HTTPS.
- Open your Netlify URL in a browser.
- The lock screen will say "Set Master Password" β this only happens once.
- Type a strong master password and click Initialize Vault.
β οΈ Write this password down somewhere safe. If you forget it, your data is permanently unrecoverable.
If you forget your master password, your encrypted data is permanently unrecoverable. However, you can wipe everything and start fresh.
Step 1 β Delete the database table by running this in your Supabase SQL Editor:
DROP POLICY IF EXISTS "Enable read access for all users" ON public.vault_items;
DROP POLICY IF EXISTS "Enable insert for all users" ON public.vault_items;
DROP POLICY IF EXISTS "Enable update for all users" ON public.vault_items;
DROP POLICY IF EXISTS "Enable delete for all users" ON public.vault_items;
DROP TABLE IF EXISTS public.vault_items;Step 2 β Re-run supabase_setup.sql to recreate the empty table.
Step 3 β Clear localStorage in your browser by opening DevTools (F12) β Application β Local Storage β select your site β Click Clear All.
Step 4 β Reload the app. It will say "Set Master Password" again β you're starting fresh.
β οΈ This permanently destroys all previously stored vault data. There is no recovery.
masters-vault/
βββ index.html # App shell & all screens
βββ style.css # Full dark-mode UI
βββ supabase_setup.sql # Run this once in Supabase SQL Editor
βββ src/
βββ main.js # Entry point, auth logic
βββ crypto.js # Argon2 + AES-GCM encryption layer
βββ store.js # Supabase sync & local cache β add your keys here
βββ ui.js # All rendering & user interactions
| Layer | Technology | Purpose |
|---|---|---|
| Key Derivation | Argon2id (64MB, 2 iter) | Brute-force resistant master key |
| Encryption | AES-256-GCM | Authenticated encryption per item |
| Owner Isolation | SHA-256 hash of password+salt | Fetches only your rows from DB |
| Transport | HTTPS (Supabase + Netlify) | Encrypted in transit |
| Panic Mode | Decoy hash in localStorage | Wipes real vault on coercion |
The Supabase database only ever stores ciphertext. Even Anthropic, Supabase, or a hacker with full DB access cannot read your passwords.
- After unlocking, click Settings.
- Under Panic Mode, enter a different password and click Enable Panic Mode.
- If you are ever forced to open your vault, type the Panic Password instead of the real one.
- It will silently delete your entire real vault from Supabase and open an empty decoy.
Pull requests are welcome! For major changes, please open an issue first.
- Fork the repo
- Create a branch:
git checkout -b feature/your-feature - Commit:
git commit -m 'Add some feature' - Push:
git push origin feature/your-feature - Open a Pull Request
MIT License β see LICENSE for full text.
Copyright (c) 2025 MD. Abdur Rahim Ratul
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
If this project helped you, please consider:
- β Starring this repo β it helps others discover it!
- π Sharing on Twitter/X with
#OpenSource #Security #JavaScript - π Writing a blog post or Dev.to article linking back here
- π¬ Posting in r/selfhosted, r/webdev, r/netsec β this kind of self-hosted, zero-knowledge tool is exactly what those communities love
- π£οΈ Mentioning it in Discord servers for developers and privacy enthusiasts
Built with β€οΈ by ratulhub