Cedarflake Ame is an opinionated, local-first Windows image organizer for large personal image libraries. It follows a long-established approach to browsing, understanding, and organizing images instead of trying to accommodate every photo-management habit. Folders from different disks and cloud-backed locations remain part of one continuous library without requiring a second complete copy of the source collection.
Ame first builds an understandable view of a library, then supports deliberate organization through separately controlled file operations. Catalogs, previews, analysis evidence, and user decisions are stored apart from source media. Ame is not a backup service, cloud synchronization client, or pixel editor.
Ame treats a personal image collection as one library rather than a collection of unrelated tools:
- imported folders are sources that scope the same gallery;
- folder, date, search, sort, layout, and analysis state compose within one browsing canvas;
- the gallery loads continuously while the backend reads bounded, revision-safe windows;
- one logical asset may have more than one physical file location;
- exact duplicate evidence, similarity evidence, and later local classification remain distinct;
- file-changing operations are introduced as separate workflows only after they can be proposed, reviewed, revalidated, logged, and explicitly authorized.
The interface follows an accepted Microsoft Photos-like information architecture while using Flutter Material 3 components and interaction behavior. Sources and albums belong in the sidebar, search remains global, and contextual gallery actions replace separate feature pages.
Cataloging, previews, metadata, and future analysis run locally. Source paths and derived data do not need a hosted service.
Indexing, browsing, and analysis do not silently change source media. Move, copy, rename, recycle-bin, and delete operations are planned organization capabilities with separate review, current-state revalidation, explicit authorization, operation history, and a recovery strategy where applicable. Cloud-only placeholders are detected without automatically downloading them.
Discovery, catalog queries, gallery rendering, and preview work are bounded. Long-running work is observable, cancellable, recoverable, and isolated from individual corrupt or inaccessible files.
Ame distinguishes a logical asset, its physical locations, source-state evidence, content identity, and versioned analysis results. A path or file extension alone is not treated as permanent identity or proof of image content.
SQLite, media inspection, metadata, duplicate analysis, similarity, classification, and platform integration sit behind Ame-owned contracts. External libraries may provide mature capabilities, but their types and storage formats do not define the product domain.
- Rust discovers supported media and records structured per-file issues without failing the whole library.
- A Rust-owned SQLite catalog publishes completed source state atomically and exposes bounded query windows.
- Derived previews are generated on demand into a capacity-limited cache outside source folders.
- Generated
flutter_rust_bridgecontracts connect the Rust application layer to Flutter. - Flutter renders the unified Material 3 gallery, viewer, source navigation, and settings without accessing the filesystem or database directly.
The core concepts remain separate: LibraryRoot, Asset, AssetLocation, source-state evidence,
versioned analysis runs, durable user decisions, and reviewed operation plans.
Ame is under active development. The repository contains a working Windows desktop application with non-mutating multi-root indexing and browsing, bounded gallery queries, lazy previews, source scoping, local search and sorting, date navigation, selection, and an image viewer. Scans are resumable and preserve the last trustworthy completed catalog when replacement work is cancelled, interrupted, or stale.
Move, copy, rename, recycle-bin, and delete controls are not yet available; they remain planned organization capabilities and will be introduced only with reviewed plans, revalidation, operation history, and explicit authorization. Exact duplicate review, perceptual similarity, and local classification are also not yet available. These future capabilities must use the same catalog, safety, and replaceability boundaries rather than forming separate applications.
The repository keeps presentation, application policy, and replaceable infrastructure separate:
| Area | Responsibility |
|---|---|
lib/app |
Flutter bootstrap, shared presentation, and Windows desktop integration |
lib/features |
Feature-owned Dart domain, application, adapter, and presentation code |
rust/src |
Rust domain, application use cases, ports, adapters, persistence, and bridge API |
test |
Dart tests arranged to mirror their owning source area |
integration_test |
Cross-layer Windows and Flutter integration workflows |
tool |
Stable formatting, quality, integration, acceptance, performance, bridge, and release commands |
docs |
Architecture decisions, acceptance contracts, and development documentation |
The complete ownership map is documented in
docs/development/repository-layout.md.
Ame is implemented independently. Lap and other photo-library applications may be inspected as external product, architecture, performance, and failure references. Their source code, UI components, assets, schemas, and internal types are not copied or vendored into this repository.
- Windows 11 x64;
- Flutter stable with Windows desktop support;
- stable Rust with the
x86_64-pc-windows-msvctarget; - Visual Studio 2022 with Desktop development with C++, MSVC, Windows SDK, and CMake tools;
- the bridge-generation tools declared by the repository.
Install Dart dependencies and run the application:
flutter pub get
flutter run -d windowsAfter changing public Rust bridge types, regenerate the typed bridge:
.\tool\bridge_generate.ps1Run a focused Flutter test through the repository's serial, lock-aware entrypoint:
.\tool\quality_test_flutter.ps1 `
-TestPath test\features\library\presentation\unified_library_screen_test.dartRun the daily quality gate:
.\tool\quality_verify_daily.ps1Windows packaging and real-library acceptance have separate, explicitly invoked gates. Their requirements and safety constraints are documented rather than folded into ordinary development commands.