An encrypted local password manager with a master password, written in Rust with a native desktop GUI (egui). Your passwords never leave your machine.
passlock/
├── Cargo.toml
├── Cargo.lock
├── LICENSE
├── README.md
├── assets/
│ ├── logo.png
│ └── fonts/ Phosphor icon fonts (MIT)
├── .github/workflows/release.yml build and publish binaries when the version changes
├── src/
│ ├── main.rs window setup
│ ├── lib.rs exposes crypto, models, storage to tests
│ ├── app.rs egui interface
│ ├── icons.rs icon font setup and glyphs
│ ├── crypto.rs Argon2id + XChaCha20-Poly1305
│ ├── storage.rs encrypted vault file
│ └── models.rs entries, strength, password generator
└── tests/
├── crypto_tests.rs
└── storage_tests.rs
- Master password protects a single encrypted vault file
- Add, edit, delete, search and sort entries (name, URL, username, password, tags)
- Favorites and tag filters
- Password generator and strength indicator
- Password history (last 5 passwords per entry)
- Copy to clipboard, cleared automatically after 30 seconds
- Light and dark theme (toggle in the header, remembered between launches)
- Site logos for well-known services, generated offline
Prerequisite: Rust
cargo run --releaseOn first launch, choose a master password (at least 8 characters). The vault is created and unlocked. On later launches, enter the same password to unlock.
The master password cannot be recovered. If you forget it, the vault cannot be decrypted.
cargo testPre-built binaries for Linux, Windows and macOS (Intel and Apple Silicon) are attached to each
GitHub release. Download the archive for your system, extract it and run passlock.
Verify the download against SHA256SUMS.txt from the same release.
Pushing to main publishes a release automatically when the version in Cargo.toml has no release yet.
Pushing a v<version> tag that matches Cargo.toml does the same.
The workflow (release.yml) creates the v<version> tag if needed, tests, builds and attaches the binaries.
To ship a new version, bump version in Cargo.toml (and commit Cargo.lock) and push to main.
If the tag already exists on another commit, the run fails: bump the version instead of reusing it.
Argon2id(64 MiB memory, 3 passes) derives a 256-bit key from the master password and a random 16-byte salt.XChaCha20-Poly1305encrypts the vault. Every save uses a fresh random 24-byte nonce, and the authentication tag detects tampering.- Only the version, salt, nonce and ciphertext are written to disk. The master password and key are never stored.
- The vault file is written atomically (temp file, then rename) with
0600permissions on Unix. - The key and the decrypted vault bytes are zeroized when dropped, and the master password field is wiped after unlock.
Not covered: malware or keyloggers on your machine, and other apps reading the clipboard during the 30 second window.
| OS | Path |
|---|---|
| Linux | ~/.local/share/passlock/vault.passlock |
| macOS | ~/Library/Application Support/passlock/vault.passlock |
| Windows | %APPDATA%\passlock\vault.passlock |
To back up your vault, copy this file. To restore it, put it back in the same place.
eframe / egui | argon2 | chacha20poly1305 | rand | serde | zeroize | Phosphor Icons
Released under the GNU General Public License v3.0. The bundled Phosphor icon fonts are MIT licensed (see assets/fonts/LICENSE-MIT).


