Waterfall-style Image Viewer for macOS — Enhanced Fork
[中文说明]
A feature-rich fork of netdcy/Picly, the macOS waterfall-style image viewer, with AI-powered search, geographic location filtering, natural language queries, image conversion, and extensive performance optimizations for external volumes.
Integrates an on-device AI server (imageai) that indexes and searches images by semantic content. Supports natural language queries like "sunset at the beach" or "red car".
- GPS Indexing: Extracts EXIF GPS coordinates from images and builds a searchable geo index.
- Proximity Search: Find all photos taken near a specific location using natural language (e.g., "near Tokyo", "photos in Paris") with configurable radius.
- Reverse Geocoding: Uses CLGeocoder with retry/timeout logic for reliable place name resolution; falls back to MKLocalSearch and built-in country center coordinates.
- Geo Filter: Filter the current folder to show only photos matching a geographic query, with count display.
Search with date, location, and keyword filters in a single query:
- Date ranges: "photos from last week", "March 2024"
- Location: "near Shanghai", "in Japan"
- Keyword: "birthday party", "document"
- Combined: "photos near Tokyo taken in January"
Convert images between formats (JPEG, PNG, WebP) with options for quality, resizing, and output directory. Supports batch conversion via the UI or right-click context menu.
Dramatically reduces I/O on exFAT, FAT32, and network drives:
- Lazy property reads — file dates/sizes are fetched only when the current sort mode requires them
- Eliminated redundant
resourceValues(forKeys:)calls (Finder tags were read twice per file) - Stripped
.isSymbolicLinkKeyand iCloud properties from external volume fetches - Configurable concurrency (up to 8 for internal SSD, up to 4 for external)
Persistent on-disk cache of [filename: (fileSize, modDate)] per directory. On subsequent opens, only new or changed files trigger I/O — unchanged files skip the scan entirely. Cache stored at ~/Library/Application Support/Picly/DirMetadataCache.json.
Custom thread pool for background tasks:
- Fixed-size worker threads with blocking-safe queue
- Priority queuing (thumbnail loading prioritized over dimension reading)
- Graceful cancellation on directory change
Tracks file creation, deletion, and moves across sessions. Used for maintaining AI index consistency and geo cache accuracy when files are moved externally.
- ImageAI Models Panel: View AI indexing status, model loading, and per-file analysis results
- Favorites Popover: Quick-access favorites with search
- File Info Window: Detailed metadata viewer
- Finder Tag Integration: Read and filter by Finder tags
- ConvertProcess: FFmpeg-based image format conversion pipeline
- Waterfall/Justified/Grid Layout Toggle: Switch layouts with a toolbar button
- Layout Profiles: Save and restore layout configurations
- Scroll Position Preservation: Maintain scroll position when FSEvents trigger refreshes
- Progressive Loading: Items appear in ~500ms with real-time aspect ratio updates
Xcode 15.2+, macOS 12.0+
- ffmpeg-kit — video processing
- BTree — sorted collections
- Settings — settings pane
- Clone this repository and the dependency libraries into sibling directories.
- For ffmpeg-kit, build to binary first or download the pre-built xcframework:
sudo xattr -rd com.apple.quarantine ./ffmpeg-kit-full-gpl-6.0-macos-xcframework - Organize directory structure:
├── Picly │ ├── Picly.xcodeproj │ └── Picly │ └── Sources ├── ffmpeg-kit-build │ └── bundle-apple-xcframework-macos │ ├── ffmpegkit.xcframework │ └── ... ├── BTree │ ├── Package.swift │ └── Sources └── Settings ├── Package.swift └── Sources - Open
Picly.xcodeprojin Xcode, selectProduct → Build For → Profiling. - Find the built app at
Products/Release/Picly.app.
GPL License. See LICENSE for details.