Releases: DavidNeurieder/LibreCrate
Releases · DavidNeurieder/LibreCrate
Release list
F-Droid build fix
0.5.4 (2026-08-05)
F-Droid build fix
- Fixed F-Droid build failure (
pkg-config/fontconfignot found): MuPDF'ssystem-fontsfeature — which pullsfont-kitand needs a systemfontconfigon Linux hosts — is now an opt-in feature enabled only by the desktop GUI. F-Droid's Android build compiles the core crate on a Linux host (to generate UniFFI bindings) and no longer requirespkg-configorlibfontconfig. Desktop font rendering is unchanged; Android never used system fonts (thefont-kitdependency is excluded for Android anyway).
Backup compatibility
0.5.3 (2026-08-04)
Backup compatibility
- Phone and desktop now share one backup/import implementation: the Android app and the desktop GUI both use the single Rust
export_vault_dirs/restore_backup_to_dirscode path, so backups move between platforms with no format differences. - Fixed phone → desktop backup import (
crypto error: key unwrap failed): phone backups now include aparams.tomlrecording the exact Argon2id parameters used to wrap the master key. Restoring overwrites any stale desktopparams.toml, so the GUI always derives the correct key. - Phone no longer hardcodes KDF parameters:
RustKeyManagerwrites and readsparams.toml(its own 16384/3/2 settings), while remaining compatible with desktop vaults (19456/2/2). - Round-trip tests: phone↔GUI backup compatibility is now covered in Rust (
phone_roundtrip), through the real GUI code path (vault.rs), and with Kotlin unit tests for theparams.tomlbuilder/parser.
Backup import now merges
- Import Backup merges instead of replacing (desktop GUI and Android): existing documents, collections, and tags are preserved, and the backup's content is added on top. When a document already exists with different content, the local one is kept with a conflict flag and the backup's version is added as a copy.
- The local passkey stays unchanged: merging keeps the current vault open under its own passkey; only the backup's own passkey is needed to decrypt it, so backups created with a different passkey can be merged and are re-encrypted with the local key.
- Merged documents are full-text searchable: text content is carried over from the backup.
- Fixed backup import failing on Android (
Permission denied): the temporary database is now written inside the app's own storage instead of the system temp directory. - Fresh installs still restore wholesale: when there is no local vault (fresh install/reinstall), the backup is restored exactly as before and the app opens the unlock screen.
- Merge tests: cross-passkey merge covered in Rust (
test_merge_backup_to_vault_cross_password,test_merge_backup_into_existing_library_cross_password) and with Android instrumented tests; the document-type library test now tolerates thumbnails.
Privacy
0.5.2 (2026-08-01)
Privacy
- App permissions trimmed: removed
WAKE_LOCK,ACCESS_NETWORK_STATE,RECEIVE_BOOT_COMPLETED, andFOREGROUND_SERVICEfrom the APK. All four were inherited from library manifests (WorkManager/ExoPlayer) and never used — the APK now declares only AndroidX's inertDYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION. - Removed the unused WorkManager dependency:
work-runtimewas declared inapp/build.gradle.ktsbut never referenced in code.
Store listing
- Rewrote the Play Store description in plain, non-technical language and added multi-device backup/restore.
Reproducible builds
0.5.1 (2026-08-01)
Reproducible builds
- Byte-identical builds between local and F-Droid:
libvault_native.sonow builds identically on any machine. Verified section-by-section against F-Droid's build — the only remaining APK difference is the git revision embedded inMETA-INF/version-control-info.textproto. - No embedded build paths:
--remap-path-prefixin the Android Rust build strips all local source and Cargo registry paths from the binary. - Deterministic MuPDF layout: fixed non-deterministic C source ordering in the bundled
mupdf-syswrapper (previously compiled in filesystemreaddirorder). The wrapper sources are now sorted, making the native library layout machine-independent.
F-Droid
- OpenSSL ranlib fix:
RANLIB_aarch64_linux_androidset to the NDK'sllvm-ranlib(fixesmake install_dev Error 127). - Robust cargo discovery: the Gradle build now probes more cargo locations before failing.
- Rust pinned to 1.94.0 via
vault-native/rust-toolchain.toml.
F-Droid compliance
0.5.0 (2026-08-01)
F-Droid compliance
- Dropped CBR (RAR) comic support: Removed the non-free
junrardependency (UnRAR license, rejected by the F-Droid license scanner). CBZ comics are unaffected — they use the JDK's built-in zip support. - Removed GitHub Packages publishing: Deleted the
maven-publishplugin andpublishing {}block fromvault-native-android/build.gradle.kts, removing themaven.pkg.github.comrepo rejected by the F-Droid scanner. - F-Droid build dependencies fixed:
F-DROID.mdrecipe now installsbuild-essential clang libclang-dev perl pkg-config curl(needed for bindgen, the MuPDF C build, and vendored OpenSSL); dropped the unnecessary OpenJDK 17 lines.
Changes
- Comics: CBZ only (
application/vnd.comicbook+zip); CBR MIME type and code paths removed from the importer, library, and viewer. - README and AppStream metadata updated to reflect CBZ-only comic support.
Linux Version
0.4.0 (2026-07-26)
Features
- CLI interactive REPL: Launch
librecratewith no arguments for a persistent shell — enter vault and password once, then run commands without re-typing credentials. Supports readline (history, line editing, ctrl-c/ctrl-d). - CLI one-shot mode: All commands available as one-shot invocations (
librecrate <cmd> <vault_dir> -p <password>) for scripting and automation. - CLI commands:
init,import,list,open,delete,search,backup,restore— full document lifecycle from the terminal. - Desktop GUI (Iced): Native desktop application with vault creation, unlock, document library, multi-file import, collections, tags, backup/restore, and password change.
- Shared vault operations module:
vault_opsin core providesVaultSnapshot,export_vault_dir,merge_vault_dir, andrestore_backup_to_dir— shared business logic for CLI, GUI, and Android. - Cross-platform backup compatibility: Backups created on Android can be restored on desktop (CLI/GUI) and vice versa.
- Multi-file import (GUI): Import multiple documents at once via file picker.
- Collections & Tags (GUI): Organize documents into collections and assign tags from the desktop GUI.
- Backup password verification: CLI
backupcommand verifies the password (derives master key) before encrypting, preventing silent corruption.
Architecture
- vault_ops module (
core/src/vault_ops.rs): Shared business logic for backup export, merge, and full restore — used by both CLI and GUI. - Session struct (
cli/src/session.rs): Caches vault dir, password, and pre-derived master key for the REPL lifetime, avoiding ~1s Argon2id re-derivation per command. - CLI refactored to 8 commands: Minimal interface matching GUI patterns (vault directory + password). Deleted 10 old files (document.rs, vault.rs, create.rs, backup_export.rs, merge.rs, export.rs, inspect.rs, crypto.rs, bench.rs, password.rs).
- Key file naming normalized:
master_key→wrapped_master_keyeverywhere with fallback reads for backwards compatibility. - DB filename normalized:
vault.db→librecrate.dbacross CLI, GUI, and vault_ops.
Tests
- 226+ tests passing: 31 CLI integration tests (including 5 REPL tests), 139 GUI unit tests, 51 core unit tests, 5 e2e tests.
- CLI integration tests: Subprocess-based tests covering init, import, list, search, backup/restore, open, delete, errors, and full workflow.
- REPL tests: Piped-stdin tests verifying list, help, import+list, search, and wrong-password handling in interactive mode.
First Usefull Release
Features
- PDF viewer rewritten: Dynamic render scale for pixel-perfect page width;
BoxWithConstraintsreplacesdisplayMetrics.widthPixelsfor accurate layout (handles insets, multi-window, scaffold padding) - Pinch-to-zoom: Two-finger pinch zoom in PDF viewer (1x–5x), vertical scroll at zoomed-in levels
- Rust native library auto-build: Gradle now builds Rust
vault-nativelibrary automatically — generates UniFFI Kotlin bindings, compiles for Android, and packages the.sointo the APK. No pre-committed build artifacts needed.
F-Droid
- F-Droid build recipe documented:
F-DROID.mdcovers MuPDF srclib, Rust toolchain, NDK config, and full recipe - Rust version pinned:
vault-native/rust-toolchain.tomlpins Rust 1.78.0 for reproducible builds - NDK path hardcoding removed:
.cargo/config.tomldeleted; NDK discovered automatically viaANDROID_NDK_HOMEorandroid.ndkDirectory
Fixes
- Backup import crash: Fixed crash when importing backup into existing database —
reopenDatabase()no longer closes the old database unnecessarily - Backup import database corruption: Fixed "file is not a database" error after import by deferring database recreation and hardening WAL/SHM cleanup
- Startup crash after failed import:
initializeDatabase()now force-opens the database inside a try/catch block, catching open errors early instead of crashing on the first DAO call - SettingsScreenTest reliability: Fixed duplicate
SectionHeader("Security")ambiguity - EpubReaderInstrumentedTest robustness: Wrapped
onActivityin try/catch to handle flaky composition - PIN lock default: Changed to disabled (
false) — no longer enabled by default on fresh install
Technical
renderPageBitmap()acceptstargetWidthPx: Int?instead of fixedscale: Float;PdfViewerpassesmaxWidth.toPx()fromBoxWithConstraints- Gesture handler simplified: 2-finger zoom, 1-finger scroll only (no horizontal pan, no double-tap)
MAX_CACHED_PAGESreduced from 20 to 4*.sofiles removed from git; generated bindings removed from git (both now built by Gradle)- F-Droid lint issue (
NewApiin UniFFICleaner) suppressed scripts/build_native.shsimplified and fixed — requiresANDROID_NDK_HOME- Added full-branch logging to
BackupManager.restoreContents()(Branch A/B/C selection) - Added
backupUninstallReinstallImportCloseReopeninstrumented test covering full backup → wipe → restore → close → reopen cycle - Bumped to versionCode 3