Warning
Status: Unmaintained — This project is no longer actively developed as of October 2024.
LibrePass Android is a cloud-based password manager built for Android with a focus on simplicity, security, and performance. The application provides a way to generate, manage, and synchronize passwords across devices. It is a hobby project — not audited for production use.
This project was a hobby project that served as a comprehensive learning experience. It taught me valuable lessons about:
- Modern Android development with Kotlin and Jetpack Compose
- Cryptography and security implementation in mobile applications (client-side encryption)
- Cloud synchronization and backend integration patterns
- Clean architecture and modular project structure
- Multi-module Android projects with feature separation
- User authentication and biometric security
- Dependency injection with Dagger Hilt
While the project is no longer maintained, the codebase remains a reference implementation for Android development practices.
- ✅ Client-Side Encryption — Vault encrypted with AES-256-GCM (via
dev.medzik:libcrypto:1.2.0/dev.medzik.librepass:client:1.6.2), key derived via Argon2id + X25519 (Cryptography.kt:14,21) - ✅ Password Generation — Generate passwords with customizable length/charset (
CipherEditFields.kt:171). Known limitation: usesjava.util.Random(CipherEditFields.kt:187, notSecureRandom) andCipherEditFields.kt:143binds password field tousername— see Security notes - ✅ Biometric Unlock —
BIOMETRIC_STRONG(face/fingerprint, Android 9+) viaBiometric.kt:21, with auto-lock after configurable timeout (VaultTimeout.kt:23INSTANT–NEVER,MainActivity.kt:95onPause/onResume) - ✅ Cross-Device Synchronization — Sync via
POST /api/cipher/sync(business/SyncCiphers.kt:27); last-write-wins, no conflict merge - ✅ Material 3 Design — Dynamic colors on Android 12+ (
Theme.kt:88dynamicDarkColorScheme), Compose1.6.8, Material31.2.1 - ✅ QR Code Integration — Scan TOTP/HOTP via
zxing-android:4.3.0(QrScanner.kt:17,OtpConfigure.kt:152supportsTOTP/HOTP,SHA1/256/512) - ✅ Vault Auto-Lock — Configurable inactivity lock
- ✅ Dark Mode — Full support via Material 3
- ✅ Partial Offline Support — View and add work offline via Room
LocalCipher.kt:16needUploadflag; login and delete require network (Login.kt:63,Vault.kt:214), deletes not queued (SyncCiphers.kt:27emptyList()+TODO) - ✅ Multi-Language Support —
values-*/(ar, de, hi, nb-rNO, pl, tr, vi) +generateLocaleConfig=true(app/build.gradle.kts:43)
- Kotlin 2.0.0, Compose 1.6.8, Material3 1.2.1, AGP 8.5.0,
compileSdk 34,minSdk 24 - Multi-module:
app,business-logic,common,database-logic(settings.gradle.kts:21) - Jetpack: Hilt
2.51.1(MainActivity.kt:28@AndroidEntryPoint), Navigation2.8.0, Biometric1.2.0-alpha05, Lifecycle2.8.2, Room2.6.1(Database.kt:6version=2), DataStore1.1.1(SecretsStore.kt:15aesKeyencrypted,Credentials.kt:13apiKey/emailplain — known trade-off) - Crypto:
dev.medzik.librepass:client:1.6.2,dev.medzik:libcrypto:1.2.0(AES-GCM),dev.medzik:otp:1.0.1,X25519+HSAuthfor auth - Other: Coil
2.6.0, ZXing3.5.3, Kotlin Coroutines1.8.1
LibrePass Android was previously available on app stores but is no longer maintained:
- F-Droid — Previously available, removed due to project being unmaintained
- IzzyOnDroid — Previously available, removed due to project being unmaintained
- GitHub Releases — Historical releases (
1.3.1versionCode 18app/build.gradle.kts:20) still available for reference. App shows deprecation dialog (MainActivity.kt:59deprecated).
This application implements several security measures:
- Encrypted Storage — Vault data encrypted with AES-256-GCM (key derived via Argon2id
X25519.computeSharedSecretUnlock.kt:94);aesKeystored inEncryptedDataStoreprotected byKeyStore+ biometrics,Credentials(apiKey) in Room plain — root can read - Biometric Authentication —
BIOMETRIC_STRONGfingerprint/face (Biometric.kt:37,69) - Automatic Vault Lock — Configurable timeout (
VaultTimeout.kt:23) - HTTPS Communication —
https://api.librepass.*vialibrepass:client;AndroidManifestnocleartextTraffic(HTTPS by default), intended to be used behind Caddy/NGINX proxy terminating TLS on server side - Logging — Passwords not logged; known issue: TOTP secrets were logged via
Log.i("QR_SCANNER", scannedText)QrScanner.kt:23andOtpConfigure.kt:95— should be removed for production
Note: This is a hobby project. The password generator uses
java.util.Random(CipherEditFields.kt:187) — not cryptographically secure — and the password field had a binding bug (CipherEditFields.kt:147value=cipherData.username). For production, useSecureRandom, fix the binding, removeLog.ifor secrets, and queue deletes for offline. Consider a professional audit and an established password manager.
This project is licensed under the GNU General Public License v3.0 (GPL-3.0)
- LibrePass Server — Backend of the LibrePass password manager (Spring Boot, serves HTTP behind Caddy TLS)
This hobby project taught me invaluable lessons about:
- ✅ Modern Kotlin & Compose patterns for responsive UIs
- ✅ Multi-module Android architecture with clean separation of concerns (
app→common→businessLogic/databaseLogic) - ✅ Jetpack components (Hilt, Navigation, Biometric, Lifecycle, Room, DataStore)
- ✅ User authentication flows and biometric integration
- ✅ Material Design 3 and dynamic theming
- ✅ Performant Android apps with offline caching (Room
needUpload)
- ✅ Client-side E2E encryption (Argon2id → X25519 → AES-256-GCM) and why server never sees plaintext
- ✅ Secure credential handling (Encrypted DataStore for
aesKeyvs. plain Room forCredentialstrade-off) - ✅ Biometric authentication and vault auto-lock
- ✅ HTTPS sync and the limits of offline-first without proper conflict resolution
- ✅ Password generation pitfalls (
RandomvsSecureRandom) and UI binding bugs
- ✅ Partial offline-first with
needUploadqueue andlastSync(Credentials.kt:15) — and whySyncCiphers.kt:27TODOfor deletes matters - ✅ Dependency injection with Dagger Hilt at scale
- ✅ Community localization and internationalization (7 locales)
- ✅ Multi-module Gradle organization
This project combined practical Android development with real-world security trade-offs of a hobby password manager.
Built with ❤️ as a learning experience in Android development




