rustiqz/Vaultiq

Vaultiq -- personal, zero-knowledge password manager. Primarily used in browser and mobile, with desktop support planned.

TypeScript

1

344 commits

updated Oct 17, 2026

See the code

See what people are saying

SourceMessageScoreDate

How do you handle secret memory across wasm and FFI boundaries? Notes from building a password manager core (r/rust)

I’ve been building a hobby password manager (Vaultiq) around one crypto crate that compiles to wasm for a browser extension and goes through uniffi for an Android app. A few design questions came up that I’d like other people’s takes on. What I did: * \#!\[forbid(unsafe\_code)\] crate-wide. The…

2

Oct 19, 2026

README

Vaultiq

A zero-knowledge, self-hosted password manager for Firefox, Chrome and Android.

CI Latest release License: AGPL-3.0


Vaultiq encrypts everything on your device before it goes anywhere. The server you run stores ciphertext and cannot read it. Item names, URLs, usernames, notes and counts are all encrypted, not just the passwords.

[!WARNING] There is no account recovery. Your master password is stored nowhere and cannot be reset by anyone, including whoever runs your server. Lose it and the vault is gone. This is deliberate, and it is the cost of the design.

[!NOTE] Vaultiq has not been independently audited. The cryptography uses vetted RustCrypto primitives and is pinned by known-answer tests, but no third party has reviewed the code. Read SECURITY.md for what it does and does not defend against before trusting it with anything.

Features

  • Five item types: logins, cards, identities, authenticator (TOTP) codes and secure notes.
  • Autofill and save prompts in the browser extension, and a real Android autofill service for logins.
  • Self-hosted sync between devices through your own server, with invite-only registration and per-device revocation.
  • Local-only mode: a vault that never contacts a server at all.
  • Quick unlock by PIN in the extension and by fingerprint on Android.
  • Encrypted backup and restore, plus import from Chrome, Firefox, Bitwarden, LastPass and 1Password CSV, Bitwarden JSON and Proton Pass JSON.
  • One Rust crypto core shared by every client: WebAssembly in the extension, native FFI on Android.

Screenshots

Show screenshots (demo data only)

Browser extension

Extension popup with a one-click Fill action for the current site
Fill the current site in one click
Autofill dropdown on a login page
Autofill right in the login form
The five item types: login, card, identity, authenticator and secure note
Five item types
Extension popup in dark mode with a live authenticator code
Dark mode, with built-in authenticator codes

Android

Get started: join with an invite, create a vault, use without a server, or restore from backup
Join, create, go local-only, or restore
Vault home listing logins, with Cards, Identities and Notes tiles
Vault home
Payment card detail with a card graphic
Cards
Codes tab with live one-time codes and countdown rings
Authenticator codes
Settings: auto-lock, master password, autofill, import, export backup
Auto-lock, import and encrypted backup
Vault home in dark theme
Dark theme

Platforms

PlatformStatus
FirefoxSupported
ChromeSupported (same build as Firefox)
AndroidSupported, arm64
iOSNot available

How it works

Your master password is stretched with Argon2id into a master key. Two independent keys are derived from it with HKDF: an auth key, which is the only thing that leaves your device, and an encryption key, which wraps a random vault key. Items are encrypted under the vault key with XChaCha20-Poly1305, with the item's id and version bound in as authenticated data so a ciphertext cannot be swapped for another.

The server never sees the master password, the master key or the vault key. The full key hierarchy, and what an attacker gets in each scenario, is in SECURITY.md. The design rationale is in PROJECT.md.

Getting started

The user guide is at vaultiq.rustiq.in/docs (source in guide/).

Short versions below. The full build, test and deployment guide, including the manual autofill test page and server test setup, is in docs/DEVELOPMENT.md.

Browser extension

Requires Rust (with the wasm32-unknown-unknown target), wasm-pack, Node 24 and pnpm.

cd extension
pnpm install
pnpm run build        # output in extension/dist
pnpm run dev          # Firefox, with live reload
pnpm run dev:chrome   # Chrome, with live reload

On first run, choose Create your vault and pick whether to use it without a server.

Sync server

Requires Docker. The compose file runs Postgres, the server and Caddy, which obtains its own certificate. Only Caddy is published.

