The core is implemented in Python. Pillow decodes and normalizes images, NumPy performs numerical calculations, and pillow-heif adds support for HEIF/HEIC formats. The code applies EXIF orientation, converts each image to grayscale, reduces it to 32 × 32 pixels and calculates a discrete cosine transform. It generates a 64-bit pHash from the low-frequency coefficients; comparison between two images uses the Hamming distance between their hashes. Similarity is therefore perceptual: a maximum score means identical hashes, not byte-for-byte identity.
The available levels are 80%, 90%, 95% and 100%. Each level maps to a maximum distance in differing bits. To avoid exhaustively comparing every image with every other image, the engine splits hashes into fragments and queries a candidate index; it then verifies the exact distance before joining two images. Grouping uses a disjoint-set structure, so transitive relationships also connect items in the same group. Thus, two images belonging to the same group does not necessarily mean that their pair directly meets the threshold.
The initial hash calculation is distributed across processes. SQLite stores metadata and hashes and reuses them when file size and modification time have not changed. New images can be added to the index; changes, deletions or threshold adjustments require rebuilding groups because they may split previous sets. Tkinter keeps analysis and thumbnail loading off the GUI thread, shows progress, and provides summary and detail views. Thresholds are comparison parameters, not model training.
The mobile integration is separate from the similarity engine. A native bridge written in Rust uses the Windows Portable Devices (WPD) interfaces to detect devices, traverse accessible content, copy images to a temporary cache and operate on persistent identifiers when deleting. A Windows Shell compatibility path is retained for older installations or inventories. The system skips Android areas that are usually unavailable through MTP, so coverage depends on the permissions and content exposed by the phone.
The documentation describes the index against exhaustive search, but provides no comparisons of algorithms or reasons for rejecting other approaches. It does not document tests of deep-learning models or other hashes.