A desktop TOTP authenticator app built with Dioxus and Rust.
- Rust — install via rustup
- Dioxus CLI —
cargo install dioxus-cli - Tailwind CSS CLI
- macOS:
brew install tailwindcss - Windows / Linux: see the Tailwind CSS installation docs
- macOS:
Build the app in dev
tailwindcss -i assets/tailwind.css -o assets/main.css --watch & dx serve --desktopdx bundle --desktopThe bundled app will be placed under target/dx/brew-vault/bundle/<platform>.
Tagged releases are built automatically via GitHub Actions for macOS, Linux, and Windows.
To publish a new release:
- Update the version in
Cargo.toml - Add a
## [x.y.z]section with content toCHANGELOG.md - Tag and push:
git tag vx.y.z
git push --tagsThe workflow validates that the tag matches Cargo.toml, builds installers on all three platforms, and publishes a GitHub Release with the CHANGELOG notes attached. Pre-release tags (e.g. v1.0.0-beta.1) are automatically marked as pre-releases.
brew-vault/
├── assets/
│ ├── tailwind.css # Tailwind source (edit this)
│ ├── colors.css # Design token CSS variables
│ └── main.css # Generated output (do not edit)
├── src/
│ ├── main.rs # App entry point
│ ├── components/ # Dioxus UI components
│ │ ├── account_row.rs
│ │ ├── app_shell.rs
│ │ ├── auto_lock_picker.rs
│ │ ├── bottom_nav.rs
│ │ ├── button.rs
│ │ ├── change_password_modal.rs
│ │ ├── context_menu.rs
│ │ ├── delete_confirm_modal.rs
│ │ ├── export_modal.rs
│ │ ├── icons.rs
│ │ ├── import_modal.rs
│ │ ├── input.rs
│ │ ├── radio.rs
│ │ ├── rename_modal.rs
│ │ ├── ring.rs
│ │ ├── section_label.rs
│ │ ├── strength_bar.rs
│ │ ├── text_divider.rs
│ │ └── toast.rs
│ ├── views/ # Route-level page components
│ ├── models/ # Data models and app state
│ ├── routes.rs
│ ├── storage.rs
│ ├── backup.rs
│ ├── file_picker.rs
│ └── totp.rs
├── tests/
│ └── storage_roundtrip.rs # Integration tests
├── Cargo.toml
└── Dioxus.toml
Run the full test suite (unit + integration):
cargo testRun only unit tests:
cargo test --libRun only integration tests:
cargo test --test storage_roundtripRun a specific test by name:
cargo test test_wrong_key_failsFilter by module:
cargo test storage
cargo test totpTests cover:
storage(unit) — schema init, insert/load round-trip, sort_order ordering, delete, rename, group update, sort_order swap, migration idempotency, wrong-key rejection, first-run state (no-password vault), password setup + unlock, rekey, Argon2 hash/verify round-trip, and meta-table operationstotp(unit) — code generation (SHA-1, SHA-256), output format, invalid secrets, andseconds_remainingrangebackup(unit) — export/import round-trip, wrong passphrase rejection, corrupt ciphertext detection, empty vault export, Aegis envelope structure, 50 MB file size guardstorage_roundtrip(integration) — persists 3 entries to a real encrypted file, reopens with the same key, and asserts all fields (includingsort_order) survive the round-trip