💡 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.
| Feature | LibrePhotosSelf-hosted | ImmichSelf-hosted | PhotoPrismSelf-hosted | PhotoviewSelf-hosted | LycheeSelf-hosted | PiwigoSelf-hosted | PiGallery2Self-hosted | PhotofieldSelf-hosted | PhotonixSelf-hosted | DamselflySelf-hosted | LomorageSelf-hosted | PhotoStructureSelf-hosted | Orchard PhotosDesktop | digiKamDesktop | Synology PhotosSelf-hosted | Google PhotosCloud service |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Media formats | ||||||||||||||||
Photos | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | YesiDesktop photo manager: browse, view and edit local photo collections | Yes | YesiBacks up and views photos in web and mobile apps |
Videos | Yes | YesiCustom web video player since v3.0.0 | Yes | Yes | Yes | PluginiCore shows a poster and a download link; inline playback via piwigo-videojs plugin | Yesimp4, webm, ogv, ogg play directly; other formats need transcoding job | Partlyimp4/mov play in browser via HTML5 video; no on-the-fly transcoding | No | NoiImage extensions only; no video decoding | Yes | Yes | YesiMOV, MP4, M4V, WebM play in window; other video formats need Download original | YesiVideo preview with player and context menu | YesiMOV and MP4 play; FLV download-only | YesiVideo formats listed incl. mp4, mov, mkv, avi, 10 GB limit |
RAW filesCR2, NEF, ARW, DNG and other camera RAW files are displayed | YesiRAW decoded with LibRaw; shown as a preview, original stays downloadable | YesiCR2, NEF, ARW, DNG and RAW/RW2 listed as supported | YesiRAW rendered via bundled darktable or RawTherapee converter | YesiVia ImageMagick/libraw; sibling JPEG used if present; PHOTOVIEW_DISABLE_RAW_PROCESSING | YesiNEF/CR2/CR3/DNG/RW2/RAF/PEF etc. converted for display | PartlyiCR2/NEF/DNG kept as alternate download formats; display needs a JPEG or ImageMagick-derived representative | PartlyiOnly DNG and ARW listed (libvips); CR2/NEF/RAF not in supported formats | PartlyiCR2/DNG indexed; decoding depends on FFmpeg, docs say only basic RAW | YesiShows camera-embedded JPEG preview (dcraw -e / exiftool); no RAW develop | PartlyiThumbnails for ARW/CR2/CR3/DNG/ORF/NEF; no RAF/RW2 | PartlyiDNG/RAW accepted and backed up; RAW preview decoding not verified in code | Yes | YesiShows the camera's embedded JPEG preview, not a RAW decode; no preview means unreadable | YesiLibRaw decoder bundled; NEWS 9.2 adds many new camera models | YesiARW, CR2, CR3, NEF, DNG and others | YesiBacks up 'most RAW files' (camera list on help page); conversion behaviour unverified |
HEIC / HEIF | Yes | Yes | YesiHEIC/HEIF via libheif | YesiDecoded by ImageMagick built with libheif (Docker build) | Yes | PartlyiConverted to JPEG for display only with ImageMagick (ext_imagick), not GD | PartlyiListed, but needs libvips with HEIF; Alpine build checked, Debian build not | PartlyiHEIC/HEIF decoded via FFmpeg; needs FFmpeg build with HEVC (bundled in Docker) | YesiConverted to JPEG with heif-convert for display | YesiThumbnails via ImageMagick processor | YesiHEIC decoded via libheif; Windows needs external HEVC decoder path | Yes | YesiViewer shows a converted JPEG; Download original gives the file | YesiHEIF/HEIC via libheif bundled dimg plugin | PartlyiHEIC/HEIF/HIF previews need Synology Image Assistant | YesiHEIC and HEIF listed as supported photo formats |
Live and Motion PhotosThe motion part of Apple Live Photos and Android Motion Photos plays | YesiMotion part extracted with FEATURE_PROCESS_EMBEDDED_MEDIA (default on) | YesiApple Live Photos paired; embedded motion photos (MotionPhoto/MicroVideo) too | Yesipaired image+video detected; type:live filter; Motion Photos per docs filter reference | NoiNo Live/Motion Photo pairing; motion part not played | YesiApple Live Photo pairing by content ID plus Google motion photos; motion plays on hover and in viewer | No | PartlyiApple Live Photo pairs and plays motion in lightbox only; Google/Samsung Motion Photos not supported | NoiHEIC and MOV/MP4 are indexed as separate files, no motion pairing found | No | NoiNo motion-photo handling found in source | YesiWeb lightbox plays Live Photos; iOS packs image+video into zip | NoiNo Live Photo pairing; iOS JPG and MOV import as separate assets, no motion playback | No | PartlyiGoogle/Samsung Motion Photo video plays; Apple Live Photo pairs not handled | PartlyiMobile apps play Live/Motion photos on tap; casting and Apple TV show still only; web not verified | YesiiPhone/iPad Live Photos and Android motion photos supported |
HEVC (H.265) videoPlays in the browser, directly or transcoded | YesiTranscoded on demand when the browser cannot play it, then cached | YesiOffline transcode plus real-time HLS transcoding (preview, web client) | Yesitranscoded to AVC on demand for browser playback, hardware encoders optional | PartlyiHEVC in .mov/.mkv transcoded to H.264 MP4; HEVC inside .mp4 served as-is | PartlyiHEVC transcoded to H.264 only for Google motion-photo clips; other HEVC depends on browser | NoiNo transcoding in core; playback depends on browser and codec | PartlyiHEVC in mov/mkv/etc transcoded to H.264 MP4 by a job; direct HEVC MP4 depends on browser | Partlyidirect playback only, depends on browser codecs; no transcoding | No | NoiNo video support | YesiTranscoded previews via ffmpeg; web shows download fallback when browser cannot play | YesiHEVC plays directly where the browser supports it, otherwise transcoded to H.264 | PartlyiNo transcoding; HEVC plays only if the system webview decodes it | YesiPlays via Qt Multimedia; HEVC support depends on the platform codecs/FFmpeg backend | PartlyiHEVC MOV/MP4 previews need Synology Image Assistant | YesiiPhone HEVC videos play in the web and mobile apps |
Video transcodingVideos are converted or streamed in a lighter quality for smooth playback | YesiConverted to H.264 (720 lines max) when the browser cannot play it, then cached for seeking | YesiOffline transcode of incompatible video; real-time HLS preview is web-only and experimental | YesiVideos transcoded to AVC on demand for browser playback; hardware encoders optional | Yesiffmpeg makes H.264 MP4 for non-web containers; web-ready files served as-is | PartlyiOnly Google motion-photo clips are transcoded to H.264; other videos play as uploaded | NoiNo transcoding in core; piwigo-videojs plugin only adds browser playback | YesiVideoConvertingJob transcodes to MP4 (bitrate, resolution) on schedule or manually | Noino on-the-fly video transcoding; source files played directly in HTML5 player | NoiVideos are skipped on import; no transcoding code or ffmpeg dependency | NoiImage-only app; no video decoding or transcoding anywhere in the code | Yesiffmpeg makes browser-friendly preview copies; web falls back to a smaller copy or download | YesiNon-browser videos transcoded to H.264/H.265; HEVC kept where browser plays it | NoiNo transcoding; only MOV, MP4, M4V, WebM play in window, others need Download original | N/AiDesktop app plays local files via Qt Multimedia; no transcoding or browser streaming | PartlyiImage Assistant makes lower-res HEVC copies; mobile speed/quality switch; no server transcoding documented | PartlyiStorage saver resizes >1080p to 1080p at backup; streaming transcode not documented |
360° panorama viewer | YesiEquirectangular photo spheres open in a pannable 360 degree viewer | YesiPanorama and 360 photo viewer in the asset viewer | YesiPanorama detection and pannable 360 viewer | NoiNo panorama or 360 viewer in UI or API | YesiEquirectangular 360 sphere viewer, detected via XMP-GPano | PluginiPiwigo Panorama (pannellum); listings are stale (2020, compat to 2.10/13) | NoiNo panorama or 360 viewer code found | Noino equirectangular or 360 viewer in UI | NoiNo panorama or 360 viewer code | NoiPanorama is only a search orientation filter; no pannable viewer | NoiNo panorama or 360 viewer in web UI or mobile | NoiNo panorama or 360 viewer in UI bundle or settings | NoiPanoramas only cropped in the grid; no pannable viewer | NoiNo 360/equirectangular viewer; only Hugin panorama stitching plugin | Partlyi360 photos/videos supported as special media; pannable viewer not documented | Partlyi360 pan confirmed officially only on Android XR headsets (Spatial tab); phone/web sphere panning unconfirmed |
| Browsing | ||||||||||||||||
TimelineAll photos in date order, grouped by day | Yes | Yes | Partlyichronological search grid plus Calendar month view; no date-grouped timeline or scrub bar | YesiTimeline page groups media by album and day (TimelineGroup type, timeline.graphql) | Yes | PartlyiDate-based calendar views (monthly/weekly) and date search, not a continuous timeline | PartlyiDate grouping inside a folder or search result; no global timeline view | YesiTimeline layout shows photos reverse-chronologically, like Google Photos | PartlyiChronological grid with no date group headers | YesiDate-grouped grid; flat view toggle | YesiMonth-grouped gallery loaded lazily via Merkle tree | YesiYear/month When facet; capture times shown in local timezone (v2026.9) | YesiNewest first, grouped by month | YesiTimeline view grouped by date with histogram range selection | YesiTimeline and folder views | YesiPhotos tab is a date-ordered grid of the library |
Date scrubberJump through the timeline by dragging a date bar | Yes | Yes | No | No | Yes | No | No | Yesidraggable scrollbar shows date strip while scrubbing | No | NoiNo date scrubber component | Unknown | NoiFilmstrip scrubs lightbox media only; no timeline date scrollbar found | YesiYear column on the right; click or drag to jump; PgUp/PgDn keys | PartlyiTimeline histogram selects date ranges (linear/log); no fast-scroll scrubber found | YesiWeb Timeline: hover right-edge scrollbar shows time indicator and jumps to a period (KB text via search snippet) | YesiAndroid: 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 | YesiFolders page with the scan folder tree and breadcrumbs | YesiPer-user folder view, opt-in under Account Settings > Features | YesiFolders page browses the library directory tree | YesiAlbums mirror the folder tree; subAlbums, parentAlbum and breadcrumb path | PartlyiNo folder-tree browser; server folders become albums on sync; import dialog browses folders | PartlyiAlbum tree mirrors synced folder tree; no separate folder-browse view | YesiDirectory tree is the primary browsing model | PartlyiHome lists collections; expand_subdirs makes each subfolder a flat collection; no folder tree | NoiNo folder tree browse; libraries and source paths only in settings | YesiFolder tree in sidebar with include-subfolders option | PartlyiYear/Month/Day and Albums folders only via WebDAV port 8004; no folder browser in apps or web UI | YesiFolder is a faceted browse dimension | PartlyiSubfolder dropdown in Filters, a flat list; no folder tree | YesiFolder-based album tree in the sidebar is the primary browse view | YesiFolder view browses the library by folder structure; thumbnail size adjustable | PartlyiAndroid lists backed-up device folders under Collections > On this device; no web folder tree |
Map view | YesiMapLibre GL map of photo locations | Yes | YesiPlaces world map with clustering; satellite/3D styles need Essentials | YesiPlaces page maps GPS photos (Mapbox GL); needs a free MAPBOX_TOKEN env var to enable | YesiMap with provider choice, album maps and GPX tracks | NoiGPS coordinates stored but no map UI; plugin search found none | YesiOpenStreetMap, Mapbox or custom tile URL; GPX tracks | YesiMap layout with clustering; tiles from OpenStreetMap | YesiLeaflet map with clustered photo markers | PartlyiOpenStreetMap panel in sidebar shows only the single selected photo's GPS marker, not a library map | YesiMobile photo map screen (react-native-maps) | PartlyiOnly external map-app links from info panel; embedded map not shipped | Partlyi2-D similarity layout (UMAP), not a geographic map; GPS is not plotted | YesiMarble-based map view with OSM data, shows GPS-tagged items | PartlyiMap view in mobile app Places album only | YesiInteractive map of geotagged photos in the Search tab |
Albums by placePhotos grouped by city or country automatically | Yes | PartlyiPlaces page groups by city only; no country grouping and not real albums | Partlyiautomatic albums per state/region only, no city-level place albums | NoiPlaces is a map of GPS points only; no city/country grouping or reverse geocoding found in api/ or ui/ | NoiLocation text search and map exist; no automatic place albums | No | No | Noiplace names shown in Timeline/Flex only; no place-based albums | PartlyiLocation tags (country > city) filterable via facet; no per-place album pages | NoiNo place-based albums | PartlyiPlace album endpoints exist, but locationsunburst/locationtimeline return fixed sample data | PartlyiBrowse Where tree (country > city) rather than place albums | No | NoiNo automatic place albums; only map-area saved searches | YesiPlaces albums auto-created from geolocation | YesiPlaces section in Search groups photos by location |
MemoriesOn this day, flashbacks | YesiMemories page and strip, generated automatically | YesiOn this day memories page | NoiNo on-this-day or flashback feature; Moments and Calendar are not memory feeds | NoiNo on-this-day or memories feature | YesiOn This Day smart album (enable_on_this_day, default on); no separate memories/flashback feature found | NoiNo on-this-day view; SmartAlbums date rules only approximate it | NoiNo on-this-day or memories feature; searched src and docs for memor, this day, years ago, flashback | Noino on-this-day or memories feature | NoiOnly holiday event tags exist; no on-this-day feature | NoiNo on-this-day or memories feature; repo search finds none | YesiOn This Day tile on mobile home screen; no memories page on web | NoiNo on-this-day or memories feature found | NoiNo on-this-day or memories view | NoiNo on-this-day or memories feature | PartlyiNo in-app On This Day. Mobile home-screen Throwbacks widget (v2.2) shuffles past-year photos; no notification | YesiMemories with hide faces, show less, blocked options and music/zoom |
Slideshow | YesiLightbox slideshow (3 to 30 s), public ?slideshow=1 link, and memory slideshow | YesiSlideshow in web and mobile viewers | YesiPlay/pause slideshow with Ctrl+S in the fullscreen viewer | NoiViewer has manual arrow navigation only; no autoplay | YesiSlideshow setting, plus digital photo frame mode | Yes | YesiLightbox slideshow with speed and loop settings | Noino slideshow mode | PlannediListed as a planned idea on photonix.org; no slideshow route or code | NoiNo slideshow mode in the web client | NoiNo slideshow mode in web UI or mobile | NoiNo slideshow mode found; filmstrip scrubs only | NoiNo slideshow mode | YesiFullscreen slideshow and presentation mode, both as built-in dplugins | YesiSlideshow on mobile and TV apps (speed adjustable on TV); web slideshow not documented | YesiAnimation creation makes a slideshow of selected photos; album slideshow on web/Android from 2016 sources, iOS unclear |
Statistics pageCounts, storage, cameras | YesiTimeline, place tree, word clouds, social graph, face clusters; no camera or lens breakdown | PartlyiAdmin stats: photo/video counts, usage and quota per user; no camera or lens breakdown | NoiNo statistics page; only Prometheus metrics and CLI face cluster stats | NoiOnly site info and scan progress; no library stats page | PaidiStatistics and insights pages are Supporter Edition | YesiAdmin intro shows counts and disk usage; admin stats charts from history | YesiAdmin gallery statistic page from /admin/statistic | Noino statistics page; Prometheus metrics endpoint only | NoiNo statistics page or stats query | YesiStats page: counts, pending jobs, tag and person totals; no storage or camera breakdown | NoiNo statistics page; /api/stats/ returns hard-coded 1s; only free-space figure exists | PartlyiSync page shows import counts only; no storage/camera stats page | PartlyiInfo panel shows counts, unreadable, duplicates; no camera or storage stats | PartlyiDatabase Statistics dialog: counts by image/video/audio, albums, tags, backend; no camera or storage stats | NoiNo library statistics page documented | NoiNo library statistics page found; Manage storage shows account usage only |
| Organizing | ||||||||||||||||
Albums | Yes | Yes | Yes | Yes | Yes | Yes | YesiAlbums are saved searches (logical albums) | Partlyicollections (albums) are defined in configuration.yaml, not created in the UI | Yes | NoiNo album model or UI | Yes | PartlyiAlbums come from metadata Album tags; in-app album creation not released, membership editor planned | No | YesiFolder-based albums plus tag, label, date and saved-search trees | YesiCustom albums, photos can join several albums | YesiUser albums with sharing and collaboration options |
Smart albumsAlbums defined by a rule or saved search that update themselves | PartlyiBuilt-in auto albums (places, things, events, hashtags) only; no user-defined rule or saved-search albums | PartlyiOnly workflow templates labelled SmartAlbum that tag new assets on trigger; no true rule-based album; roadmap says planned | PartlyiBuilt-in filter albums (Moments, Calendar, Regions, Folders) auto-update; users cannot make rule-based albums, user albums are manual | NoiAlbums come only from folders; no saved rules | YesiTag and person albums auto-update by rule (AND/OR); plus built-in smart albums (recent, unrated, etc.) | PluginiSmartAlbums (mistic100): tag/date/name rules, refreshed every 3 days; last rev 14.a (2023) | YesiLogical albums are saved searches that re-evaluate on view | Noicollections are folder/dir based in configuration.yaml; no rule-based albums | NoiAlbums are manual tags (type A); no saved search or rule model | NoiNo saved searches or rule-based albums; search is query-only | PartlyiAuto date, place and face albums generated; no user-defined rule or saved-search albums | PartlyiTag albums auto-generated from folders/dates; no user-defined saved-search albums | NoiNo albums; filters and searches are not saved | YesiSaved searches (search albums) re-run live; map-area searches also update | YesiConditional albums auto-add matching photos (person, object, location, camera lens) | NoiNo user-defined rule-based albums; only automatic Memories and Collections |
Automatic event albumsTrips and events grouped for you | YesiEvent albums and Memories generated automatically | PartlyiAuto Memories (on this day); event albums only via workflow templates | YesiMoments and monthly albums generated automatically | NoiAlbums come from folder structure only | PartlyiSmart albums (Recent, On This Day, Highlighted, Untagged...); no event/memory detection | No | NoiAlbums are user-created; no generated event or memory albums found | Partlyievents split by time and location via API/MCP; not shown as albums in UI | PartlyiOnly holiday event tags (Christmas, Halloween, Valentine's, New Year); no auto albums or memories | NoiNo auto event or memory albums; date groups only | PartlyiOn This Day cards and date albums; no generated event albums found | PartlyiDate and folder/tag albums generated automatically; no memories or event albums | No | PartlyiAuto Dates tree (year/month/day) only; no event or memory albums | YesiAutomatic albums from faces, objects, geolocation, tags | YesiMemories surface automatic on-this-day and event collections |
Favorites | YesiFavorites page and favorite toggle per photo | Yes | YesiFavorite flag with a favorite filter | YesiPer-user favorites with favorites-only filter on albums and timeline | YesiPer-photo highlight flag (free) | Yes | NoiOnly faces (persons) can be starred as favourite; photos cannot be favorited | Partlyiheart toggles fav tag; needs alpha tags enabled; filter with tag:fav | NoiNo favorite flag, field or UI | NoiOnly keyword favourites (sidebar shortcuts); individual photos cannot be favourited | YesiFavorite toggle via /assets/favorite; mobile syncs a Favorites album | YesiLiked heart toggle; liked:true search; maps to XMP rating | NoiNo favorite marking | PartlyiNo favorite flag; NL search maps 'favorite' to Accepted pick or 5 stars | PartlyiFavorites filter; mobile 2.4 beta adds Favorites album; web favorites only in 1.9 beta | YesiStar marks a favorite; Favorites collection and search |
Star ratings | Yesi1 to 5 stars per photo; rating style is a per-user setting | Yesi1-5 star rating in detail panel; API also accepts -1 (reject) | NoiOnly a read-only quality score in the info panel; no user star ratings | NoiNo rating field in schema or database models | Yesi1-5 star rating, rating search token and star albums | YesiStars 0-5 (rate_items) | PartlyiRatings read from metadata and filterable/sortable; cannot be set in the app | Noino star rating code or fields | YesiStar ratings 0-5 per photo, editable in the UI | Yesi1-5 star rating written to EXIF rating and filterable by minimum rating | NoiNo 1-5 star ratings; asset detail maps only favorite to rating 1 | PartlyiReads XMP rating for reject threshold; no in-app 1-5 star editor | NoiNo star ratings | YesiStar ratings 0 to 5 with overlay and keyboard shortcuts | YesiStar ratings editable and usable as a filter | NoiNo 1-5 star rating found in Google Photos help |
Color labels or pick flags | NoiNo colour label or pick/reject field on photos | Partlyi1-5 star ratings in web UI; reject (-1) accepted by API but no UI control; no colour labels | NoiNo color labels or pick/reject flags; color is only a search filter | NoiNo color label or pick/reject field | NoiNo colour label or pick/reject field on photos | No | NoiNo color label or pick/reject support found | Noino color labels or pick/reject flags | NoiColor tags are classifier-detected palette colors, not user labels or flags | NoiNo colour labels or pick/reject flags in code | NoiNo color labels or pick/reject flags | NoiNo color label or pick/reject flag UI or settings | NoiNo color labels or pick/reject flags | YesiPick flags plus color labels with customizable names | NoiColor labels were dropped in the move from Photo Station; not in Photos | NoiNo colour labels or pick/reject flags found |
Your own tagsAdd keywords to photos by hand | YesiOwn tags added by hand, bulk tagging, rename and merge | YesiManual tags on assets | YesiLabels added, renamed and deleted by hand; they act as keywords | NoiNo user tags or keywords in schema | YesiManual tags with tag search and tag albums | Yes | NoiKeywords come only from file metadata; no in-app tag editing | Partlyimanual tags, alpha: enable in config; stored only in cache DB, lost if DB is deleted | YesiUser generic tags can be added and removed by hand | YesiHand-added keywords with autocomplete and recents, written into files via ExifTool | PartlyiLabel API exists (/assets/label) but no tag editor in web UI or mobile | YesiKeyword edits made from the UI, written to original or sidecar | NoiNo user-added tags or keywords | YesiFree-form tags added by hand, with recent-tag history | YesiTags editable and filterable; Tags album | NoiOnly people/pet labels; no user-added keyword tags found |
Hierarchical keywordsNested keywords such as Places/Europe/Paris | PartlyiTags are flat; a hierarchical keyword on import keeps only its last level | YesiNested tags with parent paths | NoiLabels are flat; only fixed built-in categories, no user-nested keywords | NoiNo keyword or tag hierarchy | NoiTags are flat; only albums nest | NoiFlat tags table with no parent column | NoiKeywords are flat strings; no hierarchical keyword handling | Noiflat tags only; name is a plain string | PartlyiOnly auto location tags nest (country > city); user tags are flat | NoiTags are flat keyword strings; no nesting | NoiLabels are flat names; no parent or nested keyword support | YesiPath separators, reparenting, tag rename tools | NoiNo keyword hierarchy | YesiNested tag tree in the sidebar | NoiFlat tags only; no nested keywords documented | NoiNo nested keywords or hierarchy found |
Archive or hideTake photos out of the timeline without deleting them | YesiArchive and Hidden pages keep photos off the main timeline | YesiArchive hides assets from the timeline | YesiArchived photos leave all sections until restored | NoiNo archive or hide state; media only appears via folders | PartlyiNo archive; per-photo public-hidden flag and albums hidden via visibility policy | NoiPrivacy levels hide per viewer; no archive state separate from delete | NoiNo archive or hide-from-timeline feature | Noino archive or hide-from-timeline feature | NoiPhotoTag.hidden field exists but no mutation or UI uses it | NoiNo per-photo archive or hide; .nomedia only skips whole folders | PartlyiHide works through /assets/hide API and timeline filter; no hide action in web or mobile UI | YesiArchived and hidden states, filterable by search | NoiNo archive or hide; only files removed from disk leave the index | NoiNo archive or hide state for photos; only trash and tags | PartlyiHide faces in People and subject categories in Subjects; no archive view | YesiArchive hides photos from the main view; restore from Archive |
TrashDeleted items can be restored | YesiDeleted photos go to Trash; optional automatic empty after N days | YesiTrash with configurable retention (trashDays) | PartlyiNo trash: archive holds items, permanent delete removes originals with no restore | NoiNo media deletion, so no trash | NoiDelete is permanent; no trash or soft delete | NoiDelete is permanent; no trash or restore | NoiOnly .Trash folders are excluded from indexing; no in-app trash | Noino photo deletion and no trash | PartlyiDelete sets a flag; no trash view and no restore | PartlyiDeleted files move to DamselflyTrashcan folder; no in-app restore, recovery is a manual file move | PartlyiDeleted files go to an on-disk lomodTrash folder; no restore UI or API | YesiSoft deletes to OS trash, restorable; optional Empty Trash | NoiNo delete or trash; originals are never modified | YesiDelete moves to trash with restore; permanent delete also offered | PartlyiNo Photos trash; deletes go to DSM recycle bin, restored via File Station #recycle | YesiDeleted items kept 30 days before permanent deletion |
Delete in the app | YesiMoved to trash; optional automatic empty after N days | YesiTrash with configurable retention (trashDays) | Yesiarchive first, then permanent delete; no separate trash bin | NoiNo media deletion; only share links and users can be deleted | YesiPermanent delete; no trash/soft-delete | YesiPermanent delete; no trash | No | Noionly tags can be removed; no photo deletion or trash | PartlyiSoft delete flag from UI; no trash view or restore; files on disk untouched | YesiMoves files to DamselflyTrashcan folder inside the library | YesiDeleted files are moved to a trash directory on disk; no in-app restore found | YesiDelete, Empty Trash (optional), Remove asset; trashed:true search | NoiNo delete route; originals are never modified | YesiDelete to trash with restore, or permanent delete | YesiDeletes go to DSM recycle bin, not a Photos trash | YesiDeleted items stay in Trash for 30 days |
Duplicate detection | YesiExact file hash and perceptual hash duplicate groups | YesiDuplicate review utility using ML similarity | PartlyiExact SHA1 duplicates skipped at import only; no browse/delete UI, no near-duplicates | NoiDuplicate check only inside face merge/move, not a finder | PartlyiExact checksum duplicates only; no near-duplicate detection; album/title constraints are SE | YesiAdmin batch manager prefilter: duplicates by checksum, date, dimensions or filename | PartlyiAdmin list of same name and size duplicates; not perceptual | Partlyidedup:0.x search filter hides near-duplicate successive photos (AI); no review or delete | PartlyiExact duplicates skipped at import only; no finder for existing library | PartlyiPer-photo 'visually similar' lookup only; no batch duplicate finder (README: in progress) | YesiMobile groups near-duplicates by pHash (Hamming <= 6); phone-side only, no server duplicate finder | YesiGroups duplicates, edits and resized copies via perceptual hashes | YesiIdentical files shown once; near-duplicates stacked into one tile | YesiDuplicate finder plus fuzzy near-duplicate search via fingerprints | PartlyiSimilar items grouped and stacked; Moments-era For You duplicate review, not confirmed in Photos | PartlyiStacks group similar shots; no dedicated duplicate finder |
StacksBursts, RAW+JPEG pairs and edited versions shown as one | YesiBurst stacks (filename, time and EXIF rules), manual stacks; RAW+JPEG and file variants grouped under one photo | YesiStacks group related assets | YesiStacks group RAW+JPEG pairs, bursts and edited versions | PartlyiRAW+JPEG sibling used for display only; no user-visible stack | NoiNo user-facing stacks or burst grouping; only internal photo/video partner pairing | PartlyiAlternate formats (e.g. RAW) attach to one photo; no burst or stack UI | NoiNo grouping of bursts, RAW+JPEG or edited versions | Noino stacking of bursts, RAW+JPEG or versions | PartlyiRAW+JPEG files grouped under one photo with a preferred file; no burst or edit stacks | NoiNo grouping of bursts, RAW+JPEG or edited versions | PartlyiBurst and near-duplicate groups in mobile review only; no stack data model | PartlyiAuto-groups JPG/RAW/HEIC variants and edits into one asset; no manual stacks | YesiBursts, edits and resized copies share one tile with a member switcher | YesiGroups for RAW+JPEG, versions and timelapse/burst sequences by filename | PartlyiSimilar-item stacks in Timeline/albums; GIF/WebP excluded; RAW+JPEG or edit stacks not documented | YesiStack similar photos toggle in More; top pick shown; similar shots only |
Cleanup suggestionsSuggests blurry, bad or redundant photos to remove | PartlyiDuplicates, bursts and screenshot/document flags only; no blur or quality scoring | PartlyiDuplicate review and large-files utility; no blur or quality detection | Partlyireview queue flags low-quality photos; duplicates skipped by SHA1 but not suggested | No | PartlyiExact checksum duplicate finder; no blur/quality detection | NoiOnly md5 duplicate check at upload; no cleanup suggestions | PartlyiAdmin list of same name and size duplicates; no blur detection, no delete | Partlyidedup:0.x search filter hides similar successive photos; no delete or archive | NoiDuplicates skipped only at import; no cleanup or blur suggestions | PlannediDuplicate detection listed as in progress | PartlyiMobile duplicate groups by pHash (Hamming <= 6) and Free Up Space; no server-side scoring | PartlyiGroups duplicates and resized copies; no blur or quality detection | PartlyiGroups near-duplicates into one tile; no delete suggestions or blur flags | YesiDuplicate finder plus quality sorter (blur, noise, exposure, compression, aesthetics) | PartlyiSimilar photos stacked; no bad-photo or duplicate deletion | PartlyiUtilities flags blurry photos and screenshots; duplicates need manual review |
Locked folderPrivate photos behind an extra PIN or password | NoiHidden photos have no PIN; album lock only freezes which photos an album holds | YesiPIN-protected Locked Folder; hidden from normal views | NoiPrivate flag hides photos from viewers; no PIN or password locked folder | NoiNo locked or private folder feature | PartlyiAlbum passwords and hidden albums; no PIN-locked private vault | NoiPrivate albums are permission-based, no PIN; old Protected Albums ext (2016) is stale | NoiPer-user allow/block directory lists exist but no PIN or password lock | Noino locked or private folder | NoiNo locked or private folder feature | NoiNo locked folders or extra PIN; access is login-level only | NoiNo locked or PIN-protected folder; 'encrypt' metadata category is defined but unused | NoiNo locked or private folder or PIN feature | NoiNo locked or private folder | NoiNo locked or password-protected albums or folders | NoiOnly Personal and Shared Space; DSM encrypted folder is a separate DSM feature | YesiLocked 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 | YesiInsightFace detection; FEATURE_FACE_DETECTION default on | Yes | Yesibuilt-in YuNet detection and SFace embeddings | Yesidlib-based (go-face); on by default; labels assignable to face groups | PartlyiNeeds separate Lychee-Facial-Recognition microservice, V8 flag, off by default; not SE-gated | PluginiCommunity facial-plugin (CompreFace, needs external server); core has only manual people tagging, no detection | PartlyiShows and names faces from XMP/MWG region metadata; no face detection | PartlyiAlpha detection via photofield-ai plugin (RetinaFace + 512-d embeddings); no naming or people assignment | YesiDetects and names faces (MTCNN + FaceNet); needs face classifier enabled per library | YesiLocal FaceONNX models; no cloud API | PartlyiOn-device ML Kit face detection and face albums in mobile; server /api/persons returns hard-coded sample data | NoiNo face detection; only reads names from existing face-region metadata written by other apps | No | YesiYuNet face detection + SFace recognition via OpenCV DNN; people tags | PartlyiFace and object recognition only on certain NAS models; list in KB | YesiFace groups; name them, merge groups, and label people |
Face clusteringUnknown faces are grouped into people automatically | YesiHDBSCAN clustering ported to numpy; FEATURE_FACE_CLUSTER default on | YesiUnassigned faces clustered automatically; threshold settings in admin ML config | Yesisimilar unknown faces grouped automatically; CLI cluster optimization | YesiNew faces matched to existing groups or start a new group; unlabeled re-run | PartlyiClustering (DBSCAN) runs in the sidecar; admin re-runs it; same separate-service requirement | No | No | Noino person concept or clustering; search by face ID only | YesiAuto-groups unmatched faces: new auto-named tag created when no tag within threshold (online, greedy) | PartlyiUnmatched faces become new 'Unknown' persons; grouping and merge are manual | PartlyiAutomatic face clustering on mobile only (Settings toggle); server clusterfaces is sample data | No | No | NoiUnknown faces are not auto-grouped; users tag one by one, bulk-grouping requests still open | PartlyiAutomatic People grouping; same NAS model limits | YesiSimilar faces grouped automatically into face groups |
Draw faces by handAdd a missed face region and assign it | YesiDrag a box in the People sidebar, then label it; the face model refines the box | YesiDraw a face box in the asset viewer and create or assign a person | YesiFace markers drawn and assigned by hand in the viewer and info sidebar | NoiFaces only come from detection; can move or detach them, not draw | NoiAssigns AI-detected faces to people only; no hand-drawn face regions | YesiAdmin face identify draws a crop box and assigns it to a person | NoiFaces only from XMP/MWG regions; UI says tag faces in another app | Noiface regions are read-only (GET only); no manual draw or assign | NoiCan rename, verify or block detected faces; cannot draw a new face region | PartlyiCan name detected faces and merge people; cannot draw face regions by hand | NoiNo way to draw a face region or assign it by hand | NoiNo face region drawing; people read from metadata only | NoiNo face detection or manual face regions | YesiAdd a face by click-and-drag in preview, then assign a name | YesiManual face tagging; not for GIF, WebP or 360 photos | PartlyiLabel a face on one photo via Info > People; no drawn face regions |
Pet recognitionTells individual pets apart | NoiFace recognition is for people only; no individual pet recognition | NoiOnly face, CLIP and OCR models; no pet recognition | NoiNo pet recognition; only generic ImageNet dog breed labels | NoiFace model is human dlib recognition only | NoiFace service handles people only; no pet recognition | NoiNo pet recognition in core; Piwigo AI covers tags and descriptions only | NoiNo ML recognition of animals | Noiphotofield-ai provides CLIP embeddings and faces only; no pet recognition | NoiOnly generic object labels; no individual pet recognition | NoiGeneric YOLO11n object labels only; no individual pet recognition | NoiOnly CLIP text queries such as 'cat' and 'dog'; no individual pet recognition | NoiNo pet recognition | NoiNo pet recognition; search is by visual similarity only | NoiYOLOv11 gives generic object labels only; no individual pet recognition | NoiNo pet recognition documented; only general object/subject recognition | YesiPets grouped and labelled like people; can be turned off separately |
Object tagsAutomatic labels such as dog, car, beach | YesiAuto tags from OpenCLIP zero-shot labels; no bounding-box object detector | NoiTags are manual or imported from XMP/IPTC; no automatic keywords | PartlyiImageNet-1k image labels only, no bounding boxes | No | NoiTags are manual only | PluginiAuto tags via Piwigo AI plugin (beta) | No | Noitags are manual; no automatic keyword generation | YesiSSD MobileNet v2 (OID v4), about 545 labels with bounding boxes | YesiYOLO11n object detection with bounding boxes | PartlyiObject/scene labels from client classifier become tags; no server-side detector | PartlyiKeywords from metadata and folder paths only; no AI tagging | No | YesiYOLOv11 object detection proposes tags in the auto-tags scan | PartlyiSubjects album; object recognition on certain models only | YesiThings category in search; labels are not user-editable tags |
Scene classificationIndoor, mountain, beach, ... | YesiScenes such as beach, mountain come from OpenCLIP labels (Things), not a separate classifier | NoiOnly CLIP search, face and OCR models; no scene labels | Partlyiindoor/outdoor/landscape/architecture labels from ImageNet classifier, no dedicated scene model | No | No | No | No | Noino scene classification labels; text-based semantic search only | NoiStyle labels are aesthetic (Sunny, Noir, Vintage); no scene classes like beach or mountain | NoiImageClassification model and ClassifyImage defined but never called | PartlyiClient-side classifier labels mapped to scene categories (~1000 ImageNet-style rules); mobile only | No | No | Noiimage_classification model is downloaded but no feature consumes it | PartlyiSubjects albums from object/theme recognition, NAS-model gated; no named scene classes documented | PartlyiContent search (e.g. 'beach') via text; no published scene class list |
Image attributesColors, man-made, sunny, ... | PartlyiWeather and light words only (sunny, rainy, foggy); no colour or man-made attributes | NoiNo colour or attribute classifier found | Partlyicolor names, mono, chroma filters; no sunny/man-made style attributes | No | PartlyiColour palette search only; no sunny/man-made attributes | No | No | Partlyiprominent color extracted for placeholders; not searchable | YesiAesthetic style tags plus dominant color tags | PartlyiDominant and average colour stored; not shown in UI or search | Unknown | No | No | NoiNo color, sunny or man-made attribute tagging found | NoiNo color/attribute labels documented | PartlyiFree-text search recognizes scenes/things (e.g. sunsets); no color, sunny or man-made attribute filters found |
Media categoriesScreenshots, documents, selfies, ... | YesiScreenshot and document flags, plus a selfie label in the Things list | NoiNo screenshot/document/selfie classifier; screenshots only by filename workflow | Partlyidocument and info labels plus review queue; no selfie or screenshot class | No | NoiNSFW classification exists; no screenshot/document/selfie categories | No | No | Noino screenshot/document/selfie categories found | NoiNo screenshot, document or selfie category classifier found | NoiNo screenshot, document or selfie categories | Unknown | No | No | NoiNo screenshot, document or selfie category detection found | NoiAuto albums are People, Subjects, Places, Tags, Videos, Recently Added; no screenshot/document/selfie categories | PartlyiScreenshots, selfies and videos groupings confirmed; documents not confirmed |
AI captionsNatural-language descriptions of photos | YesiOn-device AI captions (LFM2.5-VL, ONNX); uses recognised people and place | NoiNo AI caption model; descriptions are user-entered | YesiAI captions via your own Ollama or OpenAI engine in vision.yml; no built-in caption model; not paywalled | NoiNo AI caption or description generation | NoiNo AI captions; descriptions are entered by hand | PluginiPiwigo AI (beta): description generation, cloud-hosted by Pigolabs | NoiCaptions only read from IPTC metadata; no AI generation | Noiphotofield-ai does not generate captions; only CLIP embeddings and face detection | NoiNo caption model or dependency | NoiNo AI captions; classification model defined but never called | NoiNo caption generator; wordcloud captions are hard-coded sample data | PartlyiCaption metadata read and edited; no AI-generated captions | NoiSearch ranks by vector; no generated captions | NoiNo AI caption generation; captions are only searchable via NL search | NoiNo AI caption or description generation documented | PartlyiAsk Photos answers questions about a photo; no per-photo caption generation found |
Text recognition (OCR)Text in photos becomes searchable | YesiText in photos is recognised and becomes searchable | YesiOCR text is searchable and selectable in the viewer | NoiNo OCR engine in internal/ai; text reading only via Ollama vision prompts | NoiNo text recognition | NoiNo text recognition code | PluginiPiwigo AI (beta) text recognition, cloud-hosted (PaddleOCR) | NoiNo text recognition | Noino OCR in app or photofield-ai | NoiNo OCR engine or dependency | NoiNo text recognition in code | YesiOn-device ML Kit text recognition with OCR overlay and text search on mobile | NoiNo text recognition feature | NoiNo text recognition | PluginiOCR Text Converter plugin; needs external Tesseract binary | NoiNo text recognition or text search documented on official pages | YesiSearch finds text inside photos; quoted phrases give exact text matches |
Machine learning runs locallyNo photo leaves your hardware for analysis | YesiAll ML models run on your server; place names can optionally use an online geocoder | YesiModels run on your own server | YesiDefault ONNX models run locally; Ollama or OpenAI captions/labels are optional and can be cloud | Yesidlib face models run on the server; no cloud ML calls | YesiArcFace/DeepFace sidecar is self-hosted; no cloud AI API calls found in app/config | NoiNo ML in core; Piwigo AI sends images to Pigolabs servers (OVH France) | NoiNo machine learning code at all; face names come from metadata | Pluginiphotofield-ai is self-hosted (uv or Docker); models run on own hardware, no cloud calls seen | YesiTensorFlow classifiers run in the app container; models downloaded once from photonix.org | YesiFaceONNX and YOLO11n run offline on the server. Site still says Azure Face (stale), code is local-only | YesiMobile runs CLIP ONNX, ML Kit and face models on device; server only stores synced embeddings | NoiNo ML models; only perceptual hashing, which is not ML | YesiSigLIP 2 runs on the computer; works offline after model download | YesiOpenCV DNN (YuNet, SFace, YOLO) and local Qwen2.5 LLM run on your machine | YesiFace and object recognition run on the NAS; no cloud processing documented | NoiFace, object and search ML run on Google's hosted service |
GPU accelerationFor machine learning or video transcoding | YesiML only, via WebGPU/Vulkan (Intel, AMD, NVIDIA on Linux); video transcoding is CPU only | YesiCUDA, ROCm, OpenVINO, ARM NN, RKNN for ML; NVENC, QSV, VAAPI, RKMPP for transcoding | YesiNVIDIA GPU for ONNX; Intel QSV, VAAPI, NVENC, VideoToolbox encoders for video | PartlyiGPU only for video encode (qsv/vaapi/nvenc); face ML is CPU; qsv only verified on Intel | NoiNo GPU device config in compose; no hwaccel/NVENC code in app or config | No | NoiNo GPU code and no ffmpeg hwaccel args; sharp/libvips and ffmpeg run on CPU | Pluginiphotofield-ai uses GPU/CUDA with PHOTOFIELD_AI_RUNTIME=all; official Docker image is CPU-only | NoiCPU TensorFlow only; no CUDA or GPU configuration in requirements or Docker | NoiCUDA explicitly disabled in object detector; FaceONNX GPU code commented out | NoiNo hardware video acceleration flags in lomod ffmpeg; no GPU delegate in mobile ML | YesiFFmpeg hwaccel for video transcodes (NVENC, CUDA, D3D11VA, DXVA2); not used for ML | YesiCore ML on Apple Silicon, DirectML on Windows x64, CUDA on Linux opt-in | YesiOpenCL path for OpenCV DNN with GPU compatibility test; no video transcoding GPU | UnknowniPhotos spec silent on GPU; GPU acceleration only documented for Surveillance Station and Deep Search | N/AiHosted service; no user hardware acceleration |
| Search | ||||||||||||||||
Natural-language searchSearch by meaning with CLIP-style embeddings | YesiOpenCLIP ViT-B/32 embeddings, exact inner-product search | YesiCLIP contextual search via VectorChord; model selectable | PluginiNo server text-to-image search; Stream iOS app (Yu Yang) runs on-device CLIP/SigLIP2/uform vector search over PhotoPrism | NoiSearch matches title and path text only | No | No | No | PluginiNeeds the photofield-ai add-on (MIT, OpenAI CLIP ONNX); not built into the Photofield binary | NoiSearch is keyword and facet based; no CLIP or text-embedding search | NoiNo CLIP or text embeddings; search is keyword and filter based | YesiOn-device CLIP ONNX (visual+textual) on mobile; server does not run models | NoiSearch is tags, dates, filenames, file types; sqlite-vec used only for duplicate matching | YesiSigLIP 2 base (ONNX); text and image queries, many languages | PartlyiNL search: local Qwen2.5-1.5B LLM builds structured filters; no embedding (CLIP) search | NoiMeaning-based search is in separate Deep Search app, not Photos | PartlyiAsk Photos (Gemini) with classic toggle; rollout limited per 2026 reports |
Search by metadataCamera, lens, date, file type, ... | YesiFilters by metadata values such as camera and lens | YesiCamera make/model, lens, date range, media type, rating, folder path | Yesifilters for camera, lens, f, iso, mm, mp, taken, codec | NoiSearch is title/path text; timeline has only a from-date filter | YesiSearch tokens for make, model, lens, iso, aperture, shutter, focal, date, ratio | PartlyiSearch by dates, dimensions, filesize, author, tags, ratings; no camera/lens/EXIF fields | PartlyiDate, rating, keyword, caption, position, resolution, orientation, distance; no camera/lens filter | Partlyisearch by date, filename and tag; no camera/lens/ISO queries (Make/Model only as tags) | YesiFilters for aperture, exposure, ISO, focal length, rating, flash, camera, lens, metering, drive and shooting modes | YesiCamera, lens, date range, file size, orientation, star rating | PartlyiSearch by metadata category/name/value and camera make table; no full EXIF filter UI found | Yesicamera:, lens:, make: search keys; Camera and Lens facets | PartlyiFilters by folder, file type and date only; no camera or lens query | YesiAdvanced search on EXIF, IPTC, XMP, camera, lens, dates and more | YesiFilter by time/date, camera model, lens, other metadata | YesiAdvanced search filters include location and dates |
Search by place | YesiSearch by place name from reverse-geocoded places | YesiSearch by city, state or country from reverse geocoding | Yesicountry, state and city filters plus map-area bounding box search | NoiSearch matches title and path only; no place names | Yesilocation: search token with text match | PluginiOpenStreetMap plugin has reverse geocoding; forum reports it broke | Yesiposition: and 5-km-from: queries via OpenStreetMap geocoding | Noiplace names shown in details but not searchable; qualifiers are tag, filename, created, t, dedup | YesiLocation tags match the search text and appear in the locations facet | NoiGPS kept as lat/long only, no place-name search. Site claims photo map; code shows current photo only | YesiMobile search suggests places from on-device geo data and combines them with time and CLIP | YesiWhere facet with country/city tree; place search | NoiNo GPS or place-name search | YesiAdvanced search fields for Country, City and Sublocation, plus map-area search | PartlyiGeolocation quick filter and Places albums; no place-name search documented | YesiPlaces in Search; search by place name |
Search by person | YesiSearch by person name in Spotlight and search page | YesiSearch filter by one or more recognised faces | Yesiperson filter matches subject names; & and | combine names | NoiSearch returns albums and media only, not people | PartlyiPerson pages and person albums exist; search box has no person-name token | YesiSearch rule on people (when people access is enabled) | Yesiperson: search and person-count queries | Noino person names; faces searchable only by face ID | YesiFace tag names match the search text | YesiPerson filter in advanced search with name typeahead | NoiSearch tokens cover time, place and CLIP text only; no person-name search | PartlyiWho facet searches names from face metadata; read-only | NoiNo people recognition | YesiSearch by people (face tags), including through NL search | YesiPeople is a quick filter for recognized faces | YesiSearch by labelled person name |
Find similar photosVisual similarity search from a photo | YesiSimilar Photos finds visually similar images from one photo | YesiView similar photos uses CLIP smart search when enabled | PartlyiOnly a 'Visual Similarity' sort order (perceptual hash); no find-similar-to-this-photo action; Discover Similar tab is a placeholder | NoiNo visual similarity search | NoiNo visual similarity search; only face suggestions | No | NoiNo visual similarity search | PluginiFind Similar Images via photofield-ai CLIP embeddings | NoiAnnoy index only speeds face classification; no find-similar photo UI | YesiPerceptual-hash visually similar search with adjustable threshold | PartlyiSimilar photos shown only as duplicate groups; no find-similar from a chosen photo | NoiPerceptual hashing groups duplicates internally; no find-similar UI | YesiFind similar from viewer; drop an image on the search bar | YesiFind similar from a reference image; sketch search also available | NoiSimilar-item stacks only; no find-similar-from-a-photo feature documented | PartlyiAsk/related photos on an open photo surfaces similar images; Gemini-based, region-limited |
| Metadata | ||||||||||||||||
EXIF info panel | YesiInfo panel with camera, lens, exposure and other EXIF details | YesiDetail panel and mobile technical details show EXIF | YesiInfo sidebar and edit dialog show camera, lens, exposure and more | YesiRead-only EXIF in sidebar: camera, lens, exposure, ISO, GPS | YesiPhoto details panel shows camera, lens, exposure and date | YesiMetadata panel shows configured EXIF fields (show_exif_fields) | YesiLightbox info panel shows EXIF details | Noidetails panel shows date, time, zone, filename, size, location; no camera, lens or exposure | YesiInfo sidebar shows camera, lens and exposure details | YesiProperties panel shows camera, lens, exposure and other metadata | PartlyiCamera make is stored and searchable, but no EXIF info panel; detail payload has GPS and time only | YesiInfo panel for asset metadata | NoiViewer shows name, date, folder, size, type; no camera, lens or exposure panel | YesiItem properties panel with EXIF, IPTC, XMP, camera and lens details | PartlyiCamera, lens and other metadata filters; EXIF info panel not confirmed on official pages | PartlyiInfo panel shows details and IPTC fields; camera, lens and exposure not confirmed in help |
Reverse geocodingGPS coordinates turned into place names | Yesigeopy-based lookup, FEATURE_REVERSE_GEOCODING default on | YesiOffline GeoNames data loaded into Postgres | YesiOpenStreetMap-based; lookups go through PhotoPrism services (disable with DISABLE_PLACES) | NoiNo GPS-to-place-name lookup; map clusters only | YesiNominatim-based geodecoding, optional via location_decoding | NoiGPS parsed from EXIF; no place-name lookup | NoiPlace names only from embedded IPTC city/country; geocoding only for search | Yesioffline geoBoundaries database embedded, ~50k places; Timeline and Flex | YesiOffline lookup using GeoNames cities1000 and world borders | NoiGPS kept as lat/long only; no place-name lookup | YesiDevice reverse geocoding, country/state normalized server-side | YesiOffline, using ExifTool's bundled geo database; no internet needed | No | YesiNominatim (OpenStreetMap) reverse-geocoding runner; needs internet | PartlyiGeolocation quick filter and Places albums; method not documented | YesiGeotagged photos are searchable and shown by place name |
Edit metadataDate, description, location, ... | YesiDate, location, caption, category, rotation and rating edits in the UI | YesiDate/time, description, rating, GPS location | Yesititle, caption, date, location, labels and people edited in UI | NoiEXIF shown read-only in sidebar; no mutation edits metadata | PartlyiTitle, description, tags, dates, license, 360 flag; no GPS/location editing in UI | YesiName, description, author, date, tags, privacy level via UI and batch manager | NoiOnly person names are editable in the UI | Noionly tags are editable; date, description and location are not | PartlyiTags, ratings, face names and rotation are editable; date, GPS and description are not | PartlyiCaption, description, copyright, rating, rotation; no date or location edit | PartlyiAPI to add/update metadata and capture time; limited UI in apps | PartlyiRotate, captions, keywords in UI; Who-tag editing is PLUS and not released | No | YesiEdit EXIF, IPTC and XMP fields, captions, tags, ratings, labels and GPS | YesiDates, times, descriptions, tags, ratings editable | PartlyiLocation editing confirmed; date/description editing not verified |
Set location by hand | YesiSet a photo's location by clicking the map or pasting coordinates | YesiSet GPS by map point picker and geolocation utility | YesiLocation field plus map picker in the edit dialog | NoiMap is read-only; no mutation sets GPS | NoiMap is view-only; GPS coordinates are not editable in the photo form | PluginiNo map UI in core; OpenStreetMap plugin lets you set coordinates on a map | NoiMap is read-only; GPS cannot be set in the app | Noino location editing, no map picker for GPS | NoiGPS is read-only; no mutation sets latitude or longitude | NoiMap is display-only; no GPS edit field or map picker | PartlyiGeo metadata editable through API (/assets/metadata, places PUT); no map editor in apps | NoiLocations are read-only; no map or manual GPS editing in app | NoiNo GPS editing or map picker | YesiGeolocation editor with map to set or fix GPS coordinates by hand | NoiOnly dates, times, descriptions, tags and ratings editable; no map location editing | YesiSet or fix a location on a map |
Write metadata backEdits saved into the file or an XMP sidecar | YesiWrites to the file or an XMP sidecar, per setting; library-wide write job | YesiXMP sidecar write job; external library write-back if mount is writable | Partlyionly image orientation written to originals; other edits are not written back | Noiexiftool writes only to generated preview files, never originals | YesiOptional: exiftool writes title/description/tags/rating to originals | NoiMetadata is read into the DB; no write back to files or XMP | No | Noiread-only, originals never modified, no XMP writing | Noiexiftool is read-only; tags, ratings and rotation are stored in the database | YesiExifTool queue writes keywords, caption, rating, rotation into the files | Noiexiftool only strips GPS or sets orientation; edits are not written to originals | YesiWrites to originals or XMP/MIE/EXIF sidecars | No | YesiWrites to embedded metadata or XMP sidecars (sidecar mode configurable) | PartlyiTags to XMP for JPG/PNG/DNG; descriptions EXIF only; sidecars unclear | NoiNo XMP or original-file write-back found; Takeout exports JSON sidecars |
Reads XMP sidecars | YesiReads XMP sidecars and embedded XMP keywords, ratings, dates | Yes | Yesireads XMP sidecar files while indexing | PartlyiHashes .xmp sidecar and re-encodes cache on change; XMP contents not parsed | YesiReads file.ext.xmp sidecars (via exiftool) | No | PartlyiReads XMP sidecars and embedded XMP; never writes | Partlyireads embedded XMP date tags via ExifTool; no sidecar handling found | NoiXMP sidecars skipped on import | YesiReads keywords from XMP and ON1 sidecars (keywords only) | No | Yes | No | YesiReads and writes XMP sidecars | PartlyiReads/writes XMP-dc:Subject tags for JPG/PNG/DNG (community-reported) | NoiNo XMP sidecar reading found; Takeout uses JSON sidecars |
Face regions in metadataReads or writes MWG / Microsoft face regions | YesiReads and writes MWG XMP:RegionInfo face regions | PartlyiReads MWG face regions on extraction when enabled; does not write them | Partlyireads XMP face regions only (PHOTOPRISM_XMP_FACES); no write-back | NoiFaces stored in database only, no MWG/MP region read or write | NoiWrites EXIF/IPTC/XMP keywords only; no MWG/MP regions | No | PartlyiReads MWG face regions only; no write back | No | No | NoiMWG region writing exists only under Debugger.IsAttached | No | PartlyiReads MWG face regions and Google Takeout people; does not write face regions | No | YesiReads and writes MWG face regions in image metadata | NoiFace tags not written to files; forum says they stay in Synology DB | NoiFace data stored internally, not written to MWG/MP regions |
GPX geotaggingGeotag photos from GPS track files | NoiGPX track files are not imported; only GPS already stored in the photo files is read | NoiNo GPX track import found | NoiNo GPX import or parsing anywhere in internal/ or pkg/ | NoiNo GPX import or geotagging | YesiGPX tracks imported and drawn on album maps | PluginiOpenStreetMap plugin supports GPX files; core only lists gpx as an upload MIME type | YesiGPX tracks shown on the map with activity icons | Noino GPX track import | NoiNo GPX parsing or geotagging code | NoiNo GPX parsing or track-based geotagging | NoiNo GPX parser or track geotagging | NoiNo GPX track import found | NoiNo GPX geotagging | YesiGPX track correlator in the geolocation editor matches photo times | NoiNo GPX import documented | NoiNo GPX track import found |
| Editing | ||||||||||||||||
Crop and rotate | YesiRotation stored in the library since 1.6.0; crop and straighten from 1.7.0 in the editor | YesiWeb and mobile crop, rotate 90/180/270 and mirror; web since v2.5.0, mobile since v3.0.0 | PartlyiRotate only for JPG/PNG, written to originals; no crop tool | NoiNo in-app editing; originals are served as-is | PartlyiRotate only; no crop | NoiNo crop/rotate UI; only auto-rotate on upload. Crop Image ext stops at Piwigo 13 | NoiNo editing tools in the app | Noino editing; originals are never modified | PartlyiRotation only; no crop | PartlyiRotation saves EXIF orientation; crop is a client-side preview and is not saved | NoiNo in-app crop or rotate; roadmap lists basic editing as future | PartlyiRotate only; no crop | NoiNo crop or rotate editor | YesiCrop, rotate, free rotation, perspective and ratio crop in the editor | PartlyiRotate via More menu in photo view; no crop documented | YesiCrop, straighten, rotate, perspective, aspect ratio presets |
Adjustments and filters | YesiLight, colour, sharpness and filters in the photo editor, from 1.7.0 | NoiEditor has only crop/rotate/mirror; no exposure, colour, brightness or filter tools; recolor removed on mobile | NoiNo exposure, color or filter adjustments in the app | NoiNo exposure, color or filter adjustments | NoiNo exposure, colour or filter adjustments | No | NoiNo exposure, color or filter edits | Noino exposure, color or filter edits | NoiNo exposure, color or filter adjustments | PartlyiMono and lighten are preview-only in the viewer; nothing is saved | NoiNo exposure, color or filter adjustments | NoiNo exposure, color or filter adjustments | NoiNo exposure, colour or filter adjustments | YesiCurves, levels, HSL, white balance, filters and enhancement tools | NoiFilters are search/browse filters only; no brightness, color or exposure edits documented | YesiBrightness, contrast, saturation, warmth, HDR and filters |
Non-destructive editsOriginal stays untouched, edits can be reverted | YesiEditor keeps original untouched and stores edits separately, from 1.7.0 | YesiEdits stored as a list in asset_edit rows; original file untouched; removeAssetEdits reverts to original | NoiRotation rewrites originals; no edit stack or revert | NoiNo edit stack; nothing to revert | NoiRotate rewrites the stored original; no edit history or revert | No | NoiNo edit feature, so no non-destructive edits | Noiapp has no edits at all; originals read-only | YesiOnly rotation exists; stored in DB, original file untouched, revertible | PlannediREADME lists simple non-destructive editing as in progress; no edit model in code | NoiNo edit pipeline or versions; originals are not edited | PartlyiSidecar edits possible, but overwriteOriginal defaults to true | NoiNo edits at all; originals are never modified | YesiVersioning is on by default: edits saved as versions, original kept and revertible | UnknowniDate/tag/rating edits stored in Photos DB, not written to video files; rotate save behavior unclear | PartlyiDefault Save overwrites original; Revert restores it; Save as copy keeps original |
Trim videos | NoiNo video trimming in the app; the editor covers photos only | NoiEditor is images only (video edits rejected by server); no trim control in web or mobile viewers | NoiNo video trim or cut tool in the app | NoiNo video editing | NoiNo video editing | No | NoiNo video trimming | Noino video editing | NoiVideos are not imported | NoiNo video support | NoiNo video trimming in apps or web UI | NoiNo video trimming | NoiNo video trimming | NoiNo video trim tool; only video slideshow export | NoiOnly metadata edits for videos; trimming requires an external editor | PartlyiVideo edits in app; some video edit features limited to Android with low-RAM limits |
AI editingObject removal, generative or one-tap enhance | PartlyiOnly histogram-based Auto light (from 1.7.0); no generative removal or sky replacement | NoiNo generative or AI edit actions | NoiNo generative or AI edits such as object removal or sky replacement | NoiNo generative or AI edits | NoiNo generative or AI edits | No | NoiNo generative or AI edits | Noino generative or AI edits | NoiNo generative or AI edit features | NoiNo generative or AI edits | NoiNo generative or AI edits; face crop helper is not a photo edit | NoiNo generative or AI edits | NoiNo generative or AI edits | PartlyiRule-based auto-correction and auto-crop only; no generative or object-removal edits | NoiNo generative or AI edits documented | PartlyiMagic Eraser, AI Enhance and Remix; availability varies by region and device |
| Sharing | ||||||||||||||||
Share with other usersOf the same server | YesiAlbums shared with users; whole libraries shared via library share | YesiAlbum editors/viewers and one-way partner sharing | Partlyiguests gain read-only access by opening album or secret links; no direct user-share dialog | NoiSharing is by link only, no user-to-user shares | Yes | PartlyiAdmins grant album access to users or groups; users cannot share on their own | NoiSharing is link-based only | Noino user-to-user sharing | PartlyiWhole-library sharing via invite; members have equal rights, no read-only role in code | PartlyiOnly global Shared Baskets; no per-user photo or album sharing | YesiShare assets to users or groups; web Inbox shows received items | No | No | NoiNo user-to-user sharing | YesiAlbums shared with users with permissions; Shared Space for selected users | YesiAlbums shared with Google Account users; partner sharing |
Share by link | YesiAlbum links at /public/s/{slug}; single-photo share links | Yes | Yesisecret links for albums, moments, months, folders, regions | YesiAlbum and media links, optional password (bcrypt) | YesiPublic albums by unguessable ID; optional password unlock | NoiOnly public permalinks and guest access; no secret or unique share links | YesiSecret sharing key, configurable length, optional password | Noionly Copy Image Link to the instance URL; no secret share links | NoiInvite links only join a library; no photo or album share links | NoiNo share-link model; social share buttons are commented out | PartlyiReceive-by-share-ID route exists; no UI to create a public link found | No | No | NoiNo share-link feature; exports go to third-party web services | YesiUnique links for photos, videos, albums | YesiShared link with unguessable URL; reset by toggling link sharing |
Share whole albumsWith users and by link | Yes | Yes | Partlyialbum links and guest access; no direct album sharing to users | PartlyiAlbum links only; no album sharing with users | Yes | PartlyiAlbum access per user or group via admin permissions; no album links | PartlyiAlbums share as search links; no user-to-user album sharing | No | NoiAlbums cannot be shared with users or by link | NoiNo albums and no share links | NoiSharing is per asset to users/groups; albums and albums-by-link not shared | No | No | NoiNo album sharing with users or by link | YesiAlbums shared with users and by link | YesiAlbums shared with users and by link |
Expiring links | PartlyiAlbum links can expire; single-photo share links have no expiry | YesiExpiry date and optional password on shared links | Yesisecret links take an expiry date | YesiOptional expiry on album and media links; can be changed later | PartlyiOnly temporary signed image URLs expire; album shares do not | No | YesiShares store an expires timestamp | No | NoiInvitations expire; photo share links do not exist | NoiNo share links exist | NoiAn expiry time is stored but not enforced | No | No | NoiNo share links, so no expiry | YesiLink password and expiration date | NoiHelp page shows no expiry; links stay active until link sharing is reset |
Password-protected links | NoiAlbum, photo and public links have expiry and slugs, but no password option | YesiShared links can require a password | PlannediDocs say password protection for share links is planned, not shipped | YesiAlbum and media share links can be password protected (bcrypt) | YesiAlbum share links can be unlocked with a password | PluginiUser Collections plugin: collection share links with password and expiry; not in core (repo is 17.0.0beta1) | YesiSharing links can require a password | Noino share links at all | NoiNo shared links at all | NoiNo share links, so no password protection | NoiShares go to users or groups by account; no password-protected links | NoiNo shared links at all | N/AiNo shared links; single-user local app | NoiNo share links; exports are static files or uploads to web services | YesiShare links protected by access password and optional expiry date | NoiShared album links have no password option in help |
Public gallery page | YesiPublic profile at /public/<username> | NoiOnly per-link share pages; no public profile or gallery per user | No | No | NoiLanding page is instance-wide, not per-user | No | No | No | No | NoiNo public gallery or profile pages | No | No | No | NoiNo public profile or gallery page; HTML gallery export is static files | PartlyiPublic folder links for portfolios; no per-user public profile | NoiNo public profile or gallery page per user found |
Partner sharingShare your whole library with a partner automatically | YesiWhole library shared read-only; new photos appear as added; optional timeline per share | YesiOne-way automatic library sharing with a partner | NoiNo automatic library sharing; direct user-to-user share is only a future item | NoiNo automatic sharing with another account | NoiSharing is per album or user; no automatic whole-library partner share | No | NoiNo automatic library sharing with another account | Noino user accounts, so no partner sharing | PartlyiLibrary invite adds a member with equal rights; not automatic and no read-only role | NoiNo account-to-account library sharing; only global shared baskets | NoiOnly per-asset sends to users or groups; no automatic library sharing | NoiNo partner sharing | N/AiSingle-user app; no accounts or sharing | N/AiSingle desktop app with no accounts or server; no partner sharing | PartlyiShared Space is a folder-based library for selected users; no automatic whole-library partner share | YesiPartner sharing of one partner's photos by person or date |
Collaborative albumsOthers can add photos to a shared album | YesiAlbum members as viewer or contributor; contributors add their own photos | YesiAlbum editor role can add photos | NoiGuests get read-only access to shared albums; members cannot add photos | NoiOnly the owner manages albums; other users cannot add photos | PaidiSharing with users is free; letting them upload into shared albums is Supporter Edition | NoiOnly admins can upload (ACCESS_ADMINISTRATOR); normal users cannot add photos | NoiShares are read-only links; other users cannot add photos | Noino shared albums or user contributions | YesiAny library member can add photos to a library album; libraries are shared | PartlyiShared baskets are global and any user can add to them; no albums | NoiAlbums are owner-managed; others cannot add photos to a shared album | NoiNo shared or collaborative albums | N/AiSingle-user app; no albums or accounts | N/AiNo multi-user or server model; no shared albums | YesiShared albums with per-user permissions; Shared Space for collaboration | YesiCollaborate option lets others add photos; owner can turn off |
Guest upload linksGuests upload without an account | NoiNo guest upload link; uploading needs an account | YesiShared link can let recipients upload | NoiShare dialog only offers WebDAV upload to external servers, not guest upload links | NoiNo upload endpoint or guest upload link | PaidiAnonymous (guest) uploads to albums are a Supporter Edition feature | No | NoiUpload needs a logged-in user (default minimum role Admin); no guest upload link | Noino upload endpoint; files read from disk | NoiInvite links create accounts or join libraries; no guest photo upload | NoiNo upload endpoint; photos are indexed from folders | NoiNo guest upload link; uploads need a logged-in account | NoiNo upload controls or guest upload links | N/AiSingle-user app; no guest access | N/AiNo server; guests cannot upload. Export plugins only push out from the desktop | YesiPhoto Request public links let guests upload without an account | PartlyiAlbum link lets holders add photos when Collaborate is on; account requirement unverified |
Download originals | YesiSingle originals or a zip of the selection | YesiSingle originals, zip archives, edited or original version | Yesisingle originals, exports, and ZIP downloads | YesiOriginal or resized versions per media; album as zip | YesiSingle originals and zip archives; RAW gated by raw_download_enabled | YesiOriginal and alternate formats, one file at a time; no zip download | YesiZip download of folders and searches; single photo download in lightbox | Partlyioriginals open via /files/{id}/original URL; no zip or bulk download | YesiSingle original file via unguessable UUID URL; no zip | YesiSingle image or zip via basket and export | YesiDownload originals; zip for multiple assets | YesiDownload ZIP of selected assets | YesiOne original at a time, as a file save; no zip | N/AiDesktop app: files are already local; use Export tools to copy out | YesiDownload with optional JPEG conversion (EXIF dropped); zip not stated | YesiDownload originals from web; bulk export via Takeout |
| Users and security | ||||||||||||||||
Multiple users | Yes | Yes | PartlyiCommunity has admin, guest and visitor roles only; user/viewer roles and web user admin need Essentials/Plus | Yes | Yes | Yes | Yes | Noino user accounts or authentication | Yes | YesiAdmin, User, ReadOnly roles; opt-in via Enable Authentication | Yes | NoiNo visitor accounts; settings say per-user levels are not yet implemented | NoiSingle-user desktop app; server binds 127.0.0.1 | NoiSingle-user desktop app with no in-app accounts (use separate OS accounts) | YesiPersonal Space per user plus Shared Space | YesiEach person signs in with their own Google Account |
Roles and permissionsBeyond admin and user | YesiPer-album viewer and contributor roles on top of admin and user | PartlyiGlobal admin/user only; album editor/viewer roles; no custom roles | PartlyiCommunity has admin, guest, visitor; user and viewer roles need Essentials or Plus | NoiOnly an admin boolean; per-user root paths but no role model | PartlyiFixed per-user flags (admin, upload, own settings) plus per-album grants; no custom roles | YesiStatuses webmaster, admin, normal, generic, guest, plus per-album group permissions | YesiFive roles: LimitedGuest, Guest, User, Admin, Developer | Noino users or roles | PartlyiInstance admin (is_staff), library owner and member; no viewer or per-album rights | YesiAdmin, User and ReadOnly (viewer) roles; no per-album rights | NoiAdmin flag plus internal bot and cast flags only; no viewer or per-album rights | NoiOnly admin and user; per-user levels not implemented | N/AiSingle-user app; no accounts | N/AiNo users or roles; single local user | PartlyiAdmin can restrict sharing for non-admins; per-user folder rights in Shared Space | NoiNo roles beyond owner, collaborator and viewer on albums |
LDAP login | PartlyiNot direct; LDAP users come in through an OIDC broker (Keycloak, Authelia) | NoiLogin via password, OAuth/OIDC and passkeys only | PaidiLDAP/AD login is Pro only; Community code has only the provider type | NoiLocal accounts only; no LDAP/OIDC code | PaidiLDAP login requires Supporter Edition | PluginiLDAP Login extension; its listed compatibility stops at Piwigo 14 | No | No | No | NoiIdentity-based login only | No | No | No | NoiNo LDAP login | PartlyiDSM supports LDAP/domain users; Photos needs per-user app privilege and home folder; older reports of limited access | NoiGoogle Account sign-in only |
Single sign-on (OIDC) | YesiOpenID Connect single sign-on via allauth | YesiOAuth/OIDC with auto-launch; Authelia, Authentik, Keycloak, Google documented | YesiOpenID Connect SSO in Community; group-to-role mapping is Pro only | NoiLocal accounts only; no OIDC or OAuth | Yesi13 OAuth/OIDC provider types, not gated by SE in routes | PluginiOpenID Connect ext (jasperweyne), last rev 2021; forum says repo is unmaintained | YesiOpenID Connect login with auto-create and allowed-domain options | Noino authentication; use a reverse proxy for access control | NoiNo OIDC, OAuth or SAML code | NoiASP.NET Identity login only; no external OIDC or OAuth provider | NoiPassword and JWT login only; no OIDC or OAuth provider support | NoiNo OIDC, OAuth or SSO | N/AiSingle-user app; no login system | N/AiDesktop app with no login server; web service plugins use their own OAuth | NoiUses DSM accounts; no OIDC/SSO for Photos documented | NoiGoogle Account sign-in only; not an OIDC provider for other apps |
Two-factor authentication | NoiNo TOTP, passkey or other 2FA code in apps/backend or apps/frontend | PartlyiPasskey sign-in with user verification only; no TOTP and no second factor on password login | YesiTOTP two-factor with recovery codes | NoiPassword login only; no TOTP or passkeys | PartlyiPasskeys (WebAuthn) only; no TOTP second factor | PluginiOfficial Two Factor Authentication (2FA) ext: TOTP, email codes, recovery codes | NoiNo TOTP or passkey support | Noino authentication at all | NoiNo TOTP or passkey code | NoiNo TOTP or passkey code in the identity pages | NoiNo TOTP or passkey login flow | NoiNo 2FA, TOTP or passkeys | N/AiSingle-user app; no accounts | N/AiNo in-app accounts to protect with 2FA | PartlyiInherits DSM account 2FA; no Photos-specific 2FA setting | YesiGoogle Account 2-Step Verification and passkeys |
Storage quotas | NoiNo per-user storage quota | YesiPer-user quotaSizeInBytes | PaidiPer-user quota (UsersQuota) is Pro only; Community has instance-wide FILES_QUOTA | NoiNo storage quotas | PaidiPer-user storage/upload quotas are Supporter Edition | No | NoiNo per-user storage quotas | N/Aisingle-instance server without user accounts | NoiNo per-user storage quota | NoiNo per-user storage quotas | NoiOnly free-space display; no per-user storage quota | NoiNo per-user storage quotas | N/AiSingle-user app; no accounts | N/AiNo server-side storage; collections are local folders | PartlyiDSM per-user quotas only; no Photos-level storage quota | PartlyiEach account has 15 GB shared quota; no admin-set per-user Photos quota |
API keysPersonal tokens for scripts | NoiOnly username/password JWT tokens (5 minute access token); no personal API keys | YesiPersonal API keys for users | YesiApp passwords and client credentials for scripts and tools | NoiOnly session tokens from login; no user-managed API keys | YesiOne personal API token per user; no scopes or multiple keys | Yes | NoiOnly session login; internal /pgapi has no personal tokens | NoiREST and MCP endpoints have no token or key auth | NoiOnly JWT login tokens; no personal API keys | NoiOnly a session JWT issued at login; no personal tokens | PartlyiUsername and password exchange for JWT via /api/auth/token; no user-managed key list | NoiOnly PS_PREVIEW_API_TOKEN for file browser previews; no personal API keys | N/AiSingle-user app; localhost API has no keys | N/AiNo HTTP API server, so no API keys | NoiNo official API or token system; only unofficial community API notes | NoiOAuth clients via Google Cloud only; no personal API keys |
| Apps | ||||||||||||||||
Web app | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | YesiBlazor WebAssembly front end | YesiBuilt-in web UI served by lomod: gallery, inbox, upload, local import, users | Yes | YesiSame page in a native window or in the browser with --browser | NoiDesktop Qt/C++ application only | Yes | YesiWeb app at photos.google.com |
Installable web app (PWA) | PartlyiManifest and icons for Add to Home Screen; no service worker or offline cache | YesiInstallable web app manifest, display standalone | Yes | YesiStandalone manifest; service worker registered in production builds | No | No | PartlyiWeb app manifest (standalone); no service worker found | Partlyiweb app manifest only, no service worker or offline mode | PartlyiWeb app manifest only; no service worker | YesiWeb manifest plus registered service worker | No | YesiInstallable; service worker is minimal (no offline cache) | No | NoiDesktop app, not a web app | UnknowniNo official PWA or add-to-home-screen guidance found; only native iOS/Android/TV apps documented | PartlyiHelp refers to a 'Photos Web App' that can run for backup; no official install steps; manifest not verifiable |
iOS app | PlannediExpo app in apps/mobile; never published to App Store or TestFlight | Yes | Noino official app; third-party Stream app only | NoiOfficial site says iOS app no longer maintained or on the App Store | PlannediLychee-Mobile pre-release, TestFlight only; no public store listing | YesiOfficial Piwigo Mobile app listed on piwigo.org | No | No | NoiThe App Store and Play Store listings linked from photonix.org return 404 | NoiNo iOS app | YesiLomoMobile on App Store; $1.99 one-time purchase per lomorage.com | No | No | NoiNo official iOS app; no companion found on digikam.org | YesiiOS 17+ required from mobile 2.4 | YesiOfficial Google Photos iOS app |
Android app | PlannediExpo app unpublished; old RN app unmaintained; UhuruPhotos (third party) in Play beta | Yes | Noino official app; third-party Gallery for PhotoPrism only | No | PlannediLychee-Mobile pre-release, Play internal testing only | YesiOfficial Piwigo Mobile app listed on piwigo.org | No | No | NoiThe App Store and Play Store listings linked from photonix.org return 404 | NoiNo Android app | YesiLomoMobile on Google Play; $1.99 one-time purchase per lomorage.com | No | No | NoiNo official Android app; only third-party DigikamCompanion reads the database | YesiAndroid 11+ required from mobile 2.4 | YesiOfficial Google Photos Android app |
Camera-roll backupAutomatic upload from a phone | PlannediCamera-roll backup is in apps/mobile source only; UhuruPhotos does it today (third party) | Yes | Pluginicamera-roll backup via third-party PhotoSync or FolderSync over WebDAV | No | No | PartlyiiOS camera-roll auto-upload reported working; Android results mixed in forum reports | No | No | PlannediCamera-roll auto upload planned, not available per photonix.org | NoiNo mobile app | YesiAutomatic background backup, resumable uploads, Live Photo packing | No | No | NoiNo mobile app, so no camera-roll backup | YesiAutomatic backup, focused backup, customizable destinations | YesiAutomatic backup of device photos and videos |
Desktop app | NoiWeb app plus unpublished Expo mobile app; the Windows build is a server, not a desktop client | NoiNo desktop client; native/ is a Rust core for the mobile app only | NoiPWA install only; no native desktop app | NoiWeb app and server only; no desktop client | NoiWeb app only; Lychee-Mobile is pre-release; no desktop client | NoiNo official desktop app; WebCatalog wrapper is third-party | NoiWeb app only; PWA manifest is partial and not a desktop app | Noisingle binary runs a local server; UI opens in browser, no native GUI app | NoiOnly the web UI and mobile thin clients; no desktop client | YesiElectron client for Windows, macOS and Linux that opens your server | PartlyiMac and Windows installers run lomod as a desktop service; UI is the browser web UI, no native client | YesiNative desktop app for Windows, macOS and Linux with tray, since v2026.4 | YesiThe product itself: native window (pywebview) or browser mode | YesiThe product itself is a native desktop app (Windows, macOS, Linux) | PartlyiSynology Image Assistant helper for HEIC/HEVC previews only; no full desktop client | NoiWeb app only at photos.google.com; no Photos desktop app found |
Cast to TVChromecast, AirPlay or a TV app | NoiNo Chromecast, AirPlay or TV app | PartlyiExperimental Google Cast from web only; no AirPlay; needs HTTPS and public DNS | PluginiGallery for PhotoPrism (third-party) runs on Android TV; web has only an experimental video Remote Playback cast button | NoiNo cast or TV support | NoiFrame mode is a browser page for a display; no cast support | PluginiCommunity Chromecast plugin only; no official TV or cast app | NoiNo cast SDK; Photo Frame link works in a kiosk browser only | Noino cast or TV app | PlannediListed as a planned idea on photonix.org; no casting code | NoiNo casting or TV app | PartlyiChromecast cast via server API only; no cast button in apps or web UI; no AirPlay or TV app | NoiNo Chromecast, AirPlay or TV app | NoiNo cast or TV app | PluginiDLNA/UPnP server via Media Server plugin; no Chromecast or AirPlay | YesiApple TV and Android TV apps; AirPlay and Chromecast casting | YesiCast to Chromecast; Google TV ambient screensaver shows photos |
Dark mode | Yes | YesiLight, dark and system theme options | Yes | YesiSetting: same as system, light, or dark | Yes | PluginiNot in default theme; Bootstrap Darkroom and modus themes offer dark colours | YesiLight, dark and auto modes | Yesilight, dark and auto color modes | YesiDark-only UI; no light theme or toggle | YesiGreen (black) and grey themes are dark | No | YesiAuto, light, or dark theme | YesiA header button toggles light and dark | PartlyiFollows system Qt/KDE palette; Breeze Dark icon theme option; no dedicated dark palette | YesiLight and dark, can follow browser | YesiFollows the system dark theme on Android and iOS |
Translated interface | Yes33 languages | Yes89 languages | Yes45 languages | Yes18 languages | Yes23 languages | Yes72 languages | Yes16 languages | NoEnglish only | NoEnglish only | NoEnglish only | Partly2 languagesiWeb UI in English and Chinese; mobile app in English | NoEnglish only | NoEnglish only | Yes62 languages | Yesabout 21 languagesiLanguage count from the App Store listing | Yes |
| Library and storage | ||||||||||||||||
Indexes folders in placeNever moves or renames your originals | PartlyiIndexes in place; moves files only when the owner asks (Move to folder) | PartlyiExternal libraries are indexed in place and never renamed; force delete or trash expiry can unlink the original unless mounted :ro | Partlyiindexing never moves originals; Import copies or moves files into originals with a path template | YesiScans in place; originals only read; albums mirror folders | PartlyiCopies originals by default; symlink import option keeps originals in place | YesiSynchronize indexes local folders in place (path stored); writes pwg_representative/pwg_format subfolders | YesiDirectory-first; originals are never modified | Yesiindexes directories in place; originals never modified | PartlyiImport-only paths index in place; Store paths import into app storage (copy or move) | PartlyiIndexed in place, but UI can move originals and trashcan moves files | PartlyiLink import mode leaves originals in place; default phone uploads use Lomorage YYYY/MM/DD layout | PartlyiIndexes in place; UI edits may overwrite originals (overwriteOriginal default true) | YesiIndexes folders in place; cache lives in app data folder | YesiIndexes files in place; moves or renames only on explicit user action | YesiAlbums label files without copying; folder views | NoiBacked-up originals are stored in the Google Account, not indexed in place |
Copies files into its own storage | PartlyiIndexes in place by default; uploads are written into the server's uploads folder | YesiUploads and CLI imports are copied into UPLOAD_LOCATION | PartlyiImport copies into originals folder; default is indexing in place | NoiCache holds derived JPEG/MP4 only, originals stay in place | YesiDefault copies originals into own storage | YesiWeb uploads move originals into the galleries/ tree | No | Noiindexes in place; only small thumbnails stored in its SQLite cache | YesiStore-type library paths import into app storage under PHOTO_OUTPUT_DIRS | NoiIndexes in place; copies only on explicit export or download | YesiCopy import mode recommended in web UI for USB/SD; phone uploads stored by server | PaidiCopy into library is PLUS-only; default is indexing in place | NoiStores thumbnails and vectors, not copies of originals | NoiIndexes files in place; does not keep its own copy of originals | NoiUploads stored in user home or /photo Shared Space folder | YesiUploads are copied into the Google Account storage |
Works with a read-only library | PartlyiRead-only mount works, but uploads, deletes and metadata writeback are disabled | YesiRead-only mounts supported; deletes and write-backs are blocked on them | YesiRead-only Mode global option | YesiExample compose mounts the photo library read-only | PartlyiSymlink import keeps originals read-only, but derivatives still written | PartlyiSync does not rewrite originals, but video posters and extra formats write beside them | YesiPhoto folder is never modified | Yesidocumented to run from a read-only mount | PartlyiScanning only reads originals, but import moves files into library; no documented read-only mount support | Partlyi--readonly disables indexing and thumbnails; needs a prior index | PartlyiLink import does not modify originals; base dir must be writable; not tested | PartlyiCatalogs in place without copying, but writes .uuid files to volume roots and edits to originals; no read-only mode | YesiServer only reads photos; cache in app data folder. Read-only mount not tested | PartlyiRead-only files are handled (XMP sidecar-only writes); no read-only catalog mode found | PartlyiNo true read-only tier; Custom permission users in Shared Space, with timeline/search limited to Full Access | N/AiHosted service |
Extra folders next to uploads | YesiExtra library folders added by an admin are scanned in place next to the upload folder | YesiIndex external read-only or writable folders alongside uploads | PartlyiOne originals folder; other folders must be mounted into it or imported (copied) | YesiEvery library is an external folder (root path); there is no separate upload store | PartlyiSymlink import keeps originals in place; default import copies into own storage | YesiSynchronize indexes extra server folders in place alongside uploads | NoiSingle Images folder root; no extra library roots | Yesiindexes folders in place; originals never copied or changed | YesiImport-in-place paths index folders the app does not own | YesiAny folder mounted under /pictures is indexed in place; there is no separate upload store | PartlyiLink import symlinks files from outside folders once; no watched external library | YesiIndexes folders in place; copy into library is PLUS-only | PartlyiOne folder open at a time; Apple Photos read-only on Mac only | YesiSeveral collection roots, any folder can be indexed in place | PartlyiIndexes folders under Photos/ and /photo only; no arbitrary external library documented | NoiNo index of external folders alongside the library |
Upload in the web app | Yes | Yes | Yes | No | Yes | YesiChunked browser upload (plupload); also FTP and server-folder import | YesiDrag-and-drop; off by default; minimum role Admin | Noifiles are read from disk; no upload endpoint | NoiPhotos come from folders, watch or CLI; web UI only uploads avatars | NoiNo upload endpoint; photos are indexed from the /pictures folder | YesiBrowser upload page (drag and drop) plus mobile backup | NoiImport is from folders/drives; no web upload control found | NoiPhotos are added by putting files in the folder; only an image search upload exists | N/AiDesktop app: import from folders and cameras instead of web upload | YesiDrag-and-drop, max 5,000 files per upload; Photo Request links | YesiUpload through photos.google.com and mobile apps |
Picks up new files automaticallyFile watcher or scheduled scan | YesiScheduled scans and a directory watcher pick up new files | YesiLibrary scan schedule plus experimental file watcher | YesiScheduled rescans, plus auto-index after WebDAV uploads with a safety delay | YesiPeriodic scan with admin-set interval; setPeriodicScanInterval | PartlyiNo file watcher; lychee:sync must be run by cron; weekly scheduler only sends notifications | NoiSync is run manually from admin; no file watcher or built-in schedule | PartlyiFolders re-checked on browse (cache timeout) plus scheduled Indexing job; no file watcher | Partlyifile watcher on expanded folders picks up new subfolders; new photos still need a Rescan | YesiPer-path inotify watcher plus periodic rescan command | YesiFile watcher picks up changes automatically; README says new files within 30 minutes | NoiLibrary scans only run when started (POST /assets/scan or local import); mount monitor covers drives, not new files | YesiScheduled sync via syncCron plus filesystem watching | YesiRescans the folder every minute; --no-watch turns it off | YesiWatches collection folders and rescans changed ones while running; no schedule | YesiNew files in Photos folders are indexed automatically; schedule not documented | YesiAutomatic backup of new device photos and videos |
Google Takeout import | YesiGoogle Takeout import keeps dates, locations and descriptions from the JSON files | PluginiVia community tool immich-go, not built in | YesiGoogle Takeout JSON metadata import keeps dates and locations | NoiNo Google Takeout import | NoiNo Google Takeout import | NoiNo Takeout reader; forum advice is to unzip and run Synchronize | NoiNo Google Takeout import | Noino Google Takeout import | NoiNo Google Takeout or JSON sidecar import | NoiNo Google Takeout import | NoiNo Google Takeout import or JSON metadata reader | YesiReads Google Takeout JSON for people and albums | NoiNo Google Takeout import | NoiNo Google Takeout import; Takeout JSON sidecars are not parsed | PartlyiCopy Takeout files into Photos folder; JSON sidecars skipped so dates and GPS are not kept | NoiTakeout is export-only; no Takeout archive import found |
S3 object storage | NoiNo S3 or object-storage backend; storage is local paths (Nextcloud via WebDAV client) | No | No | NoiLocal filesystem only | YesiS3 storage via use-s3 feature flag and AWS env vars | NoiStorage is local filesystem; sync is local folders | No | No | Noibackend_type 'S3' choice exists but no S3 code and no boto dependency | NoiNo S3 or object storage client | No | No | No | NoiLocal filesystem collections only; no S3 backend found | NoiStorage is NAS DSM folders only | NoiNo S3 or object storage backend |
Background jobs page | YesiJobs page with job history, progress and worker logs | YesiAdmin jobs page with pause, retry and concurrency controls | PartlyiLibrary page shows a progress bar with ETA for indexing only; no job list | PartlyiScan progress notifications and worker count only; no job list | YesiAdmin jobs page lists running and pending jobs | NoiMaintenance runs in-request; no job queue or jobs page | YesiAdmin scheduled-jobs page shows job progress | Yesitask list in toolbar; /tasks API lists and stops tasks | PartlyiNotifications panel shows task progress and pause; no jobs admin page | YesiAdmin task list with pause and resume of background work | PartlyiLocal import page shows progress for its own scan only; no admin page for background jobs | YesiSync page shows activity, progress and timings | YesiActivity line under search bar and Info show scan and model progress | YesiBatch Queue Manager and Maintenance window show job progress | PartlyiNo job dashboard; thumbnail progress in DSM taskbar pop-up and a 'photos to be discovered' count | NoiNo admin jobs page; hosted service |
| Integrations | ||||||||||||||||
Documented API | YesiDocumented REST API with Swagger at /api/swagger; JWT and Basic auth | YesiDocumented REST API with OpenAPI spec | YesiDocumented REST API with swagger spec | NoiGraphQL only; no documented REST API | YesiREST API v2 and v3 with generated OpenAPI docs | YesiJSON/REST web service at ws.php | PartlyiInternal /pgapi used by the UI; undocumented, no tokens for third parties | Yesidocumented OpenAPI 3.0 API; mostly read-only, writes limited to tags and tasks | PartlyiGraphQL only, undocumented; GraphiQL only when DEBUG is on | PartlyiInternal JSON controllers used by the UI; Swagger only in debugger builds; undocumented | PartlyiBroad HTTP API exists, but no published API docs and several endpoints return sample data | NoiInternal /api routes serve the web UI; no documented third-party API | PartlyiLocalhost JSON API exists but is undocumented and not for third parties | NoiNo HTTP API; only a DBus adaptor for database change notifications | NoiNo official documented HTTP API for third-party clients | PartlyiLibrary API documented; broad read scopes removed 31 Mar 2025; Picker API for selection |
Command-line tool | YesiManagement commands: scan, createuser, save_metadata, backup_database and more | PartlyiImmich CLI only uploads and checks versions; admin tasks use server container commands | Yesiphotoprism CLI for index, import, users, backup and maintenance | NoiOnly the server binary; scans and admin run via GraphQL | Yesiartisan lychee:sync with dry-run, symlink and delete options | Partlyitools/piwigo_upload.pl and remote_sync.pl use the web API; no admin CLI | PartlyiOnly --run-diagnostics and config flags; no import or maintenance commands | Yesiflags: -scan, -vacuum, -bench, -dummy, -gen-photos, -version | YesiManagement commands for import, rescan, users, libraries and housekeeping | PartlyiOnly server launch flags (library, config, port, readonly); no import or admin commands | Yesilomoc command for import, check, migrate, user and home-dir maintenance | Yesisync, list, info, doctor, fix, logtail commands | PartlyiOpens a folder and sets flags only; no import or admin commands | PartlyiCLI only for database directory, config and camera download; no import or maintenance | NoiNo official command-line tool documented | NoiNo official command-line tool found |
WebDAV | NoiWebDAV is only a client for Nextcloud; LibrePhotos does not serve WebDAV | NoiNo WebDAV server code | YesiBuilt-in WebDAV server for originals, optional per user | NoiNo WebDAV server | NoiNo WebDAV routes or dependency | No | NoiNo WebDAV server | Noino WebDAV server | NoiNo WebDAV server | NoiNo WebDAV server | YesiBuilt-in WebDAV on port 8004 with user authentication | NoiNo WebDAV server | NoiNo WebDAV server | NoiNo WebDAV server; FTP/SFTP is a transfer plugin only | PartlyiWebDAV Server package exposes Photos folders as files; not the Photos library | NoiNo WebDAV access |
DLNA / UPnP | No | No | No | No | No | No | No | No | No | NoiNo DLNA or UPnP server | No | No | No | PluginiMedia Server tool plugin provides UPnP/DLNA server | PluginiDLNA is the official Media Server package, which can serve Photos shared folders; Photos itself has none | NoiCasts to Chromecast and smart displays; no DLNA server |
Plugins | NoiNo plugin or extension loader | YesiWASM plugin system with SDK and official immich-plugin-core shipped as Workflows in v3.0.0; external plugins behind flag | NoiNo plugin or extension system; customisation via vision.yml and config only | NoiNo plugin or extension system | NoiNo plugin API; only custom CSS/JS injection and webhooks | YesiExtension system with piwigo.org/ext catalogue | YesiServer-side extension system with minimal UI hooks | Noino plugin system; AI runs as separate photofield-ai service | NoiNo plugin or extension system | NoiNo plugin or extension API | NoiNo plugin or extension system | NoiNo plugin or extension system | NoiNo plugin system | PartlyiBuilt-in dplugins with enable/disable; loader scans plugin dir but no documented extension API or store | NoiNo plugin system; only separate third-party DSM packages such as Today in Years | NoiNo plugin or extension system |
| Deployment and project | ||||||||||||||||
Photos stay on your hardware | YesiPhotos stay on your own disks; only an optional online geocoder receives coordinates | YesiSelf-hosted; AGPL-3.0 and no cloud dependency for core features | YesiSelf-hosted; originals and index stay on the server you run | YesiPhotos stay on the server's filesystem; no external storage | YesiSelf-hosted; local disk by default, optional S3 storage | Yes | YesiSelf-hosted; photos stay on your disk | Yesiruns entirely on your own hardware; photos read from your disks | YesiPhotos and database live on hardware you run (Docker volumes) | YesiPhotos stay on the server's own disks; indexes in place | YesiPhotos stored on user-owned disks and NAS mounts | YesiRuns locally; photos stay on user hardware | YesiPhotos stay on the user's own computer | YesiPhotos and database stay on local disk you control | YesiPhotos stored in DSM home or /photo folders on your own NAS | NoiPhotos stored in Google's cloud |
Docker image | YesiOfficial Docker image; Docker Compose and Unraid templates | YesiOfficial Docker Compose images | YesiOfficial Docker images with compose examples | YesiOfficial image on Docker Hub; multi-arch build in CI | YesiOfficial ghcr.io image plus compose files | YesiOfficial piwigo/piwigo image on Docker Hub; docs have a Docker install guide | YesiDocker is the recommended install method (Alpine and Debian images) | Yesiofficial image ghcr.io/smilyorg/photofield; compose file included | YesiOfficial image photonixapp/photonix on Docker Hub; compose example provided | YesiOfficial webreaper/damselfly image on Docker Hub (amd64 only) | YesiOfficial images lomorage/amd64-lomorage and raspberrypi-lomorage via lomo-docker | YesiOfficial Docker image; not for Windows Docker Desktop hosts | NoiNo Dockerfile or compose file | NoiNo official Docker image or compose file | N/AiSynology NAS package (DSM), not a container | N/AiHosted service |
ARM64Raspberry Pi, Apple Silicon | YesiARM64 images built in CI; install docs list ARM64 as supported but slower | Yesiamd64 and arm64 officially supported | YesiARM64 compose file and Raspberry Pi image | YesiCI builds linux/arm64 Docker images via buildx | YesiMulti-platform image built natively for linux/amd64 and linux/arm64 | YesiPHP app; linuxserver image is multi-arch with arm64 (community image) | YesiDocker images for amd64 and arm64v8; 32-bit ARM no longer built | Yesilinux/arm64 binaries and multi-arch Docker builds via buildx | YesiCI builds linux/amd64 and linux/arm64; Dockerfile compiles for non-amd64 | NoiDocker Hub has amd64 images only; makedocker.sh builds amd64, no arm64 release | YesiRaspberry Pi and ARM64 install guides; ARM cross-builds in repo | PartlyiShips linux-arm64 and mac-arm64 tool binaries; no ARM server statement found | YesiApple Silicon Mac app; Windows zip is x64 only | PartlyiOfficial arm64 build for macOS Apple Silicon only; Linux and Windows builds are x86-64 | PartlyiARM Synology models possible; face and object recognition limited to listed models | N/AiHosted service |
Runs natively on WindowsWithout Docker or WSL | YesiWindows standalone build runs without Docker or WSL, with self-update | NoiWindows only via Docker Desktop or WSL 2 | NoiWindows only through Docker Desktop or WSL; no native Windows install | NoiSupported platforms list Linux and Docker only; no Windows build target | PartlyiNo Windows guide; manual install needs PHP, a web server and a database | PartlyiRuns on PHP+MySQL under IIS or XAMPP (community guides, dated); no official Windows installer | PartlyiNative Node.js install possible but unsupported; no Windows install docs | Yesiwindows/amd64 and windows/arm64 single-binary builds, no WSL or Docker needed | NoiDocker-based deployment only; no native Windows install path | PartlyiWindows server binaries not produced every release; author says non-Docker unsupported | YesiWindows installer runs lomod natively without Docker or WSL | YesiDesktop app and PhotoStructure for Node.js run on Windows without Docker | YesiWindows zip with embedded Python; no WSL or Docker needed | YesiOfficial Windows installer and portable build, no WSL or Docker | N/AiNAS package; Image Assistant is only a helper app | N/AiHosted service; used via browser |
Older CPUsWorks without AVX | NoiNeeds a CPU with AVX; on Proxmox set the VM CPU type to host | Noiamd64 ML needs x86-64-v2 since v3; last x86-64-v1 release is v2.7.5 | Partlyiruns, but slow or crashes on legacy hardware; not tested there | UnknowniNo AVX/CPU requirement or support claim in README or Dockerfile; Dockerfile strips -march=native from go-face | UnknowniNo AVX requirement in core (PHP/FrankenPHP); sidecar CPU requirements not documented | YesiPHP application; no CPU-specific ML code in core | UnknowniNo AVX or CPU requirement stated in src/docs; native deps sharp 0.34.2 and ffmpeg-static 5.3.0 not verified | UnknowniNo AVX or CPU requirement stated; photofield-ai README silent on AVX; ONNX Runtime CPU requirement not verified | NoiTensorFlow 2.21 is a hard dep; official TF x86 wheels use AVX (since 1.6); 2.21 not explicitly confirmed | UnknowniONNX/FaceONNX ML; no CPU floor documented; ORT x64 prebuilts reportedly need AVX2 (third-party), .NET package unverified | Unknown | PartlyiREADME says 64-bit Intel/AMD; tools/ also ships arm64 binaries | UnknowniSearched requirements, docs and ORT wheel info; no AVX or CPU minimum stated; ORT wheels unverified | PartlyiNo AVX need found, but SSE4.1 crashes on pre-SSE4.1 CPUs (Athlon II, bug 465548) | UnknowniFace/object recognition gated by NAS model list; no published AVX or CPU instruction requirement found | N/AiHosted service |
Install methods | Docker, Compose, Kubernetes, Unraid, Windows zip | Docker Compose, Kubernetes (Helm), NAS apps | Docker, Kubernetes, NAS apps, Raspberry Pi, FreeBSD | Docker, Linux binary, AUR, NixOS, Unraid, TrueNAS | Docker, PHP web host | PHP web host, Docker, paid hosting | Docker, Node.js | Docker, single binary (Windows, macOS, Linux) | Docker Compose | Docker, binaries for Windows, macOS, Linux | Windows/macOS installers, apt/rpm, Raspberry Pi image, Docker | Docker, Node.js, desktop app (Windows, macOS, Linux) | macOS DMG, Windows zip, from source on Linux | Windows, 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+ cores | 6 GB RAM (8 GB recommended), 2+ cores | 4 GB RAM (8 GB recommended), 2+ cores | Not documented | Not documented (PHP 8.4) | Not documented (PHP, MySQL) | Not documented; aimed at Raspberry Pi class hardware | Not documented; SSD recommended | Not documented; runs on a Raspberry Pi 4 | Not documented | Not documented; runs on a Raspberry Pi | 64-bit CPU; RAM not stated | Not documented; 500-700 MB model download | 4 GB RAM (16 GB for AI features) | Synology NAS; AI features only on listed models | N/A |
License | MIT | AGPL-3.0 | AGPL-3.0 | AGPL-3.0 | MIT | GPL-2.0 | MIT | MIT | AGPL-3.0 | GPL-3.0 | MIT | proprietary | MIT | GPL-2.0-or-later | proprietary | proprietary |
GitHub starsOn 2026-11-13 | 8.2k | 119.1k | 40.4k | 6.6k | 4.3k | 3.9k | 2.3k | 618 | 2k | 1.8k | 0 | 292 | 117 | 807 | N/A | N/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.