Repository navigation
LucidGrasp 1.2.0 - Update checking, OS colours, and a working shortlist
LucidGrasp 1.2.0 - Update checking, OS colours, and a working shortlist
LucidGrasp now tells you when a newer release exists, takes every colour it draws from your operating system, and actually does the two-stage search it has always claimed to do.
Update checking
On launch, LucidGrasp asks GitHub for the latest published release and tells you if there is a newer one. The notice has three buttons: open the download page, not now, or never check again. It only reads the release page -- nothing is ever downloaded or installed without you asking.
It checks at most once a day, and you control it fully:
- Help -> Check for Updates Automatically turns the automatic check on and off. This is the way back if you ever press "never" by accident -- the opt-out would otherwise only be reversible by reinstalling.
- Help -> Check for Updates... (Ctrl+U) checks right now, ignoring the daily limit.
If you would rather it never contacted anything at all, turn the toggle off. It reads its state from a settings file under your own user directory, and it does not read anything else and send it anywhere.
A few deliberate details, for the curious:
- The check is throttled on attempts, not successes. GitHub allows 60 requests per hour per IP address, and an IP is shared by everyone behind a single NAT or carrier-grade NAT, so one exhausted office budget otherwise silences every machine in the building. Recording the attempt means a rate-limited GitHub costs one try a day instead of one per launch.
- Every failure is silent. Truncated JSON, an error page served with a 200, a timeout, a corporate proxy that inspects TLS -- all no-ops. A failure is reported only if you asked for that particular check yourself.
- An unreadable version tag is also silent. A tag like
v2024.01.15would otherwise be read as version 2024.1.15 and tell every user to update on every launch, forever.
Colours come from the operating system
Every surface, accent, border and text colour is now read out of your desktop's palette rather than chosen by hand. LucidGrasp follows your system's light or dark scheme, and follows your accent colour with it -- on both Windows and Linux, with no per-OS styling.
The square button in the top right still switches between light and dark. It is worth pressing even if you agree with your system, because when you disagree with it the app builds the opposite scheme from your palette rather than substituting a generic dark grey.
The file pickers now use your platform's own dialog on Windows, so they carry the system's look, its previews and its shell integration. (On Linux they stay on Qt's, because GTK3's native picker rejects files. That used to be forced on every platform, which is why the pickers were never actually using the OS's dialog.)
Search: the shortlist now works
If you have a large library and searches felt slower than they should have, this is the one to read. The two-stage search -- cheap in-memory ranking first, expensive OpenCV comparison only on the shortlist -- was not capping the shortlist in 1.1. Stage one collected every entry that passed the relaxed bound and stage two decoded and scored all of them, so the design did no work at all.
Per-query cost is now genuinely bounded by the shortlist rather than by your library size, and decoding happens at a bounded size instead of at full resolution.
Also in this release:
- Byte-identical copies are always returned, and never compete with other candidates for a slot in the shortlist.
- If a file changed since it was indexed, its features are refreshed before it is scored, instead of being compared against hashes for pixels that are no longer there.
- The two control panels are now the same height. They were previously laid out ragged.
Fixed
Each of these was a silently wrong answer rather than a crash, which is why they survived as long as they did:
- A user folder named
dev,sysorrunwas silently dropped from a scan, because system-directory skipping matched on the folder's name alone. Skipping is now decided by resolved path. Those losses never reached the error counter, so they were invisible. - A corrupt or truncated cache could leave the index in a state where its root pointed at a library it no longer described. The cache format has also moved to version 2; existing caches are rebuilt automatically on first launch.
- An exception escaping either background thread called
terminateand killed the process. OpenCV throws on malformed input, which is precisely what a whole-filesystem scan of untrusted files will eventually hand it. Both worker threads now report failures instead of vanishing. - Images were decoded at full resolution and copied into an OpenCV matrix before being shrunk down to the 256 px the comparison actually reads.
- EXIF orientation is now applied consistently on both sides of a comparison.
Verifying your build
--selftest builds a synthetic image corpus, indexes it, and checks that edited and rescaled copies rank above unrelated distractors. It also covers the update checker's version comparison and payload parsing -- offline, with no network access and no display:
./LucidGrasp --selftestAll eight cases pass on both platforms in CI, and the project still builds with zero warnings under -Wall -Wextra.
Upgrade notes
No configuration or cache migration is needed. Your existing index is rebuilt once on first launch after upgrading, which takes as long as indexing did. Preferences, if you use the update opt-out, are stored separately and are preserved.
Downloads, as before: lucidgrasp-linux-x64.tar.gz for Linux (Qt6 and OpenCV from your package manager), LucidGrasp_Setup_x64.exe for Windows.