Note
This is a community fork of Immich with additional features and improvements. Currently based on Immich v3.1.0. We regularly sync with upstream to stay up to date. See What's Different below.
Tip
Already running Immich? Switching to Gallery is a three-line config change — two image names in your docker-compose.yml and IMMICH_VERSION=v5 in your .env. Your library and database are fully compatible. See the install guide.
Not for you? A one-command switch-back script cleans up Gallery-specific tables and columns and puts you back on upstream Immich. Your photos and videos never move.
Gallery is a friendly fork that rebases onto every upstream Immich release, so every fix, performance improvement, and new feature from the Immich team lands here automatically. On top of that foundation, Gallery adds the features below — grouped the way the Noodle Gallery vs Immich comparison frames them: each is an additive answer to a place where upstream runs out of room. Every feature has a feature page, and most have a docs page too.
Immich's face recognition is account-scoped — the same person shows up as a separate entry in your library, your partner's, and every shared album you both touch.
- Global People — people, filters, and search results dedupe across your library and every Shared Space you can access, without crossing a permission boundary. Naming and merging stay scoped to where they were entered.
Partner Sharing is all-or-nothing and albums belong to whoever made them — there's no combined family timeline, no activity log, and no way to bulk-share tens of thousands of photos by hand.
- Shared Spaces — multi-owner collaborative timelines with Owner / Editor / Viewer roles, cross-contributor face recognition, and a per-space activity log. Photos are linked by reference at zero extra storage cost, and each contributor keeps their own library. (Docs)
- Spaces Filtering — the full filter suite (date, people, location, camera, tags) scoped to a single Space.
- User Groups — named, color-coded groups so you can share with a whole circle at once. (Docs)
- Bulk Add to Spaces — add hundreds of thousands of photos to a Space in one click, processed in the background.
Each page has its own search bar with no keyboard-first global entry point, smart-search results can't be sorted or threshold-tuned, filters operate in isolation, and the map has no filter panel of its own.
- Timeline Grouping — a Years / Months / All switcher on every timeline. Zoom into a period without restricting the query, and keep your scroll position when you switch back.
- Inline Search Filters — type structured filters (people, tags, dates, locations, ratings, cameras) straight into the search bar, with live suggestions and shareable URL state.
- Global Search — Cmd/Ctrl+K searches people, places, tags, albums, commands, and settings in parallel. (Docs)
- Search Palette — the command palette behind it, with prefix shortcuts (
@people,#tags,/albums,>commands) and page commands for rename / share / delete. (Docs) - Search Sorting & Relevance — sort by relevance, newest, or oldest, with a tunable similarity threshold.
- Interdependent Filtering — every filter narrows every other filter, so there are no dead-end combinations. (Docs)
- Smart Search & Contextual Filters — full-text and CLIP search inside Spaces, with filter suggestions that adapt to your selection.
- Map Filtering — the full filter panel on the Map view, with markers updating in real time. (Docs)
Immich's AI surface is focused on faces and basic CLIP search — pets aren't detected, memories show only "On This Day", there's no automated clutter suppression, and duplicate detection misses re-encoded videos.
- Auto-Classification — define what clutter looks like (screenshots, memes, receipts) and Gallery tags and optionally archives it automatically, each category with its own threshold. (Docs)
- Memories Archive — a dedicated Memories page with search, an All/Saved filter, and retention controls. (Docs)
- Smarter Memories — recent-trip recaps detected from location clusters, plus birthday memories that adapt to each person's photo history. (Docs)
- Pet Detection — YOLO11 detects dogs, cats, birds, and other animals and surfaces them alongside people. (Docs)
- Video Duplicate Detection — averages CLIP embeddings across sampled frames, catching duplicate videos even after re-encoding or resizing. (Docs)
Trimming a video means exporting to an external tool, moving from Google Photos needs CLI scripts, storage is local disk or external libraries with no native S3 backend, and a large existing library can't be linked into a shared collection.
- Image Editing — non-destructive rotation and cropping from the asset viewer, plus batch rotate. Originals are always preserved. (Docs)
- Video Trimming — cut clips in the browser. FFmpeg stream copy makes it instant and lossless, and you can restore the original at any time. (Docs)
- Connected Libraries — link external photo libraries into Shared Spaces with no file duplication and originals left untouched. (Docs)
- Google Photos Import — a guided in-browser wizard for Takeout archives that preserves dates, GPS, descriptions, and album structure. No CLI required. (Docs)
- S3-Compatible Storage — store media on any S3-compatible backend (AWS S3, MinIO, Cloudflare R2, Backblaze B2, Wasabi), with a built-in migration tool that resumes and rolls back. (Docs)
Filtering the timeline in the Immich mobile app means switching to a separate tab and losing your scroll position, and advanced surfaces sit deeper in the app or aren't there at all.
- Photos Filtering on Mobile — a bottom sheet filters the timeline by people, places, tags, dates, rating, and media type without leaving the grid.
- iPhone and Android — native apps on the App Store and Google Play, with background camera backup, on-device CLIP search, the map, and Shared Spaces — all talking directly to your own server. (Docs)
- Structured JSON logging — opt-in JSON log output (
IMMICH_LOG_FORMAT=json) for clean integration with log aggregation systems like Grafana Loki, the ELK Stack, Datadog, or Splunk.
Switching is simple — just change your Docker image names. Your existing database, configuration, and media files are fully compatible.
Important
Always back up your database before switching. This allows you to revert to upstream Immich if needed.
docker exec -t immich_postgres pg_dumpall -c -U postgres | gzip > immich-db-backup-$(date +%Y%m%d).sql.gzSet the version in your .env file:
IMMICH_VERSION=v5Change the image references in your docker-compose.yml:
services:
immich-server:
- image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
+ image: ghcr.io/open-noodle/gallery-server:${IMMICH_VERSION:-release}
immich-machine-learning:
- image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
+ image: ghcr.io/open-noodle/gallery-ml:${IMMICH_VERSION:-release}For NVIDIA GPU acceleration on the ML container, use the -cuda tag variant:
image: ghcr.io/open-noodle/gallery-ml:${IMMICH_VERSION:-release}-cudadocker compose pull
docker compose up -dThat's it. To switch back to upstream Immich later, flip the two image names back and either restore your database backup or run the automated switch-back script, which drops Gallery-specific tables, columns, and migration records — shared spaces, pet detection, classifications, duplicate data — leaving a plain upstream Immich database. Your photos and videos are never touched.
Català Español Français Italiano 日本語 한국어 Deutsch Nederlands Türkçe 简体中文 正體中文 Українська Русский Български Português Brasileiro Svenska العربية Tiếng Việt ภาษาไทย മലയാളം
Warning
Always follow 3-2-1 backup plan for your precious photos and videos!
Note
You can find the full documentation at https://docs.opennoodle.de/.
- Website
- Documentation
- Installation
- API Documentation — interactive Swagger UI with all endpoints including fork-specific ones. Also available on your own instance at
/doc - Roadmap
- Features
| Features | Mobile | Web |
|---|---|---|
| Upload and view videos and photos | Yes | Yes |
| Auto backup when the app is opened | Yes | N/A |
| Prevent duplication of assets | Yes | Yes |
| Selective album(s) for backup | Yes | N/A |
| Download photos and videos to local device | Yes | Yes |
| Multi-user support | Yes | Yes |
| Album and Shared albums | Yes | Yes |
| Scrubbable/draggable scrollbar | Yes | Yes |
| Support raw formats | Yes | Yes |
| Metadata view (EXIF, map) | Yes | Yes |
| Search by metadata, objects, faces, and CLIP | Yes | Yes |
| Administrative functions (user management) | No | Yes |
| Background backup | Yes | N/A |
| Virtual scroll | Yes | Yes |
| OAuth support | Yes | Yes |
| API Keys | N/A | Yes |
| LivePhoto/MotionPhoto backup and playback | Yes | Yes |
| Support 360 degree image display | No | Yes |
| User-defined storage structure | Yes | Yes |
| Public Sharing | Yes | Yes |
| Archive and Favorites | Yes | Yes |
| Global Map | Yes | Yes |
| Partner Sharing | Yes | Yes |
| Facial recognition and clustering | Yes | Yes |
| Memories (x years ago, birthdays, trips) | Yes | Yes |
| Offline support | Yes | No |
| Read-only gallery | Yes | Yes |
| Stacked Photos | Yes | Yes |
| Tags | No | Yes |
| Folder View | Yes | Yes |
| Shared Spaces | Yes | Yes |
| Smart Search & Filters | No | Yes |
| Search Palette (Cmd+K) | No | Yes |
| User Groups | No | Yes |
| Auto-Classification | No | Yes |
| Video Duplicate Detection | No | Yes |
| Pet Detection | Yes | Yes |
| Google Photos Import | No | Yes |
| Image Editing & Video Trimming | No | Yes |
| S3-Compatible Storage | Yes | Yes |
Gallery inherits upstream Immich's translations through every rebase. Fork-specific strings are translated in this repo — see the translations guide if you'd like to help.
Pre-built Docker images are published to GitHub Container Registry (GHCR) under the open-noodle organization.
| Image | Description |
|---|---|
ghcr.io/open-noodle/gallery-server |
Server + web UI + CLI (all-in-one) |
ghcr.io/open-noodle/gallery-ml |
Machine learning service (CPU) |
ghcr.io/open-noodle/gallery-ml:*-cuda |
Machine learning service (NVIDIA CUDA) |
release/release-cuda— most recent published build (like upstream'sreleasetag)v5— floats to the latest v5.x.x release (setIMMICH_VERSION=v5to auto-update within major version)v5.0.0— pinned version using semantic versioning
Gallery maintainers ship releases via manually-triggered GitHub Actions workflows — the full two-phase (mobile + server) flow and the server-only fast path are documented in CONTRIBUTING.md.
Gallery is a community fork and contributions are welcome — bug fixes, features, docs, translations. Come say hi on Discord if you want to chat about an idea before diving in.
The repo is a pnpm workspace monorepo — server (NestJS), web (SvelteKit), mobile (Flutter), machine-learning (Python), and a few supporting packages. The dev stack runs in Docker Compose with live reload for the server and web.
Prerequisites: Docker, Docker Compose, Node.js 22+, and pnpm.
-
Fork and clone the repo
git clone https://github.com/<your-username>/gallery.git cd gallery
-
Copy the example env file
cp docker/example.env docker/.env
The defaults work out of the box for local development. Adjust
UPLOAD_LOCATIONandDB_DATA_LOCATIONif you want to store data somewhere other than the repo directory. -
Install dependencies
pnpm install
This installs deps for every workspace package (server, web, cli, sdk, e2e).
-
Start the dev stack
mise dev
This brings up Postgres, Redis, the ML service, the server (with hot reload), and the web UI on http://localhost:2283. The first run downloads ML models and builds containers, so give it a few minutes. Stop it with
mise dev-down.
# Server
cd server && pnpm test # unit tests
cd server && pnpm check # TypeScript type check
# Web
cd web && pnpm test # unit tests
cd web && pnpm check # svelte-check + tsc
# Translation files, from the repo root
pnpm format # prettier --check i18n/
pnpm format:fix # prettier --write i18n/CI runs lint, type checks, unit tests, and e2e tests on every PR. If you're touching server controllers or repositories, regenerate the OpenAPI clients and SQL query files:
mise open-api # regenerates TS SDK + Dart client
mise sql # regenerates SQL query docs (needs DB running)mise tasks lists everything else available.
- Branch off
mainand keep PRs focused on one change. - Follow Conventional Commits for your commit messages (
feat:,fix:,docs:,chore:, etc.) — the release workflow uses them to compute version bumps. - Include a short description of what changed and why, plus screenshots or screen recordings for UI work.
- Make sure CI is green before requesting review.
Gallery is developed with heavy assistance from AI coding tools (Claude Code and Codex), with humans leading the ideas, testing, and debugging. We say so openly because it shaped how the project was built.
What we'd rather be judged on is the result. There's a live demo you can click through without installing anything, unit and e2e suites run on every pull request, and all of it is open source — read the code and decide for yourself.
Gallery would not exist without Immich, largely written by hand, and the work of everyone who built it. We rebase onto every upstream release, so the foundation Gallery stands on keeps coming from that project.
See AGENTS.md for a deeper tour of the codebase architecture and common commands.