Releases: outsharked/find-anything
Release list
v0.7.2
What's Changed
- fix: prevent nlp-bar pills from being squished when results overflow by @jamietre in #5
- fix: loading spinner and error state for inline image viewer by @jamietre in #6
- feat: native iWork extraction, image viewer UX, structured IWA parsing by @jamietre in #8
New Contributors
Full Changelog: v0.7.1...v0.7.2
v0.7.1
Added
codefile kind — source code, config, and markup files (.rs,.py,.js,.ts,.json,.yaml,.html,.css,.sql, etc.) now use kind"code"instead of"text"; plain text kind ("text") is now reserved for human-readable documents (.md,.txt,.log,.csv,.rst);SCANNER_VERSIONbumped to 8 to trigger re-extraction- File type filter grouped and refined — kind checkboxes are now grouped into Documents / Media / Other with category labels; Code and Text are separate entries; DICOM merged under Image; eBook and Office are separate entries
- ffprobe video metadata extraction — opt-in via
ffprobe_pathin[scan]config; when configured, ffprobe is used exclusively for video files and emits[VIDEO:format], codec, resolution, fps, audio codec/channels, and duration GET /api/v1/tree/expandendpoint — returns all ancestor directory listings needed to reveal a given path in a single request- Video codec warning in player — amber banner when the browser can't decode the video track, advising VLC
- Image adjustment panel — Invert, Flip H/V toggles and Brightness/Contrast sliders in the image viewer
Fixed
- Office template files not extracted —
.dotm,.dotx,.docm,.xltx,.xltm,.pptm,.potx,.potmwere misidentified as ZIP; now handled by the Office extractor - epub files misclassified as
document—detect_kind_from_ext("epub")now returns"epub" - Content store not updated on re-extraction — re-indexing an unchanged file after a
SCANNER_VERSIONbump now correctly overwrites the stored blob - NLP date pill X button did not dismiss — clicking X now strips the detected date phrase from the query text so NLP won't re-detect it
- find-watch: new directory contents not indexed — files already inside a newly created directory are now submitted immediately
- Code viewer triangle layout shift —
▶arrow column now reserves space withvisibility: hidden
Changed
- Tree sidebar expansion optimised — one
tree/expandrequest per navigation instead of N paralleltreecalls - find-watch: stale inotify watch errors logged at debug —
PathNotFound/WatchNotFoundon deleted directories are expected and no longer logged as warnings
Full Changelog: v0.7.0...v0.7.1
v0.7.0
Added
- DICOM support — metadata extraction (
find-extract-dicom) indexes DICOM tags (PatientName, Modality, StudyDescription, dimensions, etc.); inline PNG preview viafind-preview-dicomsubprocess (served through the unifiedGET /api/v1/viewendpoint);FileKind::Dicomvariant added; extensionless DICOM files detected via magic bytes (DICM at offset 128); JPEG2000 decoding available as optionaljpeg2000Cargo feature - Unified
GET /api/v1/viewimage endpoint — replaces the separate/api/v1/raw?convert=png(where the client guessed the format from the file extension) and/api/v1/dicom-preview; the server looks up the file'skindin the source DB and decides: serve native bytes for browser-compatible formats (detected by magic bytes), convert to PNG via theimagecrate for other image kinds, or runfind-preview-dicomfor DICOM; the client uses a singleviewUrlfor all inline image and DICOM display - DICOM metadata uses
[DICOM:Tag] valueformat — consistent with EXIF[EXIF:Make] ApplesoparseMetaTagscan parse and display each field in the metadata drawer; previously bare values likestudy: 20260323were not parsed;SCANNER_VERSIONbumped to 6 to trigger re-extraction [fa:duplicate]prefix for duplicate path entries in metadata —FileViewerno longer guesses by absence of[; only[fa:duplicate]-prefixed entries are treated as duplicate paths; untagged metadata (DICOM) goes tometaLinesinstead ofduplicatePathssource:search prefix — restricts results to a specific source and optional path prefix; formatsource:<source-name>[/path/to/dir]; server appliesWHERE (path = ? OR path LIKE ?/%)in both FTS5 and document-search modessource:typeahead with auto-advance — typingsource:opens a keyboard-navigable dropdown showing available sources; selecting one immediately fetches and recursively auto-advances through single-option directory levels until multiple choices are found; the entire path is resolved silently before any UI update (resolveAutoPathis a pure async function with no intermediate state mutations); desktop-only (hidden on mobile)← resultsbutton hidden on deeplink — button now only renders whenresults.length > 0; navigating directly to a file URL no longer shows a back button that leads nowhere- Media metadata scrollable container on mobile — EXIF/audio/video metadata no longer appears in a separate inner-scroll box below the media;
MetaDrawermobile styles removedoverflow-y: auto/max-height: 40vhso content flows naturally;FileViewerouter container switches tooverflow-y: autoon mobile;AudioViewerandVideoViewerstack vertically with a divider instead of side-by-side ?help button missing on desktop — removed erroneous global.help-wrap-outer { display: none; }rule that was hiding the button at all viewport widths; it is now visible on desktop and hidden only on mobile (where the logo tap opens the mobile help panel instead)find-watchfile content not stored in blob store —handle_updatenever computed the blake3 hash, sofile_hashwas alwaysNonein the bulk request; Phase 2 had no key to store the blob, leaving the file viewer empty even though the file was searchable via FTS5; fix: compute hash via sharedbatch::hash_fileand attach it to theIndexFile;hash_fileconsolidated from duplicate copies inscan.rsandwatch.rsintobatch.rsfind-watchhang during startup on older kernels — separated directory walk from inotify watch registration; walkdir was generating inotify OPEN events for every directory it opened, flooding the notify background thread's read loop and deadlocking thewatch()channel on kernel 3.10; all directories are now collected first (before any watches exist), then registered in a second passfind-watchonly watched 1 directory when noincludepatterns configured —include_dir_prefixes(&[])returnsSome({})(an empty terminal set that prunes everything); guard added so an empty include list yieldsNone(watch everything), matching the behaviour offind-scan.indexinclude patterns now prune directory traversal infind-watch—walk_source_tree(shared byfind-scanandfind-watch) now reads.indexfiles during the DFS and skips sibling subtrees excluded by theirincludefield, giving both binaries identical directory-pruning behaviour- Svelte CSS warnings for extracted SVG icon components — fixed unused selector warnings by replacing
.foo svgwith.foo :global(svg)inSearchBox.svelte,AdvancedSearch.svelte, and+page.svelte find-scannot found in upload integration tests —resolve_find_scannow also checks the parent of the current exe's directory; test binaries live intarget/debug/deps/butfind-scanis built one level up intarget/debug/, so the previous code fell back to PATH (which works locally iffind-scanis installed, but never in CI)- Watch integration tests W1–W6 — all watch tests now reliably pass:
batch_window_secsset to 50 ms in test config (default 5 s caused timeouts);start_watcherwaits 500 ms for inotify registration before tests touch the filesystem;start_watcher_with_configextracted so W5 (external extractor) shares the same startup wait; W6 added as regression test for the blob-store bug (create empty file, add content, verify both search and file-viewer content are correct);get_file_lineshelper added toTestEnv - SVG icon components — all inline SVGs extracted to
web/src/lib/icons/as reusable Svelte components (21 icons: Back, Check, Clear, Copy, Download, DupChevron, Email, Filter, FitViewport, Folder, MetaClose, MetaOpen, ShareAndroid, ShareApple, ShareWindows, Spinner, ChevronLeft, ChevronRight, ChevronDown, WrapOn, WrapOff); all consumers updated to import from the shared icon directory TopBar.svelte— shared topbar component used by bothSearchViewandFileView; eliminates the previous duplication where FileView's topbar lacked sticky positioning, search-help, and the logo help-toggle;isSearchActiveandnlpHighlightSpancomputed inside TopBar since it ownsisTypingAppLogo.svelte— magnifying-glass icon + "find-anything" text; logo text hidden on narrow widths (≤768 px), leaving just the icon; tapping the logo on mobile opens the search help panelMobilePanel.svelte— reusable full-screen mobile panel with a back-arrow header button; uses a portal action (document.body.appendChild) so it renders above all ancestor overflow/display constraints; used for search help and filter panelsSearchHelpContent.svelte— extracted search-help markup shared between the desktop popup and the mobile panel- Word-wrap overflow detection — wrap toggle button is now shown only when content actually overflows (or word-wrap is already active), using
ResizeObserver+afterUpdate; wrap toggle uses SVG icons (WrapOn/WrapOff) instead of text labels - Share button in file viewer toolbar — OS-aware share icon (iOS tray-arrow, Windows box-arrow, Android three-circle graph) opens a dialog with expiry selector (1 day / 1 week / 1 month / Never) and a "Create link" button; once the link is generated it appears with a copy icon and an Email button; on iOS/Android/browsers that support
navigator.sharethe native share sheet is invoked instead; the PathBar inline share-link button is removed in favour of this dialog - Configurable link expiry —
POST /api/v1/linksaccepts an optionalexpires_in_secsfield;0means never expires (expires_at = i64::MAX); omitting the field falls back to the server-configured default TTL - Download and Open in Explorer toolbar icons — Download and Download Archive are now icon buttons (SVG tray-with-arrow) replacing the text labels; Download Archive shows the icon + "archive" text; Open in Explorer becomes a folder icon moved to immediately after Wrap; Download is now visible on mobile (Download Archive and Open in Explorer remain hidden)
public_urlserver option — new optional[server] public_url = "https://..."setting; when configured, share links use this origin instead ofwindow.location.origin, so links work correctly when the server is accessed through a reverse proxy on a different hostname; exposed viaGET /api/v1/settingsand consumed by the web UI- Mobile support (plan 089) — responsive layout for narrow screens and mobile browsers: logo collapses to "fa", search input takes the full first row, Advanced filters moves below the search row with a sliders icon, tree sidebar and resize handle are hidden, "Open in Explorer" button and the related Preferences section are hidden, download buttons are hidden; PathBar splits into two rows (back/source on row 1, path on row 2); FileViewer toolbar metadata left-aligns on mobile; AdvancedSearch opens as a full-screen scrollable modal on mobile; Settings page uses an accordion layout instead of a fixed left nav; search results show filename on row 1 and kind/size/date on row 2; image EXIF metadata stacks below the preview
- AdvancedSearch panel scrolls on desktop — panel is now capped at
calc(100vh - 80px)with an internal scroll area (panel-body) so filters are reachable even on short viewports; Apply/Clear footer stays pinned at the bottom; scrollbar styled to match the dark theme - Word Wrap button hidden for media — the Wrap toolbar button is no longer shown when viewing images, video, audio, or a PDF in its original renderer
- SVG inline viewer —
.svg/.svgzfiles now render inline by default with a "View Source / View SVG" toggle; no EXIF drawer (SVG has no metadata); source view shows the XML content as before - Index size / Content size in Stats — stats page and
find-admin statsoutput now show "Index size" (source DBs) and "Content size" (blobs.db) as prominent cards; removed the confusing "1 content ...
v0.6.2
Added
- Text normalization — the server now normalizes all text content before writing it to ZIP archives; minified JSON/TOML files are pretty-printed using built-in formatters; any file type can be routed through an optional external formatter binary (e.g. biome, prettier, rustfmt) configured in
server.toml; lines exceedingnormalization.max_line_length(default 120) are word-wrapped; markdown files are exempt (line structure is semantically meaningful); normalization runs in phase 1 and the normalized content is written to a new.gzinto-archive/so the archive phase reads pre-formatted content without re-invoking any formatter max_markdown_render_kbsetting — added toServerAppSettings(default 512); exposed viaGET /api/v1/settings; the file viewer skips HTML rendering and shows plain text when a markdown file exceeds this threshold, preventing browser stalls from very large files- Text file "Download" button — the
FileViewertoolbar now shows aDownloadlink for text files (replaces the non-applicableView Originaltoggle); PDF and image files keep their existingView Original/View Extracted/View Splittoggles unchanged - HTTP request tracing —
tower_http::TraceLayeradded to the axum router; each request logs method + URI on arrival and status + elapsed on completion at DEBUG level; enable withRUST_LOG=tower_http=debug - Worker debug timing logs — a
timed!macro wraps all expensive steps in both the indexing phase (read+decode gz,open db,acquire source lock,delete/rename paths,normalize <file>,index N files,cleanup writes,write normalized gz) and the archive phase (parse gz files,take pending chunk removes,remove N chunks from ZIPs,append chunks,update line refs); each step logs elapsed ms at DEBUG level serde_jsonpreserve_orderfeature — JSON objects are now pretty-printed in their original key order rather than alphabetically sorted; applies to the built-in JSON normalizer and all otherserde_jsonserialization in the server
Changed
-
WorkerConfigchanged fromCopytoClone— required to holdNormalizationSettings(which contains aVec); all call sites updated to use explicit.clone() -
Activity log for
find-admin recent— each source DB now has anactivity_logtable recording add, modify, delete, and rename events for outer files;GET /api/v1/recentreads from it by default (falling back tosort=mtimefor file-table ordering);RecentFileresponse gainsaction("added"/"modified"/"deleted"/"renamed") andnew_path(for renames);find-admin recentoutput shows+/~/-/→action prefixes and old→new paths for renames; deleted and renamed files remain visible up toserver.activity_log_max_entriesevents (default 10 000, pruned oldest-first) -
IndexFile.is_newfield —find-scansetsis_new = truewhen the server has no prior entry for a file (server_entry is None);find-watchaddsAccumulatedKind::Createso OS create events are distinguished from modifies across the debounce window (Create→Modify=Create,Create→Delete=Delete,Delete→Create=Create); the server uses this field directly instead of a pre-batch DB lookup to log "added" vs "modified"
Changed
-
normalise_path_sep/normalise_rootdeduplicated — extracted fromscan.rsandwatch.rsinto a sharedpath_utilmodule; both binaries now use a single definition; unit tests added for UNC paths, composite::paths, bare drive letters, and mixed separators -
worker.rssplit into focused modules —worker.rs(1,238 lines, 5 concerns) converted to aworker/directory; per-file SQLite writes extracted toworker/pipeline.rs(279 lines); archive-phase batch processing extracted toworker/archive_batch.rs(333 lines);worker/mod.rsretains only the inbox polling loop and request coordinator (657 lines) -
FileViewer sub-components —
FileViewer.svelte(883 lines) split intoImageViewer.svelte,MarkdownViewer.svelte, andCodeViewer.svelte; each sub-component owns its styles and local state;FileViewer.sveltereduced to ~490 lines acting as a dispatcher -
WorkerHandlesstruct — the six runtime handles passed tostart_inbox_worker(status,archive_state,inbox_paused,deleted_bytes_since_scan,delete_notify,recent_tx) are now bundled into aWorkerHandlesstruct; reduces the function from 8 parameters to 3 and satisfies the clippytoo_many_argumentslint -
WorkerConfigstruct — the five scalar config values (log_batch_detail_limit,request_timeout,inline_threshold_bytes,archive_batch_size,activity_log_max_entries) are now bundled into aWorkerConfigstruct;start_inbox_workerdrops from 11 parameters to 7; adding new worker settings now only requires changing the struct definition and its construction site inmain.rs -
Per-request archive byte-cache in
ArchiveManager—read_chunknow caches the raw bytes of each ZIP opened during anArchiveManagerinstance's lifetime; sincenew_for_readingcreates a fresh manager per blocking task (search, context, file), a single request that reads multiple chunks from the same archive pays only oneFile::opencall instead of one per chunk; usesRefCellfor interior mutability so all existing&ArchiveManagercall sites are unchanged -
Archive rewrite temp-file cleanup — if
rewrite_archivefails mid-write (e.g. disk full), the partial.zip.tmpfile is now removed before the error propagates; previously the orphaned temp file was left on disk indefinitely -
FileViewStatebundles file-viewer state —fileSource,currentFile,fileSelection,panelMode,currentDirPrefix(5 separate variables) replaced by a singleFileViewState | nullin+page.svelteandFileView.svelte;fileView === nullis now the authoritative "show search results" condition (replacesview === 'results'); event handlers set all fields atomically; impossible states (e.g.view === 'file'withcurrentFile === null) are now unrepresentable;AppStateand URL serialization are unchanged -
collapseextracted from watch accumulator — the event-collapse transition table (Create+Modify→Create,Create+Delete→Delete,Delete+Create→Create,Update+Delete→Delete,Delete+Update→Update, same→last-wins) is extracted to afn collapse(existing, new) -> AccumulatedKindpure function; 10 unit tests cover every transition including multi-step sequences;accumulatenow delegates tocollapse -
needs_reindexextracted from scan loop — the file re-index decision (None → new,mtime_newer → modified,scanner_version_old → upgraded,same → skip) is extracted to apub(crate) fn needs_reindex(server_entry, local_mtime, upgrade) -> (bool, bool)pure function; 8 unit tests cover new files, mtime newer/equal/older, upgrade flag on and off, current vs outdated scanner version, and composite-path filtering invariant -
find_common::pathmodule — composite archive-member path operations (is_composite,composite_outer,composite_member,split_composite,make_composite,composite_like_prefix) are now centralised infind-common; all ad-hoccontains("::"),split_once("::"), andformat!("{}::%", …)call sites across the server, client, and worker now use these helpers; eliminates the risk of divergent::handling between scan and watch paths -
Server worker log format — indexer logs now use
[indexer:source:req_stem]prefix with a single completion line per request (indexed N files, M deletes, K renames, ...); archive logs use[archive:source]per batch; intermediate "start", "Processing N deletes", "Processed N renames", and "Phase 1 complete" lines removed (start demoted to DEBUG); "Queued bulk request" in the bulk route demoted to DEBUG; archive batch suppresses the log entirely when nothing was archived or removed (eliminates "processed 0 files" noise from delete-only batches) -
Debug builds strip symbols —
[profile.dev] debug = falsein the workspaceCargo.toml; eliminates ~90 GB of DWARF data fromtarget/debug; re-enable withdebug = truewhen a debugger is needed -
find-extract-typesmicro-crate — movesIndexLine,SCANNER_VERSION,detect_kind_from_ext,ExtractorConfig, andmem::available_bytesinto a new minimal crate that depends only onserde; all nine extractor crates now depend onfind-extract-typesinstead offind-common;find-commonre-exports everything at the same public paths for zero churn in server/client code; breaks the rebuild cascade so touchingapi.rsorconfig.rsno longer triggers a full 14-crate recompile of all extractors (~32 s → ~4 s incremental)
Added
-
find-admin recent --follow/-f— new SSE follow mode stays connected toGET /api/v1/recent/streamand prints new activity entries as they arrive (liketail -f); the server sends the lastlimithistorical entries as an initial burst before streaming live events; the client cancels cleanly on Ctrl+C -
GET /api/v1/recent/streamSSE endpoint — new server-sent events endpoint streamsRecentFileJSON frames to any connected client; the inbox worker publishes each add/modify/delete/rename event to abroadcast::Sender<RecentFile>(capacity 256) after a successfullog_activitywrite; SSE keep-alive pings every 30 s; multiple simultaneous subscribers supported -
[cli]config section withpoll_interval_secs— new client config section controls the refresh rate for polling-based CLI modes;find-admin status --watchnow reads this value (default 2.0 s) instead of a hardcoded 2 s constant; bothinstall.shand the Windows InnoSetup installer template include the commented-out[cli]block -
Two-phase inbox processing (plan 053) — inbox worker is now split into a single-threaded SQLite-only phase 1 (indexing) and a separate archive ph...
v0.6.1
- Tray recent-files popup: left-click shows 20 most recently indexed files, auto-refreshes while open
- New GET /api/v1/recent server endpoint
- Windows installer improvements: idempotent service install, auto-populate path/source from system env vars, silent find-watch/tray launch, magnifying-glass setup icon
- Fixed tray popup race conditions (dismiss-reopen, menu showing on left-click)
- Fixed recent files query to fall back to mtime for rows predating indexed_at feature
- Fixed include-glob directory pruning for sibling directories
- Suppress access-denied walk warnings on Windows
- --version flag on all binaries
- MIN_CLIENT_VERSION enforcement on startup
- Self-update via About panel (systemd only)
Full Changelog: v0.6.0...v0.6.1
v0.6.0
Added
-
find-scandirectory argument —find-scan <dir>rescans all files under a source subdirectory (full rescan, scoped deletions to that subtree only, noscan_timestampupdate); previously only individual files were accepted -
Search result metadata — mtime, file size, and kind are now shown right-aligned in the search result title bar; the duplicates bubble moves to immediately after the file path
-
PDF original view from tree — PDFs opened from the tree, directory listing, or command palette now default to the rendered (original) view; search-result opens continue to default to extracted text so match context is visible immediately
-
Grouped search results — multiple hits in the same file are now shown as a single result card with clickable line-number badges (
:123,:456); clicking a badge updates the context snippet without opening the file; the active badge is highlighted -
Build kind in About screen — the About panel now shows
(release),(dev), or a short commit hash alongside the version; determined at build time fromGIT_TAGandGIT_DIRTYenv vars (no GitHub API call required); CI release workflow injects these automatically -
log_batch_detail_limitserver config —[server] log_batch_detail_limit = 5(default); for batches up to this size the worker logs each file path individually; for larger batches it logs only the count, preventing log floods on big scans -
exclude_extrain example config —examples/client.tomlnow includes a commentedexclude_extra = []field so users can discover the additive-patterns option without reading the docs -
PathBar clipboard fallback — copy-path button now uses
document.execCommandas a fallback whennavigator.clipboardis unavailable (e.g. non-HTTPS contexts); "Copied" label replaces the icon briefly to confirm success -
Light/dark/system theme — Preferences panel now has an Appearance section with three options: Dark, Light, and "Inherit from browser"; choice is persisted in user profile; an inline script in
app.htmlsetsdata-themebefore first paint to prevent flash;prefers-color-schememedia query is tracked live for the system option; syntax highlighting (hljs) also switches to a GitHub Light palette in light mode -
Sidebar source header polish — source names no longer show a chevron triangle; font size increased to 14 px (slightly larger than the 13 px tree rows); active source is bold (
font-weight: 700) with a subtle--bg-hoverbackground tint (lighter in dark mode, darker in light mode) -
PathBar copy icon fixes — icon no longer clips at the bottom (
overflow-y: visibleon the path container); added 6 px left margin for breathing room between path and icon; vertical alignment corrected (align-items: centerinstead ofbaseline) -
NLP date search — natural language date phrases embedded in search queries are parsed and converted to date range filters automatically; supports
last month,last year,last week,last weekend,yesterday,last Monday,in the last N days,since,before,after, named months, and explicit ranges; the detected phrase is highlighted green in the search box and shown as a dismissible chip below the bar; calendar vs rolling semantics are distinguished by the presence of an "in the"/"within the" prefix -
Result count date context — the result count line now includes the active date range:
390 results between 2/1/2026 and 2/28/2026,200 results after 9/1/2025, etc. -
Manual — nine-page reference manual under
docs/manual/covering installation, configuration, indexing, search, web UI, supported file types, administration, services, and troubleshooting; README now links to it -
Admin panel — new "Admin" section in Settings shows pending/failed inbox item counts and a "Retry Failed" button that moves failed batches back to the inbox for reprocessing
Changed
base_urlremoved — thebase_urlsource config option and all related UI (PathBar external link, Preferences "Base URL overrides" panel,sourceBaseUrlsprofile field) have been removed; the feature was unused and the server URL is now the canonical access point for all files
Fixed
- Archive member sizes —
sizeis nownullfor archive members rather than0; search results and file viewer no longer show "0 bytes" when the size of a member cannot be determined (schema v6→v7 migration makes thesizecolumn nullable) find-scan --upgrade— replaces--full; re-indexes only files whose storedscanner_versionis older than the current client version, making post-release re-indexing fast and naturally resumable (interrupted runs skip files already upgraded); schema v7→v8 addsscanner_version INTEGER DEFAULT 0to thefilestablefind-admin showtimestamp —scan_tsis now printed as a human-readable RFC2822 local time instead of a raw Unix epoch number- Sticky search bar —
overflow: hiddenon.main-contentwas suppressingposition: stickyon the topbar in the results view; moved to the file-view-only selector so the search bar now remains fixed at the top while scrolling through results - Search result filename never hidden — file path in result cards is now
flex-shrink: 0(max 60% width) and the line-ref badge list clips rather than wraps, so a long list of line-number badges can no longer push the filename off-screen
Full Changelog: v0.5.6...v0.6.0
v0.5.6
Added
find-admin delete- handle corrupted zip filesfind-scan- improve logging when scanning large numbers of filesfind-extract-dispatchstandalone binary — unknown file types now route throughfind-extract-dispatch(instead offind-extract-text) so the full dispatch pipeline (PDF → media → HTML → office → EPUB → PE → text → MIME fallback) applies even when invoked as a subprocess- Windows dev scripts —
config/update-win.shcopies cross-compiled binaries directly to the local Windows install path for quick iteration;mise run build-winbuilds Windows binaries without invoking the Inno Setup installer
Fixed
- Locked / inaccessible files no longer hang the scan — three-layer defence prevents
find-scanfrom blocking on Windows files held open by other processes (e.g. the live WSL2ext4.vhdxheld by Hyper-V): (1) known binary extensions (.vhdx,.vmdk,.vdi,.ova,.iso, etc.) skipFile::openentirely in both extraction and content hashing; (2) unknown extensions are sniff-tested with 512 bytes before reading further — binary content is rejected immediately without reading the full file; (3) any remaining I/O error logs a warning and skips the file rather than failing the scan - Windows include filter with bare drive root —
path = "C:"is now normalised toC:/sostrip_prefixproduces clean relative paths and include filters work correctly - Windows include filter subdirectory traversal — directory pruning now correctly descends into subdirectories within
**wildcard patterns (e.g.Users/jamie/**now indexes all files underUsers/jamie/, not just files in the root ofUsers/jamie/) - Missing batch-submit log on final flush — the last batch (submitted after the scan loop ends) now logs "submitting batch — N files, M deletes" consistently with all other batch submissions
- Empty files incorrectly deduplicated —
hash_filenow returns no hash for 0-byte files; previously all empty files shared the same blake3-of-empty-bytes hash, causing them to be linked as duplicates of each other regardless of type or location
Full Changelog: v0.5.5...v0.5.6
Full Changelog: v0.5.5...v0.5.6
v0.5.5
- Browser tab title "Find Anything"
- Raw endpoint: warn logging on all silent 404/400 failure paths
- install.sh: auto-install system service on headless Linux (SSH-only servers)
- install-server.sh: fix missing --config flag in generated systemd unit; add [sources.xxx] example; recommend user mode and warn about home-dir access in system mode
- Windows: fix backslash path separators — files now index correctly into directory hierarchy
- Windows: config location moved to %USERPROFILE%.config\FindAnything\client.toml
- Windows: tray start/stop watcher now works without Administrator rights (service DACL updated during install)
- Windows: add find-admin.exe to installer
Full Changelog: v0.5.4...v0.5.5
v0.5.4
find-admin delete-source: delete all indexed data for a source (DB + ZIP chunks)- Nested ZIP member extraction in the raw/download endpoint (configurable depth)
- Copy-path button in PathBar
- Archive mtime Y2K correction for old DOS datetime timestamps
- Windows installer: source name field, config review page, FindAnything install dir, tray launched at end of install
- Windows tray: web favicon icon, no CMD window on launch, stable notification-area GUID (preserves "always show" setting across updates)
Full Changelog: v0.5.3...v0.5.4
Full Changelog: v0.5.3...v0.5.4
Full Changelog: v0.5.3...v0.5.4
v0.5.3
What's new
- Date-range search filter — the Advanced search panel now includes From / To date pickers that filter results by file modification time; archive members carry their own mtime from ZIP extended timestamps, TAR headers, or 7z metadata
- Advanced search Apply button — filter changes are staged locally and committed only when Apply is clicked; the button lights up blue when there are pending changes
- Calendar picker button — a 📅 button on each date field opens the date picker reliably, replacing the browser's small native icon
- Date placeholder dimmed — the
mm/dd/yyyyplaceholder renders at 25% opacity when the field is empty
Fixes
- Empty batch HTTP call skipped when there is nothing to submit
- Redundant stat syscall removed in inbox worker (
DirEntry::metadata()instead oftokio::fs::metadata) - Windows installer no longer blocks on an inline
find-scan --full; the command is printed in the summary for users to run manually
Full Changelog: v0.5.2...v0.5.3