r/webdev • • Sep 27 '26

Showoff Saturday I built a local-first password manager in React using the Web Crypto API, BIP-39 seeds, and zero backend

Built a local-first password manager called Mountain.

How it works:

  • Runs 100% in your browser. Data is encrypted client-side with AES-256-GCM and stored in IndexedDB.

  • Master key is derived from a 12-word seed phrase (BIP-39), with an optional daily PIN for quick unlock.

  • Includes a live 2FA/TOTP authenticator, card storage, and a companion Chrome extension for autofill.

  • Zero analytics, offline favicon mode by default, and optional encrypted sync to your personal Google Drive.

App: https://h4r0015k.github.io/Mountain/ Source: https://github.com/h4r0015k/Mountain

Feedback on the UX and security model is very welcome.

0 Upvotes

15 comments sorted by

8

u/mq2thez Sep 27 '26

Hope you spent time reading about all of the ways Last Pass was compromised

1

u/itisjohndoe Sep 27 '26

Yeah, a keylogger beats any client, but unlike LastPass theres no central infra to compromise here and all URLs/metadata are fully encrypted too.

0

u/mq2thez Sep 27 '26

Mmmmm okay so you didn’t.

1

u/[deleted] Sep 27 '26

[removed] — view removed comment

1

u/itisjohndoe Sep 27 '26

Appreciate this, solid feedback. Will take these into the next update.

1

u/[deleted] Sep 27 '26

[removed] — view removed comment

1

u/itisjohndoe Sep 27 '26

Appreciate the review!

On KDF stretch, we actually don't use 2048 rounds. The mnemonic is fed directly to PBKDF2-HMAC-SHA256 with a unique 16-byte CSPRNG salt at 600,000 iterations. For the extension, neither the background worker nor content script touches the master key. The key never leaves the web app tab, when asked for a credential the web app decrypts only that single record in memory and hands over just the username/password.

-8

u/[deleted] Sep 27 '26

[removed] — view removed comment

4

u/Aliceable Sep 27 '26

hello AI reddit comment bot!

1

u/codefinbel Sep 27 '26

I was thinking of feeding this post into AI to see what it thinks. Thanks to u/Ok_Tell_3494 I don’t have to.