A fast, simple, cross-platform desktop photo viewer (Rust + Slint).
cargo run -p app -- path/to/image.jpgShows the image fit-to-window, correctly oriented, almost immediately, then prefetches the neighbours so next/previous are instant.
Decoding uses image-rs (JPEG/PNG/WebP/GIF/BMP/TIFF/ICO/QOI) plus the pure-Rust imazen heic
crate for HEIC/HEIF (HEVC, AV1-in-HEIF, and uncompressed HEIF). Downscaling uses zenresize
(linear-light-capable Lanczos); the in-memory buffer is zenpixels::PixelBuffer; embedded ICC
profiles — and, for HEIF, nclx CICP — are converted to sRGB with moxcms. Standalone .avif is
planned for a later phase (via zenavif).
| Key | Action |
|---|---|
→ / L, ← / H |
Next / previous image (natural-sorted directory, wraps) |
↑ / K, ↓ / J |
Zoom in / out (toward the centre) |
Shift + ←/→/↑/↓ (or H/L/K/J) |
Pan left / right / up / down |
Z |
Cycle view mode: Fit → 1:1 → last manual zoom |
E / R |
Rotate counter-clockwise / clockwise (view-only; resets on navigate) |
F |
Toggle fullscreen |
I |
Toggle the info overlay (name, path, dimensions, file size, zoom %, rotation) |
Esc |
Close the info overlay if open, otherwise quit |
Q |
Quit |
- Scroll to zoom toward the cursor; left-drag to pan.
- Hover near the bottom for the toolbar (Prev / Next / Rotate L / Rotate R /
Fullscreen / Exit); hover near the left / right edge for the
‹/›nav buttons.
Window geometry and the fullscreen flag are saved to config.toml on quit and restored
on the next launch. The config lives in $PVC_HOME if set, else
%APPDATA%\PhotoViewerClassic on Windows or ~/.config/pvc elsewhere.
The only prerequisite beyond Rust is the Xcode Command Line Tools (one-time):
xcode-select --installThen, from the repo root:
cargo run -p app --release -- path/to/image.jpgKeys are the same as above. A single OpenGL-deprecation line may print to the console — that's expected and harmless (macOS deprecated, but still ships, OpenGL, which the FemtoVG renderer uses).
Interactive view (zoom/pan/rotate/fullscreen), neighbour prefetch, the auto-hiding
chrome, the info overlay, geometry persistence, and HEIC/HEIF decode are in place.
Still to come: tag/rating editing (with Windows-searchable keywords) and standalone
.avif. See docs/superpowers/specs/ and docs/superpowers/plans/.
GitHub Actions builds and tests on Linux, macOS (Apple Silicon), and Windows for
every pull request (and on release tags) — see .github/workflows/ci.yml. Plain
pushes to main do not run CI; main is gated through pull requests.
Releases are cut from main with the helper script, which bumps the version, tags
it, verifies the Linux release build locally with act,
then pushes the tag to trigger the cross-platform release build:
scripts/release.sh # bump the patch (C in A.B.C) and release
scripts/release.sh 0.2.0 # release an explicit versionThe v* tag triggers .github/workflows/release.yml, which builds the photoviewer
binary on Linux/macOS/Windows and attaches the archives to a GitHub Release. (The
publish step is expected to fail under act; the script only requires the build to
pass locally.) All crates share one version via [workspace.package] in the root
Cargo.toml.
Photo Viewer Classic is licensed under AGPL-3.0-only, because it statically links the
imazen heic crate and zenresize, which are AGPL-or-commercial. See the
LICENSE file for the full text.