Masonry layout Image Viewer — desktop, web, and CLI.
Open Preferences → Controls & shortcuts to customize keyboard, mouse, and wheel bindings. Current controls keeps wheel zoom and arrow-key panning when zoomed in. Wheel navigation switches images with the wheel and zooms with the left and right mouse buttons. Mouse bindings apply to the image; touch pinch remains available.
Use Record keys for keyboard shortcuts, or enter keys such as Escape and
Delete directly. Remove every binding to disable an action; Restore returns it
to the selected preset. Switching presets keeps custom bindings. Settings search
finds individual controls and focuses them when selected.
packages/
├── core/ — Shared UI components, stores, types, i18n
├── desktop/ — Tauri desktop app (Windows, macOS, Linux)
├── web/ — Astro static site + React browser app (Chromium browsers)
└── cli/ — npm CLI that serves the web build locally
- Bun
- Go Task
- Rust (for desktop only)
- Tauri prerequisites (for desktop only)
bun installtask dev:desktoptask dev:webtask build:clitask check # biome ci + tsc --build
task format # biome format --write
task test # core + web behavior testsThe auto-updater requires a signing key pair. Generate one with:
bunx @tauri-apps/cli signer generate -w ~/.tauri/mason-gallery.keyThis creates:
- Private key:
~/.tauri/mason-gallery.key(keep secret) - Public key: printed to stdout
Configure the project:
- Copy the public key into
packages/desktop/src-tauri/tauri.conf.jsonunderplugins.updater.pubkey - Add the following GitHub repository secrets for the release workflow:
TAURI_SIGNING_PRIVATE_KEY— contents of the private key fileTAURI_SIGNING_PRIVATE_KEY_PASSWORD— password entered during generation (if any)
Keep the existing signing key when repairing updates. Installed clients trust the public key bundled with their version; replacing the key would prevent them from installing updates.
The signing key was rotated after v2.2.0. Automatic updates from v2.2.0 are not being repaired. Users of versions carrying the previous public key must manually install a v2.2.1 or a later release carrying the new public key before using automatic updates again.
The desktop release workflow verifies the signing key before building, checks each
platform's signed bundle, and downloads the completed latest.json and its installers
to verify all four supported targets. A successful build alone is insufficient. Releases
remain drafts until these checks pass and a maintainer publishes them.
To restore updater metadata for an existing published release without rebuilding its
installers or publishing a new version, dispatch Release Desktop with that release's
tag and repair_only=true, using the original signing credentials for that release.
For example, from a branch containing the repair workflow:
gh workflow run release.yml --ref YOUR_BRANCH -f tag=YOUR_RELEASE_TAG -f repair_only=trueRepair checks the original assets' SHA-256 digests, signs them using the repository
Secrets, verifies signatures against the public key from the original tag, and uploads
the signatures followed by latest.json. It preserves the binaries, tag, release notes,
and publication state. If a valid manifest already exists, repair only verifies it.
To verify the repository signing Secrets against the current branch's public key without
building binaries or modifying any release, dispatch with verify_only=true:
gh workflow run release.yml --ref YOUR_BRANCH -f tag=YOUR_RELEASE_TAG -f verify_only=truegit switch main
git pull --ff-only origin main
# Synchronize workspace, Rust, Tauri and displayed versions before tagging.
task check
task test
git tag v2.3.0
git push origin v2.3.0The tag starts Release Desktop. Wait for all builds and the complete updater verification to succeed, then review and publish the draft GitHub Release.