Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,10 @@ platforms/apple/dist/
platforms/windows/src/engine/target/
platforms/linux/**/target/
platforms/linux/target/
platforms/linux/dist/
**/*.rs.bk
# Local Linux UI capture evidence (not release assets).
/.linux-ui-*.png
Cargo.lock.bak
# Stray local-build outputs dropped next to the engine source (e.g. rust_out.exe
# from an ad-hoc `rustc -o`); the canonical build lands under target/.
Expand Down
17 changes: 15 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,23 @@ Per `shared/docs/PRIVACY.md` and `CLAUDE.md`: this project ships no telemetry, n

## [Unreleased]

## [0.1.0] - 2026-08-08
## [0.1.0] - 2026-08-07

### Added

- **Fresh cross-platform functional baseline.** Windows, macOS, and Linux ship the same six product areas with native UI, the shared IPC contract, local-only processing, and clearly labeled unsigned prerelease artifacts.

### Changed

- **Deep Analyze is faster and more reliable on Windows.** Visual analysis combines caption, tags, and filename generation in one grounded request, disables multimodal prompt-cache retention, reuses document text, and falls back safely for corrupt or unsupported previews.
- **People editing is complete on Windows and Linux.** Naming, moving, splitting, and removing faces reconcile counts and representatives without losing named people or face-level identity exclusions.

### Fixed

- **Long-running work stays active while the display dims.** Scan, clustering, model installation, and Deep Analyze hold the native platform sleep inhibitor for their full operation lifetime.
- **Face and media failures are bounded per file.** Corrupt image, video, document, and audio inputs cannot terminate the catalog operation or damage SQLite state.
### Added

- **RAM++ scan tagging is an explicit macOS opt-in.** The fast built-in on-device classifier is the
default, while users who want the richer 4,585-label model can enable it in Settings and restart
the engine.
Expand Down Expand Up @@ -367,7 +380,7 @@ Per `shared/docs/PRIVACY.md` and `CLAUDE.md`: this project ships no telemetry, n
Versions V11–V15.2.1 predate this CHANGELOG. Their release notes live in commit messages and `shared/docs/STATE.md` (top-of-file entries, latest-first). Anyone wanting the history can `git log --oneline` or read STATE.md from the bottom up. Future releases (V15.3+) populate this file at tag time.

[Unreleased]: https://github.com/WebWorldWide/FileID/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/WebWorldWide/FileID/compare/v0.1.4...v0.1.0
[0.1.0]: https://github.com/WebWorldWide/FileID/releases/tag/v0.1.0
[0.1.4]: https://github.com/WebWorldWide/FileID/compare/v0.1.3...v0.1.4
[0.1.3]: https://github.com/WebWorldWide/FileID/compare/v0.1.2...v0.1.3
[0.1.2]: https://github.com/WebWorldWide/FileID/compare/v0.1.1...v0.1.2
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ macOS is the canonical visual + behavioral reference; the Windows and Linux apps

`fileid` and `fileid-tui` share the Rust engine crate and the **same library format** as the desktop apps. Read/query and model-free paths run in-process; full-ML scans spawn `FileIDEngine` over the canonical IPC.

Build from source for now; refreshed downloadable CLI and TUI archives will return with the next cross-platform release. This command builds the engine, CLI, and TUI in release and installs `fileid`, `fileid-tui`, and the engine binary to `~/.cargo/bin`:
Download the matching `FileID-tools-0.1.0-*` archive from the [v0.1.0 prerelease](https://github.com/WebWorldWide/FileID/releases/tag/v0.1.0), or build from source. This command builds the engine, CLI, and TUI in release and installs `fileid`, `fileid-tui`, and the engine binary to `~/.cargo/bin`:

```bash
bash scripts/build-tools.sh
Expand Down Expand Up @@ -174,9 +174,9 @@ Deeper reference: [`platforms/cli/README.md`](platforms/cli/README.md) · [`plat

| Platform | Format | Notes |
| :-- | :-- | :-- |
| **Windows app** | Build from source | Refreshed x64/ARM64 installers will return with the next Windows release. |
| **macOS app** | `FileID-v0.1.0.dmg` | Apple Silicon app bundle in an unsigned prerelease disk image. |
| **CLI + TUI** | Build from source | Refreshed x64/ARM64 archives will return with the next cross-platform release. |
| **Windows app** | `FileID-0.1.0-UNSIGNED-Setup.exe` · x64/ARM64 `.msi` | The Burn setup bundle chooses the native MSI; all are unsigned prerelease builds. |
| **macOS app** | `FileID-0.1.0-UNSIGNED-macOS.dmg` | Apple Silicon app bundle in an unsigned prerelease disk image. |
| **CLI + TUI** | `FileID-tools-0.1.0-*` | x64/ARM64 archives for Windows, macOS, and Linux; Windows archives are explicitly marked unsigned. |
| **Linux app** | Flatpak · AppImage · Nix flake · AUR `PKGBUILD` recipes | Build from source for now; clean-sandbox and distro lifecycle validation remain release gates in `SHIP.md`. |

---
Expand Down
2 changes: 1 addition & 1 deletion packaging/aur/PKGBUILD
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
# Generate .SRCINFO before publishing: makepkg --printsrcinfo > .SRCINFO

pkgname=fileid
pkgver=0.1.3
pkgver=0.1.0
pkgrel=1
pkgdesc="On-device AI file organizer — tag, dedupe, restructure, rename files locally (GTK4)"
arch=('x86_64' 'aarch64')
Expand Down
52 changes: 52 additions & 0 deletions packaging/flatpak/cargo-sources.json
Original file line number Diff line number Diff line change
Expand Up @@ -3366,6 +3366,32 @@
"dest": "cargo/vendor/symphonia-codec-aac-0.5.5",
"dest-filename": ".cargo-checksum.json"
},
{
"type": "archive",
"archive-type": "tar-gzip",
"url": "https://static.crates.io/crates/symphonia-codec-adpcm/symphonia-codec-adpcm-0.5.5.crate",
"sha256": "2dddc50e2bbea4cfe027441eece77c46b9f319748605ab8f3443350129ddd07f",
"dest": "cargo/vendor/symphonia-codec-adpcm-0.5.5"
},
{
"type": "inline",
"contents": "{\"package\":\"2dddc50e2bbea4cfe027441eece77c46b9f319748605ab8f3443350129ddd07f\",\"files\":{}}",
"dest": "cargo/vendor/symphonia-codec-adpcm-0.5.5",
"dest-filename": ".cargo-checksum.json"
},
{
"type": "archive",
"archive-type": "tar-gzip",
"url": "https://static.crates.io/crates/symphonia-codec-alac/symphonia-codec-alac-0.5.5.crate",
"sha256": "8413fa754942ac16a73634c9dfd1500ed5c61430956b33728567f667fdd393ab",
"dest": "cargo/vendor/symphonia-codec-alac-0.5.5"
},
{
"type": "inline",
"contents": "{\"package\":\"8413fa754942ac16a73634c9dfd1500ed5c61430956b33728567f667fdd393ab\",\"files\":{}}",
"dest": "cargo/vendor/symphonia-codec-alac-0.5.5",
"dest-filename": ".cargo-checksum.json"
},
{
"type": "archive",
"archive-type": "tar-gzip",
Expand Down Expand Up @@ -3405,6 +3431,19 @@
"dest": "cargo/vendor/symphonia-core-0.5.5",
"dest-filename": ".cargo-checksum.json"
},
{
"type": "archive",
"archive-type": "tar-gzip",
"url": "https://static.crates.io/crates/symphonia-format-caf/symphonia-format-caf-0.5.5.crate",
"sha256": "b8faf379316b6b6e6bbc274d00e7a592e0d63ff1a7e182ce8ba25e24edd3d096",
"dest": "cargo/vendor/symphonia-format-caf-0.5.5"
},
{
"type": "inline",
"contents": "{\"package\":\"b8faf379316b6b6e6bbc274d00e7a592e0d63ff1a7e182ce8ba25e24edd3d096\",\"files\":{}}",
"dest": "cargo/vendor/symphonia-format-caf-0.5.5",
"dest-filename": ".cargo-checksum.json"
},
{
"type": "archive",
"archive-type": "tar-gzip",
Expand All @@ -3418,6 +3457,19 @@
"dest": "cargo/vendor/symphonia-format-isomp4-0.5.5",
"dest-filename": ".cargo-checksum.json"
},
{
"type": "archive",
"archive-type": "tar-gzip",
"url": "https://static.crates.io/crates/symphonia-format-mkv/symphonia-format-mkv-0.5.5.crate",
"sha256": "122d786d2c43a49beb6f397551b4a050d8229eaa54c7ddf9ee4b98899b8742d0",
"dest": "cargo/vendor/symphonia-format-mkv-0.5.5"
},
{
"type": "inline",
"contents": "{\"package\":\"122d786d2c43a49beb6f397551b4a050d8229eaa54c7ddf9ee4b98899b8742d0\",\"files\":{}}",
"dest": "cargo/vendor/symphonia-format-mkv-0.5.5",
"dest-filename": ".cargo-checksum.json"
},
{
"type": "archive",
"archive-type": "tar-gzip",
Expand Down
2 changes: 1 addition & 1 deletion packaging/nix/flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
in {
packages.fileid = pkgs.rustPlatform.buildRustPackage {
pname = "fileid-linux";
version = "0.1.4";
version = "0.1.0";

src = repoRoot;
# platforms/linux is the workspace; it path-depends on
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,11 @@ struct FileIDEngineMain {
case .renamePerson(let personID, let title, let firstName, let middleName, let lastName, let suffix):
guard let database else { await emitDbUnavailable(sink, action: "renamePerson"); return }
await sink.emit(.bulkActionResult(await renamePerson(database: database, personID: personID, title: title, firstName: firstName, middleName: middleName, lastName: lastName, suffix: suffix)))
case .reassignFace:
await sink.emit(.error(EngineError(
kind: "not_implemented_yet",
message: "This IPC command is not implemented by the macOS engine yet."
)))
case .markPersonsAsUnknown(let personIDs):
guard let database else { await emitDbUnavailable(sink, action: "markPersonsAsUnknown"); return }
await sink.emit(.bulkActionResult(await markPersonsAsUnknown(database: database, personIDs: personIDs)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ public struct IPCCommand: Codable, Sendable {
case mergeClusters(sourcePersonID: Int64, destinationPersonID: Int64)
case embedTextQuery(query: String, queryID: String)
case renamePerson(personID: Int64, title: String?, firstName: String?, middleName: String?, lastName: String?, suffix: String?)
case reassignFace(faceID: Int64, destinationPersonID: Int64?, createNewPerson: Bool)
case markPersonsAsUnknown(personIDs: [Int64])
case findMergeSuggestions
case embedImageQuery(fileID: Int64, queryID: String)
Expand Down
52 changes: 50 additions & 2 deletions platforms/cli/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion platforms/cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

[package]
name = "fileid-cli"
version = "0.1.4"
version = "0.1.0"
edition = "2021"
rust-version = "1.90"
description = "FileID — local AI file organizer. Cross-platform CLI front-end over the shared Rust engine."
Expand Down
2 changes: 1 addition & 1 deletion platforms/linux/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ See `shared/docs/NEXT.md` for native packaging and hardware validation gates.
| `shell/video` | `ffmpeg` keyframe → P6 PPM we parse, best-effort (`ffprobe` for the 25% seek) | **Done** (no crate) |
| `shell/thumbnail` | Not used on Linux: the GTK app owns its off-thread GdkPixbuf thumbnail path; the engine API remains an explicit unsupported stub | **Not applicable** |
| `shell/heic` | best-effort `heif-dec`/`heif-convert` CLI → temp PNG → `image` decode (no GPL libheif linked; graceful skip when the tools are absent) | **Done** (subprocess) |
| `platform/SleepGuard` | `systemd-inhibit --what=sleep:idle` held for the scan lifetime; inert when logind is unavailable | **Done** (subprocess) |
| `platform/SleepGuard` | `systemd-inhibit --what=sleep:idle` held for scan, Deep Analyze, clustering, and prewarm lifetimes; inert when logind is unavailable | **Done** (subprocess) |

The five "Done" backends are gated `#[cfg(target_os = "linux")]` in `platforms/windows/src/engine/src/shell/mod.rs` and built only with **std + libc + subprocess** (no new crates). macOS / other Unix keep the `#[cfg(all(not(windows), not(target_os = "linux")))]` graceful stub; `thumbnail` + `heic` are still stubbed on every non-Windows OS. CI: `linux.yml` runs `cargo clippy --all-targets -D warnings` + `cargo test --lib` on the Linux target (where these arms actually compile).

Expand Down
52 changes: 50 additions & 2 deletions platforms/linux/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading