A photo management application for the GNOME desktop. Organize, browse, and manage your photo library with support for local storage and Immich servers.
- Local and Immich backends — manage photos stored on your filesystem or connect to an Immich server for cloud-based library management
- Offline-first sync — the Immich backend caches everything locally in SQLite, so the app works fully offline and syncs when connected
- Fast grid browsing — keyset-paginated photo grid with six zoom levels and smooth scrolling through large libraries
- RAW format support — import and display CR2, NEF, ARW, DNG, and other RAW formats alongside standard JPEG, PNG, WebP, HEIC, and TIFF
- Video support — import and play video files with GStreamer-based playback
- Albums — create and manage albums to organize your photos
- People — browse photos by person using face data synced from Immich
- Favourites and filtering — star your best photos and filter by favourites, recent imports, or trash
- EXIF metadata — view camera, lens, exposure, GPS, and other metadata in the detail panel
Moments is distributed as a Flatpak. There is no Flathub listing yet — install the bundle attached to a GitHub Release, or build from source.
Every release ships a single-file .flatpak bundle. Download
moments-<version>-x86_64.flatpak from the
latest release and install it:
flatpak install --user moments-<version>-x86_64.flatpak
flatpak run io.github.justinf555.MomentsMoments needs the GNOME 50 runtime. The bundle points at Flathub as its runtime source, so Flatpak offers to add that remote and pull the runtime if you don't have it yet.
Bundles are installed as a one-off, so flatpak update won't pick up new versions —
download and install the next bundle the same way.
Verifying the download. Each release also carries a .sha256 file:
sha256sum -c moments-<version>-x86_64.flatpak.sha256Signed releases additionally include moments-releases.asc, the public key the
bundle was signed with. The GPG signature and a copy of that key travel inside the
bundle itself, so the install is trust-on-first-use — the published key is there so
the signing identity is a matter of record and stays stable across releases:
gpg --show-keys moments-releases.asc # fingerprint of the release signing keyEvery merge to main publishes a nightly bundle at a URL that never changes:
wget https://github.com/justinf555/Moments/releases/download/nightly/moments-nightly-x86_64.flatpak
flatpak install --user moments-nightly-x86_64.flatpak
flatpak run io.github.justinf555.Moments.NightlyNightlies have had no release testing and may be broken at any time — they exist so you can try an unreleased fix without building it yourself.
A nightly installs under its own application id, so it runs alongside a production
install with a separate library, settings and keyring entry rather than replacing
it. It carries an orange icon with a NIGHTLY banner and a striped headerbar so
you can tell the two apart, and reports a version like 0.4.1+6.g7ecfa4a — six
commits past v0.4.1, at that commit — which is the thing to quote in a bug
report.
The nightly release
page names the commit each build came from.
Requirements:
- GNOME Builder (recommended), or
flatpak-builderand the GNOME 50 SDK:The Makefile uses a hostflatpak install --user flathub org.flatpak.Builder \ org.gnome.Sdk/x86_64/50 org.freedesktop.Sdk.Extension.rust-stable/x86_64/25.08flatpak-builderif one is installed and falls back to the Flatpak-packagedorg.flatpak.Builderotherwise. Override withmake run FLATPAK_BUILDER=…if you have both.
Using GNOME Builder:
- Clone the repository:
git clone https://github.com/justinf555/Moments.git cd Moments - Open the project in GNOME Builder
- Click Run (or press Ctrl+F5)
Using the command line:
git clone https://github.com/justinf555/Moments.git
cd Moments
make runThis builds and installs the Flatpak locally, then launches the app.
Building your own bundle:
make bundle # → moments-<version>-<arch>.flatpak (+ .sha256)
make install-bundle # build if needed, then flatpak install --usermake bundle builds the production app ID from the working tree and packs it into a
redistributable single-file bundle — the same command the release workflow runs. Pass
GPG_KEY=<key-id> (optionally GPG_HOMEDIR=<dir>) to sign it.
If you want to run unit tests directly, you need these system libraries:
gtk4-devellibadwaita-develgettext-devellibheif-develgstreamer1-develandgstreamer1-plugins-base-devellibsecret-devel
On Fedora:
sudo dnf install cargo gtk4-devel libadwaita-devel gettext-devel \
libheif-devel gstreamer1-devel gstreamer1-plugins-base-devel \
libsecret-devel pkg-configThen run:
cargo testMoments ships with non-destructive rotate, flip, and crop enabled by default. The pixel-adjustment and filter editing sections ship in the binary but are hidden by default while they get more real-world testing miles. You can opt in per-feature via GSettings.
Because Moments is a sandboxed Flatpak with no dconf hole, run
gsettings inside the sandbox with flatpak run --command=gsettings:
# Enable the Adjustments section (exposure, contrast, saturation,
# temperature, tint, vignette).
flatpak run --command=gsettings io.github.justinf555.Moments \
set io.github.justinf555.Moments enable-adjustments true
# Enable the Filters section (Noir, Sepia, B&W).
flatpak run --command=gsettings io.github.justinf555.Moments \
set io.github.justinf555.Moments enable-filters trueRestart Moments after changing either key. To revert, replace set
with reset and drop the trailing value.
For development builds (make run-dev, app id
io.github.justinf555.Moments.Devel), substitute that app id in both
positions (the flatpak run target and the schema id).
Contributions are welcome! Please read CONTRIBUTING.md for guidelines on reporting bugs, suggesting features, and submitting pull requests.
For an overview of the codebase, see ARCHITECTURE.md.
- GitHub Issues — bug reports and feature requests
- GitHub Discussions — questions and general discussion
Moments is licensed under the GNU General Public License v3.0 or later.

