Skip to content

Releases: outsharked/find-anything

v0.7.2

Choose a tag to compare

@github-actions github-actions released this 01 Apr 16:58

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

Choose a tag to compare

@jamietre jamietre released this 24 Mar 22:01

Added

  • code file 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_VERSION bumped 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_path in [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/expand endpoint — 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, .potm were misidentified as ZIP; now handled by the Office extractor
  • epub files misclassified as documentdetect_kind_from_ext("epub") now returns "epub"
  • Content store not updated on re-extraction — re-indexing an unchanged file after a SCANNER_VERSION bump 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 with visibility: hidden

Changed

  • Tree sidebar expansion optimised — one tree/expand request per navigation instead of N parallel tree calls
  • find-watch: stale inotify watch errors logged at debugPathNotFound/WatchNotFound on deleted directories are expected and no longer logged as warnings

Full Changelog: v0.7.0...v0.7.1

v0.7.0

Choose a tag to compare

@jamietre jamietre released this 24 Mar 11:58

Added

  • DICOM support — metadata extraction (find-extract-dicom) indexes DICOM tags (PatientName, Modality, StudyDescription, dimensions, etc.); inline PNG preview via find-preview-dicom subprocess (served through the unified GET /api/v1/view endpoint); FileKind::Dicom variant added; extensionless DICOM files detected via magic bytes (DICM at offset 128); JPEG2000 decoding available as optional jpeg2000 Cargo feature
  • Unified GET /api/v1/view image 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's kind in the source DB and decides: serve native bytes for browser-compatible formats (detected by magic bytes), convert to PNG via the image crate for other image kinds, or run find-preview-dicom for DICOM; the client uses a single viewUrl for all inline image and DICOM display
  • DICOM metadata uses [DICOM:Tag] value format — consistent with EXIF [EXIF:Make] Apple so parseMetaTags can parse and display each field in the metadata drawer; previously bare values like study: 20260323 were not parsed; SCANNER_VERSION bumped to 6 to trigger re-extraction
  • [fa:duplicate] prefix for duplicate path entries in metadataFileViewer no longer guesses by absence of [; only [fa:duplicate] -prefixed entries are treated as duplicate paths; untagged metadata (DICOM) goes to metaLines instead of duplicatePaths
  • source: search prefix — restricts results to a specific source and optional path prefix; format source:<source-name>[/path/to/dir]; server applies WHERE (path = ? OR path LIKE ?/%) in both FTS5 and document-search modes
  • source: typeahead with auto-advance — typing source: 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 (resolveAutoPath is a pure async function with no intermediate state mutations); desktop-only (hidden on mobile)
  • ← results button hidden on deeplink — button now only renders when results.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; MetaDrawer mobile styles removed overflow-y: auto / max-height: 40vh so content flows naturally; FileViewer outer container switches to overflow-y: auto on mobile; AudioViewer and VideoViewer stack 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-watch file content not stored in blob storehandle_update never computed the blake3 hash, so file_hash was always None in 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 shared batch::hash_file and attach it to the IndexFile; hash_file consolidated from duplicate copies in scan.rs and watch.rs into batch.rs
  • find-watch hang 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 the watch() channel on kernel 3.10; all directories are now collected first (before any watches exist), then registered in a second pass
  • find-watch only watched 1 directory when no include patterns configuredinclude_dir_prefixes(&[]) returns Some({}) (an empty terminal set that prunes everything); guard added so an empty include list yields None (watch everything), matching the behaviour of find-scan
  • .index include patterns now prune directory traversal in find-watchwalk_source_tree (shared by find-scan and find-watch) now reads .index files during the DFS and skips sibling subtrees excluded by their include field, giving both binaries identical directory-pruning behaviour
  • Svelte CSS warnings for extracted SVG icon components — fixed unused selector warnings by replacing .foo svg with .foo :global(svg) in SearchBox.svelte, AdvancedSearch.svelte, and +page.svelte
  • find-scan not found in upload integration testsresolve_find_scan now also checks the parent of the current exe's directory; test binaries live in target/debug/deps/ but find-scan is built one level up in target/debug/, so the previous code fell back to PATH (which works locally if find-scan is installed, but never in CI)
  • Watch integration tests W1–W6 — all watch tests now reliably pass: batch_window_secs set to 50 ms in test config (default 5 s caused timeouts); start_watcher waits 500 ms for inotify registration before tests touch the filesystem; start_watcher_with_config extracted 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_lines helper added to TestEnv
  • 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 both SearchView and FileView; eliminates the previous duplication where FileView's topbar lacked sticky positioning, search-help, and the logo help-toggle; isSearchActive and nlpHighlightSpan computed inside TopBar since it owns isTyping
  • AppLogo.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 panel
  • MobilePanel.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 panels
  • SearchHelpContent.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.share the native share sheet is invoked instead; the PathBar inline share-link button is removed in favour of this dialog
  • Configurable link expiryPOST /api/v1/links accepts an optional expires_in_secs field; 0 means 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_url server option — new optional [server] public_url = "https://..." setting; when configured, share links use this origin instead of window.location.origin, so links work correctly when the server is accessed through a reverse proxy on a different hostname; exposed via GET /api/v1/settings and 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/.svgz files 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 stats output now show "Index size" (source DBs) and "Content size" (blobs.db) as prominent cards; removed the confusing "1 content ...
Read more

v0.6.2

Choose a tag to compare

@jamietre jamietre released this 12 Mar 03:00

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 exceeding normalization.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 .gz in to-archive/ so the archive phase reads pre-formatted content without re-invoking any formatter
  • max_markdown_render_kb setting — added to ServerAppSettings (default 512); exposed via GET /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 FileViewer toolbar now shows a Download link for text files (replaces the non-applicable View Original toggle); PDF and image files keep their existing View Original / View Extracted / View Split toggles unchanged
  • HTTP request tracingtower_http::TraceLayer added to the axum router; each request logs method + URI on arrival and status + elapsed on completion at DEBUG level; enable with RUST_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_json preserve_order feature — JSON objects are now pretty-printed in their original key order rather than alphabetically sorted; applies to the built-in JSON normalizer and all other serde_json serialization in the server

Changed

  • WorkerConfig changed from Copy to Clone — required to hold NormalizationSettings (which contains a Vec); all call sites updated to use explicit .clone()

  • Activity log for find-admin recent — each source DB now has an activity_log table recording add, modify, delete, and rename events for outer files; GET /api/v1/recent reads from it by default (falling back to sort=mtime for file-table ordering); RecentFile response gains action ("added" / "modified" / "deleted" / "renamed") and new_path (for renames); find-admin recent output shows +/~/-/ action prefixes and old→new paths for renames; deleted and renamed files remain visible up to server.activity_log_max_entries events (default 10 000, pruned oldest-first)

  • IndexFile.is_new fieldfind-scan sets is_new = true when the server has no prior entry for a file (server_entry is None); find-watch adds AccumulatedKind::Create so 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_root deduplicated — extracted from scan.rs and watch.rs into a shared path_util module; both binaries now use a single definition; unit tests added for UNC paths, composite :: paths, bare drive letters, and mixed separators

  • worker.rs split into focused modulesworker.rs (1,238 lines, 5 concerns) converted to a worker/ directory; per-file SQLite writes extracted to worker/pipeline.rs (279 lines); archive-phase batch processing extracted to worker/archive_batch.rs (333 lines); worker/mod.rs retains only the inbox polling loop and request coordinator (657 lines)

  • FileViewer sub-componentsFileViewer.svelte (883 lines) split into ImageViewer.svelte, MarkdownViewer.svelte, and CodeViewer.svelte; each sub-component owns its styles and local state; FileViewer.svelte reduced to ~490 lines acting as a dispatcher

  • WorkerHandles struct — the six runtime handles passed to start_inbox_worker (status, archive_state, inbox_paused, deleted_bytes_since_scan, delete_notify, recent_tx) are now bundled into a WorkerHandles struct; reduces the function from 8 parameters to 3 and satisfies the clippy too_many_arguments lint

  • WorkerConfig struct — 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 a WorkerConfig struct; start_inbox_worker drops from 11 parameters to 7; adding new worker settings now only requires changing the struct definition and its construction site in main.rs

  • Per-request archive byte-cache in ArchiveManagerread_chunk now caches the raw bytes of each ZIP opened during an ArchiveManager instance's lifetime; since new_for_reading creates a fresh manager per blocking task (search, context, file), a single request that reads multiple chunks from the same archive pays only one File::open call instead of one per chunk; uses RefCell for interior mutability so all existing &ArchiveManager call sites are unchanged

  • Archive rewrite temp-file cleanup — if rewrite_archive fails mid-write (e.g. disk full), the partial .zip.tmp file is now removed before the error propagates; previously the orphaned temp file was left on disk indefinitely

  • FileViewState bundles file-viewer statefileSource, currentFile, fileSelection, panelMode, currentDirPrefix (5 separate variables) replaced by a single FileViewState | null in +page.svelte and FileView.svelte; fileView === null is now the authoritative "show search results" condition (replaces view === 'results'); event handlers set all fields atomically; impossible states (e.g. view === 'file' with currentFile === null) are now unrepresentable; AppState and URL serialization are unchanged

  • collapse extracted 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 a fn collapse(existing, new) -> AccumulatedKind pure function; 10 unit tests cover every transition including multi-step sequences; accumulate now delegates to collapse

  • needs_reindex extracted from scan loop — the file re-index decision (None → new, mtime_newer → modified, scanner_version_old → upgraded, same → skip) is extracted to a pub(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::path module — composite archive-member path operations (is_composite, composite_outer, composite_member, split_composite, make_composite, composite_like_prefix) are now centralised in find-common; all ad-hoc contains("::"), split_once("::"), and format!("{}::%", …) 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 = false in the workspace Cargo.toml; eliminates ~90 GB of DWARF data from target/debug; re-enable with debug = true when a debugger is needed

  • find-extract-types micro-crate — moves IndexLine, SCANNER_VERSION, detect_kind_from_ext, ExtractorConfig, and mem::available_bytes into a new minimal crate that depends only on serde; all nine extractor crates now depend on find-extract-types instead of find-common; find-common re-exports everything at the same public paths for zero churn in server/client code; breaks the rebuild cascade so touching api.rs or config.rs no 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 to GET /api/v1/recent/stream and prints new activity entries as they arrive (like tail -f); the server sends the last limit historical entries as an initial burst before streaming live events; the client cancels cleanly on Ctrl+C

  • GET /api/v1/recent/stream SSE endpoint — new server-sent events endpoint streams RecentFile JSON frames to any connected client; the inbox worker publishes each add/modify/delete/rename event to a broadcast::Sender<RecentFile> (capacity 256) after a successful log_activity write; SSE keep-alive pings every 30 s; multiple simultaneous subscribers supported

  • [cli] config section with poll_interval_secs — new client config section controls the refresh rate for polling-based CLI modes; find-admin status --watch now reads this value (default 2.0 s) instead of a hardcoded 2 s constant; both install.sh and 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...

Read more

v0.6.1

Choose a tag to compare

@jamietre jamietre released this 07 Mar 05:11
  • 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

Choose a tag to compare

@jamietre jamietre released this 06 Mar 20:37

Added

  • find-scan directory argumentfind-scan <dir> rescans all files under a source subdirectory (full rescan, scoped deletions to that subtree only, no scan_timestamp update); 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 from GIT_TAG and GIT_DIRTY env vars (no GitHub API call required); CI release workflow injects these automatically

  • log_batch_detail_limit server 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_extra in example configexamples/client.toml now includes a commented exclude_extra = [] field so users can discover the additive-patterns option without reading the docs

  • PathBar clipboard fallback — copy-path button now uses document.execCommand as a fallback when navigator.clipboard is 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.html sets data-theme before first paint to prevent flash; prefers-color-scheme media 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-hover background tint (lighter in dark mode, darker in light mode)

  • PathBar copy icon fixes — icon no longer clips at the bottom (overflow-y: visible on the path container); added 6 px left margin for breathing room between path and icon; vertical alignment corrected (align-items: center instead of baseline)

  • 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_url removed — the base_url source config option and all related UI (PathBar external link, Preferences "Base URL overrides" panel, sourceBaseUrls profile field) have been removed; the feature was unused and the server URL is now the canonical access point for all files

Fixed

  • Archive member sizessize is now null for archive members rather than 0; search results and file viewer no longer show "0 bytes" when the size of a member cannot be determined (schema v6→v7 migration makes the size column nullable)
  • find-scan --upgrade — replaces --full; re-indexes only files whose stored scanner_version is older than the current client version, making post-release re-indexing fast and naturally resumable (interrupted runs skip files already upgraded); schema v7→v8 adds scanner_version INTEGER DEFAULT 0 to the files table
  • find-admin show timestampscan_ts is now printed as a human-readable RFC2822 local time instead of a raw Unix epoch number
  • Sticky search baroverflow: hidden on .main-content was suppressing position: sticky on 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

Choose a tag to compare

@jamietre jamietre released this 05 Mar 15:50

Added

  • find-admin delete - handle corrupted zip files
  • find-scan - improve logging when scanning large numbers of files
  • find-extract-dispatch standalone binary — unknown file types now route through find-extract-dispatch (instead of find-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 scriptsconfig/update-win.sh copies cross-compiled binaries directly to the local Windows install path for quick iteration; mise run build-win builds Windows binaries without invoking the Inno Setup installer

Fixed

  • Locked / inaccessible files no longer hang the scan — three-layer defence prevents find-scan from blocking on Windows files held open by other processes (e.g. the live WSL2 ext4.vhdx held by Hyper-V): (1) known binary extensions (.vhdx, .vmdk, .vdi, .ova, .iso, etc.) skip File::open entirely 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 rootpath = "C:" is now normalised to C:/ so strip_prefix produces 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 under Users/jamie/, not just files in the root of Users/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 deduplicatedhash_file now 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

Choose a tag to compare

@jamietre jamietre released this 05 Mar 02:03
  • 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

Choose a tag to compare

@jamietre jamietre released this 04 Mar 21:10
  • 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

Choose a tag to compare

@jamietre jamietre released this 04 Mar 19:19

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/yyyy placeholder 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 of tokio::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