Cross-platform photo culling for Windows, macOS, and Linux. Ratings, labels, and keywords write directly to Adobe-compatible XMP sidecars next to each photo. No catalog, no import step.
Hobby project. Provided as-is, no warranty, no support promise. Issues and PRs are appreciated but I work on this when I feel like it. If you need a polished pro tool with vendor support, use Lightroom or Photo Mechanic. This is a free thing that mostly works for basic culling and has very limited RAW support (DCPs and MakerNotes databases are difficult!).
→ Download the latest release · What it does · Limitations
- Windows x64 —
.exeNSIS installer. Unsigned, so SmartScreen will warn "Unknown publisher" on first run. - macOS arm64 —
.dmg(Apple Silicon only; no Intel build yet). Unsigned, so first launch needs right-click → Open to bypass Gatekeeper. - Linux x64 —
.AppImage.chmod +xand run; no installer.
This is a preview build — see Limitations before shipping with it.
- Filesystem-as-truth. All ratings, labels, keywords, GPS, and edit-slider values round-trip through XMP sidecars in the same format Lightroom and Adobe Bridge use. Rename, move, or copy files outside seecull; the cache rebuilds on next folder open.
- RAW + JPEG + video in one grid. Decodes Fuji RAF, Sony ARW, Nikon NEF/NRW, Canon CR2/CR3, Adobe DNG, Olympus ORF, Panasonic RW2, Pentax PEF, Samsung SRW via bundled libraw. Grid thumbs use the camera-embedded JPEG for instant paint.
- Basic edit mode works for both stills and video. The same
crs:*sliders (exposure, contrast, highlights/shadows, curve, HSL, B&W, split tone, sharpen, vignette, crop) apply to photos and video clips alike, and write to the same XMP sidecar shape Adobe uses for video. The on-screen preview runs against a poster frame for video — fine for shot selection and grade direction, not a substitute for a colour-graded final. - Keyboard-first culling.
1–5rate,Xreject,6–9colour-label,Spaceloupe, arrows navigate,Dedit. Bulk operations work over multi-select. - GPU loupe. WebGPU 1:1 view with click-to-zoom, scroll-wheel zoom, drag-pan.
Shift+Spaceswaps the embedded preview for a full libraw decode in your chosen working space (ProPhoto / AdobeRGB / sRGB / linear). - Edit mode writes ACR-compatible XMP. Exposure / contrast / highlights / shadows / whites / blacks / tone curve / HSL / B&W mix / split tone / sharpen / vignette / crop land in the same
crs:*XMP fields Lightroom reads. Open the same file in Lightroom and the sliders are already there. - Stacks. RAW+JPEG pairs collapse automatically; time-proximity grouping for derivatives (PSDs, exports). Selection-aware: rating a collapsed stack head rates every member.
- GPS / GPX. Geotag from a GPX/TCX/FIT/KML track via time matching; reverse-geocode to nearest named place via the bundled GeoNames dataset (no network).
- Map view. Plots every GPS-tagged photo on a tile map with cluster bubbles.
- External tools. Right-click → Open with… surfaces the OS-native picker (Windows native, file-dialog on macOS/Linux). Double-click opens in the OS default app.
Not a Lightroom replacement. The intended flow is cull and rough-edit in seecull, then finish in Lightroom or Adobe Camera Raw if you need full RAW develop fidelity.
- Limited RAW camera-profile support. Edit-slider preview applies adjustments on top of a generic libraw decode rather than a per-camera DCP profile. The XMP values written are Lightroom-correct; the in-app preview just won't match Lightroom's renderer pixel-for-pixel until camera-profile coverage lands.
- No noise reduction, no lens corrections, no perspective transforms, no AI masking. Out of scope for v0.x.
- Edit mode is early. Crop UI works; histograms work; sliders write correct XMP; the preview pipeline is still being tuned. Expect rough edges and the occasional re-render delay.
- No catalog features. No collections, smart collections, virtual copies, or stacks-across-folders. The folder you opened is the working set.
![]() |
![]() |
![]() |
| Selection — bulk rate / label / keyword | Loupe — WebGPU 1:1 with click-to-zoom | Edit — tone / colour / curve → crs:* XMP |
![]() |
||
| Settings — colour pipeline, libraw, ExifTool |
My camera? If libraw decodes it, seecull decodes it. Settings → Tools → libraw → Show camera list shows the full ~1300-body list. Fuji X-Trans, Sony A7/A9, Nikon Z, Canon R, Pentax K all work.
Round-trip with Lightroom? Yes — the XMP fields seecull writes are the same fields Lightroom reads. Open the folder in Lightroom and your ratings/labels/keywords/edits are there.
Network share / NAS? Works. UNC paths, mapped drives, SMB, NFS detected automatically. Concurrent reads throttled to avoid swamping the share.
Why no catalog? Catalogs drift the moment a file moves outside the app. The filesystem already is the source of truth; we treat it that way.
Why does my edit look different in Lightroom? The XMP is identical — the renderer isn't. seecull's preview runs on the cached JPEG; Lightroom runs on the RAW with its own demosaic and tone-curve pipeline. Final RAW output should be done in Lightroom or ACR.
rustup default stable
corepack enable && corepack prepare pnpm@11 --activate
pnpm install
cargo build --release -p sc-headless
pnpm devTests: cargo test --workspace and pnpm -r test. Lint: pnpm lint. Re-capture README screenshots: pnpm screenshots.
crates/— Rust workspace. Subsystem crates stay pure Rust;sc-corewraps them;sc-headlessis the NDJSON RPC server.apps/desktop/— Electron app. Renderer follows atomic design.packages/ipc-types/— typed IPC contract; drift between Rust and TS fails CI.docs/decisions/— ADRs. PLAN.md is the product spec, AGENTS.md is the engineering rulebook.
Dual-licensed MIT or Apache-2.0, your choice. Bundled libraw + ffmpeg stay LGPL-2.1 (dynamic-link only). Full attribution in THIRD_PARTY_NOTICES.md.



