v2.0 - Full gallery redesign
Highlights
- New gallery design - Visual look matches Immich: justified-rows layout on desktop, edge-to-edge square grid on mobile, light/dark mode following system preference
- New lightbox - PhotoSwipe replaces lightGallery, with proper pinch-zoom, swipe-to-dismiss, and a much smaller bundle
- Handles huge galleries - virtualised rendering keeps the DOM small even for shares of 5,000+ photos (#201). Only tiles within +/- 1 viewport-height of the current scroll position exist in the DOM at any moment. Layout for all items is pre-computed up front so the scrollbar stays accurate. (example large(ish) gallery)
- Multi-select with selective download - long-press or click a tile's checkmark to enter select mode, pick photos, download just those as a zip
- Date grouping - optional month-grouped gallery view, to match Immich's date grouping (off by default)
- Blur placeholders - uses Immich's thumbhash data for a blurred preview behind every tile while the thumbnail loads (my favourite improvement)
Changed
- Replaced lightGallery with PhotoSwipe - different lightbox engine, smaller bundle, gestures and zoom work natively on touch
- Templating engine switched from EJS to Preact + JSX
- Server-rendered HTML is much smaller (around 10x reduction) - only the data flows to the client; tiles are rendered by JS via virtualisation
- Serve font locally rather than via CDN for privacy / no-tracking
Breaking changes
By default, the gallery title will now be shown, to match Immich's behaviour. In IPP 1.x the title was hidden by default. To hide the title, change showTitle to false in your config.json
Configuration migration
The previous config format will continue to work. A backward-compatibility shim at startup detects the old keys and maps them onto the new schema, then logs a single deprecation notice. You'll see something like:
[IPP] Top-level gallery keys (singleImageGallery, singleItemAutoOpen, showGalleryTitle, showGalleryDescription, groupGalleryByDate) are deprecated; please move them under ipp.gallery.*. See README.
To migrate, restructure your config.json from this:
{
"ipp": {
"singleImageGallery": false,
"singleItemAutoOpen": true,
"showGalleryTitle": false,
"showGalleryDescription": false,
"groupGalleryByDate": false
},
"lightGallery": {
"controls": true,
"download": true,
"mobileSettings": { "controls": false, "download": true }
}
}…to this:
{
"ipp": {
"gallery": {
"singleImage": false,
"singleItemAutoOpen": true,
"showTitle": false,
"showDescription": false,
"groupByDate": false
},
"lightbox": {
"showArrows": true,
"showDownload": true,
"mobileArrows": false
}
}
}The compatibility shim will keep your old config working in the meantime. The shim may be removed in a future major release.
Acknowledgments
This release brings together work from several open-source projects, used under their respective licenses:
- PhotoSwipe (https://photoswipe.com/) - MIT
- Inter (https://rsms.me/inter/) - OFL-1.1
- thumbhash (https://github.com/evanw/thumbhash) - MIT
- Material Design Icons (https://pictogrammers.com/library/mdi/) - Apache-2.0
- Preact (https://preactjs.com/) - MIT