Mirrors the desktop DetailDialog's "Cover ändern…" button: opens the
online search pre-filled with the item's title and auto-searches, but
choosing a hit only replaces the item's cover URL instead of staging a
full edit draft.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Swap lazysodium/JNA for a pure-Java Bouncy Castle crypto envelope so the
APK ships no native .so files (resolves the Android 15 16 KB alignment
crash) while staying byte-compatible with the desktop libsodium sync.
Bring the Android app up to the desktop feature set: full item CRUD with
an add/edit screen and FAB, inline editing on the detail view (status,
rating, favorite, per-unit/segment watched toggles, delete), online
metadata search (TMDB/OpenLibrary/AniList/RAWG) that pre-fills the editor,
library filtering and sorting, a statistics view, and settings polish for
dark mode and provider API keys/language.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduce the Kotlin/Compose Android companion app and extend the TMDB
proxy into a combo server that synchronizes the whole library as an
encrypted snapshot, with all three components (Go server, Android,
desktop) sharing one zero-knowledge crypto envelope and JSON schema.
- server: add PostgreSQL-backed /sync/library (GET/PUT) with optimistic
concurrency (revision + 409 on conflict); sync stays disabled unless
DATABASE_URL is set. Add docker-compose with Postgres.
- desktop: add libsodium CryptoEnvelope, LibrarySerializer and SyncClient;
storage-mode and passphrase settings; a "Sync now" toolbar action with
conflict resolution.
- android: Room-backed library with local/cloud storage modes, encrypted
sync client, and settings UI. The proxy server (URL + token) can be
configured as a TMDB proxy even in local-only mode.
Crypto is identical across platforms: Argon2id (libsodium crypto_pwhash,
INTERACTIVE) + XChaCha20-Poly1305 in a versioned "UMTS" envelope, so a
snapshot encrypted on one client decrypts on the other.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The bundling loop ran under set -euo pipefail; once no new /mingw64 deps
remained, grep exited 1 and aborted the script before makensis ran, so no
Setup.exe was produced. Disable strict mode in that subshell and collect
deps before copying. Anchor all installer source paths to the script dir
via ${__FILEDIR__} and switch the File glob to "\*" so extensionless files
and plugin subfolders are included.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
build-linux.sh configures and builds via CMake. build-windows.sh builds
in MSYS2/MINGW64, bundles Qt and transitive MinGW DLLs via windeployqt
plus an ldd pass, and produces an NSIS installer (installer.nsi). Ignore
the dist/ output and generated Setup.exe.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Block saving a new item when one already exists, so no duplicate is
created and existing progress is never overwritten. Matches by provider
id (external_source/external_id) when available, otherwise by media
type, year and title.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>