cp .env.example .env          # set POSTGRES_PASSWORD and VAULTIQ_DOMAIN
docker compose up -d
docker compose logs server    # the first-run registration token is logged here

Registration is invite-only. Manage invitations, users, devices and the audit log with the admin CLI:

docker compose exec server node dist/admin/cli.js

Android

Requires the Android SDK and NDK, and Rust with the aarch64-linux-android target.

cd mobile
pnpm install
pnpm run crypto       # cross-compile the core and generate Kotlin bindings
pnpm run android

Crypto core

cargo test
cargo build --features wasm

Repository layout

PathWhat it is
pw-crypto-core/Rust crypto core: key derivation, key wrapping, item encryption, wasm and FFI bindings
extension/Manifest V3 browser extension for Firefox and Chrome
mobile/React Native Android app
server/NestJS and PostgreSQL sync server, plus the admin CLI
site/Static landing page
guide/mdBook user guide, published under /docs/

Known limitations

  • No sharing, passkeys, breach checking or account recovery. These are deliberately out of scope, not forgotten.
  • The Android app has been built and tested on a physical device, but several newer features (autofill service, biometric unlock, QR scanning, backup restore) are compile-verified only. See docs/STATUS.md for the per-feature record.
  • A local-only vault has no offsite copy. Export a backup, or losing the device loses the vault.
  • iOS is not available.

Contributing

Contributions are welcome. Read CONTRIBUTING.md first, because this is a security product and some changes need discussion before code.

Security

Please report vulnerabilities privately. See SECURITY.md for how.

Support the project

Vaultiq is free software built by one person. There is no paid support, and issues are handled on a best-effort basis. If it is useful to you, you can sponsor development through GitHub Sponsors or Buy Me a Coffee.

License

Vaultiq is licensed under the GNU Affero General Public License v3.0. If you run a modified version as a network service, you must offer its source to the users of that service.

Bundled fonts are under the SIL Open Font License; see THIRD_PARTY_NOTICES.md.

argon2
browser-extension
end-to-end-encryption
nestjs
password-manager
react-native
rust
self-hosted
totp
webassembly
xchacha20-poly1305
zero-knowledge

rustiqz/Vaultiq

Vaultiq -- personal, zero-knowledge password manager. Primarily used in browser and mobile, with desktop support planned.

TypeScript

1

344 commits

updated Oct 17, 2026

See the code

See what people are saying

SourceMessageScoreDate

How do you handle secret memory across wasm and FFI boundaries? Notes from building a password manager core (r/rust)

I’ve been building a hobby password manager (Vaultiq) around one crypto crate that compiles to wasm for a browser extension and goes through uniffi for an Android app. A few design questions came up that I’d like other people’s takes on. What I did: * \#!\[forbid(unsafe\_code)\] crate-wide. The…

2

Oct 19, 2026

README

Vaultiq

A zero-knowledge, self-hosted password manager for Firefox, Chrome and Android.

CI Latest release License: AGPL-3.0


Vaultiq encrypts everything on your device before it goes anywhere. The server you run stores ciphertext and cannot read it. Item names, URLs, usernames, notes and counts are all encrypted, not just the passwords.

[!WARNING] There is no account recovery. Your master password is stored nowhere and cannot be reset by anyone, including whoever runs your server. Lose it and the vault is gone. This is deliberate, and it is the cost of the design.

[!NOTE] Vaultiq has not been independently audited. The cryptography uses vetted RustCrypto primitives and is pinned by known-answer tests, but no third party has reviewed the code. Read SECURITY.md for what it does and does not defend against before trusting it with anything.

Features

  • Five item types: logins, cards, identities, authenticator (TOTP) codes and secure notes.
  • Autofill and save prompts in the browser extension, and a real Android autofill service for logins.
  • Self-hosted sync between devices through your own server, with invite-only registration and per-device revocation.
  • Local-only mode: a vault that never contacts a server at all.
  • Quick unlock by PIN in the extension and by fingerprint on Android.
  • Encrypted backup and restore, plus import from Chrome, Firefox, Bitwarden, LastPass and 1Password CSV, Bitwarden JSON and Proton Pass JSON.
  • One Rust crypto core shared by every client: WebAssembly in the extension, native FFI on Android.

Screenshots

Show screenshots (demo data only)

