Immich Lite is a divergent fork of Immich (pinned at v3.0.1) cut down to a single job: point it at photo/video folders that already exist on disk, mounted read-only, and browse them — timeline, albums, favorites, video playback — with multi-user email/password auth. It does not track upstream Immich releases.
There is no upload, no backup, no machine learning, and no sharing. Assets only ever enter the system by scanning external library folders you mount into the container. The app never writes to your photo library; the only volumes it writes to are the Postgres database and a generated-media volume for thumbnails/previews/transcodes.
See docs-lite/spec.md for the full design rationale and docs-lite/plan.md for the task-by-task strip log.
- Upload/backup ingest — no upload endpoints, mobile app, or mobile sync API. The external-library scanner is the only ingest path.
- Machine learning — smart search (CLIP), facial recognition/people, duplicate detection, OCR. The
immich-machine-learningcontainer is gone entirely. - Sharing — public shared links, partner sharing, same-server album collaborators (
albumUsers), and activity/comments. - Destructive & edit operations — trash/soft-delete, bulk asset delete, the photo editor, OAuth/OIDC login.
- Non-web platforms — the mobile app, Fastlane, and their CI workflows are deleted from the repo.
Kept: timeline with virtualized scroll, full-screen photo/video viewer (with ffmpeg transcoding), albums, favorites, tags, memories, global map, metadata search, stacks, multi-user admin, API keys, download/export.
-
Copy
docker/example.envtodocker/.envand set:UPLOAD_LOCATION— where Postgres data and generated thumbnails/transcodes live.PHOTOS_LOCATION— the host folder containing your existing photos/videos (mounted read-only at/photosin the container).DB_PASSWORDand the other Postgres variables.
-
Start the stack:
docker compose -f docker/docker-compose.lite.yml --project-directory docker up -d --build
-
Open
http://localhost:2283, complete admin sign-up. -
Library setup — Immich Lite never discovers photos on its own; an admin has to create a library:
- As the admin user, create an external library (
Administration -> Librariesin the web UI, orPOST /api/librarieswithownerIdandimportPaths: ["/photos"], or a subfolder of it). - Trigger a scan (UI button or
POST /api/libraries/{id}/scan). Scanning is an async background job — large libraries (the design targets ~1M photos) take a while; watch the admin jobs page. - Repeat per user if multiple users need separate libraries.
- As the admin user, create an external library (
-
bash scripts/smoke.shruns an end-to-end curl-based check (admin auth, library create + scan, timeline buckets, thumbnail, video asset) against a running stack — useful after any change to confirm the stack still serves photos correctly.scripts/seed-test-media.shgenerates a few throwaway test images/video intoPHOTOS_LOCATIONif you don't have real media handy yet.
This fork does not run Immich's original e2e/ suite in full: most of those specs seed their test fixtures by uploading assets over HTTP, and the upload endpoint no longer exists here (ingestion is library-scan only). Specs that depended on that upload seeding path were removed rather than reworked (see the Task 12 report for the exact file list).
What's actually retained and passing:
- Vitest API/CLI/maintenance specs (
e2e/src/specs/server/**) — auth, sessions, API keys, external-library scanning/offline-handling, system config/metadata, user admin, database backups. 166/176 tests pass against a real running server (the other 9 are CLI specs that fail in sandboxes where plainpnpmisn't onPATH, not a suite defect). - Playwright
uiproject (e2e/src/ui/specs) — timeline, asset viewer, and memory-viewer specs that mock the API in-browser rather than depending on real uploaded fixtures. This is real, rendered-browser coverage of exactly the flows that Task 11 could only verify at the API level: 50/67 tests pass (login/timeline render, deep-linking, scrubber scrolling, keyboard navigation in most cases, favorite toggle, album add, archive/unarchive/favorite-an-archived-photo). The remaining 13 are either resource-contention flakiness under parallel workers (asset prev/next-button navigation intermittently times out, passes when re-run serially) or reproducible failures in still-kept features — keyboard month/year/"go to time" navigation, day-range selection, and 5 of 10 "deep link to random asset" iterations consistently fail against the current stripped web build. These weren't previously verified in a real browser and are a genuine, concrete follow-up (not something this task's scope covers fixing). (Note: the dedicated/archivepage was intentionally removed along with trash/delete, perdocs-lite/spec.md— the archive/unarchive action itself is still live and is what these specs exercise directly on a thumbnail, not the removed page.) A follow-up investigation tried to determine whether these 13 are a real strip regression or an artifact of this project's mocked-networkuiPlaywright specs, by looking for equivalent coverage in the real-backendwebPlaywright project — none exists (a pre-existing gap in upstream Immich's own e2e suite, not something the strip introduced). Resolving this conclusively requires a manual click-through against the running stack athttp://localhost:2283, which no automated tool in this project's toolchain can currently perform.
scripts/smoke.sh plus manual/API verification against the running stack remains the project's primary day-to-day verification story, alongside whichever e2e subset stays green above.
Immich Lite is a fork of immich-app/immich, licensed AGPL-3.0. All credit for the original design, the timeline/scan/thumbnail pipeline, and the vast majority of the code goes to the upstream Immich project and its contributors. This fork keeps the upstream LICENSE (AGPL-3.0) and is not affiliated with or endorsed by the Immich project.