CipherLite is a lightweight local password manager built with C++20, Qt6 Widgets, CMake, SQLite, and libsodium.
Use the build helper for the usual configure, build, runtime dependency deployment, and test flow:
.\scripts\build.ps1Useful options:
.\scripts\build.ps1 -Clean
.\scripts\build.ps1 -Config Release
.\scripts\build.ps1 -BuildDir build-release -Config Release -Parallel 8
.\scripts\build.ps1 -Target cipherlite -NoTests
.\scripts\build.ps1 -Generator "Ninja"The script defaults to build, Debug, and runs tests unless -NoTests is provided. If .tools\msys64\ucrt64\bin exists, it is added to PATH, Ninja is selected by default, and local runtime DLLs are copied next to cipherlite.exe.
Manual CMake flow:
cmake -S . -B build
cmake --build build
ctest --test-dir build --output-on-failure- Keep the UI in Qt Widgets.
- Keep core vault, crypto, and database code independent from Qt.
- Do not write plaintext vault contents to disk.
- Do not log master passwords, derived keys, plaintext entries, salts, nonces, or ciphertext.
- Treat vault file headers as authenticated data when encrypting/decrypting.
- Prefer small, testable core classes over UI-driven business logic.
- Keep source files ASCII unless a file already uses another character set.
Use a lightweight Conventional Commits style:
<type>: <summary>
Allowed types: feat, fix, docs, test, refactor, build, ci, and chore.
- Write the summary in English as an imperative phrase or short verb phrase.
- Start the summary with a lowercase letter and do not end it with a period.
- Prefer a single-line message and keep it to 72 characters or fewer when practical.
- Add a body after a blank line only when the commit needs extra context.
- Describe one main intent per commit; avoid mixing unrelated changes.
- For security, crypto, database migration, or vault format changes, explain the impact and compatibility in the body.
- The first implementation uses libsodium Argon2id for key derivation and authenticated encryption.
- The app must prefer AES-256-GCM when
crypto_aead_aes256gcm_is_available()succeeds and fall back to XChaCha20-Poly1305 when AES-GCM is unavailable on the current CPU/platform. - Sensitive buffers should be wiped with
sodium_memzerobefore being released when practical.