Browser extension

Extension popup with a one-click Fill action for the current site
Fill the current site in one click
Autofill dropdown on a login page
Autofill right in the login form
The five item types: login, card, identity, authenticator and secure note
Five item types
Extension popup in dark mode with a live authenticator code
Dark mode, with built-in authenticator codes

Android

Get started: join with an invite, create a vault, use without a server, or restore from backup
Join, create, go local-only, or restore
Vault home listing logins, with Cards, Identities and Notes tiles
Vault home
Payment card detail with a card graphic
Cards
Codes tab with live one-time codes and countdown rings
Authenticator codes
Settings: auto-lock, master password, autofill, import, export backup
Auto-lock, import and encrypted backup
Vault home in dark theme
Dark theme

Platforms

PlatformStatus
FirefoxSupported
ChromeSupported (same build as Firefox)
AndroidSupported, arm64
iOSNot available

How it works

Your master password is stretched with Argon2id into a master key. Two independent keys are derived from it with HKDF: an auth key, which is the only thing that leaves your device, and an encryption key, which wraps a random vault key. Items are encrypted under the vault key with XChaCha20-Poly1305, with the item's id and version bound in as authenticated data so a ciphertext cannot be swapped for another.

The server never sees the master password, the master key or the vault key. The full key hierarchy, and what an attacker gets in each scenario, is in SECURITY.md. The design rationale is in PROJECT.md.

Getting started

The user guide is at vaultiq.rustiq.in/docs (source in guide/).

Short versions below. The full build, test and deployment guide, including the manual autofill test page and server test setup, is in docs/DEVELOPMENT.md.

Browser extension

Requires Rust (with the wasm32-unknown-unknown target), wasm-pack, Node 24 and pnpm.

cd extension
pnpm install
pnpm run build        # output in extension/dist
pnpm run dev          # Firefox, with live reload
pnpm run dev:chrome   # Chrome, with live reload

On first run, choose Create your vault and pick whether to use it without a server.

Sync server

Requires Docker. The compose file runs Postgres, the server and Caddy, which obtains its own certificate. Only Caddy is published.

cp .env.example .env          # set POSTGRES_PASSWORD and VAULTIQ_DOMAIN
docker compose up -d
docker compose logs server    # the first-run registration token is logged here

Registration is invite-only. Manage invitations, users, devices and the audit log with the admin CLI:

docker compose exec server node dist/admin/cli.js

Android

Requires the Android SDK and NDK, and Rust with the aarch64-linux-android target.

cd mobile
pnpm install
pnpm run crypto       # cross-compile the core and generate Kotlin bindings
pnpm run android

Crypto core

cargo test
cargo build --features wasm

Repository layout

PathWhat it is
pw-crypto-core/Rust crypto core: key derivation, key wrapping, item encryption, wasm and FFI bindings
extension/Manifest V3 browser extension for Firefox and Chrome
mobile/React Native Android app
server/NestJS and PostgreSQL sync server, plus the admin CLI
site/Static landing page
guide/mdBook user guide, published under /docs/

Known limitations

  • No sharing, passkeys, breach checking or account recovery. These are deliberately out of scope, not forgotten.
  • The Android app has been built and tested on a physical device, but several newer features (autofill service, biometric unlock, QR scanning, backup restore) are compile-verified only. See docs/STATUS.md for the per-feature record.
  • A local-only vault has no offsite copy. Export a backup, or losing the device loses the vault.
  • iOS is not available.

Contributing

Contributions are welcome. Read CONTRIBUTING.md first, because this is a security product and some changes need discussion before code.

Security

Please report vulnerabilities privately. See SECURITY.md for how.

Support the project

Vaultiq is free software built by one person. There is no paid support, and issues are handled on a best-effort basis. If it is useful to you, you can sponsor development through GitHub Sponsors or Buy Me a Coffee.

License

Vaultiq is licensed under the GNU Affero General Public License v3.0. If you run a modified version as a network service, you must offer its source to the users of that service.

Bundled fonts are under the SIL Open Font License; see THIRD_PARTY_NOTICES.md.

argon2
browser-extension
end-to-end-encryption
nestjs
password-manager
react-native
rust
self-hosted
totp
webassembly
xchacha20-poly1305
zero-knowledge