Skip to main content

💡 Feature Comparison

How LibrePhotos compares to other photo managers, feature by feature. Search for a feature, pick the categories and apps you care about, or tick ☆ next to the features you need: each app's column then shows how many of them it has, and you can hide the apps that miss one. The filters are kept in the address bar, so you can share the view you built as a link.

FeatureLibrePhotosSelf-hostedImmichSelf-hostedPhotoPrismSelf-hostedPhotoviewSelf-hostedLycheeSelf-hostedPiwigoSelf-hostedPiGallery2Self-hostedPhotofieldSelf-hostedPhotonixSelf-hostedDamselflySelf-hostedLomorageSelf-hostedPhotoStructureSelf-hostedOrchard PhotosDesktopdigiKamDesktopSynology PhotosSelf-hostedGoogle PhotosCloud service
Media formats
Photos
YesYesYesYesYesYesYesYesYesYesYesYesYesYesDesktop photo manager: browse, view and edit local photo collectionsYesYesBacks up and views photos in web and mobile apps
Videos
YesYesCustom web video player since v3.0.0YesYesYesPluginCore shows a poster and a download link; inline playback via piwigo-videojs pluginYesmp4, webm, ogv, ogg play directly; other formats need transcoding jobPartlymp4/mov play in browser via HTML5 video; no on-the-fly transcodingNoNoImage extensions only; no video decodingYesYesYesMOV, MP4, M4V, WebM play in window; other video formats need Download originalYesVideo preview with player and context menuYesMOV and MP4 play; FLV download-onlyYesVideo formats listed incl. mp4, mov, mkv, avi, 10 GB limit
RAW filesCR2, NEF, ARW, DNG and other camera RAW files are displayed
YesRAW decoded with LibRaw; shown as a preview, original stays downloadableYesCR2, NEF, ARW, DNG and RAW/RW2 listed as supportedYesRAW rendered via bundled darktable or RawTherapee converterYesVia ImageMagick/libraw; sibling JPEG used if present; PHOTOVIEW_DISABLE_RAW_PROCESSINGYesNEF/CR2/CR3/DNG/RW2/RAF/PEF etc. converted for displayPartlyCR2/NEF/DNG kept as alternate download formats; display needs a JPEG or ImageMagick-derived representativePartlyOnly DNG and ARW listed (libvips); CR2/NEF/RAF not in supported formatsPartlyCR2/DNG indexed; decoding depends on FFmpeg, docs say only basic RAWYesShows camera-embedded JPEG preview (dcraw -e / exiftool); no RAW developPartlyThumbnails for ARW/CR2/CR3/DNG/ORF/NEF; no RAF/RW2PartlyDNG/RAW accepted and backed up; RAW preview decoding not verified in codeYesYesShows the camera's embedded JPEG preview, not a RAW decode; no preview means unreadableYesLibRaw decoder bundled; NEWS 9.2 adds many new camera modelsYesARW, CR2, CR3, NEF, DNG and othersYesBacks up 'most RAW files' (camera list on help page); conversion behaviour unverified
HEIC / HEIF
YesYesYesHEIC/HEIF via libheifYesDecoded by ImageMagick built with libheif (Docker build)YesPartlyConverted to JPEG for display only with ImageMagick (ext_imagick), not GDPartlyListed, but needs libvips with HEIF; Alpine build checked, Debian build notPartlyHEIC/HEIF decoded via FFmpeg; needs FFmpeg build with HEVC (bundled in Docker)YesConverted to JPEG with heif-convert for displayYesThumbnails via ImageMagick processorYesHEIC decoded via libheif; Windows needs external HEVC decoder pathYesYesViewer shows a converted JPEG; Download original gives the fileYesHEIF/HEIC via libheif bundled dimg pluginPartlyHEIC/HEIF/HIF previews need Synology Image AssistantYesHEIC and HEIF listed as supported photo formats
Live and Motion PhotosThe motion part of Apple Live Photos and Android Motion Photos plays
YesMotion part extracted with FEATURE_PROCESS_EMBEDDED_MEDIA (default on)YesApple Live Photos paired; embedded motion photos (MotionPhoto/MicroVideo) tooYespaired image+video detected; type:live filter; Motion Photos per docs filter referenceNoNo Live/Motion Photo pairing; motion part not playedYesApple Live Photo pairing by content ID plus Google motion photos; motion plays on hover and in viewerNoPartlyApple Live Photo pairs and plays motion in lightbox only; Google/Samsung Motion Photos not supportedNoHEIC and MOV/MP4 are indexed as separate files, no motion pairing foundNoNoNo motion-photo handling found in sourceYesWeb lightbox plays Live Photos; iOS packs image+video into zipNoNo Live Photo pairing; iOS JPG and MOV import as separate assets, no motion playbackNoPartlyGoogle/Samsung Motion Photo video plays; Apple Live Photo pairs not handledPartlyMobile apps play Live/Motion photos on tap; casting and Apple TV show still only; web not verifiedYesiPhone/iPad Live Photos and Android motion photos supported
HEVC (H.265) videoPlays in the browser, directly or transcoded
YesTranscoded on demand when the browser cannot play it, then cachedYesOffline transcode plus real-time HLS transcoding (preview, web client)Yestranscoded to AVC on demand for browser playback, hardware encoders optionalPartlyHEVC in .mov/.mkv transcoded to H.264 MP4; HEVC inside .mp4 served as-isPartlyHEVC transcoded to H.264 only for Google motion-photo clips; other HEVC depends on browserNoNo transcoding in core; playback depends on browser and codecPartlyHEVC in mov/mkv/etc transcoded to H.264 MP4 by a job; direct HEVC MP4 depends on browserPartlydirect playback only, depends on browser codecs; no transcodingNoNoNo video supportYesTranscoded previews via ffmpeg; web shows download fallback when browser cannot playYesHEVC plays directly where the browser supports it, otherwise transcoded to H.264PartlyNo transcoding; HEVC plays only if the system webview decodes itYesPlays via Qt Multimedia; HEVC support depends on the platform codecs/FFmpeg backendPartlyHEVC MOV/MP4 previews need Synology Image AssistantYesiPhone HEVC videos play in the web and mobile apps
Video transcodingVideos are converted or streamed in a lighter quality for smooth playback
YesConverted to H.264 (720 lines max) when the browser cannot play it, then cached for seekingYesOffline transcode of incompatible video; real-time HLS preview is web-only and experimentalYesVideos transcoded to AVC on demand for browser playback; hardware encoders optionalYesffmpeg makes H.264 MP4 for non-web containers; web-ready files served as-isPartlyOnly Google motion-photo clips are transcoded to H.264; other videos play as uploadedNoNo transcoding in core; piwigo-videojs plugin only adds browser playbackYesVideoConvertingJob transcodes to MP4 (bitrate, resolution) on schedule or manuallyNono on-the-fly video transcoding; source files played directly in HTML5 playerNoVideos are skipped on import; no transcoding code or ffmpeg dependencyNoImage-only app; no video decoding or transcoding anywhere in the codeYesffmpeg makes browser-friendly preview copies; web falls back to a smaller copy or downloadYesNon-browser videos transcoded to H.264/H.265; HEVC kept where browser plays itNoNo transcoding; only MOV, MP4, M4V, WebM play in window, others need Download originalN/ADesktop app plays local files via Qt Multimedia; no transcoding or browser streamingPartlyImage Assistant makes lower-res HEVC copies; mobile speed/quality switch; no server transcoding documentedPartlyStorage saver resizes >1080p to 1080p at backup; streaming transcode not documented
360° panorama viewer
YesEquirectangular photo spheres open in a pannable 360 degree viewerYesPanorama and 360 photo viewer in the asset viewerYesPanorama detection and pannable 360 viewerNoNo panorama or 360 viewer in UI or APIYesEquirectangular 360 sphere viewer, detected via XMP-GPanoPluginPiwigo Panorama (pannellum); listings are stale (2020, compat to 2.10/13)NoNo panorama or 360 viewer code foundNono equirectangular or 360 viewer in UINoNo panorama or 360 viewer codeNoPanorama is only a search orientation filter; no pannable viewerNoNo panorama or 360 viewer in web UI or mobileNoNo panorama or 360 viewer in UI bundle or settingsNoPanoramas only cropped in the grid; no pannable viewerNoNo 360/equirectangular viewer; only Hugin panorama stitching pluginPartly360 photos/videos supported as special media; pannable viewer not documentedPartly360 pan confirmed officially only on Android XR headsets (Spatial tab); phone/web sphere panning unconfirmed
Browsing
TimelineAll photos in date order, grouped by day
YesYesPartlychronological search grid plus Calendar month view; no date-grouped timeline or scrub barYesTimeline page groups media by album and day (TimelineGroup type, timeline.graphql)YesPartlyDate-based calendar views (monthly/weekly) and date search, not a continuous timelinePartlyDate grouping inside a folder or search result; no global timeline viewYesTimeline layout shows photos reverse-chronologically, like Google PhotosPartlyChronological grid with no date group headersYesDate-grouped grid; flat view toggleYesMonth-grouped gallery loaded lazily via Merkle treeYesYear/month When facet; capture times shown in local timezone (v2026.9)YesNewest first, grouped by monthYesTimeline view grouped by date with histogram range selectionYesTimeline and folder viewsYesPhotos tab is a date-ordered grid of the library
Date scrubberJump through the timeline by dragging a date bar
YesYesNoNoYesNoNoYesdraggable scrollbar shows date strip while scrubbingNoNoNo date scrubber componentUnknownNoFilmstrip scrubs lightbox media only; no timeline date scrollbar foundYesYear column on the right; click or drag to jump; PgUp/PgDn keysPartlyTimeline histogram selects date ranges (linear/log); no fast-scroll scrubber foundYesWeb Timeline: hover right-edge scrollbar shows time indicator and jumps to a period (KB text via search snippet)YesAndroid: drag scroll handle jumps by year with floating date pill on scroll; web: scrollbar handle with date marks
Folder viewBrowse the library by its folder tree
YesFolders page with the scan folder tree and breadcrumbsYesPer-user folder view, opt-in under Account Settings > FeaturesYesFolders page browses the library directory treeYesAlbums mirror the folder tree; subAlbums, parentAlbum and breadcrumb pathPartlyNo folder-tree browser; server folders become albums on sync; import dialog browses foldersPartlyAlbum tree mirrors synced folder tree; no separate folder-browse viewYesDirectory tree is the primary browsing modelPartlyHome lists collections; expand_subdirs makes each subfolder a flat collection; no folder treeNoNo folder tree browse; libraries and source paths only in settingsYesFolder tree in sidebar with include-subfolders optionPartlyYear/Month/Day and Albums folders only via WebDAV port 8004; no folder browser in apps or web UIYesFolder is a faceted browse dimensionPartlySubfolder dropdown in Filters, a flat list; no folder treeYesFolder-based album tree in the sidebar is the primary browse viewYesFolder view browses the library by folder structure; thumbnail size adjustablePartlyAndroid lists backed-up device folders under Collections > On this device; no web folder tree
Map view
YesMapLibre GL map of photo locationsYesYesPlaces world map with clustering; satellite/3D styles need EssentialsYesPlaces page maps GPS photos (Mapbox GL); needs a free MAPBOX_TOKEN env var to enableYesMap with provider choice, album maps and GPX tracksNoGPS coordinates stored but no map UI; plugin search found noneYesOpenStreetMap, Mapbox or custom tile URL; GPX tracksYesMap layout with clustering; tiles from OpenStreetMapYesLeaflet map with clustered photo markersPartlyOpenStreetMap panel in sidebar shows only the single selected photo's GPS marker, not a library mapYesMobile photo map screen (react-native-maps)PartlyOnly external map-app links from info panel; embedded map not shippedPartly2-D similarity layout (UMAP), not a geographic map; GPS is not plottedYesMarble-based map view with OSM data, shows GPS-tagged itemsPartlyMap view in mobile app Places album onlyYesInteractive map of geotagged photos in the Search tab
Albums by placePhotos grouped by city or country automatically
YesPartlyPlaces page groups by city only; no country grouping and not real albumsPartlyautomatic albums per state/region only, no city-level place albumsNoPlaces is a map of GPS points only; no city/country grouping or reverse geocoding found in api/ or ui/NoLocation text search and map exist; no automatic place albumsNoNoNoplace names shown in Timeline/Flex only; no place-based albumsPartlyLocation tags (country > city) filterable via facet; no per-place album pagesNoNo place-based albumsPartlyPlace album endpoints exist, but locationsunburst/locationtimeline return fixed sample dataPartlyBrowse Where tree (country > city) rather than place albumsNoNoNo automatic place albums; only map-area saved searchesYesPlaces albums auto-created from geolocationYesPlaces section in Search groups photos by location
MemoriesOn this day, flashbacks
YesMemories page and strip, generated automaticallyYesOn this day memories pageNoNo on-this-day or flashback feature; Moments and Calendar are not memory feedsNoNo on-this-day or memories featureYesOn This Day smart album (enable_on_this_day, default on); no separate memories/flashback feature foundNoNo on-this-day view; SmartAlbums date rules only approximate itNoNo on-this-day or memories feature; searched src and docs for memor, this day, years ago, flashbackNono on-this-day or memories featureNoOnly holiday event tags exist; no on-this-day featureNoNo on-this-day or memories feature; repo search finds noneYesOn This Day tile on mobile home screen; no memories page on webNoNo on-this-day or memories feature foundNoNo on-this-day or memories viewNoNo on-this-day or memories featurePartlyNo in-app On This Day. Mobile home-screen Throwbacks widget (v2.2) shuffles past-year photos; no notificationYesMemories with hide faces, show less, blocked options and music/zoom
Slideshow
YesLightbox slideshow (3 to 30 s), public ?slideshow=1 link, and memory slideshowYesSlideshow in web and mobile viewersYesPlay/pause slideshow with Ctrl+S in the fullscreen viewerNoViewer has manual arrow navigation only; no autoplayYesSlideshow setting, plus digital photo frame modeYesYesLightbox slideshow with speed and loop settingsNono slideshow modePlannedListed as a planned idea on photonix.org; no slideshow route or codeNoNo slideshow mode in the web clientNoNo slideshow mode in web UI or mobileNoNo slideshow mode found; filmstrip scrubs onlyNoNo slideshow modeYesFullscreen slideshow and presentation mode, both as built-in dpluginsYesSlideshow on mobile and TV apps (speed adjustable on TV); web slideshow not documentedYesAnimation creation makes a slideshow of selected photos; album slideshow on web/Android from 2016 sources, iOS unclear
Statistics pageCounts, storage, cameras
YesTimeline, place tree, word clouds, social graph, face clusters; no camera or lens breakdownPartlyAdmin stats: photo/video counts, usage and quota per user; no camera or lens breakdownNoNo statistics page; only Prometheus metrics and CLI face cluster statsNoOnly site info and scan progress; no library stats pagePaidStatistics and insights pages are Supporter EditionYesAdmin intro shows counts and disk usage; admin stats charts from historyYesAdmin gallery statistic page from /admin/statisticNono statistics page; Prometheus metrics endpoint onlyNoNo statistics page or stats queryYesStats page: counts, pending jobs, tag and person totals; no storage or camera breakdownNoNo statistics page; /api/stats/ returns hard-coded 1s; only free-space figure existsPartlySync page shows import counts only; no storage/camera stats pagePartlyInfo panel shows counts, unreadable, duplicates; no camera or storage statsPartlyDatabase Statistics dialog: counts by image/video/audio, albums, tags, backend; no camera or storage statsNoNo library statistics page documentedNoNo library statistics page found; Manage storage shows account usage only
Organizing
Albums
YesYesYesYesYesYesYesAlbums are saved searches (logical albums)Partlycollections (albums) are defined in configuration.yaml, not created in the UIYesNoNo album model or UIYesPartlyAlbums come from metadata Album tags; in-app album creation not released, membership editor plannedNoYesFolder-based albums plus tag, label, date and saved-search treesYesCustom albums, photos can join several albumsYesUser albums with sharing and collaboration options
Smart albumsAlbums defined by a rule or saved search that update themselves
PartlyBuilt-in auto albums (places, things, events, hashtags) only; no user-defined rule or saved-search albumsPartlyOnly workflow templates labelled SmartAlbum that tag new assets on trigger; no true rule-based album; roadmap says plannedPartlyBuilt-in filter albums (Moments, Calendar, Regions, Folders) auto-update; users cannot make rule-based albums, user albums are manualNoAlbums come only from folders; no saved rulesYesTag and person albums auto-update by rule (AND/OR); plus built-in smart albums (recent, unrated, etc.)PluginSmartAlbums (mistic100): tag/date/name rules, refreshed every 3 days; last rev 14.a (2023)YesLogical albums are saved searches that re-evaluate on viewNocollections are folder/dir based in configuration.yaml; no rule-based albumsNoAlbums are manual tags (type A); no saved search or rule modelNoNo saved searches or rule-based albums; search is query-onlyPartlyAuto date, place and face albums generated; no user-defined rule or saved-search albumsPartlyTag albums auto-generated from folders/dates; no user-defined saved-search albumsNoNo albums; filters and searches are not savedYesSaved searches (search albums) re-run live; map-area searches also updateYesConditional albums auto-add matching photos (person, object, location, camera lens)NoNo user-defined rule-based albums; only automatic Memories and Collections
Automatic event albumsTrips and events grouped for you
YesEvent albums and Memories generated automaticallyPartlyAuto Memories (on this day); event albums only via workflow templatesYesMoments and monthly albums generated automaticallyNoAlbums come from folder structure onlyPartlySmart albums (Recent, On This Day, Highlighted, Untagged...); no event/memory detectionNoNoAlbums are user-created; no generated event or memory albums foundPartlyevents split by time and location via API/MCP; not shown as albums in UIPartlyOnly holiday event tags (Christmas, Halloween, Valentine's, New Year); no auto albums or memoriesNoNo auto event or memory albums; date groups onlyPartlyOn This Day cards and date albums; no generated event albums foundPartlyDate and folder/tag albums generated automatically; no memories or event albumsNoPartlyAuto Dates tree (year/month/day) only; no event or memory albumsYesAutomatic albums from faces, objects, geolocation, tagsYesMemories surface automatic on-this-day and event collections
Favorites
YesFavorites page and favorite toggle per photoYesYesFavorite flag with a favorite filterYesPer-user favorites with favorites-only filter on albums and timelineYesPer-photo highlight flag (free)YesNoOnly faces (persons) can be starred as favourite; photos cannot be favoritedPartlyheart toggles fav tag; needs alpha tags enabled; filter with tag:favNoNo favorite flag, field or UINoOnly keyword favourites (sidebar shortcuts); individual photos cannot be favouritedYesFavorite toggle via /assets/favorite; mobile syncs a Favorites albumYesLiked heart toggle; liked:true search; maps to XMP ratingNoNo favorite markingPartlyNo favorite flag; NL search maps 'favorite' to Accepted pick or 5 starsPartlyFavorites filter; mobile 2.4 beta adds Favorites album; web favorites only in 1.9 betaYesStar marks a favorite; Favorites collection and search
Star ratings
Yes1 to 5 stars per photo; rating style is a per-user settingYes1-5 star rating in detail panel; API also accepts -1 (reject)NoOnly a read-only quality score in the info panel; no user star ratingsNoNo rating field in schema or database modelsYes1-5 star rating, rating search token and star albumsYesStars 0-5 (rate_items)PartlyRatings read from metadata and filterable/sortable; cannot be set in the appNono star rating code or fieldsYesStar ratings 0-5 per photo, editable in the UIYes1-5 star rating written to EXIF rating and filterable by minimum ratingNoNo 1-5 star ratings; asset detail maps only favorite to rating 1PartlyReads XMP rating for reject threshold; no in-app 1-5 star editorNoNo star ratingsYesStar ratings 0 to 5 with overlay and keyboard shortcutsYesStar ratings editable and usable as a filterNoNo 1-5 star rating found in Google Photos help
Color labels or pick flags
NoNo colour label or pick/reject field on photosPartly1-5 star ratings in web UI; reject (-1) accepted by API but no UI control; no colour labelsNoNo color labels or pick/reject flags; color is only a search filterNoNo color label or pick/reject fieldNoNo colour label or pick/reject field on photosNoNoNo color label or pick/reject support foundNono color labels or pick/reject flagsNoColor tags are classifier-detected palette colors, not user labels or flagsNoNo colour labels or pick/reject flags in codeNoNo color labels or pick/reject flagsNoNo color label or pick/reject flag UI or settingsNoNo color labels or pick/reject flagsYesPick flags plus color labels with customizable namesNoColor labels were dropped in the move from Photo Station; not in PhotosNoNo colour labels or pick/reject flags found
Your own tagsAdd keywords to photos by hand
YesOwn tags added by hand, bulk tagging, rename and mergeYesManual tags on assetsYesLabels added, renamed and deleted by hand; they act as keywordsNoNo user tags or keywords in schemaYesManual tags with tag search and tag albumsYesNoKeywords come only from file metadata; no in-app tag editingPartlymanual tags, alpha: enable in config; stored only in cache DB, lost if DB is deletedYesUser generic tags can be added and removed by handYesHand-added keywords with autocomplete and recents, written into files via ExifToolPartlyLabel API exists (/assets/label) but no tag editor in web UI or mobileYesKeyword edits made from the UI, written to original or sidecarNoNo user-added tags or keywordsYesFree-form tags added by hand, with recent-tag historyYesTags editable and filterable; Tags albumNoOnly people/pet labels; no user-added keyword tags found
Hierarchical keywordsNested keywords such as Places/Europe/Paris
PartlyTags are flat; a hierarchical keyword on import keeps only its last levelYesNested tags with parent pathsNoLabels are flat; only fixed built-in categories, no user-nested keywordsNoNo keyword or tag hierarchyNoTags are flat; only albums nestNoFlat tags table with no parent columnNoKeywords are flat strings; no hierarchical keyword handlingNoflat tags only; name is a plain stringPartlyOnly auto location tags nest (country > city); user tags are flatNoTags are flat keyword strings; no nestingNoLabels are flat names; no parent or nested keyword supportYesPath separators, reparenting, tag rename toolsNoNo keyword hierarchyYesNested tag tree in the sidebarNoFlat tags only; no nested keywords documentedNoNo nested keywords or hierarchy found
Archive or hideTake photos out of the timeline without deleting them
YesArchive and Hidden pages keep photos off the main timelineYesArchive hides assets from the timelineYesArchived photos leave all sections until restoredNoNo archive or hide state; media only appears via foldersPartlyNo archive; per-photo public-hidden flag and albums hidden via visibility policyNoPrivacy levels hide per viewer; no archive state separate from deleteNoNo archive or hide-from-timeline featureNono archive or hide-from-timeline featureNoPhotoTag.hidden field exists but no mutation or UI uses itNoNo per-photo archive or hide; .nomedia only skips whole foldersPartlyHide works through /assets/hide API and timeline filter; no hide action in web or mobile UIYesArchived and hidden states, filterable by searchNoNo archive or hide; only files removed from disk leave the indexNoNo archive or hide state for photos; only trash and tagsPartlyHide faces in People and subject categories in Subjects; no archive viewYesArchive hides photos from the main view; restore from Archive
TrashDeleted items can be restored
YesDeleted photos go to Trash; optional automatic empty after N daysYesTrash with configurable retention (trashDays)PartlyNo trash: archive holds items, permanent delete removes originals with no restoreNoNo media deletion, so no trashNoDelete is permanent; no trash or soft deleteNoDelete is permanent; no trash or restoreNoOnly .Trash folders are excluded from indexing; no in-app trashNono photo deletion and no trashPartlyDelete sets a flag; no trash view and no restorePartlyDeleted files move to DamselflyTrashcan folder; no in-app restore, recovery is a manual file movePartlyDeleted files go to an on-disk lomodTrash folder; no restore UI or APIYesSoft deletes to OS trash, restorable; optional Empty TrashNoNo delete or trash; originals are never modifiedYesDelete moves to trash with restore; permanent delete also offeredPartlyNo Photos trash; deletes go to DSM recycle bin, restored via File Station #recycleYesDeleted items kept 30 days before permanent deletion
Delete in the app
YesMoved to trash; optional automatic empty after N daysYesTrash with configurable retention (trashDays)Yesarchive first, then permanent delete; no separate trash binNoNo media deletion; only share links and users can be deletedYesPermanent delete; no trash/soft-deleteYesPermanent delete; no trashNoNoonly tags can be removed; no photo deletion or trashPartlySoft delete flag from UI; no trash view or restore; files on disk untouchedYesMoves files to DamselflyTrashcan folder inside the libraryYesDeleted files are moved to a trash directory on disk; no in-app restore foundYesDelete, Empty Trash (optional), Remove asset; trashed:true searchNoNo delete route; originals are never modifiedYesDelete to trash with restore, or permanent deleteYesDeletes go to DSM recycle bin, not a Photos trashYesDeleted items stay in Trash for 30 days
Duplicate detection
YesExact file hash and perceptual hash duplicate groupsYesDuplicate review utility using ML similarityPartlyExact SHA1 duplicates skipped at import only; no browse/delete UI, no near-duplicatesNoDuplicate check only inside face merge/move, not a finderPartlyExact checksum duplicates only; no near-duplicate detection; album/title constraints are SEYesAdmin batch manager prefilter: duplicates by checksum, date, dimensions or filenamePartlyAdmin list of same name and size duplicates; not perceptualPartlydedup:0.x search filter hides near-duplicate successive photos (AI); no review or deletePartlyExact duplicates skipped at import only; no finder for existing libraryPartlyPer-photo 'visually similar' lookup only; no batch duplicate finder (README: in progress)YesMobile groups near-duplicates by pHash (Hamming <= 6); phone-side only, no server duplicate finderYesGroups duplicates, edits and resized copies via perceptual hashesYesIdentical files shown once; near-duplicates stacked into one tileYesDuplicate finder plus fuzzy near-duplicate search via fingerprintsPartlySimilar items grouped and stacked; Moments-era For You duplicate review, not confirmed in PhotosPartlyStacks group similar shots; no dedicated duplicate finder
StacksBursts, RAW+JPEG pairs and edited versions shown as one
YesBurst stacks (filename, time and EXIF rules), manual stacks; RAW+JPEG and file variants grouped under one photoYesStacks group related assetsYesStacks group RAW+JPEG pairs, bursts and edited versionsPartlyRAW+JPEG sibling used for display only; no user-visible stackNoNo user-facing stacks or burst grouping; only internal photo/video partner pairingPartlyAlternate formats (e.g. RAW) attach to one photo; no burst or stack UINoNo grouping of bursts, RAW+JPEG or edited versionsNono stacking of bursts, RAW+JPEG or versionsPartlyRAW+JPEG files grouped under one photo with a preferred file; no burst or edit stacksNoNo grouping of bursts, RAW+JPEG or edited versionsPartlyBurst and near-duplicate groups in mobile review only; no stack data modelPartlyAuto-groups JPG/RAW/HEIC variants and edits into one asset; no manual stacksYesBursts, edits and resized copies share one tile with a member switcherYesGroups for RAW+JPEG, versions and timelapse/burst sequences by filenamePartlySimilar-item stacks in Timeline/albums; GIF/WebP excluded; RAW+JPEG or edit stacks not documentedYesStack similar photos toggle in More; top pick shown; similar shots only
Cleanup suggestionsSuggests blurry, bad or redundant photos to remove
PartlyDuplicates, bursts and screenshot/document flags only; no blur or quality scoringPartlyDuplicate review and large-files utility; no blur or quality detectionPartlyreview queue flags low-quality photos; duplicates skipped by SHA1 but not suggestedNoPartlyExact checksum duplicate finder; no blur/quality detectionNoOnly md5 duplicate check at upload; no cleanup suggestionsPartlyAdmin list of same name and size duplicates; no blur detection, no deletePartlydedup:0.x search filter hides similar successive photos; no delete or archiveNoDuplicates skipped only at import; no cleanup or blur suggestionsPlannedDuplicate detection listed as in progressPartlyMobile duplicate groups by pHash (Hamming <= 6) and Free Up Space; no server-side scoringPartlyGroups duplicates and resized copies; no blur or quality detectionPartlyGroups near-duplicates into one tile; no delete suggestions or blur flagsYesDuplicate finder plus quality sorter (blur, noise, exposure, compression, aesthetics)PartlySimilar photos stacked; no bad-photo or duplicate deletionPartlyUtilities flags blurry photos and screenshots; duplicates need manual review
Locked folderPrivate photos behind an extra PIN or password
NoHidden photos have no PIN; album lock only freezes which photos an album holdsYesPIN-protected Locked Folder; hidden from normal viewsNoPrivate flag hides photos from viewers; no PIN or password locked folderNoNo locked or private folder featurePartlyAlbum passwords and hidden albums; no PIN-locked private vaultNoPrivate albums are permission-based, no PIN; old Protected Albums ext (2016) is staleNoPer-user allow/block directory lists exist but no PIN or password lockNono locked or private folderNoNo locked or private folder featureNoNo locked folders or extra PIN; access is login-level onlyNoNo locked or PIN-protected folder; 'encrypt' metadata category is defined but unusedNoNo locked or private folder or PIN featureNoNo locked or private folderNoNo locked or password-protected albums or foldersNoOnly Personal and Shared Space; DSM encrypted folder is a separate DSM featureYesLocked Folder on Android and iOS; iOS uses Face ID/Touch ID or passcode, no separate PIN
Faces and AI
Face recognitionFaces are found and can be named
YesInsightFace detection; FEATURE_FACE_DETECTION default onYesYesbuilt-in YuNet detection and SFace embeddingsYesdlib-based (go-face); on by default; labels assignable to face groupsPartlyNeeds separate Lychee-Facial-Recognition microservice, V8 flag, off by default; not SE-gatedPluginCommunity facial-plugin (CompreFace, needs external server); core has only manual people tagging, no detectionPartlyShows and names faces from XMP/MWG region metadata; no face detectionPartlyAlpha detection via photofield-ai plugin (RetinaFace + 512-d embeddings); no naming or people assignmentYesDetects and names faces (MTCNN + FaceNet); needs face classifier enabled per libraryYesLocal FaceONNX models; no cloud APIPartlyOn-device ML Kit face detection and face albums in mobile; server /api/persons returns hard-coded sample dataNoNo face detection; only reads names from existing face-region metadata written by other appsNoYesYuNet face detection + SFace recognition via OpenCV DNN; people tagsPartlyFace and object recognition only on certain NAS models; list in KBYesFace groups; name them, merge groups, and label people
Face clusteringUnknown faces are grouped into people automatically
YesHDBSCAN clustering ported to numpy; FEATURE_FACE_CLUSTER default onYesUnassigned faces clustered automatically; threshold settings in admin ML configYessimilar unknown faces grouped automatically; CLI cluster optimizationYesNew faces matched to existing groups or start a new group; unlabeled re-runPartlyClustering (DBSCAN) runs in the sidecar; admin re-runs it; same separate-service requirementNoNoNono person concept or clustering; search by face ID onlyYesAuto-groups unmatched faces: new auto-named tag created when no tag within threshold (online, greedy)PartlyUnmatched faces become new 'Unknown' persons; grouping and merge are manualPartlyAutomatic face clustering on mobile only (Settings toggle); server clusterfaces is sample dataNoNoNoUnknown faces are not auto-grouped; users tag one by one, bulk-grouping requests still openPartlyAutomatic People grouping; same NAS model limitsYesSimilar faces grouped automatically into face groups
Draw faces by handAdd a missed face region and assign it
YesDrag a box in the People sidebar, then label it; the face model refines the boxYesDraw a face box in the asset viewer and create or assign a personYesFace markers drawn and assigned by hand in the viewer and info sidebarNoFaces only come from detection; can move or detach them, not drawNoAssigns AI-detected faces to people only; no hand-drawn face regionsYesAdmin face identify draws a crop box and assigns it to a personNoFaces only from XMP/MWG regions; UI says tag faces in another appNoface regions are read-only (GET only); no manual draw or assignNoCan rename, verify or block detected faces; cannot draw a new face regionPartlyCan name detected faces and merge people; cannot draw face regions by handNoNo way to draw a face region or assign it by handNoNo face region drawing; people read from metadata onlyNoNo face detection or manual face regionsYesAdd a face by click-and-drag in preview, then assign a nameYesManual face tagging; not for GIF, WebP or 360 photosPartlyLabel a face on one photo via Info > People; no drawn face regions
Pet recognitionTells individual pets apart
NoFace recognition is for people only; no individual pet recognitionNoOnly face, CLIP and OCR models; no pet recognitionNoNo pet recognition; only generic ImageNet dog breed labelsNoFace model is human dlib recognition onlyNoFace service handles people only; no pet recognitionNoNo pet recognition in core; Piwigo AI covers tags and descriptions onlyNoNo ML recognition of animalsNophotofield-ai provides CLIP embeddings and faces only; no pet recognitionNoOnly generic object labels; no individual pet recognitionNoGeneric YOLO11n object labels only; no individual pet recognitionNoOnly CLIP text queries such as 'cat' and 'dog'; no individual pet recognitionNoNo pet recognitionNoNo pet recognition; search is by visual similarity onlyNoYOLOv11 gives generic object labels only; no individual pet recognitionNoNo pet recognition documented; only general object/subject recognitionYesPets grouped and labelled like people; can be turned off separately
Object tagsAutomatic labels such as dog, car, beach
YesAuto tags from OpenCLIP zero-shot labels; no bounding-box object detectorNoTags are manual or imported from XMP/IPTC; no automatic keywordsPartlyImageNet-1k image labels only, no bounding boxesNoNoTags are manual onlyPluginAuto tags via Piwigo AI plugin (beta)NoNotags are manual; no automatic keyword generationYesSSD MobileNet v2 (OID v4), about 545 labels with bounding boxesYesYOLO11n object detection with bounding boxesPartlyObject/scene labels from client classifier become tags; no server-side detectorPartlyKeywords from metadata and folder paths only; no AI taggingNoYesYOLOv11 object detection proposes tags in the auto-tags scanPartlySubjects album; object recognition on certain models onlyYesThings category in search; labels are not user-editable tags
Scene classificationIndoor, mountain, beach, ...
YesScenes such as beach, mountain come from OpenCLIP labels (Things), not a separate classifierNoOnly CLIP search, face and OCR models; no scene labelsPartlyindoor/outdoor/landscape/architecture labels from ImageNet classifier, no dedicated scene modelNoNoNoNoNono scene classification labels; text-based semantic search onlyNoStyle labels are aesthetic (Sunny, Noir, Vintage); no scene classes like beach or mountainNoImageClassification model and ClassifyImage defined but never calledPartlyClient-side classifier labels mapped to scene categories (~1000 ImageNet-style rules); mobile onlyNoNoNoimage_classification model is downloaded but no feature consumes itPartlySubjects albums from object/theme recognition, NAS-model gated; no named scene classes documentedPartlyContent search (e.g. 'beach') via text; no published scene class list
Image attributesColors, man-made, sunny, ...
PartlyWeather and light words only (sunny, rainy, foggy); no colour or man-made attributesNoNo colour or attribute classifier foundPartlycolor names, mono, chroma filters; no sunny/man-made style attributesNoPartlyColour palette search only; no sunny/man-made attributesNoNoPartlyprominent color extracted for placeholders; not searchableYesAesthetic style tags plus dominant color tagsPartlyDominant and average colour stored; not shown in UI or searchUnknownNoNoNoNo color, sunny or man-made attribute tagging foundNoNo color/attribute labels documentedPartlyFree-text search recognizes scenes/things (e.g. sunsets); no color, sunny or man-made attribute filters found
Media categoriesScreenshots, documents, selfies, ...
YesScreenshot and document flags, plus a selfie label in the Things listNoNo screenshot/document/selfie classifier; screenshots only by filename workflowPartlydocument and info labels plus review queue; no selfie or screenshot classNoNoNSFW classification exists; no screenshot/document/selfie categoriesNoNoNono screenshot/document/selfie categories foundNoNo screenshot, document or selfie category classifier foundNoNo screenshot, document or selfie categoriesUnknownNoNoNoNo screenshot, document or selfie category detection foundNoAuto albums are People, Subjects, Places, Tags, Videos, Recently Added; no screenshot/document/selfie categoriesPartlyScreenshots, selfies and videos groupings confirmed; documents not confirmed
AI captionsNatural-language descriptions of photos
YesOn-device AI captions (LFM2.5-VL, ONNX); uses recognised people and placeNoNo AI caption model; descriptions are user-enteredYesAI captions via your own Ollama or OpenAI engine in vision.yml; no built-in caption model; not paywalledNoNo AI caption or description generationNoNo AI captions; descriptions are entered by handPluginPiwigo AI (beta): description generation, cloud-hosted by PigolabsNoCaptions only read from IPTC metadata; no AI generationNophotofield-ai does not generate captions; only CLIP embeddings and face detectionNoNo caption model or dependencyNoNo AI captions; classification model defined but never calledNoNo caption generator; wordcloud captions are hard-coded sample dataPartlyCaption metadata read and edited; no AI-generated captionsNoSearch ranks by vector; no generated captionsNoNo AI caption generation; captions are only searchable via NL searchNoNo AI caption or description generation documentedPartlyAsk Photos answers questions about a photo; no per-photo caption generation found
Text recognition (OCR)Text in photos becomes searchable
YesText in photos is recognised and becomes searchableYesOCR text is searchable and selectable in the viewerNoNo OCR engine in internal/ai; text reading only via Ollama vision promptsNoNo text recognitionNoNo text recognition codePluginPiwigo AI (beta) text recognition, cloud-hosted (PaddleOCR)NoNo text recognitionNono OCR in app or photofield-aiNoNo OCR engine or dependencyNoNo text recognition in codeYesOn-device ML Kit text recognition with OCR overlay and text search on mobileNoNo text recognition featureNoNo text recognitionPluginOCR Text Converter plugin; needs external Tesseract binaryNoNo text recognition or text search documented on official pagesYesSearch finds text inside photos; quoted phrases give exact text matches
Machine learning runs locallyNo photo leaves your hardware for analysis
YesAll ML models run on your server; place names can optionally use an online geocoderYesModels run on your own serverYesDefault ONNX models run locally; Ollama or OpenAI captions/labels are optional and can be cloudYesdlib face models run on the server; no cloud ML callsYesArcFace/DeepFace sidecar is self-hosted; no cloud AI API calls found in app/configNoNo ML in core; Piwigo AI sends images to Pigolabs servers (OVH France)NoNo machine learning code at all; face names come from metadataPluginphotofield-ai is self-hosted (uv or Docker); models run on own hardware, no cloud calls seenYesTensorFlow classifiers run in the app container; models downloaded once from photonix.orgYesFaceONNX and YOLO11n run offline on the server. Site still says Azure Face (stale), code is local-onlyYesMobile runs CLIP ONNX, ML Kit and face models on device; server only stores synced embeddingsNoNo ML models; only perceptual hashing, which is not MLYesSigLIP 2 runs on the computer; works offline after model downloadYesOpenCV DNN (YuNet, SFace, YOLO) and local Qwen2.5 LLM run on your machineYesFace and object recognition run on the NAS; no cloud processing documentedNoFace, object and search ML run on Google's hosted service
GPU accelerationFor machine learning or video transcoding
YesML only, via WebGPU/Vulkan (Intel, AMD, NVIDIA on Linux); video transcoding is CPU onlyYesCUDA, ROCm, OpenVINO, ARM NN, RKNN for ML; NVENC, QSV, VAAPI, RKMPP for transcodingYesNVIDIA GPU for ONNX; Intel QSV, VAAPI, NVENC, VideoToolbox encoders for videoPartlyGPU only for video encode (qsv/vaapi/nvenc); face ML is CPU; qsv only verified on IntelNoNo GPU device config in compose; no hwaccel/NVENC code in app or configNoNoNo GPU code and no ffmpeg hwaccel args; sharp/libvips and ffmpeg run on CPUPluginphotofield-ai uses GPU/CUDA with PHOTOFIELD_AI_RUNTIME=all; official Docker image is CPU-onlyNoCPU TensorFlow only; no CUDA or GPU configuration in requirements or DockerNoCUDA explicitly disabled in object detector; FaceONNX GPU code commented outNoNo hardware video acceleration flags in lomod ffmpeg; no GPU delegate in mobile MLYesFFmpeg hwaccel for video transcodes (NVENC, CUDA, D3D11VA, DXVA2); not used for MLYesCore ML on Apple Silicon, DirectML on Windows x64, CUDA on Linux opt-inYesOpenCL path for OpenCV DNN with GPU compatibility test; no video transcoding GPUUnknownPhotos spec silent on GPU; GPU acceleration only documented for Surveillance Station and Deep SearchN/AHosted service; no user hardware acceleration
Search
Metadata
EXIF info panel
YesInfo panel with camera, lens, exposure and other EXIF detailsYesDetail panel and mobile technical details show EXIFYesInfo sidebar and edit dialog show camera, lens, exposure and moreYesRead-only EXIF in sidebar: camera, lens, exposure, ISO, GPSYesPhoto details panel shows camera, lens, exposure and dateYesMetadata panel shows configured EXIF fields (show_exif_fields)YesLightbox info panel shows EXIF detailsNodetails panel shows date, time, zone, filename, size, location; no camera, lens or exposureYesInfo sidebar shows camera, lens and exposure detailsYesProperties panel shows camera, lens, exposure and other metadataPartlyCamera make is stored and searchable, but no EXIF info panel; detail payload has GPS and time onlyYesInfo panel for asset metadataNoViewer shows name, date, folder, size, type; no camera, lens or exposure panelYesItem properties panel with EXIF, IPTC, XMP, camera and lens detailsPartlyCamera, lens and other metadata filters; EXIF info panel not confirmed on official pagesPartlyInfo panel shows details and IPTC fields; camera, lens and exposure not confirmed in help
Reverse geocodingGPS coordinates turned into place names
Yesgeopy-based lookup, FEATURE_REVERSE_GEOCODING default onYesOffline GeoNames data loaded into PostgresYesOpenStreetMap-based; lookups go through PhotoPrism services (disable with DISABLE_PLACES)NoNo GPS-to-place-name lookup; map clusters onlyYesNominatim-based geodecoding, optional via location_decodingNoGPS parsed from EXIF; no place-name lookupNoPlace names only from embedded IPTC city/country; geocoding only for searchYesoffline geoBoundaries database embedded, ~50k places; Timeline and FlexYesOffline lookup using GeoNames cities1000 and world bordersNoGPS kept as lat/long only; no place-name lookupYesDevice reverse geocoding, country/state normalized server-sideYesOffline, using ExifTool's bundled geo database; no internet neededNoYesNominatim (OpenStreetMap) reverse-geocoding runner; needs internetPartlyGeolocation quick filter and Places albums; method not documentedYesGeotagged photos are searchable and shown by place name
Edit metadataDate, description, location, ...
YesDate, location, caption, category, rotation and rating edits in the UIYesDate/time, description, rating, GPS locationYestitle, caption, date, location, labels and people edited in UINoEXIF shown read-only in sidebar; no mutation edits metadataPartlyTitle, description, tags, dates, license, 360 flag; no GPS/location editing in UIYesName, description, author, date, tags, privacy level via UI and batch managerNoOnly person names are editable in the UINoonly tags are editable; date, description and location are notPartlyTags, ratings, face names and rotation are editable; date, GPS and description are notPartlyCaption, description, copyright, rating, rotation; no date or location editPartlyAPI to add/update metadata and capture time; limited UI in appsPartlyRotate, captions, keywords in UI; Who-tag editing is PLUS and not releasedNoYesEdit EXIF, IPTC and XMP fields, captions, tags, ratings, labels and GPSYesDates, times, descriptions, tags, ratings editablePartlyLocation editing confirmed; date/description editing not verified
Set location by hand
YesSet a photo's location by clicking the map or pasting coordinatesYesSet GPS by map point picker and geolocation utilityYesLocation field plus map picker in the edit dialogNoMap is read-only; no mutation sets GPSNoMap is view-only; GPS coordinates are not editable in the photo formPluginNo map UI in core; OpenStreetMap plugin lets you set coordinates on a mapNoMap is read-only; GPS cannot be set in the appNono location editing, no map picker for GPSNoGPS is read-only; no mutation sets latitude or longitudeNoMap is display-only; no GPS edit field or map pickerPartlyGeo metadata editable through API (/assets/metadata, places PUT); no map editor in appsNoLocations are read-only; no map or manual GPS editing in appNoNo GPS editing or map pickerYesGeolocation editor with map to set or fix GPS coordinates by handNoOnly dates, times, descriptions, tags and ratings editable; no map location editingYesSet or fix a location on a map
Write metadata backEdits saved into the file or an XMP sidecar
YesWrites to the file or an XMP sidecar, per setting; library-wide write jobYesXMP sidecar write job; external library write-back if mount is writablePartlyonly image orientation written to originals; other edits are not written backNoexiftool writes only to generated preview files, never originalsYesOptional: exiftool writes title/description/tags/rating to originalsNoMetadata is read into the DB; no write back to files or XMPNoNoread-only, originals never modified, no XMP writingNoexiftool is read-only; tags, ratings and rotation are stored in the databaseYesExifTool queue writes keywords, caption, rating, rotation into the filesNoexiftool only strips GPS or sets orientation; edits are not written to originalsYesWrites to originals or XMP/MIE/EXIF sidecarsNoYesWrites to embedded metadata or XMP sidecars (sidecar mode configurable)PartlyTags to XMP for JPG/PNG/DNG; descriptions EXIF only; sidecars unclearNoNo XMP or original-file write-back found; Takeout exports JSON sidecars
Reads XMP sidecars
YesReads XMP sidecars and embedded XMP keywords, ratings, datesYesYesreads XMP sidecar files while indexingPartlyHashes .xmp sidecar and re-encodes cache on change; XMP contents not parsedYesReads file.ext.xmp sidecars (via exiftool)NoPartlyReads XMP sidecars and embedded XMP; never writesPartlyreads embedded XMP date tags via ExifTool; no sidecar handling foundNoXMP sidecars skipped on importYesReads keywords from XMP and ON1 sidecars (keywords only)NoYesNoYesReads and writes XMP sidecarsPartlyReads/writes XMP-dc:Subject tags for JPG/PNG/DNG (community-reported)NoNo XMP sidecar reading found; Takeout uses JSON sidecars
Face regions in metadataReads or writes MWG / Microsoft face regions
YesReads and writes MWG XMP:RegionInfo face regionsPartlyReads MWG face regions on extraction when enabled; does not write themPartlyreads XMP face regions only (PHOTOPRISM_XMP_FACES); no write-backNoFaces stored in database only, no MWG/MP region read or writeNoWrites EXIF/IPTC/XMP keywords only; no MWG/MP regionsNoPartlyReads MWG face regions only; no write backNoNoNoMWG region writing exists only under Debugger.IsAttachedNoPartlyReads MWG face regions and Google Takeout people; does not write face regionsNoYesReads and writes MWG face regions in image metadataNoFace tags not written to files; forum says they stay in Synology DBNoFace data stored internally, not written to MWG/MP regions
GPX geotaggingGeotag photos from GPS track files
NoGPX track files are not imported; only GPS already stored in the photo files is readNoNo GPX track import foundNoNo GPX import or parsing anywhere in internal/ or pkg/NoNo GPX import or geotaggingYesGPX tracks imported and drawn on album mapsPluginOpenStreetMap plugin supports GPX files; core only lists gpx as an upload MIME typeYesGPX tracks shown on the map with activity iconsNono GPX track importNoNo GPX parsing or geotagging codeNoNo GPX parsing or track-based geotaggingNoNo GPX parser or track geotaggingNoNo GPX track import foundNoNo GPX geotaggingYesGPX track correlator in the geolocation editor matches photo timesNoNo GPX import documentedNoNo GPX track import found
Editing
Crop and rotate
YesRotation stored in the library since 1.6.0; crop and straighten from 1.7.0 in the editorYesWeb and mobile crop, rotate 90/180/270 and mirror; web since v2.5.0, mobile since v3.0.0PartlyRotate only for JPG/PNG, written to originals; no crop toolNoNo in-app editing; originals are served as-isPartlyRotate only; no cropNoNo crop/rotate UI; only auto-rotate on upload. Crop Image ext stops at Piwigo 13NoNo editing tools in the appNono editing; originals are never modifiedPartlyRotation only; no cropPartlyRotation saves EXIF orientation; crop is a client-side preview and is not savedNoNo in-app crop or rotate; roadmap lists basic editing as futurePartlyRotate only; no cropNoNo crop or rotate editorYesCrop, rotate, free rotation, perspective and ratio crop in the editorPartlyRotate via More menu in photo view; no crop documentedYesCrop, straighten, rotate, perspective, aspect ratio presets
Adjustments and filters
YesLight, colour, sharpness and filters in the photo editor, from 1.7.0NoEditor has only crop/rotate/mirror; no exposure, colour, brightness or filter tools; recolor removed on mobileNoNo exposure, color or filter adjustments in the appNoNo exposure, color or filter adjustmentsNoNo exposure, colour or filter adjustmentsNoNoNo exposure, color or filter editsNono exposure, color or filter editsNoNo exposure, color or filter adjustmentsPartlyMono and lighten are preview-only in the viewer; nothing is savedNoNo exposure, color or filter adjustmentsNoNo exposure, color or filter adjustmentsNoNo exposure, colour or filter adjustmentsYesCurves, levels, HSL, white balance, filters and enhancement toolsNoFilters are search/browse filters only; no brightness, color or exposure edits documentedYesBrightness, contrast, saturation, warmth, HDR and filters
Non-destructive editsOriginal stays untouched, edits can be reverted
YesEditor keeps original untouched and stores edits separately, from 1.7.0YesEdits stored as a list in asset_edit rows; original file untouched; removeAssetEdits reverts to originalNoRotation rewrites originals; no edit stack or revertNoNo edit stack; nothing to revertNoRotate rewrites the stored original; no edit history or revertNoNoNo edit feature, so no non-destructive editsNoapp has no edits at all; originals read-onlyYesOnly rotation exists; stored in DB, original file untouched, revertiblePlannedREADME lists simple non-destructive editing as in progress; no edit model in codeNoNo edit pipeline or versions; originals are not editedPartlySidecar edits possible, but overwriteOriginal defaults to trueNoNo edits at all; originals are never modifiedYesVersioning is on by default: edits saved as versions, original kept and revertibleUnknownDate/tag/rating edits stored in Photos DB, not written to video files; rotate save behavior unclearPartlyDefault Save overwrites original; Revert restores it; Save as copy keeps original
Trim videos
NoNo video trimming in the app; the editor covers photos onlyNoEditor is images only (video edits rejected by server); no trim control in web or mobile viewersNoNo video trim or cut tool in the appNoNo video editingNoNo video editingNoNoNo video trimmingNono video editingNoVideos are not importedNoNo video supportNoNo video trimming in apps or web UINoNo video trimmingNoNo video trimmingNoNo video trim tool; only video slideshow exportNoOnly metadata edits for videos; trimming requires an external editorPartlyVideo edits in app; some video edit features limited to Android with low-RAM limits
AI editingObject removal, generative or one-tap enhance
PartlyOnly histogram-based Auto light (from 1.7.0); no generative removal or sky replacementNoNo generative or AI edit actionsNoNo generative or AI edits such as object removal or sky replacementNoNo generative or AI editsNoNo generative or AI editsNoNoNo generative or AI editsNono generative or AI editsNoNo generative or AI edit featuresNoNo generative or AI editsNoNo generative or AI edits; face crop helper is not a photo editNoNo generative or AI editsNoNo generative or AI editsPartlyRule-based auto-correction and auto-crop only; no generative or object-removal editsNoNo generative or AI edits documentedPartlyMagic Eraser, AI Enhance and Remix; availability varies by region and device
Sharing
Share with other usersOf the same server
YesAlbums shared with users; whole libraries shared via library shareYesAlbum editors/viewers and one-way partner sharingPartlyguests gain read-only access by opening album or secret links; no direct user-share dialogNoSharing is by link only, no user-to-user sharesYesPartlyAdmins grant album access to users or groups; users cannot share on their ownNoSharing is link-based onlyNono user-to-user sharingPartlyWhole-library sharing via invite; members have equal rights, no read-only role in codePartlyOnly global Shared Baskets; no per-user photo or album sharingYesShare assets to users or groups; web Inbox shows received itemsNoNoNoNo user-to-user sharingYesAlbums shared with users with permissions; Shared Space for selected usersYesAlbums shared with Google Account users; partner sharing
Expiring links
PartlyAlbum links can expire; single-photo share links have no expiryYesExpiry date and optional password on shared linksYessecret links take an expiry dateYesOptional expiry on album and media links; can be changed laterPartlyOnly temporary signed image URLs expire; album shares do notNoYesShares store an expires timestampNoNoInvitations expire; photo share links do not existNoNo share links existNoAn expiry time is stored but not enforcedNoNoNoNo share links, so no expiryYesLink password and expiration dateNoHelp page shows no expiry; links stay active until link sharing is reset
Password-protected links
NoAlbum, photo and public links have expiry and slugs, but no password optionYesShared links can require a passwordPlannedDocs say password protection for share links is planned, not shippedYesAlbum and media share links can be password protected (bcrypt)YesAlbum share links can be unlocked with a passwordPluginUser Collections plugin: collection share links with password and expiry; not in core (repo is 17.0.0beta1)YesSharing links can require a passwordNono share links at allNoNo shared links at allNoNo share links, so no password protectionNoShares go to users or groups by account; no password-protected linksNoNo shared links at allN/ANo shared links; single-user local appNoNo share links; exports are static files or uploads to web servicesYesShare links protected by access password and optional expiry dateNoShared album links have no password option in help
Public gallery page
YesPublic profile at /public/<username>NoOnly per-link share pages; no public profile or gallery per userNoNoNoLanding page is instance-wide, not per-userNoNoNoNoNoNo public gallery or profile pagesNoNoNoNoNo public profile or gallery page; HTML gallery export is static filesPartlyPublic folder links for portfolios; no per-user public profileNoNo public profile or gallery page per user found
Partner sharingShare your whole library with a partner automatically
YesWhole library shared read-only; new photos appear as added; optional timeline per shareYesOne-way automatic library sharing with a partnerNoNo automatic library sharing; direct user-to-user share is only a future itemNoNo automatic sharing with another accountNoSharing is per album or user; no automatic whole-library partner shareNoNoNo automatic library sharing with another accountNono user accounts, so no partner sharingPartlyLibrary invite adds a member with equal rights; not automatic and no read-only roleNoNo account-to-account library sharing; only global shared basketsNoOnly per-asset sends to users or groups; no automatic library sharingNoNo partner sharingN/ASingle-user app; no accounts or sharingN/ASingle desktop app with no accounts or server; no partner sharingPartlyShared Space is a folder-based library for selected users; no automatic whole-library partner shareYesPartner sharing of one partner's photos by person or date
Collaborative albumsOthers can add photos to a shared album
YesAlbum members as viewer or contributor; contributors add their own photosYesAlbum editor role can add photosNoGuests get read-only access to shared albums; members cannot add photosNoOnly the owner manages albums; other users cannot add photosPaidSharing with users is free; letting them upload into shared albums is Supporter EditionNoOnly admins can upload (ACCESS_ADMINISTRATOR); normal users cannot add photosNoShares are read-only links; other users cannot add photosNono shared albums or user contributionsYesAny library member can add photos to a library album; libraries are sharedPartlyShared baskets are global and any user can add to them; no albumsNoAlbums are owner-managed; others cannot add photos to a shared albumNoNo shared or collaborative albumsN/ASingle-user app; no albums or accountsN/ANo multi-user or server model; no shared albumsYesShared albums with per-user permissions; Shared Space for collaborationYesCollaborate option lets others add photos; owner can turn off
Download originals
YesSingle originals or a zip of the selectionYesSingle originals, zip archives, edited or original versionYessingle originals, exports, and ZIP downloadsYesOriginal or resized versions per media; album as zipYesSingle originals and zip archives; RAW gated by raw_download_enabledYesOriginal and alternate formats, one file at a time; no zip downloadYesZip download of folders and searches; single photo download in lightboxPartlyoriginals open via /files/{id}/original URL; no zip or bulk downloadYesSingle original file via unguessable UUID URL; no zipYesSingle image or zip via basket and exportYesDownload originals; zip for multiple assetsYesDownload ZIP of selected assetsYesOne original at a time, as a file save; no zipN/ADesktop app: files are already local; use Export tools to copy outYesDownload with optional JPEG conversion (EXIF dropped); zip not statedYesDownload originals from web; bulk export via Takeout
Users and security
Multiple users
YesYesPartlyCommunity has admin, guest and visitor roles only; user/viewer roles and web user admin need Essentials/PlusYesYesYesYesNono user accounts or authenticationYesYesAdmin, User, ReadOnly roles; opt-in via Enable AuthenticationYesNoNo visitor accounts; settings say per-user levels are not yet implementedNoSingle-user desktop app; server binds 127.0.0.1NoSingle-user desktop app with no in-app accounts (use separate OS accounts)YesPersonal Space per user plus Shared SpaceYesEach person signs in with their own Google Account
Roles and permissionsBeyond admin and user
YesPer-album viewer and contributor roles on top of admin and userPartlyGlobal admin/user only; album editor/viewer roles; no custom rolesPartlyCommunity has admin, guest, visitor; user and viewer roles need Essentials or PlusNoOnly an admin boolean; per-user root paths but no role modelPartlyFixed per-user flags (admin, upload, own settings) plus per-album grants; no custom rolesYesStatuses webmaster, admin, normal, generic, guest, plus per-album group permissionsYesFive roles: LimitedGuest, Guest, User, Admin, DeveloperNono users or rolesPartlyInstance admin (is_staff), library owner and member; no viewer or per-album rightsYesAdmin, User and ReadOnly (viewer) roles; no per-album rightsNoAdmin flag plus internal bot and cast flags only; no viewer or per-album rightsNoOnly admin and user; per-user levels not implementedN/ASingle-user app; no accountsN/ANo users or roles; single local userPartlyAdmin can restrict sharing for non-admins; per-user folder rights in Shared SpaceNoNo roles beyond owner, collaborator and viewer on albums
LDAP login
PartlyNot direct; LDAP users come in through an OIDC broker (Keycloak, Authelia)NoLogin via password, OAuth/OIDC and passkeys onlyPaidLDAP/AD login is Pro only; Community code has only the provider typeNoLocal accounts only; no LDAP/OIDC codePaidLDAP login requires Supporter EditionPluginLDAP Login extension; its listed compatibility stops at Piwigo 14NoNoNoNoIdentity-based login onlyNoNoNoNoNo LDAP loginPartlyDSM supports LDAP/domain users; Photos needs per-user app privilege and home folder; older reports of limited accessNoGoogle Account sign-in only
Single sign-on (OIDC)
YesOpenID Connect single sign-on via allauthYesOAuth/OIDC with auto-launch; Authelia, Authentik, Keycloak, Google documentedYesOpenID Connect SSO in Community; group-to-role mapping is Pro onlyNoLocal accounts only; no OIDC or OAuthYes13 OAuth/OIDC provider types, not gated by SE in routesPluginOpenID Connect ext (jasperweyne), last rev 2021; forum says repo is unmaintainedYesOpenID Connect login with auto-create and allowed-domain optionsNono authentication; use a reverse proxy for access controlNoNo OIDC, OAuth or SAML codeNoASP.NET Identity login only; no external OIDC or OAuth providerNoPassword and JWT login only; no OIDC or OAuth provider supportNoNo OIDC, OAuth or SSON/ASingle-user app; no login systemN/ADesktop app with no login server; web service plugins use their own OAuthNoUses DSM accounts; no OIDC/SSO for Photos documentedNoGoogle Account sign-in only; not an OIDC provider for other apps
Two-factor authentication
NoNo TOTP, passkey or other 2FA code in apps/backend or apps/frontendPartlyPasskey sign-in with user verification only; no TOTP and no second factor on password loginYesTOTP two-factor with recovery codesNoPassword login only; no TOTP or passkeysPartlyPasskeys (WebAuthn) only; no TOTP second factorPluginOfficial Two Factor Authentication (2FA) ext: TOTP, email codes, recovery codesNoNo TOTP or passkey supportNono authentication at allNoNo TOTP or passkey codeNoNo TOTP or passkey code in the identity pagesNoNo TOTP or passkey login flowNoNo 2FA, TOTP or passkeysN/ASingle-user app; no accountsN/ANo in-app accounts to protect with 2FAPartlyInherits DSM account 2FA; no Photos-specific 2FA settingYesGoogle Account 2-Step Verification and passkeys
Storage quotas
NoNo per-user storage quotaYesPer-user quotaSizeInBytesPaidPer-user quota (UsersQuota) is Pro only; Community has instance-wide FILES_QUOTANoNo storage quotasPaidPer-user storage/upload quotas are Supporter EditionNoNoNo per-user storage quotasN/Asingle-instance server without user accountsNoNo per-user storage quotaNoNo per-user storage quotasNoOnly free-space display; no per-user storage quotaNoNo per-user storage quotasN/ASingle-user app; no accountsN/ANo server-side storage; collections are local foldersPartlyDSM per-user quotas only; no Photos-level storage quotaPartlyEach account has 15 GB shared quota; no admin-set per-user Photos quota
API keysPersonal tokens for scripts
NoOnly username/password JWT tokens (5 minute access token); no personal API keysYesPersonal API keys for usersYesApp passwords and client credentials for scripts and toolsNoOnly session tokens from login; no user-managed API keysYesOne personal API token per user; no scopes or multiple keysYesNoOnly session login; internal /pgapi has no personal tokensNoREST and MCP endpoints have no token or key authNoOnly JWT login tokens; no personal API keysNoOnly a session JWT issued at login; no personal tokensPartlyUsername and password exchange for JWT via /api/auth/token; no user-managed key listNoOnly PS_PREVIEW_API_TOKEN for file browser previews; no personal API keysN/ASingle-user app; localhost API has no keysN/ANo HTTP API server, so no API keysNoNo official API or token system; only unofficial community API notesNoOAuth clients via Google Cloud only; no personal API keys
Apps
Web app
YesYesYesYesYesYesYesYesYesYesBlazor WebAssembly front endYesBuilt-in web UI served by lomod: gallery, inbox, upload, local import, usersYesYesSame page in a native window or in the browser with --browserNoDesktop Qt/C++ application onlyYesYesWeb app at photos.google.com
Installable web app (PWA)
PartlyManifest and icons for Add to Home Screen; no service worker or offline cacheYesInstallable web app manifest, display standaloneYesYesStandalone manifest; service worker registered in production buildsNoNoPartlyWeb app manifest (standalone); no service worker foundPartlyweb app manifest only, no service worker or offline modePartlyWeb app manifest only; no service workerYesWeb manifest plus registered service workerNoYesInstallable; service worker is minimal (no offline cache)NoNoDesktop app, not a web appUnknownNo official PWA or add-to-home-screen guidance found; only native iOS/Android/TV apps documentedPartlyHelp refers to a 'Photos Web App' that can run for backup; no official install steps; manifest not verifiable
iOS app
PlannedExpo app in apps/mobile; never published to App Store or TestFlightYesNono official app; third-party Stream app onlyNoOfficial site says iOS app no longer maintained or on the App StorePlannedLychee-Mobile pre-release, TestFlight only; no public store listingYesOfficial Piwigo Mobile app listed on piwigo.orgNoNoNoThe App Store and Play Store listings linked from photonix.org return 404NoNo iOS appYesLomoMobile on App Store; $1.99 one-time purchase per lomorage.comNoNoNoNo official iOS app; no companion found on digikam.orgYesiOS 17+ required from mobile 2.4YesOfficial Google Photos iOS app
Android app
PlannedExpo app unpublished; old RN app unmaintained; UhuruPhotos (third party) in Play betaYesNono official app; third-party Gallery for PhotoPrism onlyNoPlannedLychee-Mobile pre-release, Play internal testing onlyYesOfficial Piwigo Mobile app listed on piwigo.orgNoNoNoThe App Store and Play Store listings linked from photonix.org return 404NoNo Android appYesLomoMobile on Google Play; $1.99 one-time purchase per lomorage.comNoNoNoNo official Android app; only third-party DigikamCompanion reads the databaseYesAndroid 11+ required from mobile 2.4YesOfficial Google Photos Android app
Camera-roll backupAutomatic upload from a phone
PlannedCamera-roll backup is in apps/mobile source only; UhuruPhotos does it today (third party)YesPlugincamera-roll backup via third-party PhotoSync or FolderSync over WebDAVNoNoPartlyiOS camera-roll auto-upload reported working; Android results mixed in forum reportsNoNoPlannedCamera-roll auto upload planned, not available per photonix.orgNoNo mobile appYesAutomatic background backup, resumable uploads, Live Photo packingNoNoNoNo mobile app, so no camera-roll backupYesAutomatic backup, focused backup, customizable destinationsYesAutomatic backup of device photos and videos
Desktop app
NoWeb app plus unpublished Expo mobile app; the Windows build is a server, not a desktop clientNoNo desktop client; native/ is a Rust core for the mobile app onlyNoPWA install only; no native desktop appNoWeb app and server only; no desktop clientNoWeb app only; Lychee-Mobile is pre-release; no desktop clientNoNo official desktop app; WebCatalog wrapper is third-partyNoWeb app only; PWA manifest is partial and not a desktop appNosingle binary runs a local server; UI opens in browser, no native GUI appNoOnly the web UI and mobile thin clients; no desktop clientYesElectron client for Windows, macOS and Linux that opens your serverPartlyMac and Windows installers run lomod as a desktop service; UI is the browser web UI, no native clientYesNative desktop app for Windows, macOS and Linux with tray, since v2026.4YesThe product itself: native window (pywebview) or browser modeYesThe product itself is a native desktop app (Windows, macOS, Linux)PartlySynology Image Assistant helper for HEIC/HEVC previews only; no full desktop clientNoWeb app only at photos.google.com; no Photos desktop app found
Cast to TVChromecast, AirPlay or a TV app
NoNo Chromecast, AirPlay or TV appPartlyExperimental Google Cast from web only; no AirPlay; needs HTTPS and public DNSPluginGallery for PhotoPrism (third-party) runs on Android TV; web has only an experimental video Remote Playback cast buttonNoNo cast or TV supportNoFrame mode is a browser page for a display; no cast supportPluginCommunity Chromecast plugin only; no official TV or cast appNoNo cast SDK; Photo Frame link works in a kiosk browser onlyNono cast or TV appPlannedListed as a planned idea on photonix.org; no casting codeNoNo casting or TV appPartlyChromecast cast via server API only; no cast button in apps or web UI; no AirPlay or TV appNoNo Chromecast, AirPlay or TV appNoNo cast or TV appPluginDLNA/UPnP server via Media Server plugin; no Chromecast or AirPlayYesApple TV and Android TV apps; AirPlay and Chromecast castingYesCast to Chromecast; Google TV ambient screensaver shows photos
Dark mode
YesYesLight, dark and system theme optionsYesYesSetting: same as system, light, or darkYesPluginNot in default theme; Bootstrap Darkroom and modus themes offer dark coloursYesLight, dark and auto modesYeslight, dark and auto color modesYesDark-only UI; no light theme or toggleYesGreen (black) and grey themes are darkNoYesAuto, light, or dark themeYesA header button toggles light and darkPartlyFollows system Qt/KDE palette; Breeze Dark icon theme option; no dedicated dark paletteYesLight and dark, can follow browserYesFollows the system dark theme on Android and iOS
Translated interface
Yes33 languagesYes89 languagesYes45 languagesYes18 languagesYes23 languagesYes72 languagesYes16 languagesNoEnglish onlyNoEnglish onlyNoEnglish onlyPartly2 languagesWeb UI in English and Chinese; mobile app in EnglishNoEnglish onlyNoEnglish onlyYes62 languagesYesabout 21 languagesLanguage count from the App Store listingYes
Library and storage
Indexes folders in placeNever moves or renames your originals
PartlyIndexes in place; moves files only when the owner asks (Move to folder)PartlyExternal libraries are indexed in place and never renamed; force delete or trash expiry can unlink the original unless mounted :roPartlyindexing never moves originals; Import copies or moves files into originals with a path templateYesScans in place; originals only read; albums mirror foldersPartlyCopies originals by default; symlink import option keeps originals in placeYesSynchronize indexes local folders in place (path stored); writes pwg_representative/pwg_format subfoldersYesDirectory-first; originals are never modifiedYesindexes directories in place; originals never modifiedPartlyImport-only paths index in place; Store paths import into app storage (copy or move)PartlyIndexed in place, but UI can move originals and trashcan moves filesPartlyLink import mode leaves originals in place; default phone uploads use Lomorage YYYY/MM/DD layoutPartlyIndexes in place; UI edits may overwrite originals (overwriteOriginal default true)YesIndexes folders in place; cache lives in app data folderYesIndexes files in place; moves or renames only on explicit user actionYesAlbums label files without copying; folder viewsNoBacked-up originals are stored in the Google Account, not indexed in place
Copies files into its own storage
PartlyIndexes in place by default; uploads are written into the server's uploads folderYesUploads and CLI imports are copied into UPLOAD_LOCATIONPartlyImport copies into originals folder; default is indexing in placeNoCache holds derived JPEG/MP4 only, originals stay in placeYesDefault copies originals into own storageYesWeb uploads move originals into the galleries/ treeNoNoindexes in place; only small thumbnails stored in its SQLite cacheYesStore-type library paths import into app storage under PHOTO_OUTPUT_DIRSNoIndexes in place; copies only on explicit export or downloadYesCopy import mode recommended in web UI for USB/SD; phone uploads stored by serverPaidCopy into library is PLUS-only; default is indexing in placeNoStores thumbnails and vectors, not copies of originalsNoIndexes files in place; does not keep its own copy of originalsNoUploads stored in user home or /photo Shared Space folderYesUploads are copied into the Google Account storage
Works with a read-only library
PartlyRead-only mount works, but uploads, deletes and metadata writeback are disabledYesRead-only mounts supported; deletes and write-backs are blocked on themYesRead-only Mode global optionYesExample compose mounts the photo library read-onlyPartlySymlink import keeps originals read-only, but derivatives still writtenPartlySync does not rewrite originals, but video posters and extra formats write beside themYesPhoto folder is never modifiedYesdocumented to run from a read-only mountPartlyScanning only reads originals, but import moves files into library; no documented read-only mount supportPartly--readonly disables indexing and thumbnails; needs a prior indexPartlyLink import does not modify originals; base dir must be writable; not testedPartlyCatalogs in place without copying, but writes .uuid files to volume roots and edits to originals; no read-only modeYesServer only reads photos; cache in app data folder. Read-only mount not testedPartlyRead-only files are handled (XMP sidecar-only writes); no read-only catalog mode foundPartlyNo true read-only tier; Custom permission users in Shared Space, with timeline/search limited to Full AccessN/AHosted service
Extra folders next to uploads
YesExtra library folders added by an admin are scanned in place next to the upload folderYesIndex external read-only or writable folders alongside uploadsPartlyOne originals folder; other folders must be mounted into it or imported (copied)YesEvery library is an external folder (root path); there is no separate upload storePartlySymlink import keeps originals in place; default import copies into own storageYesSynchronize indexes extra server folders in place alongside uploadsNoSingle Images folder root; no extra library rootsYesindexes folders in place; originals never copied or changedYesImport-in-place paths index folders the app does not ownYesAny folder mounted under /pictures is indexed in place; there is no separate upload storePartlyLink import symlinks files from outside folders once; no watched external libraryYesIndexes folders in place; copy into library is PLUS-onlyPartlyOne folder open at a time; Apple Photos read-only on Mac onlyYesSeveral collection roots, any folder can be indexed in placePartlyIndexes folders under Photos/ and /photo only; no arbitrary external library documentedNoNo index of external folders alongside the library
Upload in the web app
YesYesYesNoYesYesChunked browser upload (plupload); also FTP and server-folder importYesDrag-and-drop; off by default; minimum role AdminNofiles are read from disk; no upload endpointNoPhotos come from folders, watch or CLI; web UI only uploads avatarsNoNo upload endpoint; photos are indexed from the /pictures folderYesBrowser upload page (drag and drop) plus mobile backupNoImport is from folders/drives; no web upload control foundNoPhotos are added by putting files in the folder; only an image search upload existsN/ADesktop app: import from folders and cameras instead of web uploadYesDrag-and-drop, max 5,000 files per upload; Photo Request linksYesUpload through photos.google.com and mobile apps
Picks up new files automaticallyFile watcher or scheduled scan
YesScheduled scans and a directory watcher pick up new filesYesLibrary scan schedule plus experimental file watcherYesScheduled rescans, plus auto-index after WebDAV uploads with a safety delayYesPeriodic scan with admin-set interval; setPeriodicScanIntervalPartlyNo file watcher; lychee:sync must be run by cron; weekly scheduler only sends notificationsNoSync is run manually from admin; no file watcher or built-in schedulePartlyFolders re-checked on browse (cache timeout) plus scheduled Indexing job; no file watcherPartlyfile watcher on expanded folders picks up new subfolders; new photos still need a RescanYesPer-path inotify watcher plus periodic rescan commandYesFile watcher picks up changes automatically; README says new files within 30 minutesNoLibrary scans only run when started (POST /assets/scan or local import); mount monitor covers drives, not new filesYesScheduled sync via syncCron plus filesystem watchingYesRescans the folder every minute; --no-watch turns it offYesWatches collection folders and rescans changed ones while running; no scheduleYesNew files in Photos folders are indexed automatically; schedule not documentedYesAutomatic backup of new device photos and videos
Google Takeout import
YesGoogle Takeout import keeps dates, locations and descriptions from the JSON filesPluginVia community tool immich-go, not built inYesGoogle Takeout JSON metadata import keeps dates and locationsNoNo Google Takeout importNoNo Google Takeout importNoNo Takeout reader; forum advice is to unzip and run SynchronizeNoNo Google Takeout importNono Google Takeout importNoNo Google Takeout or JSON sidecar importNoNo Google Takeout importNoNo Google Takeout import or JSON metadata readerYesReads Google Takeout JSON for people and albumsNoNo Google Takeout importNoNo Google Takeout import; Takeout JSON sidecars are not parsedPartlyCopy Takeout files into Photos folder; JSON sidecars skipped so dates and GPS are not keptNoTakeout is export-only; no Takeout archive import found
S3 object storage
NoNo S3 or object-storage backend; storage is local paths (Nextcloud via WebDAV client)NoNoNoLocal filesystem onlyYesS3 storage via use-s3 feature flag and AWS env varsNoStorage is local filesystem; sync is local foldersNoNoNobackend_type 'S3' choice exists but no S3 code and no boto dependencyNoNo S3 or object storage clientNoNoNoNoLocal filesystem collections only; no S3 backend foundNoStorage is NAS DSM folders onlyNoNo S3 or object storage backend
Background jobs page
YesJobs page with job history, progress and worker logsYesAdmin jobs page with pause, retry and concurrency controlsPartlyLibrary page shows a progress bar with ETA for indexing only; no job listPartlyScan progress notifications and worker count only; no job listYesAdmin jobs page lists running and pending jobsNoMaintenance runs in-request; no job queue or jobs pageYesAdmin scheduled-jobs page shows job progressYestask list in toolbar; /tasks API lists and stops tasksPartlyNotifications panel shows task progress and pause; no jobs admin pageYesAdmin task list with pause and resume of background workPartlyLocal import page shows progress for its own scan only; no admin page for background jobsYesSync page shows activity, progress and timingsYesActivity line under search bar and Info show scan and model progressYesBatch Queue Manager and Maintenance window show job progressPartlyNo job dashboard; thumbnail progress in DSM taskbar pop-up and a 'photos to be discovered' countNoNo admin jobs page; hosted service
Integrations
Documented API
YesDocumented REST API with Swagger at /api/swagger; JWT and Basic authYesDocumented REST API with OpenAPI specYesDocumented REST API with swagger specNoGraphQL only; no documented REST APIYesREST API v2 and v3 with generated OpenAPI docsYesJSON/REST web service at ws.phpPartlyInternal /pgapi used by the UI; undocumented, no tokens for third partiesYesdocumented OpenAPI 3.0 API; mostly read-only, writes limited to tags and tasksPartlyGraphQL only, undocumented; GraphiQL only when DEBUG is onPartlyInternal JSON controllers used by the UI; Swagger only in debugger builds; undocumentedPartlyBroad HTTP API exists, but no published API docs and several endpoints return sample dataNoInternal /api routes serve the web UI; no documented third-party APIPartlyLocalhost JSON API exists but is undocumented and not for third partiesNoNo HTTP API; only a DBus adaptor for database change notificationsNoNo official documented HTTP API for third-party clientsPartlyLibrary API documented; broad read scopes removed 31 Mar 2025; Picker API for selection
Command-line tool
YesManagement commands: scan, createuser, save_metadata, backup_database and morePartlyImmich CLI only uploads and checks versions; admin tasks use server container commandsYesphotoprism CLI for index, import, users, backup and maintenanceNoOnly the server binary; scans and admin run via GraphQLYesartisan lychee:sync with dry-run, symlink and delete optionsPartlytools/piwigo_upload.pl and remote_sync.pl use the web API; no admin CLIPartlyOnly --run-diagnostics and config flags; no import or maintenance commandsYesflags: -scan, -vacuum, -bench, -dummy, -gen-photos, -versionYesManagement commands for import, rescan, users, libraries and housekeepingPartlyOnly server launch flags (library, config, port, readonly); no import or admin commandsYeslomoc command for import, check, migrate, user and home-dir maintenanceYessync, list, info, doctor, fix, logtail commandsPartlyOpens a folder and sets flags only; no import or admin commandsPartlyCLI only for database directory, config and camera download; no import or maintenanceNoNo official command-line tool documentedNoNo official command-line tool found
WebDAV
NoWebDAV is only a client for Nextcloud; LibrePhotos does not serve WebDAVNoNo WebDAV server codeYesBuilt-in WebDAV server for originals, optional per userNoNo WebDAV serverNoNo WebDAV routes or dependencyNoNoNo WebDAV serverNono WebDAV serverNoNo WebDAV serverNoNo WebDAV serverYesBuilt-in WebDAV on port 8004 with user authenticationNoNo WebDAV serverNoNo WebDAV serverNoNo WebDAV server; FTP/SFTP is a transfer plugin onlyPartlyWebDAV Server package exposes Photos folders as files; not the Photos libraryNoNo WebDAV access
DLNA / UPnP
NoNoNoNoNoNoNoNoNoNoNo DLNA or UPnP serverNoNoNoPluginMedia Server tool plugin provides UPnP/DLNA serverPluginDLNA is the official Media Server package, which can serve Photos shared folders; Photos itself has noneNoCasts to Chromecast and smart displays; no DLNA server
Plugins
NoNo plugin or extension loaderYesWASM plugin system with SDK and official immich-plugin-core shipped as Workflows in v3.0.0; external plugins behind flagNoNo plugin or extension system; customisation via vision.yml and config onlyNoNo plugin or extension systemNoNo plugin API; only custom CSS/JS injection and webhooksYesExtension system with piwigo.org/ext catalogueYesServer-side extension system with minimal UI hooksNono plugin system; AI runs as separate photofield-ai serviceNoNo plugin or extension systemNoNo plugin or extension APINoNo plugin or extension systemNoNo plugin or extension systemNoNo plugin systemPartlyBuilt-in dplugins with enable/disable; loader scans plugin dir but no documented extension API or storeNoNo plugin system; only separate third-party DSM packages such as Today in YearsNoNo plugin or extension system
Deployment and project
Photos stay on your hardware
YesPhotos stay on your own disks; only an optional online geocoder receives coordinatesYesSelf-hosted; AGPL-3.0 and no cloud dependency for core featuresYesSelf-hosted; originals and index stay on the server you runYesPhotos stay on the server's filesystem; no external storageYesSelf-hosted; local disk by default, optional S3 storageYesYesSelf-hosted; photos stay on your diskYesruns entirely on your own hardware; photos read from your disksYesPhotos and database live on hardware you run (Docker volumes)YesPhotos stay on the server's own disks; indexes in placeYesPhotos stored on user-owned disks and NAS mountsYesRuns locally; photos stay on user hardwareYesPhotos stay on the user's own computerYesPhotos and database stay on local disk you controlYesPhotos stored in DSM home or /photo folders on your own NASNoPhotos stored in Google's cloud
Docker image
YesOfficial Docker image; Docker Compose and Unraid templatesYesOfficial Docker Compose imagesYesOfficial Docker images with compose examplesYesOfficial image on Docker Hub; multi-arch build in CIYesOfficial ghcr.io image plus compose filesYesOfficial piwigo/piwigo image on Docker Hub; docs have a Docker install guideYesDocker is the recommended install method (Alpine and Debian images)Yesofficial image ghcr.io/smilyorg/photofield; compose file includedYesOfficial image photonixapp/photonix on Docker Hub; compose example providedYesOfficial webreaper/damselfly image on Docker Hub (amd64 only)YesOfficial images lomorage/amd64-lomorage and raspberrypi-lomorage via lomo-dockerYesOfficial Docker image; not for Windows Docker Desktop hostsNoNo Dockerfile or compose fileNoNo official Docker image or compose fileN/ASynology NAS package (DSM), not a containerN/AHosted service
ARM64Raspberry Pi, Apple Silicon
YesARM64 images built in CI; install docs list ARM64 as supported but slowerYesamd64 and arm64 officially supportedYesARM64 compose file and Raspberry Pi imageYesCI builds linux/arm64 Docker images via buildxYesMulti-platform image built natively for linux/amd64 and linux/arm64YesPHP app; linuxserver image is multi-arch with arm64 (community image)YesDocker images for amd64 and arm64v8; 32-bit ARM no longer builtYeslinux/arm64 binaries and multi-arch Docker builds via buildxYesCI builds linux/amd64 and linux/arm64; Dockerfile compiles for non-amd64NoDocker Hub has amd64 images only; makedocker.sh builds amd64, no arm64 releaseYesRaspberry Pi and ARM64 install guides; ARM cross-builds in repoPartlyShips linux-arm64 and mac-arm64 tool binaries; no ARM server statement foundYesApple Silicon Mac app; Windows zip is x64 onlyPartlyOfficial arm64 build for macOS Apple Silicon only; Linux and Windows builds are x86-64PartlyARM Synology models possible; face and object recognition limited to listed modelsN/AHosted service
Runs natively on WindowsWithout Docker or WSL
YesWindows standalone build runs without Docker or WSL, with self-updateNoWindows only via Docker Desktop or WSL 2NoWindows only through Docker Desktop or WSL; no native Windows installNoSupported platforms list Linux and Docker only; no Windows build targetPartlyNo Windows guide; manual install needs PHP, a web server and a databasePartlyRuns on PHP+MySQL under IIS or XAMPP (community guides, dated); no official Windows installerPartlyNative Node.js install possible but unsupported; no Windows install docsYeswindows/amd64 and windows/arm64 single-binary builds, no WSL or Docker neededNoDocker-based deployment only; no native Windows install pathPartlyWindows server binaries not produced every release; author says non-Docker unsupportedYesWindows installer runs lomod natively without Docker or WSLYesDesktop app and PhotoStructure for Node.js run on Windows without DockerYesWindows zip with embedded Python; no WSL or Docker neededYesOfficial Windows installer and portable build, no WSL or DockerN/ANAS package; Image Assistant is only a helper appN/AHosted service; used via browser
Older CPUsWorks without AVX
NoNeeds a CPU with AVX; on Proxmox set the VM CPU type to hostNoamd64 ML needs x86-64-v2 since v3; last x86-64-v1 release is v2.7.5Partlyruns, but slow or crashes on legacy hardware; not tested thereUnknownNo AVX/CPU requirement or support claim in README or Dockerfile; Dockerfile strips -march=native from go-faceUnknownNo AVX requirement in core (PHP/FrankenPHP); sidecar CPU requirements not documentedYesPHP application; no CPU-specific ML code in coreUnknownNo AVX or CPU requirement stated in src/docs; native deps sharp 0.34.2 and ffmpeg-static 5.3.0 not verifiedUnknownNo AVX or CPU requirement stated; photofield-ai README silent on AVX; ONNX Runtime CPU requirement not verifiedNoTensorFlow 2.21 is a hard dep; official TF x86 wheels use AVX (since 1.6); 2.21 not explicitly confirmedUnknownONNX/FaceONNX ML; no CPU floor documented; ORT x64 prebuilts reportedly need AVX2 (third-party), .NET package unverifiedUnknownPartlyREADME says 64-bit Intel/AMD; tools/ also ships arm64 binariesUnknownSearched requirements, docs and ORT wheel info; no AVX or CPU minimum stated; ORT wheels unverifiedPartlyNo AVX need found, but SSE4.1 crashes on pre-SSE4.1 CPUs (Athlon II, bug 465548)UnknownFace/object recognition gated by NAS model list; no published AVX or CPU instruction requirement foundN/AHosted service
Install methods
Docker, Compose, Kubernetes, Unraid, Windows zipDocker Compose, Kubernetes (Helm), NAS appsDocker, Kubernetes, NAS apps, Raspberry Pi, FreeBSDDocker, Linux binary, AUR, NixOS, Unraid, TrueNASDocker, PHP web hostPHP web host, Docker, paid hostingDocker, Node.jsDocker, single binary (Windows, macOS, Linux)Docker ComposeDocker, binaries for Windows, macOS, LinuxWindows/macOS installers, apt/rpm, Raspberry Pi image, DockerDocker, Node.js, desktop app (Windows, macOS, Linux)macOS DMG, Windows zip, from source on LinuxWindows, macOS, Linux (AppImage, Flatpak, Snap, distro packages)Package on a Synology NAS (DSM 7.2+)Cloud service only
Recommended hardware
4 GB RAM (8 GB recommended), 2+ cores6 GB RAM (8 GB recommended), 2+ cores4 GB RAM (8 GB recommended), 2+ coresNot documentedNot documented (PHP 8.4)Not documented (PHP, MySQL)Not documented; aimed at Raspberry Pi class hardwareNot documented; SSD recommendedNot documented; runs on a Raspberry Pi 4Not documentedNot documented; runs on a Raspberry Pi64-bit CPU; RAM not statedNot documented; 500-700 MB model download4 GB RAM (16 GB for AI features)Synology NAS; AI features only on listed modelsN/A
License
MITAGPL-3.0AGPL-3.0AGPL-3.0MITGPL-2.0MITMITAGPL-3.0GPL-3.0MITproprietaryMITGPL-2.0-or-laterproprietaryproprietary
GitHub starsOn 2026-11-13
8.2k119.1k40.4k6.6k4.3k3.9k2.3k6182k1.8k0292117807N/AN/A
  • Built in
  • With a limitation (hover or turn on notes)
  • Through a plugin or add-on
  • Only in a paid tier
  • Planned or in progress
  • Not available
  • Does not apply
  • Not known yet

How this table is made​

Each app's source code, documentation and release notes were read on 2026-11-13; for the closed-source apps (Google Photos, Synology Photos, PhotoStructure) only their official help pages were used. The version that was looked at is in the tooltip of each app's name. Cells with an i carry a note: hover over them, or turn on Show notes.

Apps change quickly, and some answers depend on configuration, hardware or a paid tier. If you find a cell that is wrong or out of date, edit src/data/feature-comparison.json and open a pull request with a link to the source that shows it.