2025-08-21 17:15:11 -05:00
# openapi
Immich API
This Dart package is automatically generated by the [OpenAPI Generator ](https://openapi-generator.tech ) project:
2026-07-14 21:10:19 +00:00
- API version: 3.0.3
2026-07-21 02:06:23 +02:00
- Generator version: 7.24.0
2025-08-21 17:15:11 -05:00
- Build package: org.openapitools.codegen.languages.DartClientCodegen
## Requirements
2026-07-21 02:06:23 +02:00
Dart 2.17 or later
2025-08-21 17:15:11 -05:00
## Installation & Usage
### Github
If this Dart package is published to Github, add the following dependency to your pubspec.yaml
```
dependencies:
openapi:
git: https://github.com/GIT_USER_ID/GIT_REPO_ID.git
```
### Local
To use the package in your local drive, add the following dependency to your pubspec.yaml
```
dependencies:
openapi:
path: /path/to/openapi
```
## Tests
TODO
## Getting Started
Please follow the [installation procedure ](#installation--usage ) and then run the following:
```dart
import 'package:openapi/api.dart';
// TODO Configure API key authorization: cookie
//defaultApiClient.getAuthentication< ApiKeyAuth > ('cookie').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication< ApiKeyAuth > ('cookie').apiKeyPrefix = 'Bearer';
// TODO Configure API key authorization: api_key
//defaultApiClient.getAuthentication< ApiKeyAuth > ('api_key').apiKey = 'YOUR_API_KEY';
// uncomment below to setup prefix (e.g. Bearer) for API key, if needed
//defaultApiClient.getAuthentication< ApiKeyAuth > ('api_key').apiKeyPrefix = 'Bearer';
// TODO Configure HTTP Bearer authorization: bearer
// Case 1. Use String Token
//defaultApiClient.getAuthentication< HttpBearerAuth > ('bearer').setAccessToken('YOUR_ACCESS_TOKEN');
// Case 2. Use Function which generate token.
// String yourTokenGeneratorFunction() { ... }
//defaultApiClient.getAuthentication< HttpBearerAuth > ('bearer').setAccessToken(yourTokenGeneratorFunction);
final api_instance = APIKeysApi();
2026-04-15 15:58:26 -04:00
final apiKeyCreateDto = ApiKeyCreateDto(); // ApiKeyCreateDto |
2025-08-21 17:15:11 -05:00
try {
2026-04-15 15:58:26 -04:00
final result = api_instance.createApiKey(apiKeyCreateDto);
2025-08-21 17:15:11 -05:00
print(result);
} catch (e) {
print('Exception when calling APIKeysApi->createApiKey: $e\n');
}
```
## Documentation for API Endpoints
All URIs are relative to */api*
Class | Method | HTTP request | Description
------------ | ------------- | ------------- | -------------
2025-11-11 17:01:14 -05:00
*APIKeysApi* | [**createApiKey** ](doc//APIKeysApi.md#createapikey ) | **POST** /api-keys | Create an API key
*APIKeysApi* | [**deleteApiKey** ](doc//APIKeysApi.md#deleteapikey ) | **DELETE** /api-keys/{id} | Delete an API key
*APIKeysApi* | [**getApiKey** ](doc//APIKeysApi.md#getapikey ) | **GET** /api-keys/{id} | Retrieve an API key
*APIKeysApi* | [**getApiKeys** ](doc//APIKeysApi.md#getapikeys ) | **GET** /api-keys | List all API keys
*APIKeysApi* | [**getMyApiKey** ](doc//APIKeysApi.md#getmyapikey ) | **GET** /api-keys/me | Retrieve the current API key
*APIKeysApi* | [**updateApiKey** ](doc//APIKeysApi.md#updateapikey ) | **PUT** /api-keys/{id} | Update an API key
*ActivitiesApi* | [**createActivity** ](doc//ActivitiesApi.md#createactivity ) | **POST** /activities | Create an activity
*ActivitiesApi* | [**deleteActivity** ](doc//ActivitiesApi.md#deleteactivity ) | **DELETE** /activities/{id} | Delete an activity
*ActivitiesApi* | [**getActivities** ](doc//ActivitiesApi.md#getactivities ) | **GET** /activities | List all activities
*ActivitiesApi* | [**getActivityStatistics** ](doc//ActivitiesApi.md#getactivitystatistics ) | **GET** /activities/statistics | Retrieve activity statistics
*AlbumsApi* | [**addAssetsToAlbum** ](doc//AlbumsApi.md#addassetstoalbum ) | **PUT** /albums/{id}/assets | Add assets to an album
*AlbumsApi* | [**addAssetsToAlbums** ](doc//AlbumsApi.md#addassetstoalbums ) | **PUT** /albums/assets | Add assets to albums
*AlbumsApi* | [**addUsersToAlbum** ](doc//AlbumsApi.md#adduserstoalbum ) | **PUT** /albums/{id}/users | Share album with users
*AlbumsApi* | [**createAlbum** ](doc//AlbumsApi.md#createalbum ) | **POST** /albums | Create an album
*AlbumsApi* | [**deleteAlbum** ](doc//AlbumsApi.md#deletealbum ) | **DELETE** /albums/{id} | Delete an album
*AlbumsApi* | [**getAlbumInfo** ](doc//AlbumsApi.md#getalbuminfo ) | **GET** /albums/{id} | Retrieve an album
2026-04-15 15:58:34 -04:00
*AlbumsApi* | [**getAlbumMapMarkers** ](doc//AlbumsApi.md#getalbummapmarkers ) | **GET** /albums/{id}/map-markers | Retrieve album map markers
2025-11-11 17:01:14 -05:00
*AlbumsApi* | [**getAlbumStatistics** ](doc//AlbumsApi.md#getalbumstatistics ) | **GET** /albums/statistics | Retrieve album statistics
*AlbumsApi* | [**getAllAlbums** ](doc//AlbumsApi.md#getallalbums ) | **GET** /albums | List all albums
*AlbumsApi* | [**removeAssetFromAlbum** ](doc//AlbumsApi.md#removeassetfromalbum ) | **DELETE** /albums/{id}/assets | Remove assets from an album
*AlbumsApi* | [**removeUserFromAlbum** ](doc//AlbumsApi.md#removeuserfromalbum ) | **DELETE** /albums/{id}/user/{userId} | Remove user from album
*AlbumsApi* | [**updateAlbumInfo** ](doc//AlbumsApi.md#updatealbuminfo ) | **PATCH** /albums/{id} | Update an album
*AlbumsApi* | [**updateAlbumUser** ](doc//AlbumsApi.md#updatealbumuser ) | **PUT** /albums/{id}/user/{userId} | Update user role
*AssetsApi* | [**checkBulkUpload** ](doc//AssetsApi.md#checkbulkupload ) | **POST** /assets/bulk-upload-check | Check bulk upload
*AssetsApi* | [**copyAsset** ](doc//AssetsApi.md#copyasset ) | **PUT** /assets/copy | Copy asset
*AssetsApi* | [**deleteAssetMetadata** ](doc//AssetsApi.md#deleteassetmetadata ) | **DELETE** /assets/{id}/metadata/{key} | Delete asset metadata by key
*AssetsApi* | [**deleteAssets** ](doc//AssetsApi.md#deleteassets ) | **DELETE** /assets | Delete assets
2026-01-08 14:52:16 -05:00
*AssetsApi* | [**deleteBulkAssetMetadata** ](doc//AssetsApi.md#deletebulkassetmetadata ) | **DELETE** /assets/metadata | Delete asset metadata
2025-11-11 17:01:14 -05:00
*AssetsApi* | [**downloadAsset** ](doc//AssetsApi.md#downloadasset ) | **GET** /assets/{id}/original | Download original asset
2026-01-09 17:59:52 -05:00
*AssetsApi* | [**editAsset** ](doc//AssetsApi.md#editasset ) | **PUT** /assets/{id}/edits | Apply edits to an existing asset
2026-06-01 14:52:29 -04:00
*AssetsApi* | [**endSession** ](doc//AssetsApi.md#endsession ) | **DELETE** /assets/{id}/video/stream/{sessionId} | End HLS streaming session
2026-01-09 17:59:52 -05:00
*AssetsApi* | [**getAssetEdits** ](doc//AssetsApi.md#getassetedits ) | **GET** /assets/{id}/edits | Retrieve edits for an existing asset
2025-11-11 17:01:14 -05:00
*AssetsApi* | [**getAssetInfo** ](doc//AssetsApi.md#getassetinfo ) | **GET** /assets/{id} | Retrieve an asset
*AssetsApi* | [**getAssetMetadata** ](doc//AssetsApi.md#getassetmetadata ) | **GET** /assets/{id}/metadata | Get asset metadata
*AssetsApi* | [**getAssetMetadataByKey** ](doc//AssetsApi.md#getassetmetadatabykey ) | **GET** /assets/{id}/metadata/{key} | Retrieve asset metadata by key
*AssetsApi* | [**getAssetOcr** ](doc//AssetsApi.md#getassetocr ) | **GET** /assets/{id}/ocr | Retrieve asset OCR data
*AssetsApi* | [**getAssetStatistics** ](doc//AssetsApi.md#getassetstatistics ) | **GET** /assets/statistics | Get asset statistics
2026-06-01 14:52:29 -04:00
*AssetsApi* | [**getMainPlaylist** ](doc//AssetsApi.md#getmainplaylist ) | **GET** /assets/{id}/video/stream/main.m3u8 | Get HLS main playlist
*AssetsApi* | [**getMediaPlaylist** ](doc//AssetsApi.md#getmediaplaylist ) | **GET** /assets/{id}/video/stream/{sessionId}/{variantIndex}/playlist.m3u8 | Get HLS media playlist
*AssetsApi* | [**getSegment** ](doc//AssetsApi.md#getsegment ) | **GET** /assets/{id}/video/stream/{sessionId}/{variantIndex}/{filename} | Get HLS segment or init file
2025-11-11 17:01:14 -05:00
*AssetsApi* | [**playAssetVideo** ](doc//AssetsApi.md#playassetvideo ) | **GET** /assets/{id}/video/playback | Play asset video
2026-01-09 17:59:52 -05:00
*AssetsApi* | [**removeAssetEdits** ](doc//AssetsApi.md#removeassetedits ) | **DELETE** /assets/{id}/edits | Remove edits from an existing asset
2025-11-11 17:01:14 -05:00
*AssetsApi* | [**runAssetJobs** ](doc//AssetsApi.md#runassetjobs ) | **POST** /assets/jobs | Run an asset job
*AssetsApi* | [**updateAsset** ](doc//AssetsApi.md#updateasset ) | **PUT** /assets/{id} | Update an asset
*AssetsApi* | [**updateAssetMetadata** ](doc//AssetsApi.md#updateassetmetadata ) | **PUT** /assets/{id}/metadata | Update asset metadata
*AssetsApi* | [**updateAssets** ](doc//AssetsApi.md#updateassets ) | **PUT** /assets | Update assets
2026-01-08 14:52:16 -05:00
*AssetsApi* | [**updateBulkAssetMetadata** ](doc//AssetsApi.md#updatebulkassetmetadata ) | **PUT** /assets/metadata | Upsert asset metadata
2025-11-11 17:01:14 -05:00
*AssetsApi* | [**uploadAsset** ](doc//AssetsApi.md#uploadasset ) | **POST** /assets | Upload asset
*AssetsApi* | [**viewAsset** ](doc//AssetsApi.md#viewasset ) | **GET** /assets/{id}/thumbnail | View asset thumbnail
*AuthenticationApi* | [**changePassword** ](doc//AuthenticationApi.md#changepassword ) | **POST** /auth/change-password | Change password
*AuthenticationApi* | [**changePinCode** ](doc//AuthenticationApi.md#changepincode ) | **PUT** /auth/pin-code | Change pin code
*AuthenticationApi* | [**finishOAuth** ](doc//AuthenticationApi.md#finishoauth ) | **POST** /oauth/callback | Finish OAuth
*AuthenticationApi* | [**getAuthStatus** ](doc//AuthenticationApi.md#getauthstatus ) | **GET** /auth/status | Retrieve auth status
*AuthenticationApi* | [**linkOAuthAccount** ](doc//AuthenticationApi.md#linkoauthaccount ) | **POST** /oauth/link | Link OAuth account
*AuthenticationApi* | [**lockAuthSession** ](doc//AuthenticationApi.md#lockauthsession ) | **POST** /auth/session/lock | Lock auth session
*AuthenticationApi* | [**login** ](doc//AuthenticationApi.md#login ) | **POST** /auth/login | Login
*AuthenticationApi* | [**logout** ](doc//AuthenticationApi.md#logout ) | **POST** /auth/logout | Logout
2026-04-17 20:45:33 +02:00
*AuthenticationApi* | [**logoutOAuth** ](doc//AuthenticationApi.md#logoutoauth ) | **POST** /oauth/backchannel-logout | Backchannel OAuth logout
2025-11-11 17:01:14 -05:00
*AuthenticationApi* | [**redirectOAuthToMobile** ](doc//AuthenticationApi.md#redirectoauthtomobile ) | **GET** /oauth/mobile-redirect | Redirect OAuth to mobile
*AuthenticationApi* | [**resetPinCode** ](doc//AuthenticationApi.md#resetpincode ) | **DELETE** /auth/pin-code | Reset pin code
*AuthenticationApi* | [**setupPinCode** ](doc//AuthenticationApi.md#setuppincode ) | **POST** /auth/pin-code | Setup pin code
*AuthenticationApi* | [**signUpAdmin** ](doc//AuthenticationApi.md#signupadmin ) | **POST** /auth/admin-sign-up | Register admin
*AuthenticationApi* | [**startOAuth** ](doc//AuthenticationApi.md#startoauth ) | **POST** /oauth/authorize | Start OAuth
*AuthenticationApi* | [**unlinkOAuthAccount** ](doc//AuthenticationApi.md#unlinkoauthaccount ) | **POST** /oauth/unlink | Unlink OAuth account
*AuthenticationApi* | [**unlockAuthSession** ](doc//AuthenticationApi.md#unlockauthsession ) | **POST** /auth/session/unlock | Unlock auth session
*AuthenticationApi* | [**validateAccessToken** ](doc//AuthenticationApi.md#validateaccesstoken ) | **POST** /auth/validateToken | Validate access token
*AuthenticationAdminApi* | [**unlinkAllOAuthAccountsAdmin** ](doc//AuthenticationAdminApi.md#unlinkalloauthaccountsadmin ) | **POST** /admin/auth/unlink-all | Unlink all OAuth accounts
feat: restore database backups (#23978)
* feat: ProcessRepository#createSpawnDuplexStream
* test: write tests for ProcessRepository#createSpawnDuplexStream
* feat: StorageRepository#createGzip,createGunzip,createPlainReadStream
* feat: backups util (args, create, restore, progress)
* feat: wait on maintenance operation lock on boot
* chore: use backup util from backup.service.ts
test: update backup.service.ts tests with new util
* feat: list/delete backups (maintenance services)
* chore: open api
fix: missing action in cli.service.ts
* chore: add missing repositories to MaintenanceModule
* refactor: move logSecret into module init
* feat: initialise StorageCore in maintenance mode
* feat: authenticate websocket requests in maintenance mode
* test: add mock for new storage fns
* feat: add MaintenanceEphemeralStateRepository
refactor: cache the secret in memory
* test: update service worker tests
* feat: add external maintenance mode status
* feat: synchronised status, restore db action
* test: backup restore service tests
* refactor: DRY end maintenance
* feat: list and delete backup routes
* feat: start action on boot
* fix: should set status on restore end
* refactor: add maintenanceStore to hold writables
* feat: sync status to web app
* feat: web impl.
* test: various utils for testings
* test: web e2e tests
* test: e2e maintenance spec
* test: update cli spec
* chore: e2e lint
* chore: lint fixes
* chore: lint fixes
* feat: start restore flow route
* test: update e2e tests
* chore: remove neon lights on maintenance action pages
* fix: use 'startRestoreFlow' on onboarding page
* chore: ignore any library folder in `docker/`
* fix: load status on boot
* feat: upload backups
* refactor: permit any .sql(.gz) to be listed/restored
* feat: download backups from list
* fix: permit uploading just .sql files
* feat: restore just .sql files
* fix: don't show backups list if logged out
* feat: system integrity check in restore flow
* test: not providing failed backups in API anymore
* test: util should also not try to use failedBackups
* fix: actually assign inputStream
* test: correct test backup prep.
* fix: ensure task is defined to show error
* test: fix docker cp command
* test: update e2e web spec to select next button
* test: update e2e api tests
* test: refactor timeouts
* chore: remove `showDelete` from maint. settings
* chore: lint
* chore: lint
* fix: make sure backups are correctly sorted for clean up
* test: update service spec
* test: adjust e2e timeout
* test: increase web timeouts for ci
* chore: move gitignore changes
* chore: additional filename validation
* refactor: better typings for integrity API
* feat: higher accuracy progress tracking
* chore: delay lock retry
* refactor: remove old maintenance settings
* refactor: clean up tailwind classes
* refactor: use while loop rather than recursive calls
* test: update service specs
* chore: check canParse too
* chore: lint
* fix: logic error causing infinite loop
* refactor: use <ProgressBar /> from ui library
* fix: create or overwrite file
* chore: i18n pass, update progress bar
* fix: wrong translation string
* chore: update colour variables
* test: update web test for new maint. page
* chore: format, fix key
* test: update tests to be more linter complaint & use new routines
* chore: update onClick -> onAction, title -> breadcrumbs
* fix: use wrench icon in admin settings sidebar
* chore: add translation strings to accordion
* chore: lint
* refactor: move maintenance worker init into service
* refactor: `maintenanceStatus` -> `getMaintenanceStatus`
refactor: `integrityCheck` -> `detectPriorInstall`
chore: add `v2.4.0` version
refactor: `/backups/list` -> `/backups`
refactor: use sendFile in download route
refactor: use separate backups permissions
chore: correct descriptions
refactor: permit handler that doesn't return promise for sendfile
* refactor: move status impl into service
refactor: add active flag to maintenance status
* refactor: split into database backup controller
* test: split api e2e tests and passing
* fix: move end button into authed default maint page
* fix: also show in restore flow
* fix: import getMaintenanceStatus
* test: split web e2e tests
* refactor: ensure detect install is consistently named
* chore: ensure admin for detect install while out of maint.
* refactor: remove state repository
* test: update maint. worker service spec
* test: split backup service spec
* refactor: rename db backup routes
* refactor: instead of param, allow bulk backup deletion
* test: update sdk use in e2e test
* test: correct deleteBackup call
* fix: correct type for serverinstall response dto
* chore: validate filename for deletion
* test: wip
* test: backups no longer take path param
* refactor: scope util to database-backups instead of backups
* fix: update worker controller with new route
* chore: use new admin page actions
* chore: remove stray comment
* test: rename outdated test
* refactor: getter pattern for maintenance secret
* refactor: `createSpawnDuplexStream` -> `spawnDuplexStream`
* refactor: prefer `Object.assign`
* refactor: remove useless try {} block
* refactor: prefer `type Props`
refactor: prefer arrow function
* refactor: use luxon API for minutesAgo
* chore: remove change to gitignore
* refactor: prefer `type Props`
* refactor: remove async from onMount
* refactor: use luxon toRelative for relative time
* refactor: duplicate logic check
* chore: open api
* refactor: begin moving code into web//services
* refactor: don't use template string with $t
* test: use dialog role to match prompt
* refactor: split actions into flow/restore
* test: fix action value
* refactor: move more service calls into web//services
* chore: should void fn return
* chore: bump 2.4.0 to 2.5.0 in controller
* chore: bump 2.4.0 to 2.5.0 in controller
* refactor: use events for web//services
* chore: open api
* chore: open api
* refactor: don't await returned promise
* refactor: remove redundant check
* refactor: add `type: command` to actions
* refactor: split backup entries into own component
* refactor: split restore flow into separate components
* refactor(web): split BackupDelete event
* chore: stylings
* chore: stylings
* fix: don't log query failure on first boot
* feat: support pg_dumpall backups
* feat: display information about each backup
* chore: i18n
* feat: rollback to restore point on migrations failure
* feat: health check after restore
* chore: format
* refactor: split health check into separate function
* refactor: split health into repository
test: write tests covering rollbacks
* fix: omit 'health' requirement from createDbBackup
* test(e2e): rollback test
* fix: wrap text in backup entry
* fix: don't shrink context menu button
* fix: correct CREATE DB syntax for postgres
* test: rename backups generated by test
* feat: add filesize to backup response dto
* feat: restore list
* feat: ui work
* fix: e2e test
* fix: e2e test
* pr feedback
* pr feedback
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-01-20 15:22:28 +00:00
*DatabaseBackupsAdminApi* | [**deleteDatabaseBackup** ](doc//DatabaseBackupsAdminApi.md#deletedatabasebackup ) | **DELETE** /admin/database-backups | Delete database backup
*DatabaseBackupsAdminApi* | [**downloadDatabaseBackup** ](doc//DatabaseBackupsAdminApi.md#downloaddatabasebackup ) | **GET** /admin/database-backups/{filename} | Download database backup
*DatabaseBackupsAdminApi* | [**listDatabaseBackups** ](doc//DatabaseBackupsAdminApi.md#listdatabasebackups ) | **GET** /admin/database-backups | List database backups
*DatabaseBackupsAdminApi* | [**startDatabaseRestoreFlow** ](doc//DatabaseBackupsAdminApi.md#startdatabaserestoreflow ) | **POST** /admin/database-backups/start-restore | Start database backup restore flow
*DatabaseBackupsAdminApi* | [**uploadDatabaseBackup** ](doc//DatabaseBackupsAdminApi.md#uploaddatabasebackup ) | **POST** /admin/database-backups/upload | Upload database backup
2025-11-11 17:01:14 -05:00
*DeprecatedApi* | [**createPartnerDeprecated** ](doc//DeprecatedApi.md#createpartnerdeprecated ) | **POST** /partners/{id} | Create a partner
2025-11-25 08:19:40 -05:00
*DeprecatedApi* | [**getQueuesLegacy** ](doc//DeprecatedApi.md#getqueueslegacy ) | **GET** /jobs | Retrieve queue counts and status
*DeprecatedApi* | [**runQueueCommandLegacy** ](doc//DeprecatedApi.md#runqueuecommandlegacy ) | **PUT** /jobs/{name} | Run jobs
2026-06-07 15:40:01 +02:00
*DeprecatedApi* | [**updateApiKey** ](doc//DeprecatedApi.md#updateapikey ) | **PUT** /api-keys/{id} | Update an API key
*DeprecatedApi* | [**updateAsset** ](doc//DeprecatedApi.md#updateasset ) | **PUT** /assets/{id} | Update an asset
*DeprecatedApi* | [**updateAssets** ](doc//DeprecatedApi.md#updateassets ) | **PUT** /assets | Update assets
*DeprecatedApi* | [**updateLibrary** ](doc//DeprecatedApi.md#updatelibrary ) | **PUT** /libraries/{id} | Update a library
*DeprecatedApi* | [**updateMemory** ](doc//DeprecatedApi.md#updatememory ) | **PUT** /memories/{id} | Update a memory
*DeprecatedApi* | [**updateMyPreferences** ](doc//DeprecatedApi.md#updatemypreferences ) | **PUT** /users/me/preferences | Update my preferences
*DeprecatedApi* | [**updateMyUser** ](doc//DeprecatedApi.md#updatemyuser ) | **PUT** /users/me | Update current user
*DeprecatedApi* | [**updatePerson** ](doc//DeprecatedApi.md#updateperson ) | **PUT** /people/{id} | Update person
*DeprecatedApi* | [**updateSession** ](doc//DeprecatedApi.md#updatesession ) | **PUT** /sessions/{id} | Update a session
*DeprecatedApi* | [**updateStack** ](doc//DeprecatedApi.md#updatestack ) | **PUT** /stacks/{id} | Update a stack
*DeprecatedApi* | [**updateTag** ](doc//DeprecatedApi.md#updatetag ) | **PUT** /tags/{id} | Update a tag
*DeprecatedApi* | [**updateUserAdmin** ](doc//DeprecatedApi.md#updateuseradmin ) | **PUT** /admin/users/{id} | Update a user
*DeprecatedApi* | [**updateUserPreferencesAdmin** ](doc//DeprecatedApi.md#updateuserpreferencesadmin ) | **PUT** /admin/users/{id}/preferences | Update user preferences
*DeprecatedApi* | [**updateWorkflow** ](doc//DeprecatedApi.md#updateworkflow ) | **PUT** /workflows/{id} | Update a workflow
2025-11-11 17:01:14 -05:00
*DownloadApi* | [**downloadArchive** ](doc//DownloadApi.md#downloadarchive ) | **POST** /download/archive | Download asset archive
*DownloadApi* | [**getDownloadInfo** ](doc//DownloadApi.md#getdownloadinfo ) | **POST** /download/info | Retrieve download information
2026-05-04 12:51:54 +02:00
*DuplicatesApi* | [**deleteDuplicate** ](doc//DuplicatesApi.md#deleteduplicate ) | **DELETE** /duplicates/{id} | Dismiss a duplicate group
2025-11-11 17:01:14 -05:00
*DuplicatesApi* | [**deleteDuplicates** ](doc//DuplicatesApi.md#deleteduplicates ) | **DELETE** /duplicates | Delete duplicates
*DuplicatesApi* | [**getAssetDuplicates** ](doc//DuplicatesApi.md#getassetduplicates ) | **GET** /duplicates | Retrieve duplicates
feat(server): resolve duplicates (#25316)
* feat(web): Synchronize information from deduplicated images
* Added new settings menu to the the deduplication tab.
* The toggable options in the settings are synchronization of: albums, favorites, ratings, description, visibility and location.
* When synchronizing the albums, the resolved images will be added to all albums of the duplicates.
* When synchronizing the favorite status, the resolved images will be marked as favorite, if at least one selectable image is marked as favorite.
* When synchronizing the ratings, the highest rating from the selectable images will be applied to the resolved image.
* When synchronizing the description, all descriptions from the selectable images will be merged into one description for the resolved image.
* When synchronizing the visibility, the most restrictive visibility setting from the selectable images will be applied to the resolved image.
* When synchronizing the location, if exactly one unique location exists among the selectable images, this location will be applied to the resolved image.
* There is no additional UI for these settings to keep the visual clutter minimal. The settings are applied automatically based on the user's preferences.
* Replace addAssetToAlbums with copyAsset
* fix linter
* feat(web): add duplicate sync fields and fix typo
* feat(web): add tag sync and enhance duplicate resolution
This update introduces tag synchronization for duplicate resolution,
ensuring all unique tag IDs from duplicates are applied to kept assets.
The visibility sync logic is updated to use a simplified ordering, as the hidden status items will never show up in a duplicate set.
Album synchronization now merges albums directly via addAssetsToAlbums; as the approach with copyAsset API endpoint was ineffiecient.
Description, rating, and location sync logic is improved for correctness.
and deduplication. i18n strings were added / updated.
* feat(server): move duplicate resolution to backend with sync and stacking
Moves duplicate metadata synchronization from frontend to backend, enabling robust
batch operations and proper validation. This is an improved refactor of PR #13851.
New endpoints:
- POST /duplicates/resolve - batch resolve with configurable metadata sync
- POST /duplicates/stack - create stacks from duplicate groups
- GET /duplicates - now includes suggestedKeepAssetIds based on file size and EXIF
Key changes:
- Move sync logic (albums, tags, favorites, ratings, descriptions, location, visibility) to server
- Add server-side metadata merge policies with proper conflict resolution
- Replace client-side resolution logic with new backend endpoints
- Add comprehensive E2E tests (70+ test cases) and unit tests
- Update OpenAPI specs and TypeScript SDK
No breaking changes - only additions to existing API.
* feat(preferences): enable all duplicate sync settings by default
* chore: clean up
* chore: clean up
* refactor: rename & clean up
* fix: preference upgrade
* chore: linting
* refactor(e2e): use updateAssets API for setAssetDuplicateId
* fix: visibility sync logic in duplicate resolution
* fix(duplicate): write description to exifUpdate
Previously the duplicate resolution populated assetUpdate.description even
though description belongs to exif info.
* fix(duplicate): remove redundant updateLockedColumns wrapper
updateAllExif already computes lockedProperties via distinctLocked
using Object.keys(options). The wrapper added a lockedProperties key
to the options object, causing the spurious string 'lockedProperties'
to be stored in the lockedProperties array.
* fix(duplicate): write merged tags to asset_exif to survive metadata re-extraction
During duplicate resolution, replaceAssetTags correctly wrote merged tag
IDs to the tag_asset table, but never updated asset_exif.tags or locked
the tags property. The subsequent SidecarWrite → AssetExtractMetadata
chain calls applyTagList, which destructively replaces tag_asset rows
with whatever is in asset_exif.tags — still the original per-asset tags,
not the merged set.
Write merged tag values to asset_exif.tags via updateAllExif (which also
locks the property via distinctLocked), and queue SidecarWrite when tags
change so they persist to the sidecar file.
* docs(duplicates): clarify location and tag sync behavior
* refactor(duplicate): remove sync settings, always sync all metadata on resolve
Remove DuplicateSyncSettingsDto and the per-field sync toggles
(albums, favorites, rating, description, visibility, location, tags).
Duplicate resolution now unconditionally syncs all metadata from
trashed assets to kept assets.
- Remove DuplicateSyncSettingsDto and settings field from DuplicateResolveDto
- Update DuplicateService to always run all sync logic without conditionals
- Delete DuplicateSettingsModal.svelte and settings gear button from UI
- Remove DuplicateSettings type and duplicateSettings persisted store
- Update unit and e2e tests to remove settings from resolve requests
* docs: update duplicates utility to reflect automatic metadata sync
* docs(web): replace duplicates info modal with link to documentation
* chore: clean up
* fix: add missing type cast to jsonAgg in duplicate repository getAll
* fix: skip persisting rating=0 in duplicate merge to avoid unnecessary sidecar write
---------
Co-authored-by: Toni <51962051+EinToni@users.noreply.github.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
2026-03-26 19:33:55 +01:00
*DuplicatesApi* | [**resolveDuplicates** ](doc//DuplicatesApi.md#resolveduplicates ) | **POST** /duplicates/resolve | Resolve duplicate groups
2025-11-11 17:01:14 -05:00
*FacesApi* | [**createFace** ](doc//FacesApi.md#createface ) | **POST** /faces | Create a face
*FacesApi* | [**deleteFace** ](doc//FacesApi.md#deleteface ) | **DELETE** /faces/{id} | Delete a face
*FacesApi* | [**getFaces** ](doc//FacesApi.md#getfaces ) | **GET** /faces | Retrieve faces for asset
*FacesApi* | [**reassignFacesById** ](doc//FacesApi.md#reassignfacesbyid ) | **PUT** /faces/{id} | Re-assign a face to another person
*JobsApi* | [**createJob** ](doc//JobsApi.md#createjob ) | **POST** /jobs | Create a manual job
2025-11-14 14:42:00 -05:00
*JobsApi* | [**getQueuesLegacy** ](doc//JobsApi.md#getqueueslegacy ) | **GET** /jobs | Retrieve queue counts and status
*JobsApi* | [**runQueueCommandLegacy** ](doc//JobsApi.md#runqueuecommandlegacy ) | **PUT** /jobs/{name} | Run jobs
2025-11-11 17:01:14 -05:00
*LibrariesApi* | [**createLibrary** ](doc//LibrariesApi.md#createlibrary ) | **POST** /libraries | Create a library
*LibrariesApi* | [**deleteLibrary** ](doc//LibrariesApi.md#deletelibrary ) | **DELETE** /libraries/{id} | Delete a library
*LibrariesApi* | [**getAllLibraries** ](doc//LibrariesApi.md#getalllibraries ) | **GET** /libraries | Retrieve libraries
*LibrariesApi* | [**getLibrary** ](doc//LibrariesApi.md#getlibrary ) | **GET** /libraries/{id} | Retrieve a library
*LibrariesApi* | [**getLibraryStatistics** ](doc//LibrariesApi.md#getlibrarystatistics ) | **GET** /libraries/{id}/statistics | Retrieve library statistics
*LibrariesApi* | [**scanLibrary** ](doc//LibrariesApi.md#scanlibrary ) | **POST** /libraries/{id}/scan | Scan a library
*LibrariesApi* | [**updateLibrary** ](doc//LibrariesApi.md#updatelibrary ) | **PUT** /libraries/{id} | Update a library
*LibrariesApi* | [**validate** ](doc//LibrariesApi.md#validate ) | **POST** /libraries/{id}/validate | Validate library settings
2026-06-10 21:02:27 +02:00
*MaintenanceAdminApi* | [**deleteIntegrityReport** ](doc//MaintenanceAdminApi.md#deleteintegrityreport ) | **DELETE** /admin/integrity/report/{id} | Delete integrity report item
feat: restore database backups (#23978)
* feat: ProcessRepository#createSpawnDuplexStream
* test: write tests for ProcessRepository#createSpawnDuplexStream
* feat: StorageRepository#createGzip,createGunzip,createPlainReadStream
* feat: backups util (args, create, restore, progress)
* feat: wait on maintenance operation lock on boot
* chore: use backup util from backup.service.ts
test: update backup.service.ts tests with new util
* feat: list/delete backups (maintenance services)
* chore: open api
fix: missing action in cli.service.ts
* chore: add missing repositories to MaintenanceModule
* refactor: move logSecret into module init
* feat: initialise StorageCore in maintenance mode
* feat: authenticate websocket requests in maintenance mode
* test: add mock for new storage fns
* feat: add MaintenanceEphemeralStateRepository
refactor: cache the secret in memory
* test: update service worker tests
* feat: add external maintenance mode status
* feat: synchronised status, restore db action
* test: backup restore service tests
* refactor: DRY end maintenance
* feat: list and delete backup routes
* feat: start action on boot
* fix: should set status on restore end
* refactor: add maintenanceStore to hold writables
* feat: sync status to web app
* feat: web impl.
* test: various utils for testings
* test: web e2e tests
* test: e2e maintenance spec
* test: update cli spec
* chore: e2e lint
* chore: lint fixes
* chore: lint fixes
* feat: start restore flow route
* test: update e2e tests
* chore: remove neon lights on maintenance action pages
* fix: use 'startRestoreFlow' on onboarding page
* chore: ignore any library folder in `docker/`
* fix: load status on boot
* feat: upload backups
* refactor: permit any .sql(.gz) to be listed/restored
* feat: download backups from list
* fix: permit uploading just .sql files
* feat: restore just .sql files
* fix: don't show backups list if logged out
* feat: system integrity check in restore flow
* test: not providing failed backups in API anymore
* test: util should also not try to use failedBackups
* fix: actually assign inputStream
* test: correct test backup prep.
* fix: ensure task is defined to show error
* test: fix docker cp command
* test: update e2e web spec to select next button
* test: update e2e api tests
* test: refactor timeouts
* chore: remove `showDelete` from maint. settings
* chore: lint
* chore: lint
* fix: make sure backups are correctly sorted for clean up
* test: update service spec
* test: adjust e2e timeout
* test: increase web timeouts for ci
* chore: move gitignore changes
* chore: additional filename validation
* refactor: better typings for integrity API
* feat: higher accuracy progress tracking
* chore: delay lock retry
* refactor: remove old maintenance settings
* refactor: clean up tailwind classes
* refactor: use while loop rather than recursive calls
* test: update service specs
* chore: check canParse too
* chore: lint
* fix: logic error causing infinite loop
* refactor: use <ProgressBar /> from ui library
* fix: create or overwrite file
* chore: i18n pass, update progress bar
* fix: wrong translation string
* chore: update colour variables
* test: update web test for new maint. page
* chore: format, fix key
* test: update tests to be more linter complaint & use new routines
* chore: update onClick -> onAction, title -> breadcrumbs
* fix: use wrench icon in admin settings sidebar
* chore: add translation strings to accordion
* chore: lint
* refactor: move maintenance worker init into service
* refactor: `maintenanceStatus` -> `getMaintenanceStatus`
refactor: `integrityCheck` -> `detectPriorInstall`
chore: add `v2.4.0` version
refactor: `/backups/list` -> `/backups`
refactor: use sendFile in download route
refactor: use separate backups permissions
chore: correct descriptions
refactor: permit handler that doesn't return promise for sendfile
* refactor: move status impl into service
refactor: add active flag to maintenance status
* refactor: split into database backup controller
* test: split api e2e tests and passing
* fix: move end button into authed default maint page
* fix: also show in restore flow
* fix: import getMaintenanceStatus
* test: split web e2e tests
* refactor: ensure detect install is consistently named
* chore: ensure admin for detect install while out of maint.
* refactor: remove state repository
* test: update maint. worker service spec
* test: split backup service spec
* refactor: rename db backup routes
* refactor: instead of param, allow bulk backup deletion
* test: update sdk use in e2e test
* test: correct deleteBackup call
* fix: correct type for serverinstall response dto
* chore: validate filename for deletion
* test: wip
* test: backups no longer take path param
* refactor: scope util to database-backups instead of backups
* fix: update worker controller with new route
* chore: use new admin page actions
* chore: remove stray comment
* test: rename outdated test
* refactor: getter pattern for maintenance secret
* refactor: `createSpawnDuplexStream` -> `spawnDuplexStream`
* refactor: prefer `Object.assign`
* refactor: remove useless try {} block
* refactor: prefer `type Props`
refactor: prefer arrow function
* refactor: use luxon API for minutesAgo
* chore: remove change to gitignore
* refactor: prefer `type Props`
* refactor: remove async from onMount
* refactor: use luxon toRelative for relative time
* refactor: duplicate logic check
* chore: open api
* refactor: begin moving code into web//services
* refactor: don't use template string with $t
* test: use dialog role to match prompt
* refactor: split actions into flow/restore
* test: fix action value
* refactor: move more service calls into web//services
* chore: should void fn return
* chore: bump 2.4.0 to 2.5.0 in controller
* chore: bump 2.4.0 to 2.5.0 in controller
* refactor: use events for web//services
* chore: open api
* chore: open api
* refactor: don't await returned promise
* refactor: remove redundant check
* refactor: add `type: command` to actions
* refactor: split backup entries into own component
* refactor: split restore flow into separate components
* refactor(web): split BackupDelete event
* chore: stylings
* chore: stylings
* fix: don't log query failure on first boot
* feat: support pg_dumpall backups
* feat: display information about each backup
* chore: i18n
* feat: rollback to restore point on migrations failure
* feat: health check after restore
* chore: format
* refactor: split health check into separate function
* refactor: split health into repository
test: write tests covering rollbacks
* fix: omit 'health' requirement from createDbBackup
* test(e2e): rollback test
* fix: wrap text in backup entry
* fix: don't shrink context menu button
* fix: correct CREATE DB syntax for postgres
* test: rename backups generated by test
* feat: add filesize to backup response dto
* feat: restore list
* feat: ui work
* fix: e2e test
* fix: e2e test
* pr feedback
* pr feedback
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-01-20 15:22:28 +00:00
*MaintenanceAdminApi* | [**detectPriorInstall** ](doc//MaintenanceAdminApi.md#detectpriorinstall ) | **GET** /admin/maintenance/detect-install | Detect existing install
2026-06-10 21:02:27 +02:00
*MaintenanceAdminApi* | [**getIntegrityReport** ](doc//MaintenanceAdminApi.md#getintegrityreport ) | **GET** /admin/integrity/report | Get integrity report by type
*MaintenanceAdminApi* | [**getIntegrityReportCsv** ](doc//MaintenanceAdminApi.md#getintegrityreportcsv ) | **GET** /admin/integrity/report/{type}/csv | Export integrity report by type as CSV
*MaintenanceAdminApi* | [**getIntegrityReportFile** ](doc//MaintenanceAdminApi.md#getintegrityreportfile ) | **GET** /admin/integrity/report/{id}/file | Download flagged file
*MaintenanceAdminApi* | [**getIntegrityReportSummary** ](doc//MaintenanceAdminApi.md#getintegrityreportsummary ) | **GET** /admin/integrity/summary | Get integrity report summary
feat: restore database backups (#23978)
* feat: ProcessRepository#createSpawnDuplexStream
* test: write tests for ProcessRepository#createSpawnDuplexStream
* feat: StorageRepository#createGzip,createGunzip,createPlainReadStream
* feat: backups util (args, create, restore, progress)
* feat: wait on maintenance operation lock on boot
* chore: use backup util from backup.service.ts
test: update backup.service.ts tests with new util
* feat: list/delete backups (maintenance services)
* chore: open api
fix: missing action in cli.service.ts
* chore: add missing repositories to MaintenanceModule
* refactor: move logSecret into module init
* feat: initialise StorageCore in maintenance mode
* feat: authenticate websocket requests in maintenance mode
* test: add mock for new storage fns
* feat: add MaintenanceEphemeralStateRepository
refactor: cache the secret in memory
* test: update service worker tests
* feat: add external maintenance mode status
* feat: synchronised status, restore db action
* test: backup restore service tests
* refactor: DRY end maintenance
* feat: list and delete backup routes
* feat: start action on boot
* fix: should set status on restore end
* refactor: add maintenanceStore to hold writables
* feat: sync status to web app
* feat: web impl.
* test: various utils for testings
* test: web e2e tests
* test: e2e maintenance spec
* test: update cli spec
* chore: e2e lint
* chore: lint fixes
* chore: lint fixes
* feat: start restore flow route
* test: update e2e tests
* chore: remove neon lights on maintenance action pages
* fix: use 'startRestoreFlow' on onboarding page
* chore: ignore any library folder in `docker/`
* fix: load status on boot
* feat: upload backups
* refactor: permit any .sql(.gz) to be listed/restored
* feat: download backups from list
* fix: permit uploading just .sql files
* feat: restore just .sql files
* fix: don't show backups list if logged out
* feat: system integrity check in restore flow
* test: not providing failed backups in API anymore
* test: util should also not try to use failedBackups
* fix: actually assign inputStream
* test: correct test backup prep.
* fix: ensure task is defined to show error
* test: fix docker cp command
* test: update e2e web spec to select next button
* test: update e2e api tests
* test: refactor timeouts
* chore: remove `showDelete` from maint. settings
* chore: lint
* chore: lint
* fix: make sure backups are correctly sorted for clean up
* test: update service spec
* test: adjust e2e timeout
* test: increase web timeouts for ci
* chore: move gitignore changes
* chore: additional filename validation
* refactor: better typings for integrity API
* feat: higher accuracy progress tracking
* chore: delay lock retry
* refactor: remove old maintenance settings
* refactor: clean up tailwind classes
* refactor: use while loop rather than recursive calls
* test: update service specs
* chore: check canParse too
* chore: lint
* fix: logic error causing infinite loop
* refactor: use <ProgressBar /> from ui library
* fix: create or overwrite file
* chore: i18n pass, update progress bar
* fix: wrong translation string
* chore: update colour variables
* test: update web test for new maint. page
* chore: format, fix key
* test: update tests to be more linter complaint & use new routines
* chore: update onClick -> onAction, title -> breadcrumbs
* fix: use wrench icon in admin settings sidebar
* chore: add translation strings to accordion
* chore: lint
* refactor: move maintenance worker init into service
* refactor: `maintenanceStatus` -> `getMaintenanceStatus`
refactor: `integrityCheck` -> `detectPriorInstall`
chore: add `v2.4.0` version
refactor: `/backups/list` -> `/backups`
refactor: use sendFile in download route
refactor: use separate backups permissions
chore: correct descriptions
refactor: permit handler that doesn't return promise for sendfile
* refactor: move status impl into service
refactor: add active flag to maintenance status
* refactor: split into database backup controller
* test: split api e2e tests and passing
* fix: move end button into authed default maint page
* fix: also show in restore flow
* fix: import getMaintenanceStatus
* test: split web e2e tests
* refactor: ensure detect install is consistently named
* chore: ensure admin for detect install while out of maint.
* refactor: remove state repository
* test: update maint. worker service spec
* test: split backup service spec
* refactor: rename db backup routes
* refactor: instead of param, allow bulk backup deletion
* test: update sdk use in e2e test
* test: correct deleteBackup call
* fix: correct type for serverinstall response dto
* chore: validate filename for deletion
* test: wip
* test: backups no longer take path param
* refactor: scope util to database-backups instead of backups
* fix: update worker controller with new route
* chore: use new admin page actions
* chore: remove stray comment
* test: rename outdated test
* refactor: getter pattern for maintenance secret
* refactor: `createSpawnDuplexStream` -> `spawnDuplexStream`
* refactor: prefer `Object.assign`
* refactor: remove useless try {} block
* refactor: prefer `type Props`
refactor: prefer arrow function
* refactor: use luxon API for minutesAgo
* chore: remove change to gitignore
* refactor: prefer `type Props`
* refactor: remove async from onMount
* refactor: use luxon toRelative for relative time
* refactor: duplicate logic check
* chore: open api
* refactor: begin moving code into web//services
* refactor: don't use template string with $t
* test: use dialog role to match prompt
* refactor: split actions into flow/restore
* test: fix action value
* refactor: move more service calls into web//services
* chore: should void fn return
* chore: bump 2.4.0 to 2.5.0 in controller
* chore: bump 2.4.0 to 2.5.0 in controller
* refactor: use events for web//services
* chore: open api
* chore: open api
* refactor: don't await returned promise
* refactor: remove redundant check
* refactor: add `type: command` to actions
* refactor: split backup entries into own component
* refactor: split restore flow into separate components
* refactor(web): split BackupDelete event
* chore: stylings
* chore: stylings
* fix: don't log query failure on first boot
* feat: support pg_dumpall backups
* feat: display information about each backup
* chore: i18n
* feat: rollback to restore point on migrations failure
* feat: health check after restore
* chore: format
* refactor: split health check into separate function
* refactor: split health into repository
test: write tests covering rollbacks
* fix: omit 'health' requirement from createDbBackup
* test(e2e): rollback test
* fix: wrap text in backup entry
* fix: don't shrink context menu button
* fix: correct CREATE DB syntax for postgres
* test: rename backups generated by test
* feat: add filesize to backup response dto
* feat: restore list
* feat: ui work
* fix: e2e test
* fix: e2e test
* pr feedback
* pr feedback
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-01-20 15:22:28 +00:00
*MaintenanceAdminApi* | [**getMaintenanceStatus** ](doc//MaintenanceAdminApi.md#getmaintenancestatus ) | **GET** /admin/maintenance/status | Get maintenance mode status
2025-11-17 17:15:44 +00:00
*MaintenanceAdminApi* | [**maintenanceLogin** ](doc//MaintenanceAdminApi.md#maintenancelogin ) | **POST** /admin/maintenance/login | Log into maintenance mode
*MaintenanceAdminApi* | [**setMaintenanceMode** ](doc//MaintenanceAdminApi.md#setmaintenancemode ) | **POST** /admin/maintenance | Set maintenance mode
2025-11-11 17:01:14 -05:00
*MapApi* | [**getMapMarkers** ](doc//MapApi.md#getmapmarkers ) | **GET** /map/markers | Retrieve map markers
*MapApi* | [**reverseGeocode** ](doc//MapApi.md#reversegeocode ) | **GET** /map/reverse-geocode | Reverse geocode coordinates
*MemoriesApi* | [**addMemoryAssets** ](doc//MemoriesApi.md#addmemoryassets ) | **PUT** /memories/{id}/assets | Add assets to a memory
*MemoriesApi* | [**createMemory** ](doc//MemoriesApi.md#creatememory ) | **POST** /memories | Create a memory
*MemoriesApi* | [**deleteMemory** ](doc//MemoriesApi.md#deletememory ) | **DELETE** /memories/{id} | Delete a memory
*MemoriesApi* | [**getMemory** ](doc//MemoriesApi.md#getmemory ) | **GET** /memories/{id} | Retrieve a memory
*MemoriesApi* | [**memoriesStatistics** ](doc//MemoriesApi.md#memoriesstatistics ) | **GET** /memories/statistics | Retrieve memories statistics
*MemoriesApi* | [**removeMemoryAssets** ](doc//MemoriesApi.md#removememoryassets ) | **DELETE** /memories/{id}/assets | Remove assets from a memory
*MemoriesApi* | [**searchMemories** ](doc//MemoriesApi.md#searchmemories ) | **GET** /memories | Retrieve memories
*MemoriesApi* | [**updateMemory** ](doc//MemoriesApi.md#updatememory ) | **PUT** /memories/{id} | Update a memory
*NotificationsApi* | [**deleteNotification** ](doc//NotificationsApi.md#deletenotification ) | **DELETE** /notifications/{id} | Delete a notification
*NotificationsApi* | [**deleteNotifications** ](doc//NotificationsApi.md#deletenotifications ) | **DELETE** /notifications | Delete notifications
*NotificationsApi* | [**getNotification** ](doc//NotificationsApi.md#getnotification ) | **GET** /notifications/{id} | Get a notification
*NotificationsApi* | [**getNotifications** ](doc//NotificationsApi.md#getnotifications ) | **GET** /notifications | Retrieve notifications
*NotificationsApi* | [**updateNotification** ](doc//NotificationsApi.md#updatenotification ) | **PUT** /notifications/{id} | Update a notification
*NotificationsApi* | [**updateNotifications** ](doc//NotificationsApi.md#updatenotifications ) | **PUT** /notifications | Update notifications
*NotificationsAdminApi* | [**createNotification** ](doc//NotificationsAdminApi.md#createnotification ) | **POST** /admin/notifications | Create a notification
*NotificationsAdminApi* | [**getNotificationTemplateAdmin** ](doc//NotificationsAdminApi.md#getnotificationtemplateadmin ) | **POST** /admin/notifications/templates/{name} | Render email template
*NotificationsAdminApi* | [**sendTestEmailAdmin** ](doc//NotificationsAdminApi.md#sendtestemailadmin ) | **POST** /admin/notifications/test-email | Send test email
*PartnersApi* | [**createPartner** ](doc//PartnersApi.md#createpartner ) | **POST** /partners | Create a partner
*PartnersApi* | [**createPartnerDeprecated** ](doc//PartnersApi.md#createpartnerdeprecated ) | **POST** /partners/{id} | Create a partner
*PartnersApi* | [**getPartners** ](doc//PartnersApi.md#getpartners ) | **GET** /partners | Retrieve partners
*PartnersApi* | [**removePartner** ](doc//PartnersApi.md#removepartner ) | **DELETE** /partners/{id} | Remove a partner
*PartnersApi* | [**updatePartner** ](doc//PartnersApi.md#updatepartner ) | **PUT** /partners/{id} | Update a partner
*PeopleApi* | [**createPerson** ](doc//PeopleApi.md#createperson ) | **POST** /people | Create a person
*PeopleApi* | [**deletePeople** ](doc//PeopleApi.md#deletepeople ) | **DELETE** /people | Delete people
*PeopleApi* | [**deletePerson** ](doc//PeopleApi.md#deleteperson ) | **DELETE** /people/{id} | Delete person
*PeopleApi* | [**getAllPeople** ](doc//PeopleApi.md#getallpeople ) | **GET** /people | Get all people
*PeopleApi* | [**getPerson** ](doc//PeopleApi.md#getperson ) | **GET** /people/{id} | Get a person
*PeopleApi* | [**getPersonStatistics** ](doc//PeopleApi.md#getpersonstatistics ) | **GET** /people/{id}/statistics | Get person statistics
*PeopleApi* | [**getPersonThumbnail** ](doc//PeopleApi.md#getpersonthumbnail ) | **GET** /people/{id}/thumbnail | Get person thumbnail
*PeopleApi* | [**mergePerson** ](doc//PeopleApi.md#mergeperson ) | **POST** /people/{id}/merge | Merge people
*PeopleApi* | [**reassignFaces** ](doc//PeopleApi.md#reassignfaces ) | **PUT** /people/{id}/reassign | Reassign faces
*PeopleApi* | [**updatePeople** ](doc//PeopleApi.md#updatepeople ) | **PUT** /people | Update people
*PeopleApi* | [**updatePerson** ](doc//PeopleApi.md#updateperson ) | **PUT** /people/{id} | Update person
2025-11-14 14:05:05 -06:00
*PluginsApi* | [**getPlugin** ](doc//PluginsApi.md#getplugin ) | **GET** /plugins/{id} | Retrieve a plugin
2026-05-18 11:09:33 -04:00
*PluginsApi* | [**searchPluginMethods** ](doc//PluginsApi.md#searchpluginmethods ) | **GET** /plugins/methods | Retrieve plugin methods
2026-05-26 15:47:05 -05:00
*PluginsApi* | [**searchPluginTemplates** ](doc//PluginsApi.md#searchplugintemplates ) | **GET** /plugins/templates | Retrieve workflow templates
2026-05-18 11:09:33 -04:00
*PluginsApi* | [**searchPlugins** ](doc//PluginsApi.md#searchplugins ) | **GET** /plugins | List all plugins
2025-11-25 08:19:40 -05:00
*QueuesApi* | [**emptyQueue** ](doc//QueuesApi.md#emptyqueue ) | **DELETE** /queues/{name}/jobs | Empty a queue
*QueuesApi* | [**getQueue** ](doc//QueuesApi.md#getqueue ) | **GET** /queues/{name} | Retrieve a queue
*QueuesApi* | [**getQueueJobs** ](doc//QueuesApi.md#getqueuejobs ) | **GET** /queues/{name}/jobs | Retrieve queue jobs
*QueuesApi* | [**getQueues** ](doc//QueuesApi.md#getqueues ) | **GET** /queues | List all queues
*QueuesApi* | [**updateQueue** ](doc//QueuesApi.md#updatequeue ) | **PUT** /queues/{name} | Update a queue
2025-11-11 17:01:14 -05:00
*SearchApi* | [**getAssetsByCity** ](doc//SearchApi.md#getassetsbycity ) | **GET** /search/cities | Retrieve assets by city
*SearchApi* | [**getExploreData** ](doc//SearchApi.md#getexploredata ) | **GET** /search/explore | Retrieve explore data
*SearchApi* | [**getSearchSuggestions** ](doc//SearchApi.md#getsearchsuggestions ) | **GET** /search/suggestions | Retrieve search suggestions
*SearchApi* | [**searchAssetStatistics** ](doc//SearchApi.md#searchassetstatistics ) | **POST** /search/statistics | Search asset statistics
*SearchApi* | [**searchAssets** ](doc//SearchApi.md#searchassets ) | **POST** /search/metadata | Search assets by metadata
*SearchApi* | [**searchLargeAssets** ](doc//SearchApi.md#searchlargeassets ) | **POST** /search/large-assets | Search large assets
*SearchApi* | [**searchPerson** ](doc//SearchApi.md#searchperson ) | **GET** /search/person | Search people
*SearchApi* | [**searchPlaces** ](doc//SearchApi.md#searchplaces ) | **GET** /search/places | Search places
*SearchApi* | [**searchRandom** ](doc//SearchApi.md#searchrandom ) | **POST** /search/random | Search random assets
*SearchApi* | [**searchSmart** ](doc//SearchApi.md#searchsmart ) | **POST** /search/smart | Smart asset search
*ServerApi* | [**deleteServerLicense** ](doc//ServerApi.md#deleteserverlicense ) | **DELETE** /server/license | Delete server product key
*ServerApi* | [**getAboutInfo** ](doc//ServerApi.md#getaboutinfo ) | **GET** /server/about | Get server information
*ServerApi* | [**getApkLinks** ](doc//ServerApi.md#getapklinks ) | **GET** /server/apk-links | Get APK links
*ServerApi* | [**getServerConfig** ](doc//ServerApi.md#getserverconfig ) | **GET** /server/config | Get config
*ServerApi* | [**getServerFeatures** ](doc//ServerApi.md#getserverfeatures ) | **GET** /server/features | Get features
*ServerApi* | [**getServerLicense** ](doc//ServerApi.md#getserverlicense ) | **GET** /server/license | Get product key
*ServerApi* | [**getServerStatistics** ](doc//ServerApi.md#getserverstatistics ) | **GET** /server/statistics | Get statistics
*ServerApi* | [**getServerVersion** ](doc//ServerApi.md#getserverversion ) | **GET** /server/version | Get server version
*ServerApi* | [**getStorage** ](doc//ServerApi.md#getstorage ) | **GET** /server/storage | Get storage
*ServerApi* | [**getSupportedMediaTypes** ](doc//ServerApi.md#getsupportedmediatypes ) | **GET** /server/media-types | Get supported media types
*ServerApi* | [**getVersionCheck** ](doc//ServerApi.md#getversioncheck ) | **GET** /server/version-check | Get version check status
*ServerApi* | [**getVersionHistory** ](doc//ServerApi.md#getversionhistory ) | **GET** /server/version-history | Get version history
*ServerApi* | [**pingServer** ](doc//ServerApi.md#pingserver ) | **GET** /server/ping | Ping
*ServerApi* | [**setServerLicense** ](doc//ServerApi.md#setserverlicense ) | **PUT** /server/license | Set server product key
*SessionsApi* | [**createSession** ](doc//SessionsApi.md#createsession ) | **POST** /sessions | Create a session
*SessionsApi* | [**deleteAllSessions** ](doc//SessionsApi.md#deleteallsessions ) | **DELETE** /sessions | Delete all sessions
*SessionsApi* | [**deleteSession** ](doc//SessionsApi.md#deletesession ) | **DELETE** /sessions/{id} | Delete a session
*SessionsApi* | [**getSessions** ](doc//SessionsApi.md#getsessions ) | **GET** /sessions | Retrieve sessions
*SessionsApi* | [**lockSession** ](doc//SessionsApi.md#locksession ) | **POST** /sessions/{id}/lock | Lock a session
*SessionsApi* | [**updateSession** ](doc//SessionsApi.md#updatesession ) | **PUT** /sessions/{id} | Update a session
*SharedLinksApi* | [**addSharedLinkAssets** ](doc//SharedLinksApi.md#addsharedlinkassets ) | **PUT** /shared-links/{id}/assets | Add assets to a shared link
*SharedLinksApi* | [**createSharedLink** ](doc//SharedLinksApi.md#createsharedlink ) | **POST** /shared-links | Create a shared link
*SharedLinksApi* | [**getAllSharedLinks** ](doc//SharedLinksApi.md#getallsharedlinks ) | **GET** /shared-links | Retrieve all shared links
*SharedLinksApi* | [**getMySharedLink** ](doc//SharedLinksApi.md#getmysharedlink ) | **GET** /shared-links/me | Retrieve current shared link
*SharedLinksApi* | [**getSharedLinkById** ](doc//SharedLinksApi.md#getsharedlinkbyid ) | **GET** /shared-links/{id} | Retrieve a shared link
*SharedLinksApi* | [**removeSharedLink** ](doc//SharedLinksApi.md#removesharedlink ) | **DELETE** /shared-links/{id} | Delete a shared link
*SharedLinksApi* | [**removeSharedLinkAssets** ](doc//SharedLinksApi.md#removesharedlinkassets ) | **DELETE** /shared-links/{id}/assets | Remove assets from a shared link
2026-02-12 12:08:38 -05:00
*SharedLinksApi* | [**sharedLinkLogin** ](doc//SharedLinksApi.md#sharedlinklogin ) | **POST** /shared-links/login | Shared link login
2025-11-11 17:01:14 -05:00
*SharedLinksApi* | [**updateSharedLink** ](doc//SharedLinksApi.md#updatesharedlink ) | **PATCH** /shared-links/{id} | Update a shared link
*StacksApi* | [**createStack** ](doc//StacksApi.md#createstack ) | **POST** /stacks | Create a stack
*StacksApi* | [**deleteStack** ](doc//StacksApi.md#deletestack ) | **DELETE** /stacks/{id} | Delete a stack
*StacksApi* | [**deleteStacks** ](doc//StacksApi.md#deletestacks ) | **DELETE** /stacks | Delete stacks
*StacksApi* | [**getStack** ](doc//StacksApi.md#getstack ) | **GET** /stacks/{id} | Retrieve a stack
*StacksApi* | [**removeAssetFromStack** ](doc//StacksApi.md#removeassetfromstack ) | **DELETE** /stacks/{id}/assets/{assetId} | Remove an asset from a stack
*StacksApi* | [**searchStacks** ](doc//StacksApi.md#searchstacks ) | **GET** /stacks | Retrieve stacks
*StacksApi* | [**updateStack** ](doc//StacksApi.md#updatestack ) | **PUT** /stacks/{id} | Update a stack
*SyncApi* | [**deleteSyncAck** ](doc//SyncApi.md#deletesyncack ) | **DELETE** /sync/ack | Delete acknowledgements
*SyncApi* | [**getSyncAck** ](doc//SyncApi.md#getsyncack ) | **GET** /sync/ack | Retrieve acknowledgements
*SyncApi* | [**getSyncStream** ](doc//SyncApi.md#getsyncstream ) | **POST** /sync/stream | Stream sync changes
*SyncApi* | [**sendSyncAck** ](doc//SyncApi.md#sendsyncack ) | **POST** /sync/ack | Acknowledge changes
*SystemConfigApi* | [**getConfig** ](doc//SystemConfigApi.md#getconfig ) | **GET** /system-config | Get system configuration
*SystemConfigApi* | [**getConfigDefaults** ](doc//SystemConfigApi.md#getconfigdefaults ) | **GET** /system-config/defaults | Get system configuration defaults
*SystemConfigApi* | [**getStorageTemplateOptions** ](doc//SystemConfigApi.md#getstoragetemplateoptions ) | **GET** /system-config/storage-template-options | Get storage template options
*SystemConfigApi* | [**updateConfig** ](doc//SystemConfigApi.md#updateconfig ) | **PUT** /system-config | Update system configuration
*SystemMetadataApi* | [**getAdminOnboarding** ](doc//SystemMetadataApi.md#getadminonboarding ) | **GET** /system-metadata/admin-onboarding | Retrieve admin onboarding
*SystemMetadataApi* | [**getReverseGeocodingState** ](doc//SystemMetadataApi.md#getreversegeocodingstate ) | **GET** /system-metadata/reverse-geocoding-state | Retrieve reverse geocoding state
*SystemMetadataApi* | [**getVersionCheckState** ](doc//SystemMetadataApi.md#getversioncheckstate ) | **GET** /system-metadata/version-check-state | Retrieve version check state
*SystemMetadataApi* | [**updateAdminOnboarding** ](doc//SystemMetadataApi.md#updateadminonboarding ) | **POST** /system-metadata/admin-onboarding | Update admin onboarding
*TagsApi* | [**bulkTagAssets** ](doc//TagsApi.md#bulktagassets ) | **PUT** /tags/assets | Tag assets
*TagsApi* | [**createTag** ](doc//TagsApi.md#createtag ) | **POST** /tags | Create a tag
*TagsApi* | [**deleteTag** ](doc//TagsApi.md#deletetag ) | **DELETE** /tags/{id} | Delete a tag
*TagsApi* | [**getAllTags** ](doc//TagsApi.md#getalltags ) | **GET** /tags | Retrieve tags
*TagsApi* | [**getTagById** ](doc//TagsApi.md#gettagbyid ) | **GET** /tags/{id} | Retrieve a tag
*TagsApi* | [**tagAssets** ](doc//TagsApi.md#tagassets ) | **PUT** /tags/{id}/assets | Tag assets
*TagsApi* | [**untagAssets** ](doc//TagsApi.md#untagassets ) | **DELETE** /tags/{id}/assets | Untag assets
*TagsApi* | [**updateTag** ](doc//TagsApi.md#updatetag ) | **PUT** /tags/{id} | Update a tag
*TagsApi* | [**upsertTags** ](doc//TagsApi.md#upserttags ) | **PUT** /tags | Upsert tags
*TimelineApi* | [**getTimeBucket** ](doc//TimelineApi.md#gettimebucket ) | **GET** /timeline/bucket | Get time bucket
*TimelineApi* | [**getTimeBuckets** ](doc//TimelineApi.md#gettimebuckets ) | **GET** /timeline/buckets | Get time buckets
*TrashApi* | [**emptyTrash** ](doc//TrashApi.md#emptytrash ) | **POST** /trash/empty | Empty trash
*TrashApi* | [**restoreAssets** ](doc//TrashApi.md#restoreassets ) | **POST** /trash/restore/assets | Restore assets
*TrashApi* | [**restoreTrash** ](doc//TrashApi.md#restoretrash ) | **POST** /trash/restore | Restore trash
*UsersApi* | [**createProfileImage** ](doc//UsersApi.md#createprofileimage ) | **POST** /users/profile-image | Create user profile image
*UsersApi* | [**deleteProfileImage** ](doc//UsersApi.md#deleteprofileimage ) | **DELETE** /users/profile-image | Delete user profile image
*UsersApi* | [**deleteUserLicense** ](doc//UsersApi.md#deleteuserlicense ) | **DELETE** /users/me/license | Delete user product key
*UsersApi* | [**deleteUserOnboarding** ](doc//UsersApi.md#deleteuseronboarding ) | **DELETE** /users/me/onboarding | Delete user onboarding
2026-06-04 15:36:09 -04:00
*UsersApi* | [**getMyCalendarHeatmap** ](doc//UsersApi.md#getmycalendarheatmap ) | **GET** /users/me/calendar-heatmap | Retrieve calendar heatmap activity
2025-11-11 17:01:14 -05:00
*UsersApi* | [**getMyPreferences** ](doc//UsersApi.md#getmypreferences ) | **GET** /users/me/preferences | Get my preferences
*UsersApi* | [**getMyUser** ](doc//UsersApi.md#getmyuser ) | **GET** /users/me | Get current user
*UsersApi* | [**getProfileImage** ](doc//UsersApi.md#getprofileimage ) | **GET** /users/{id}/profile-image | Retrieve user profile image
*UsersApi* | [**getUser** ](doc//UsersApi.md#getuser ) | **GET** /users/{id} | Retrieve a user
*UsersApi* | [**getUserLicense** ](doc//UsersApi.md#getuserlicense ) | **GET** /users/me/license | Retrieve user product key
*UsersApi* | [**getUserOnboarding** ](doc//UsersApi.md#getuseronboarding ) | **GET** /users/me/onboarding | Retrieve user onboarding
*UsersApi* | [**searchUsers** ](doc//UsersApi.md#searchusers ) | **GET** /users | Get all users
*UsersApi* | [**setUserLicense** ](doc//UsersApi.md#setuserlicense ) | **PUT** /users/me/license | Set user product key
*UsersApi* | [**setUserOnboarding** ](doc//UsersApi.md#setuseronboarding ) | **PUT** /users/me/onboarding | Update user onboarding
*UsersApi* | [**updateMyPreferences** ](doc//UsersApi.md#updatemypreferences ) | **PUT** /users/me/preferences | Update my preferences
*UsersApi* | [**updateMyUser** ](doc//UsersApi.md#updatemyuser ) | **PUT** /users/me | Update current user
*UsersAdminApi* | [**createUserAdmin** ](doc//UsersAdminApi.md#createuseradmin ) | **POST** /admin/users | Create a user
*UsersAdminApi* | [**deleteUserAdmin** ](doc//UsersAdminApi.md#deleteuseradmin ) | **DELETE** /admin/users/{id} | Delete a user
*UsersAdminApi* | [**getUserAdmin** ](doc//UsersAdminApi.md#getuseradmin ) | **GET** /admin/users/{id} | Retrieve a user
2026-06-04 15:36:09 -04:00
*UsersAdminApi* | [**getUserCalendarHeatmapAdmin** ](doc//UsersAdminApi.md#getusercalendarheatmapadmin ) | **GET** /admin/users/{id}/calendar-heatmap | Retrieve calendar heatmap activity
2025-11-11 17:01:14 -05:00
*UsersAdminApi* | [**getUserPreferencesAdmin** ](doc//UsersAdminApi.md#getuserpreferencesadmin ) | **GET** /admin/users/{id}/preferences | Retrieve user preferences
*UsersAdminApi* | [**getUserSessionsAdmin** ](doc//UsersAdminApi.md#getusersessionsadmin ) | **GET** /admin/users/{id}/sessions | Retrieve user sessions
*UsersAdminApi* | [**getUserStatisticsAdmin** ](doc//UsersAdminApi.md#getuserstatisticsadmin ) | **GET** /admin/users/{id}/statistics | Retrieve user statistics
*UsersAdminApi* | [**restoreUserAdmin** ](doc//UsersAdminApi.md#restoreuseradmin ) | **POST** /admin/users/{id}/restore | Restore a deleted user
*UsersAdminApi* | [**searchUsersAdmin** ](doc//UsersAdminApi.md#searchusersadmin ) | **GET** /admin/users | Search users
*UsersAdminApi* | [**updateUserAdmin** ](doc//UsersAdminApi.md#updateuseradmin ) | **PUT** /admin/users/{id} | Update a user
*UsersAdminApi* | [**updateUserPreferencesAdmin** ](doc//UsersAdminApi.md#updateuserpreferencesadmin ) | **PUT** /admin/users/{id}/preferences | Update user preferences
*ViewsApi* | [**getAssetsByOriginalPath** ](doc//ViewsApi.md#getassetsbyoriginalpath ) | **GET** /view/folder | Retrieve assets by original path
*ViewsApi* | [**getUniqueOriginalPaths** ](doc//ViewsApi.md#getuniqueoriginalpaths ) | **GET** /view/folder/unique-paths | Retrieve unique paths
2025-11-14 14:05:05 -06:00
*WorkflowsApi* | [**createWorkflow** ](doc//WorkflowsApi.md#createworkflow ) | **POST** /workflows | Create a workflow
*WorkflowsApi* | [**deleteWorkflow** ](doc//WorkflowsApi.md#deleteworkflow ) | **DELETE** /workflows/{id} | Delete a workflow
*WorkflowsApi* | [**getWorkflow** ](doc//WorkflowsApi.md#getworkflow ) | **GET** /workflows/{id} | Retrieve a workflow
2026-05-18 11:09:33 -04:00
*WorkflowsApi* | [**getWorkflowForShare** ](doc//WorkflowsApi.md#getworkflowforshare ) | **GET** /workflows/{id}/share | Retrieve a workflow
*WorkflowsApi* | [**getWorkflowTriggers** ](doc//WorkflowsApi.md#getworkflowtriggers ) | **GET** /workflows/triggers | List all workflow triggers
*WorkflowsApi* | [**searchWorkflows** ](doc//WorkflowsApi.md#searchworkflows ) | **GET** /workflows | List all workflows
2025-11-14 14:05:05 -06:00
*WorkflowsApi* | [**updateWorkflow** ](doc//WorkflowsApi.md#updateworkflow ) | **PUT** /workflows/{id} | Update a workflow
2025-08-21 17:15:11 -05:00
## Documentation For Models
- [ActivityCreateDto ](doc//ActivityCreateDto.md )
- [ActivityResponseDto ](doc//ActivityResponseDto.md )
- [ActivityStatisticsResponseDto ](doc//ActivityStatisticsResponseDto.md )
- [AddUsersDto ](doc//AddUsersDto.md )
- [AdminOnboardingUpdateDto ](doc//AdminOnboardingUpdateDto.md )
- [AlbumResponseDto ](doc//AlbumResponseDto.md )
- [AlbumStatisticsResponseDto ](doc//AlbumStatisticsResponseDto.md )
- [AlbumUserAddDto ](doc//AlbumUserAddDto.md )
- [AlbumUserCreateDto ](doc//AlbumUserCreateDto.md )
- [AlbumUserResponseDto ](doc//AlbumUserResponseDto.md )
- [AlbumUserRole ](doc//AlbumUserRole.md )
- [AlbumsAddAssetsDto ](doc//AlbumsAddAssetsDto.md )
- [AlbumsAddAssetsResponseDto ](doc//AlbumsAddAssetsResponseDto.md )
- [AlbumsResponse ](doc//AlbumsResponse.md )
- [AlbumsUpdate ](doc//AlbumsUpdate.md )
2026-04-15 15:58:26 -04:00
- [ApiKeyCreateDto ](doc//ApiKeyCreateDto.md )
- [ApiKeyCreateResponseDto ](doc//ApiKeyCreateResponseDto.md )
- [ApiKeyResponseDto ](doc//ApiKeyResponseDto.md )
- [ApiKeyUpdateDto ](doc//ApiKeyUpdateDto.md )
2025-08-21 17:15:11 -05:00
- [AssetBulkDeleteDto ](doc//AssetBulkDeleteDto.md )
- [AssetBulkUpdateDto ](doc//AssetBulkUpdateDto.md )
- [AssetBulkUploadCheckDto ](doc//AssetBulkUploadCheckDto.md )
- [AssetBulkUploadCheckItem ](doc//AssetBulkUploadCheckItem.md )
- [AssetBulkUploadCheckResponseDto ](doc//AssetBulkUploadCheckResponseDto.md )
- [AssetBulkUploadCheckResult ](doc//AssetBulkUploadCheckResult.md )
2025-10-29 14:43:47 +01:00
- [AssetCopyDto ](doc//AssetCopyDto.md )
2026-01-09 17:59:52 -05:00
- [AssetEditAction ](doc//AssetEditAction.md )
2026-02-23 14:57:57 -06:00
- [AssetEditActionItemDto ](doc//AssetEditActionItemDto.md )
- [AssetEditActionItemDtoParameters ](doc//AssetEditActionItemDtoParameters.md )
- [AssetEditActionItemResponseDto ](doc//AssetEditActionItemResponseDto.md )
- [AssetEditsCreateDto ](doc//AssetEditsCreateDto.md )
- [AssetEditsResponseDto ](doc//AssetEditsResponseDto.md )
2025-08-21 17:15:11 -05:00
- [AssetFaceCreateDto ](doc//AssetFaceCreateDto.md )
- [AssetFaceDeleteDto ](doc//AssetFaceDeleteDto.md )
- [AssetFaceResponseDto ](doc//AssetFaceResponseDto.md )
- [AssetFaceUpdateDto ](doc//AssetFaceUpdateDto.md )
- [AssetFaceUpdateItem ](doc//AssetFaceUpdateItem.md )
2026-04-14 23:39:03 +02:00
- [AssetIdErrorReason ](doc//AssetIdErrorReason.md )
2025-08-21 17:15:11 -05:00
- [AssetIdsDto ](doc//AssetIdsDto.md )
- [AssetIdsResponseDto ](doc//AssetIdsResponseDto.md )
- [AssetJobName ](doc//AssetJobName.md )
- [AssetJobsDto ](doc//AssetJobsDto.md )
- [AssetMediaResponseDto ](doc//AssetMediaResponseDto.md )
- [AssetMediaSize ](doc//AssetMediaSize.md )
- [AssetMediaStatus ](doc//AssetMediaStatus.md )
2026-01-08 14:52:16 -05:00
- [AssetMetadataBulkDeleteDto ](doc//AssetMetadataBulkDeleteDto.md )
- [AssetMetadataBulkDeleteItemDto ](doc//AssetMetadataBulkDeleteItemDto.md )
- [AssetMetadataBulkResponseDto ](doc//AssetMetadataBulkResponseDto.md )
- [AssetMetadataBulkUpsertDto ](doc//AssetMetadataBulkUpsertDto.md )
- [AssetMetadataBulkUpsertItemDto ](doc//AssetMetadataBulkUpsertItemDto.md )
2025-08-27 14:31:23 -04:00
- [AssetMetadataResponseDto ](doc//AssetMetadataResponseDto.md )
- [AssetMetadataUpsertDto ](doc//AssetMetadataUpsertDto.md )
- [AssetMetadataUpsertItemDto ](doc//AssetMetadataUpsertItemDto.md )
2025-10-28 15:57:03 -05:00
- [AssetOcrResponseDto ](doc//AssetOcrResponseDto.md )
2025-08-21 17:15:11 -05:00
- [AssetOrder ](doc//AssetOrder.md )
2026-05-11 14:35:10 -07:00
- [AssetOrderBy ](doc//AssetOrderBy.md )
2026-04-14 23:39:03 +02:00
- [AssetRejectReason ](doc//AssetRejectReason.md )
2025-08-21 17:15:11 -05:00
- [AssetResponseDto ](doc//AssetResponseDto.md )
- [AssetStackResponseDto ](doc//AssetStackResponseDto.md )
- [AssetStatsResponseDto ](doc//AssetStatsResponseDto.md )
- [AssetTypeEnum ](doc//AssetTypeEnum.md )
2026-04-14 23:39:03 +02:00
- [AssetUploadAction ](doc//AssetUploadAction.md )
2025-08-21 17:15:11 -05:00
- [AssetVisibility ](doc//AssetVisibility.md )
- [AudioCodec ](doc//AudioCodec.md )
- [AuthStatusResponseDto ](doc//AuthStatusResponseDto.md )
- [AvatarUpdate ](doc//AvatarUpdate.md )
- [BulkIdErrorReason ](doc//BulkIdErrorReason.md )
- [BulkIdResponseDto ](doc//BulkIdResponseDto.md )
- [BulkIdsDto ](doc//BulkIdsDto.md )
- [CLIPConfig ](doc//CLIPConfig.md )
- [CQMode ](doc//CQMode.md )
2026-06-04 15:36:09 -04:00
- [CalendarHeatmapResponseDto ](doc//CalendarHeatmapResponseDto.md )
- [CalendarHeatmapResponseDtoSeriesInner ](doc//CalendarHeatmapResponseDtoSeriesInner.md )
- [CalendarHeatmapType ](doc//CalendarHeatmapType.md )
2025-08-21 17:15:11 -05:00
- [CastResponse ](doc//CastResponse.md )
- [CastUpdate ](doc//CastUpdate.md )
- [ChangePasswordDto ](doc//ChangePasswordDto.md )
- [Colorspace ](doc//Colorspace.md )
feat(album): show per-user contributions in shared albums (#21740)
* feat: show per-user contribution counts on shared albums
Add API support and UI display for per-user asset contribution
counts on shared albums:
- server: add ContributorCountResponseDto and repository method to
aggregate counts per user (excluding deleted assets), expose via
album response only when shared and counts > 0
- web: display contributor counts in Album Users modal next to each
member’s role
This helps users understand participation levels in shared albums.
* Add ContributorCountResponseDto and expose contributorCounts
on AlbumResponseDto in OpenAPI spec. Regenerate TypeScript SDK
and mobile OpenAPI clients to include new types.
No breaking changes; fields are additive.
* fix: shrink age view to fit and not overflow (#22405)
Co-authored-by: Alex <alex.tran1502@gmail.com>
* chore: post release tasks (#22587)
* chore: clean auth-user entity on reset (#22583)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix: mitigate database lock scenario when running full sync in splash screen page (#22608)
* fix: improve sync backup error indicator (#22527)
* fix: improve sync indicator error
* prefer backup disabled icon before error
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: bottom navigation bar overlay sheet info (#22610)
* fix: respect storage indicator setting (#22596)
* fix: respect storage indicator size setting
* remove black bar on the bottom of the setting scaffold page
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: do not run multiple engines on cold startup (#22518)
fix: do not run multiple engines on app startup
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: album selector in favorite view (#22612)
* chore(web): update translations (#22486)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/az/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bg/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/el/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hu/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/kn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ko/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ml/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich
Co-authored-by: Arthur Bols <arthur@bols.dev>
Co-authored-by: Ben Kim <benkim1129@gmail.com>
Co-authored-by: César Gómez <cegomez@gmail.com>
Co-authored-by: DR <weblate-kavita.snowflake668@slmail.me>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Emil Friis Osmann <Emilfriisosmann@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Godwin T <godwintgn@protonmail.com>
Co-authored-by: Hristo T <hristotarnev@gmail.com>
Co-authored-by: Hurricane-32 <rodrigorimo@hotmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: KecskeTech <teonyitas@gmail.com>
Co-authored-by: Kiril Panayotov <eccyboo@protonmail.com>
Co-authored-by: Liviu Roman <contact@liviuroman.com>
Co-authored-by: Lorenzo <artale.lorenzo@outlook.it>
Co-authored-by: Marcelo Popper Costa <marcelo_popper@hotmail.com>
Co-authored-by: Matjaž T <matjaz@moj-svet.si>
Co-authored-by: Miryusif Rahimov <miryusifrahimov@gmail.com>
Co-authored-by: Msaood <msaood@msaood.com>
Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Co-authored-by: Pedro Vendeira <vendeira.pedro@gmail.com>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Rahees <ahdrahees.dev@gmail.com>
Co-authored-by: Sandeep R <sandeep1891995@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Tino Altmann <usinggrant@hotmail.de>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: anton garcias <isaga.percompartir@gmail.com>
Co-authored-by: chamdim <chamdim@protonmail.com>
Co-authored-by: longlarry <weblate.gm@tuta.io>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: swever <swever@users.noreply.hosted.weblate.org>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Co-authored-by: 안세훈 <on9686@gmail.com>
* chore: version v2.0.1
* fix(docs): link to immich docs does not lead correctly to docs (#22687)
* fix(server): fix chunking Postgres query parameters (#22684)
* feat(server): improve checkAlbumAccess query performance (#22467)
* Fix slow SQL query in checkAlbumAccess caused by the array overlap operator &&
* Update access.repository.sql
* Rewrite the query to pass assetIds once as a single array parameter
* chore: mark VSCode tasks as background tasks (#22631)
VSCode expect tasks that aren't marked as background tasks to finish eventually. That's not how a dev-server is supposed to work, we expect it to run for basically infinite time.
By marking those tasks as background tasks, VSCode stops showing the infinite loading spinner on those processes.
* fix(ml): Resolve IPv6 startup crash and healthcheck failure (#22387)
* fix(ml): Resolve IPv6 startup crash and healthcheck failure
Fixes #13782
* fix(ml): updated the fix to use the std lib
* Apply code formatting to __main__.py
* fix(server): override reserved color metadata for video thumbnails (#22348)
override reserved metadata
* fix(mobile): trash description cut off (#22662)
* fix(mobile): empty album description does not save (#22649)
* fix(mobile): video player using ref after disposal (#21843)
check if disposed
* docs: add job order diagram (#22673)
* docs: add job order diagram
* wording
---------
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
* fix: missing responsive calculation in UserPageLayout (#22455)
* fix: use full-size image for non-web-compatible panoramas (#20359)
* fix(web): use full-size image for non-web-compatible panoramas
* always generate full-size image for panoramas
* add unit test
* fix formatting
---------
Co-authored-by: gergo= <gergo@pitty.hu>
* chore: update cli docs to pnpm (#22702)
update cli docs to pnpm
* chore(web): upgrade ESLint and plugins (#22495)
* chore(web): upgrade ESLint and plugins, simplify linting configuration
- Update eslint from ^9.18.0 to ^9.36.0
- Update eslint plugins:
- eslint-plugin-svelte: ^3.9.0 → ^3.12.4
- eslint-plugin-unicorn: ^60.0.0 → ^61.0.2
- svelte-eslint-parser: ^1.2.0 → ^1.3.3
- typescript-eslint: ^8.28.0 → ^8.45.0
- Remove eslint-p dependency in favor of native eslint concurrency
- Add unicorn/no-array-sort rule exception
- Update linting scripts to use eslint's native --concurrency flag
- Update Makefile and mise.toml to reflect simplified lint commands
- Update GitHub Actions workflow to use standard pnpm lint command
* pnpm dedupe
---------
Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com>
* fix(web): do not notify on patch releases (#22591)
* chore: post release tasks (#22616)
* fix: hide view in timeline button on local timeline (#22713)
* chore(server): support vectorchord 0.5.x (#21602)
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
* fix: Fix issue fail to download iOS live photos (#22708)
Co-authored-by: bwees <brandonwees@gmail.com>
* fix(docs): Remove immich_remove_offline_files as no longer functional (#21774)
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
Co-authored-by: Brandon Wees <brandonwees@gmail.com>
* fix(mobile): closing editor goes back to main page (#22647)
Co-authored-by: bwees <brandonwees@gmail.com>
* docs: update TrueNAS migration instructions (#22463)
Co-authored-by: bo0tzz <git@bo0tzz.me>
Co-authored-by: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com>
* docs: update Synology install guide (#21996)
Co-authored-by: mertalev <101130780+mertalev@users.noreply.github.com>
* fix: improve the selected sidebar item text color in dark mode (#22640)
* chore(deps): update redis:6.2-alpine docker digest to 2185e74 (#22718)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* chore: update devcontainers for trixie, devenv changes (#22194)
* fix(deps): update dependency device_info_plus to v12 (#22724)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* chore(deps): update dependency flutter to v3.35.5 (#22720)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* chore(deps): update github-actions (#22721)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix: --no-git-checks on pnpm publish (#22715)
* fix: --no-git-checks on sdk publish
* fix: --no-git-checks on cli publish
* refactor(web): Clarify property names in Timeline and Scrubber (#22265)
refactor(web): Clarify property names in Timeline and Scrubber
Renamed properties across Timeline/Scrubber components for clarity:
- scrubOverallPercent → timelineScrollPercent
- scrubberMonthPercent → viewportTopMonthScrollPercent
- scrubberMonth → viewportTopMonth
- leadout → isInLeadOutSection
Additional changes:
- Updated ScrubberListener signature to accept object parameter
- Added detailed JSDoc comments for all Scrubber props
- Fixed callback invocations to use new object syntax
- Aligned Timeline's local state variables with Scrubber prop names
* fix: promote to foreground service before starting engine (#22517)
fix: show notification from native
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* refactor(web): extract timeline keyboard actions into separate component (#22266)
refactor(web): extract timeline keyboard actions into separate component
Extracts keyboard shortcuts and related functionality from Timeline component into a dedicated TimelineKeyboardActions component for better separation of concerns and maintainability.
* feat: make skeleton title optional (#22396)
feat: skeleton title is optional
feat: skeleton title optional
* refactor(web): extract asset viewer logic from Timeline into TimelineAssetViewer component (#22268)
refactor(web): extract asset viewer logic from Timeline into TimelineAssetViewer component
- Extracted asset viewer navigation and action handling logic from Timeline.svelte into a dedicated TimelineAssetViewer component
- Reduces Timeline.svelte complexity by ~150 lines and improves separation of concerns
- No functional changes - purely a refactoring to improve code organization
## Changes
- Created new TimelineAssetViewer.svelte component containing all asset viewer-related logic
- Moved handlePrevious, handleNext, handleRandom, handleClose, handlePreAction, and handleAction methods
- Timeline.svelte now only passes required props to the new component
- Maintained all existing functionality including navigation, asset actions, and stack management
* chore: track full actions/cache version in comment (#22359)
* fix(ml): ipv6 check (#22735)
* chore(deps): cache pnpm dependencies in prod build (#22555)
* cache pnpm dependencies
use different ids to be safe
unnecessary lines
* use buildcache folder
* chore: use isar immich fork (#22738)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix: bottom sheet blank with local assets that have remote counterparts (#22743)
* chore(deps): update dependency @types/node to ^22.18.8 (#22719)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* chore(deps): update dependency nodemailer to v7.0.7 [security] (#22740)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix(deps): update dependency connectivity_plus to v7 (#22723)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* chore: use hosted isar flutter libs (#22757)
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
* fix: skip local only assets in move to lock action (#22728)
* fix:prefer trashing to deletions
* skip local only assets in move to lock action
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: brief flashing when swiping from video (#22187)
* fix(web): Uniform random distribution during shuffle (#19902)
feat: better random distribution
* fix: persist search page scroll offset between rebuilds (#22733)
fix: persist search scroll between rebuilds
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* docs: add some external library notes (#22776)
* feat(web): seconds and milliseconds in timestamps (#20337)
* fix(web): seconds in timestamps
* changed date-input step to provide millisecond precision
* feat(cli): add debug development config (#22712)
* add debug and change ts-node with tsx
* update pr changes
* update pnpm-lock
* remove ts-node from readme
* typo
* resolve conflicts
* remove tsx
* launch from dist
* add preLaunchTask
* update readme
* undo main in package.json
* remove typo
* Apply suggestion from @bwees
Co-authored-by: Brandon Wees <brandonwees@gmail.com>
* revert pnpm-lock changes
* @jrasm91 suggestions
* chore: run node with source maps
---------
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Brandon Wees <brandonwees@gmail.com>
* docs: add Immich-Stack to community-projects (#21563)
docs: add Immich Stack community project
Co-authored-by: Jason Rasmussen <jason@rasm.me>
* feat(web): Add upload to stack action (#19842)
* feat(web): Add upload to stack action
* Event handling and translation
* Update asset viewer instead
* lint, improve upload return type
* Add suggestions from code review
* Resolve merge conflicts
* Apply suggestions from code review
* feat(server): add `immich.users.total` metric (#21780)
* Add immich.users.total metric
* Fix tests & one lint error
* Lint
* Fix SQL Schema checks
* Fix nit
* Use workers argument in OnEvent hook and remove condition from method body
* feat(docs): add zh_TW Traditional Chinese version README (#22703)
docs: add zh_TW Traditional Chinese version README
* chore: ignore renovate major updates for postgres image (#22764)
* fix: remove postgres exclude datasource match (#22811)
* chore(deps): update github-actions (major) (#22810)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix: revert terragrunt-action bump (#22812)
* chore: don't enforce runes (#22813)
* chore(deps): update base-image to v202510092146 (major) (#22818)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix(deps): update typescript-projects (#22809)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
* fix: only cast to device if the asset is a RemoteAsset (#22805)
* feat: (perf) remove scroll compensation (#22837)
* fix(deps): update dependency happy-dom to v20 [security] (#22846)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* chore(deps): update github-actions (#22793)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix: various typos (#22867)
Found via `codespell -q 3 -S "*.svg,./i18n,./docs/package-lock.json,./readme_i18n,./mobile/assets/i18n" -L afterall,devlop,finaly,inout,nd,optin,renderd,sade`
* fix: ios skip posting hash response after detached from engine (#22695)
* skip posting message after detached from engine
* review changes
* cancel plugin before destroying engine
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.3.0 docker digest to 6f3e9d2 (#22912)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* chore(deps): update ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 docker digest to bcf6335 (#22913)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix: re-add scroll compensation (efficiently) (#22848)
* fix: re-add scroll compensation (efficient)
* Rename showSkeleton to invisible. Adjust skeleton margins, invisible support.
* Fix faulty logic, simplify
* Calculate ratios and determine compensation strategy: height comp for above/partiality visible, month-scroll comp within a fully visible month.
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix: shared album control permissions (#22435)
* fix: shared album control permissions
* fix: properly display "add photos"
* fix: dont allow modification of album order
* fix: album title/description edit from app bar
* chore: code review changes
* chore: format translations
* chore: lintings
* fix: show dialog before delete local action (#22280)
* fix: show dialog on delete local action
# Conflicts:
# mobile/lib/repositories/asset_media.repository.dart
* button style
---------
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
* fix(deps): update dependency kysely-postgres-js to v3 (#22924)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* chore(deps): update redis:6.2-alpine docker digest to 77697a7 (#22915)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
* fix(deps): update typescript-projects (#22918)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
* feat: local album events notification (#22817)
* feat: local album events notification
* pr feedback
* show number of unread notification
* chore: refactor show view in timeline button (#22894)
* chore: refactor show view in timeline button
This refactor includes changes to notify asset viewer about where an asset was shown from.
* chore: realized I could just pull from the timelineProvider instead of storing it in the asset viewer state
* chore: rename enum to TimelineOrigin and update members
* fix: update isOwner condition
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
* chore(web): update translations (#22623)
Translate-URL: https://hosted.weblate.org/projects/immich/immich/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ar/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/be/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/bn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ca/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/da/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/de/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/el/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/es/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/et/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/fr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/gl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/he/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hi/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/id/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/it/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ja/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ka/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/lv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/mr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nb_NO/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/nl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pa/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pt_BR/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ro/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ru/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sr_Latn/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sv/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/ta/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/tr/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/uk/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_Hant/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/zh_SIMPLIFIED/
Translation: Immich/immich
Co-authored-by: Abhijeet Bonde <abhijeetbonde19@gmail.com>
Co-authored-by: Adam Uchmanowicz <auchmanowicz@gmail.com>
Co-authored-by: Adrian Hermida <adrian.hermida.baloira@gmail.com>
Co-authored-by: Aleksa Milošević <akimaki15@gmail.com>
Co-authored-by: Amin <amnsharif@gmail.com>
Co-authored-by: AndreiP28 <andreiprica28@gmail.com>
Co-authored-by: António Santos <antoniomsantos99@gmail.com>
Co-authored-by: Asger Mogensen <asgermog@gmail.com>
Co-authored-by: Christoph Auer <Christoph.Auer@pilsheim.de>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Eetu Mäenpää <me@eetumaenpaa.fi>
Co-authored-by: Felipe Garcia <garcia.o.felipe@gmail.com>
Co-authored-by: Filip Joković <filip@jokovic.dev>
Co-authored-by: Hurricane-32 <rodrigorimo@hotmail.com>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Jason Song <songpeiheng@gmail.com>
Co-authored-by: Javier Villanueva García <jvg2203@gmail.com>
Co-authored-by: Jordy H <jordy@hoebergen.net>
Co-authored-by: Jorge Montejo <jorgemon.lopez@gmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Konstantinos D <kdemer@yahoo.com>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: Linerly <linerly@proton.me>
Co-authored-by: Liviu Roman <contact@liviuroman.com>
Co-authored-by: Lorenz Baum <LorenzBaum@gmx.de>
Co-authored-by: Lukas Konsin <lukaskonsin@proton.me>
Co-authored-by: Mandeep <mandeeps708@gmail.com>
Co-authored-by: Marc Casillas <mcasillassu@gmail.com>
Co-authored-by: Marcelo Popper Costa <marcelo_popper@hotmail.com>
Co-authored-by: MatijaThe245th <matija245matakovic@gmail.com>
Co-authored-by: Matjaž T <matjaz@moj-svet.si>
Co-authored-by: Mees Frensel <meesfrensel@gmail.com>
Co-authored-by: Mirko <itzmirko@itzmirko.it>
Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Co-authored-by: Oleksandr Yurov <oyurov@icloud.com>
Co-authored-by: Orkun Sürel <orkunsurel@gmail.com>
Co-authored-by: Peter Dave Hello <hsu@peterdavehello.org>
Co-authored-by: Philipp Burndorfer <phi.bur@gmx.at>
Co-authored-by: Prasanth Baskar <bupdprasanth@gmail.com>
Co-authored-by: Roman Zhukov <Softver161@gmail.com>
Co-authored-by: Sayan Goswami <goswami.sayan47@gmail.com>
Co-authored-by: Sergey Katsubo <skatsubo@gmail.com>
Co-authored-by: Simon Bierwald <simon.bierwald@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
Co-authored-by: Theodore Zhvania <zhvania@ted.ge>
Co-authored-by: Tim De Meyer <demeyer.tim@gmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Valentino Harpa <valen.ginga@gmail.com>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: Willem Schipper <git@willem.page>
Co-authored-by: Yago Raña Gayoso <yago.rana.gayoso@gmail.com>
Co-authored-by: Zurab Sajaia <vavalomi@hotmail.com>
Co-authored-by: albanobattistella <albanobattistella@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: dark&white <darkwhite@users.noreply.hosted.weblate.org>
Co-authored-by: eav5jhl0 <eav5jhl0@users.noreply.hosted.weblate.org>
Co-authored-by: findussoft <sella_violett_8i@icloud.com>
Co-authored-by: kiwinho <kiwicaja@gmail.com>
Co-authored-by: millallo <millallo@tiscali.it>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: rokon001 <rnacc3579@gmail.com>
Co-authored-by: vaibhav kumar <catvaku@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
* chore: version v2.1.0
* refactor
* question marks are the enemy
* refactor count map
* update readme
* e2e
* count of 0 is impossible
* useless async
---------
Co-authored-by: Chaoscontrol <6642238+Chaoscontrol@users.noreply.github.com>
Co-authored-by: Brandon Wees <brandonwees@gmail.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: shenlong <139912620+shenlong-tanwen@users.noreply.github.com>
Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Weblate (bot) <hosted@weblate.org>
Co-authored-by: Arthur Bols <arthur@bols.dev>
Co-authored-by: Ben Kim <benkim1129@gmail.com>
Co-authored-by: César Gómez <cegomez@gmail.com>
Co-authored-by: DR <weblate-kavita.snowflake668@slmail.me>
Co-authored-by: DevServs <bonov@mail.ru>
Co-authored-by: Emil Friis Osmann <Emilfriisosmann@gmail.com>
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Godwin T <godwintgn@protonmail.com>
Co-authored-by: Hristo T <hristotarnev@gmail.com>
Co-authored-by: Hurricane-32 <rodrigorimo@hotmail.com>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: KecskeTech <teonyitas@gmail.com>
Co-authored-by: Kiril Panayotov <eccyboo@protonmail.com>
Co-authored-by: Liviu Roman <contact@liviuroman.com>
Co-authored-by: Lorenzo <artale.lorenzo@outlook.it>
Co-authored-by: Marcelo Popper Costa <marcelo_popper@hotmail.com>
Co-authored-by: Matjaž T <matjaz@moj-svet.si>
Co-authored-by: Miryusif Rahimov <miryusifrahimov@gmail.com>
Co-authored-by: Msaood <msaood@msaood.com>
Co-authored-by: Mārtiņš Bruņenieks <martinsb@gmail.com>
Co-authored-by: Pedro Vendeira <vendeira.pedro@gmail.com>
Co-authored-by: PontusÖsterlindh <pontus@osterlindh.com>
Co-authored-by: Rahees <ahdrahees.dev@gmail.com>
Co-authored-by: Sandeep R <sandeep1891995@gmail.com>
Co-authored-by: Sylvain Pichon <service@spichon.fr>
Co-authored-by: TV Box <realceday.tvbox@gmail.com>
Co-authored-by: Tino Altmann <usinggrant@hotmail.de>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: Vegard Fladby <vegard@fladby.org>
Co-authored-by: anton garcias <isaga.percompartir@gmail.com>
Co-authored-by: chamdim <chamdim@protonmail.com>
Co-authored-by: longlarry <weblate.gm@tuta.io>
Co-authored-by: pyccl <changcongliang@163.com>
Co-authored-by: swever <swever@users.noreply.hosted.weblate.org>
Co-authored-by: தமிழ்நேரம் <tamilneram247@gmail.com>
Co-authored-by: 안세훈 <on9686@gmail.com>
Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Xavier Dupuis <xavier0978@hotmail.fr>
Co-authored-by: Sergey Katsubo <skatsubo@gmail.com>
Co-authored-by: Adrian Jost <22987140+adrianjost@users.noreply.github.com>
Co-authored-by: Cokodayo <78474654+CaptainJack2491@users.noreply.github.com>
Co-authored-by: Mert <101130780+mertalev@users.noreply.github.com>
Co-authored-by: Yaros <thedj.launchpadder.dmx512@gmail.com>
Co-authored-by: USBAkimbo <71508071+USBAkimbo@users.noreply.github.com>
Co-authored-by: Min Idzelis <min123@gmail.com>
Co-authored-by: grgergo <gergo_g@proton.me>
Co-authored-by: gergo= <gergo@pitty.hu>
Co-authored-by: Jorge Montejo <jorgemon.lopez@gmail.com>
Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Diogo Correia <me@diogotc.com>
Co-authored-by: CuberL <liaoziyue10@gmail.com>
Co-authored-by: Xantin <56741168+Xiticks@users.noreply.github.com>
Co-authored-by: bo0tzz <git@bo0tzz.me>
Co-authored-by: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com>
Co-authored-by: TDR001 <redp50@outlook.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Saschl <19493808+Saschl@users.noreply.github.com>
Co-authored-by: Pascal Sommer <Pascal-So@users.noreply.github.com>
Co-authored-by: kaziu687 <kaziu687@gmail.com>
Co-authored-by: Qhilm <3350433+Qhilm@users.noreply.github.com>
Co-authored-by: Sebastian Schneider <sese.tailor@gmx.net>
Co-authored-by: Tushar Harsora <tusharharsora95@gmail.com>
Co-authored-by: Peter Dave Hello <hsu@peterdavehello.org>
Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
Co-authored-by: luzpaz <luzpaz@users.noreply.github.com>
Co-authored-by: Abhijeet Bonde <abhijeetbonde19@gmail.com>
Co-authored-by: Adam Uchmanowicz <auchmanowicz@gmail.com>
Co-authored-by: Adrian Hermida <adrian.hermida.baloira@gmail.com>
Co-authored-by: Aleksa Milošević <akimaki15@gmail.com>
Co-authored-by: Amin <amnsharif@gmail.com>
Co-authored-by: AndreiP28 <andreiprica28@gmail.com>
Co-authored-by: António Santos <antoniomsantos99@gmail.com>
Co-authored-by: Asger Mogensen <asgermog@gmail.com>
Co-authored-by: Christoph Auer <Christoph.Auer@pilsheim.de>
Co-authored-by: Denis Pacquier <denis.pacquier@gmail.com>
Co-authored-by: Eetu Mäenpää <me@eetumaenpaa.fi>
Co-authored-by: Felipe Garcia <garcia.o.felipe@gmail.com>
Co-authored-by: Filip Joković <filip@jokovic.dev>
Co-authored-by: Indrek Haav <indrek.haav@hotmail.com>
Co-authored-by: Jason Song <songpeiheng@gmail.com>
Co-authored-by: Javier Villanueva García <jvg2203@gmail.com>
Co-authored-by: Jordy H <jordy@hoebergen.net>
Co-authored-by: Konstantinos D <kdemer@yahoo.com>
Co-authored-by: Leo Bottaro <github@leobottaro.com>
Co-authored-by: Linerly <linerly@proton.me>
Co-authored-by: Lorenz Baum <LorenzBaum@gmx.de>
Co-authored-by: Lukas Konsin <lukaskonsin@proton.me>
Co-authored-by: Mandeep <mandeeps708@gmail.com>
Co-authored-by: Marc Casillas <mcasillassu@gmail.com>
Co-authored-by: MatijaThe245th <matija245matakovic@gmail.com>
Co-authored-by: Mees Frensel <meesfrensel@gmail.com>
Co-authored-by: Mirko <itzmirko@itzmirko.it>
Co-authored-by: Oleksandr Yurov <oyurov@icloud.com>
Co-authored-by: Orkun Sürel <orkunsurel@gmail.com>
Co-authored-by: Philipp Burndorfer <phi.bur@gmx.at>
Co-authored-by: Prasanth Baskar <bupdprasanth@gmail.com>
Co-authored-by: Roman Zhukov <Softver161@gmail.com>
Co-authored-by: Sayan Goswami <goswami.sayan47@gmail.com>
Co-authored-by: Simon Bierwald <simon.bierwald@gmail.com>
Co-authored-by: Taiki M <vexingly-many-mace@duck.com>
Co-authored-by: Theodore Zhvania <zhvania@ted.ge>
Co-authored-by: Tim De Meyer <demeyer.tim@gmail.com>
Co-authored-by: Valentino Harpa <valen.ginga@gmail.com>
Co-authored-by: Willem Schipper <git@willem.page>
Co-authored-by: Yago Raña Gayoso <yago.rana.gayoso@gmail.com>
Co-authored-by: Zurab Sajaia <vavalomi@hotmail.com>
Co-authored-by: albanobattistella <albanobattistella@gmail.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
Co-authored-by: dark&white <darkwhite@users.noreply.hosted.weblate.org>
Co-authored-by: eav5jhl0 <eav5jhl0@users.noreply.hosted.weblate.org>
Co-authored-by: findussoft <sella_violett_8i@icloud.com>
Co-authored-by: kiwinho <kiwicaja@gmail.com>
Co-authored-by: millallo <millallo@tiscali.it>
Co-authored-by: rokon001 <rnacc3579@gmail.com>
Co-authored-by: vaibhav kumar <catvaku@gmail.com>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com>
2025-10-14 22:34:20 +01:00
- [ContributorCountResponseDto ](doc//ContributorCountResponseDto.md )
2025-08-21 17:15:11 -05:00
- [CreateAlbumDto ](doc//CreateAlbumDto.md )
- [CreateLibraryDto ](doc//CreateLibraryDto.md )
- [CreateProfileImageResponseDto ](doc//CreateProfileImageResponseDto.md )
2026-01-09 17:59:52 -05:00
- [CropParameters ](doc//CropParameters.md )
2025-08-21 17:15:11 -05:00
- [DatabaseBackupConfig ](doc//DatabaseBackupConfig.md )
feat: restore database backups (#23978)
* feat: ProcessRepository#createSpawnDuplexStream
* test: write tests for ProcessRepository#createSpawnDuplexStream
* feat: StorageRepository#createGzip,createGunzip,createPlainReadStream
* feat: backups util (args, create, restore, progress)
* feat: wait on maintenance operation lock on boot
* chore: use backup util from backup.service.ts
test: update backup.service.ts tests with new util
* feat: list/delete backups (maintenance services)
* chore: open api
fix: missing action in cli.service.ts
* chore: add missing repositories to MaintenanceModule
* refactor: move logSecret into module init
* feat: initialise StorageCore in maintenance mode
* feat: authenticate websocket requests in maintenance mode
* test: add mock for new storage fns
* feat: add MaintenanceEphemeralStateRepository
refactor: cache the secret in memory
* test: update service worker tests
* feat: add external maintenance mode status
* feat: synchronised status, restore db action
* test: backup restore service tests
* refactor: DRY end maintenance
* feat: list and delete backup routes
* feat: start action on boot
* fix: should set status on restore end
* refactor: add maintenanceStore to hold writables
* feat: sync status to web app
* feat: web impl.
* test: various utils for testings
* test: web e2e tests
* test: e2e maintenance spec
* test: update cli spec
* chore: e2e lint
* chore: lint fixes
* chore: lint fixes
* feat: start restore flow route
* test: update e2e tests
* chore: remove neon lights on maintenance action pages
* fix: use 'startRestoreFlow' on onboarding page
* chore: ignore any library folder in `docker/`
* fix: load status on boot
* feat: upload backups
* refactor: permit any .sql(.gz) to be listed/restored
* feat: download backups from list
* fix: permit uploading just .sql files
* feat: restore just .sql files
* fix: don't show backups list if logged out
* feat: system integrity check in restore flow
* test: not providing failed backups in API anymore
* test: util should also not try to use failedBackups
* fix: actually assign inputStream
* test: correct test backup prep.
* fix: ensure task is defined to show error
* test: fix docker cp command
* test: update e2e web spec to select next button
* test: update e2e api tests
* test: refactor timeouts
* chore: remove `showDelete` from maint. settings
* chore: lint
* chore: lint
* fix: make sure backups are correctly sorted for clean up
* test: update service spec
* test: adjust e2e timeout
* test: increase web timeouts for ci
* chore: move gitignore changes
* chore: additional filename validation
* refactor: better typings for integrity API
* feat: higher accuracy progress tracking
* chore: delay lock retry
* refactor: remove old maintenance settings
* refactor: clean up tailwind classes
* refactor: use while loop rather than recursive calls
* test: update service specs
* chore: check canParse too
* chore: lint
* fix: logic error causing infinite loop
* refactor: use <ProgressBar /> from ui library
* fix: create or overwrite file
* chore: i18n pass, update progress bar
* fix: wrong translation string
* chore: update colour variables
* test: update web test for new maint. page
* chore: format, fix key
* test: update tests to be more linter complaint & use new routines
* chore: update onClick -> onAction, title -> breadcrumbs
* fix: use wrench icon in admin settings sidebar
* chore: add translation strings to accordion
* chore: lint
* refactor: move maintenance worker init into service
* refactor: `maintenanceStatus` -> `getMaintenanceStatus`
refactor: `integrityCheck` -> `detectPriorInstall`
chore: add `v2.4.0` version
refactor: `/backups/list` -> `/backups`
refactor: use sendFile in download route
refactor: use separate backups permissions
chore: correct descriptions
refactor: permit handler that doesn't return promise for sendfile
* refactor: move status impl into service
refactor: add active flag to maintenance status
* refactor: split into database backup controller
* test: split api e2e tests and passing
* fix: move end button into authed default maint page
* fix: also show in restore flow
* fix: import getMaintenanceStatus
* test: split web e2e tests
* refactor: ensure detect install is consistently named
* chore: ensure admin for detect install while out of maint.
* refactor: remove state repository
* test: update maint. worker service spec
* test: split backup service spec
* refactor: rename db backup routes
* refactor: instead of param, allow bulk backup deletion
* test: update sdk use in e2e test
* test: correct deleteBackup call
* fix: correct type for serverinstall response dto
* chore: validate filename for deletion
* test: wip
* test: backups no longer take path param
* refactor: scope util to database-backups instead of backups
* fix: update worker controller with new route
* chore: use new admin page actions
* chore: remove stray comment
* test: rename outdated test
* refactor: getter pattern for maintenance secret
* refactor: `createSpawnDuplexStream` -> `spawnDuplexStream`
* refactor: prefer `Object.assign`
* refactor: remove useless try {} block
* refactor: prefer `type Props`
refactor: prefer arrow function
* refactor: use luxon API for minutesAgo
* chore: remove change to gitignore
* refactor: prefer `type Props`
* refactor: remove async from onMount
* refactor: use luxon toRelative for relative time
* refactor: duplicate logic check
* chore: open api
* refactor: begin moving code into web//services
* refactor: don't use template string with $t
* test: use dialog role to match prompt
* refactor: split actions into flow/restore
* test: fix action value
* refactor: move more service calls into web//services
* chore: should void fn return
* chore: bump 2.4.0 to 2.5.0 in controller
* chore: bump 2.4.0 to 2.5.0 in controller
* refactor: use events for web//services
* chore: open api
* chore: open api
* refactor: don't await returned promise
* refactor: remove redundant check
* refactor: add `type: command` to actions
* refactor: split backup entries into own component
* refactor: split restore flow into separate components
* refactor(web): split BackupDelete event
* chore: stylings
* chore: stylings
* fix: don't log query failure on first boot
* feat: support pg_dumpall backups
* feat: display information about each backup
* chore: i18n
* feat: rollback to restore point on migrations failure
* feat: health check after restore
* chore: format
* refactor: split health check into separate function
* refactor: split health into repository
test: write tests covering rollbacks
* fix: omit 'health' requirement from createDbBackup
* test(e2e): rollback test
* fix: wrap text in backup entry
* fix: don't shrink context menu button
* fix: correct CREATE DB syntax for postgres
* test: rename backups generated by test
* feat: add filesize to backup response dto
* feat: restore list
* feat: ui work
* fix: e2e test
* fix: e2e test
* pr feedback
* pr feedback
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-01-20 15:22:28 +00:00
- [DatabaseBackupDeleteDto ](doc//DatabaseBackupDeleteDto.md )
- [DatabaseBackupDto ](doc//DatabaseBackupDto.md )
- [DatabaseBackupListResponseDto ](doc//DatabaseBackupListResponseDto.md )
2026-02-18 22:47:45 +01:00
- [DownloadArchiveDto ](doc//DownloadArchiveDto.md )
2025-08-21 17:15:11 -05:00
- [DownloadArchiveInfo ](doc//DownloadArchiveInfo.md )
- [DownloadInfoDto ](doc//DownloadInfoDto.md )
- [DownloadResponse ](doc//DownloadResponse.md )
- [DownloadResponseDto ](doc//DownloadResponseDto.md )
- [DownloadUpdate ](doc//DownloadUpdate.md )
- [DuplicateDetectionConfig ](doc//DuplicateDetectionConfig.md )
feat(server): resolve duplicates (#25316)
* feat(web): Synchronize information from deduplicated images
* Added new settings menu to the the deduplication tab.
* The toggable options in the settings are synchronization of: albums, favorites, ratings, description, visibility and location.
* When synchronizing the albums, the resolved images will be added to all albums of the duplicates.
* When synchronizing the favorite status, the resolved images will be marked as favorite, if at least one selectable image is marked as favorite.
* When synchronizing the ratings, the highest rating from the selectable images will be applied to the resolved image.
* When synchronizing the description, all descriptions from the selectable images will be merged into one description for the resolved image.
* When synchronizing the visibility, the most restrictive visibility setting from the selectable images will be applied to the resolved image.
* When synchronizing the location, if exactly one unique location exists among the selectable images, this location will be applied to the resolved image.
* There is no additional UI for these settings to keep the visual clutter minimal. The settings are applied automatically based on the user's preferences.
* Replace addAssetToAlbums with copyAsset
* fix linter
* feat(web): add duplicate sync fields and fix typo
* feat(web): add tag sync and enhance duplicate resolution
This update introduces tag synchronization for duplicate resolution,
ensuring all unique tag IDs from duplicates are applied to kept assets.
The visibility sync logic is updated to use a simplified ordering, as the hidden status items will never show up in a duplicate set.
Album synchronization now merges albums directly via addAssetsToAlbums; as the approach with copyAsset API endpoint was ineffiecient.
Description, rating, and location sync logic is improved for correctness.
and deduplication. i18n strings were added / updated.
* feat(server): move duplicate resolution to backend with sync and stacking
Moves duplicate metadata synchronization from frontend to backend, enabling robust
batch operations and proper validation. This is an improved refactor of PR #13851.
New endpoints:
- POST /duplicates/resolve - batch resolve with configurable metadata sync
- POST /duplicates/stack - create stacks from duplicate groups
- GET /duplicates - now includes suggestedKeepAssetIds based on file size and EXIF
Key changes:
- Move sync logic (albums, tags, favorites, ratings, descriptions, location, visibility) to server
- Add server-side metadata merge policies with proper conflict resolution
- Replace client-side resolution logic with new backend endpoints
- Add comprehensive E2E tests (70+ test cases) and unit tests
- Update OpenAPI specs and TypeScript SDK
No breaking changes - only additions to existing API.
* feat(preferences): enable all duplicate sync settings by default
* chore: clean up
* chore: clean up
* refactor: rename & clean up
* fix: preference upgrade
* chore: linting
* refactor(e2e): use updateAssets API for setAssetDuplicateId
* fix: visibility sync logic in duplicate resolution
* fix(duplicate): write description to exifUpdate
Previously the duplicate resolution populated assetUpdate.description even
though description belongs to exif info.
* fix(duplicate): remove redundant updateLockedColumns wrapper
updateAllExif already computes lockedProperties via distinctLocked
using Object.keys(options). The wrapper added a lockedProperties key
to the options object, causing the spurious string 'lockedProperties'
to be stored in the lockedProperties array.
* fix(duplicate): write merged tags to asset_exif to survive metadata re-extraction
During duplicate resolution, replaceAssetTags correctly wrote merged tag
IDs to the tag_asset table, but never updated asset_exif.tags or locked
the tags property. The subsequent SidecarWrite → AssetExtractMetadata
chain calls applyTagList, which destructively replaces tag_asset rows
with whatever is in asset_exif.tags — still the original per-asset tags,
not the merged set.
Write merged tag values to asset_exif.tags via updateAllExif (which also
locks the property via distinctLocked), and queue SidecarWrite when tags
change so they persist to the sidecar file.
* docs(duplicates): clarify location and tag sync behavior
* refactor(duplicate): remove sync settings, always sync all metadata on resolve
Remove DuplicateSyncSettingsDto and the per-field sync toggles
(albums, favorites, rating, description, visibility, location, tags).
Duplicate resolution now unconditionally syncs all metadata from
trashed assets to kept assets.
- Remove DuplicateSyncSettingsDto and settings field from DuplicateResolveDto
- Update DuplicateService to always run all sync logic without conditionals
- Delete DuplicateSettingsModal.svelte and settings gear button from UI
- Remove DuplicateSettings type and duplicateSettings persisted store
- Update unit and e2e tests to remove settings from resolve requests
* docs: update duplicates utility to reflect automatic metadata sync
* docs(web): replace duplicates info modal with link to documentation
* chore: clean up
* fix: add missing type cast to jsonAgg in duplicate repository getAll
* fix: skip persisting rating=0 in duplicate merge to avoid unnecessary sidecar write
---------
Co-authored-by: Toni <51962051+EinToni@users.noreply.github.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
Co-authored-by: Jason Rasmussen <jrasm91@gmail.com>
2026-03-26 19:33:55 +01:00
- [DuplicateResolveDto ](doc//DuplicateResolveDto.md )
- [DuplicateResolveGroupDto ](doc//DuplicateResolveGroupDto.md )
2025-08-21 17:15:11 -05:00
- [DuplicateResponseDto ](doc//DuplicateResponseDto.md )
- [EmailNotificationsResponse ](doc//EmailNotificationsResponse.md )
- [EmailNotificationsUpdate ](doc//EmailNotificationsUpdate.md )
- [ExifResponseDto ](doc//ExifResponseDto.md )
- [FaceDto ](doc//FaceDto.md )
- [FacialRecognitionConfig ](doc//FacialRecognitionConfig.md )
- [FoldersResponse ](doc//FoldersResponse.md )
- [FoldersUpdate ](doc//FoldersUpdate.md )
2026-07-06 14:57:48 -04:00
- [HlsVideoResolution ](doc//HlsVideoResolution.md )
2025-08-21 17:15:11 -05:00
- [ImageFormat ](doc//ImageFormat.md )
2026-06-10 21:02:27 +02:00
- [IntegrityReport ](doc//IntegrityReport.md )
- [IntegrityReportResponseDto ](doc//IntegrityReportResponseDto.md )
- [IntegrityReportResponseDtoItemsInner ](doc//IntegrityReportResponseDtoItemsInner.md )
- [IntegrityReportSummaryResponseDto ](doc//IntegrityReportSummaryResponseDto.md )
2025-08-21 17:15:11 -05:00
- [JobCreateDto ](doc//JobCreateDto.md )
2025-11-25 08:19:40 -05:00
- [JobName ](doc//JobName.md )
2025-08-21 17:15:11 -05:00
- [JobSettingsDto ](doc//JobSettingsDto.md )
- [LibraryResponseDto ](doc//LibraryResponseDto.md )
- [LibraryStatsResponseDto ](doc//LibraryStatsResponseDto.md )
- [LicenseKeyDto ](doc//LicenseKeyDto.md )
- [LogLevel ](doc//LogLevel.md )
- [LoginCredentialDto ](doc//LoginCredentialDto.md )
- [LoginResponseDto ](doc//LoginResponseDto.md )
- [LogoutResponseDto ](doc//LogoutResponseDto.md )
2025-09-19 12:18:42 -04:00
- [MachineLearningAvailabilityChecksDto ](doc//MachineLearningAvailabilityChecksDto.md )
2025-11-17 17:15:44 +00:00
- [MaintenanceAction ](doc//MaintenanceAction.md )
- [MaintenanceAuthDto ](doc//MaintenanceAuthDto.md )
feat: restore database backups (#23978)
* feat: ProcessRepository#createSpawnDuplexStream
* test: write tests for ProcessRepository#createSpawnDuplexStream
* feat: StorageRepository#createGzip,createGunzip,createPlainReadStream
* feat: backups util (args, create, restore, progress)
* feat: wait on maintenance operation lock on boot
* chore: use backup util from backup.service.ts
test: update backup.service.ts tests with new util
* feat: list/delete backups (maintenance services)
* chore: open api
fix: missing action in cli.service.ts
* chore: add missing repositories to MaintenanceModule
* refactor: move logSecret into module init
* feat: initialise StorageCore in maintenance mode
* feat: authenticate websocket requests in maintenance mode
* test: add mock for new storage fns
* feat: add MaintenanceEphemeralStateRepository
refactor: cache the secret in memory
* test: update service worker tests
* feat: add external maintenance mode status
* feat: synchronised status, restore db action
* test: backup restore service tests
* refactor: DRY end maintenance
* feat: list and delete backup routes
* feat: start action on boot
* fix: should set status on restore end
* refactor: add maintenanceStore to hold writables
* feat: sync status to web app
* feat: web impl.
* test: various utils for testings
* test: web e2e tests
* test: e2e maintenance spec
* test: update cli spec
* chore: e2e lint
* chore: lint fixes
* chore: lint fixes
* feat: start restore flow route
* test: update e2e tests
* chore: remove neon lights on maintenance action pages
* fix: use 'startRestoreFlow' on onboarding page
* chore: ignore any library folder in `docker/`
* fix: load status on boot
* feat: upload backups
* refactor: permit any .sql(.gz) to be listed/restored
* feat: download backups from list
* fix: permit uploading just .sql files
* feat: restore just .sql files
* fix: don't show backups list if logged out
* feat: system integrity check in restore flow
* test: not providing failed backups in API anymore
* test: util should also not try to use failedBackups
* fix: actually assign inputStream
* test: correct test backup prep.
* fix: ensure task is defined to show error
* test: fix docker cp command
* test: update e2e web spec to select next button
* test: update e2e api tests
* test: refactor timeouts
* chore: remove `showDelete` from maint. settings
* chore: lint
* chore: lint
* fix: make sure backups are correctly sorted for clean up
* test: update service spec
* test: adjust e2e timeout
* test: increase web timeouts for ci
* chore: move gitignore changes
* chore: additional filename validation
* refactor: better typings for integrity API
* feat: higher accuracy progress tracking
* chore: delay lock retry
* refactor: remove old maintenance settings
* refactor: clean up tailwind classes
* refactor: use while loop rather than recursive calls
* test: update service specs
* chore: check canParse too
* chore: lint
* fix: logic error causing infinite loop
* refactor: use <ProgressBar /> from ui library
* fix: create or overwrite file
* chore: i18n pass, update progress bar
* fix: wrong translation string
* chore: update colour variables
* test: update web test for new maint. page
* chore: format, fix key
* test: update tests to be more linter complaint & use new routines
* chore: update onClick -> onAction, title -> breadcrumbs
* fix: use wrench icon in admin settings sidebar
* chore: add translation strings to accordion
* chore: lint
* refactor: move maintenance worker init into service
* refactor: `maintenanceStatus` -> `getMaintenanceStatus`
refactor: `integrityCheck` -> `detectPriorInstall`
chore: add `v2.4.0` version
refactor: `/backups/list` -> `/backups`
refactor: use sendFile in download route
refactor: use separate backups permissions
chore: correct descriptions
refactor: permit handler that doesn't return promise for sendfile
* refactor: move status impl into service
refactor: add active flag to maintenance status
* refactor: split into database backup controller
* test: split api e2e tests and passing
* fix: move end button into authed default maint page
* fix: also show in restore flow
* fix: import getMaintenanceStatus
* test: split web e2e tests
* refactor: ensure detect install is consistently named
* chore: ensure admin for detect install while out of maint.
* refactor: remove state repository
* test: update maint. worker service spec
* test: split backup service spec
* refactor: rename db backup routes
* refactor: instead of param, allow bulk backup deletion
* test: update sdk use in e2e test
* test: correct deleteBackup call
* fix: correct type for serverinstall response dto
* chore: validate filename for deletion
* test: wip
* test: backups no longer take path param
* refactor: scope util to database-backups instead of backups
* fix: update worker controller with new route
* chore: use new admin page actions
* chore: remove stray comment
* test: rename outdated test
* refactor: getter pattern for maintenance secret
* refactor: `createSpawnDuplexStream` -> `spawnDuplexStream`
* refactor: prefer `Object.assign`
* refactor: remove useless try {} block
* refactor: prefer `type Props`
refactor: prefer arrow function
* refactor: use luxon API for minutesAgo
* chore: remove change to gitignore
* refactor: prefer `type Props`
* refactor: remove async from onMount
* refactor: use luxon toRelative for relative time
* refactor: duplicate logic check
* chore: open api
* refactor: begin moving code into web//services
* refactor: don't use template string with $t
* test: use dialog role to match prompt
* refactor: split actions into flow/restore
* test: fix action value
* refactor: move more service calls into web//services
* chore: should void fn return
* chore: bump 2.4.0 to 2.5.0 in controller
* chore: bump 2.4.0 to 2.5.0 in controller
* refactor: use events for web//services
* chore: open api
* chore: open api
* refactor: don't await returned promise
* refactor: remove redundant check
* refactor: add `type: command` to actions
* refactor: split backup entries into own component
* refactor: split restore flow into separate components
* refactor(web): split BackupDelete event
* chore: stylings
* chore: stylings
* fix: don't log query failure on first boot
* feat: support pg_dumpall backups
* feat: display information about each backup
* chore: i18n
* feat: rollback to restore point on migrations failure
* feat: health check after restore
* chore: format
* refactor: split health check into separate function
* refactor: split health into repository
test: write tests covering rollbacks
* fix: omit 'health' requirement from createDbBackup
* test(e2e): rollback test
* fix: wrap text in backup entry
* fix: don't shrink context menu button
* fix: correct CREATE DB syntax for postgres
* test: rename backups generated by test
* feat: add filesize to backup response dto
* feat: restore list
* feat: ui work
* fix: e2e test
* fix: e2e test
* pr feedback
* pr feedback
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-01-20 15:22:28 +00:00
- [MaintenanceDetectInstallResponseDto ](doc//MaintenanceDetectInstallResponseDto.md )
- [MaintenanceDetectInstallStorageFolderDto ](doc//MaintenanceDetectInstallStorageFolderDto.md )
2025-11-17 17:15:44 +00:00
- [MaintenanceLoginDto ](doc//MaintenanceLoginDto.md )
feat: restore database backups (#23978)
* feat: ProcessRepository#createSpawnDuplexStream
* test: write tests for ProcessRepository#createSpawnDuplexStream
* feat: StorageRepository#createGzip,createGunzip,createPlainReadStream
* feat: backups util (args, create, restore, progress)
* feat: wait on maintenance operation lock on boot
* chore: use backup util from backup.service.ts
test: update backup.service.ts tests with new util
* feat: list/delete backups (maintenance services)
* chore: open api
fix: missing action in cli.service.ts
* chore: add missing repositories to MaintenanceModule
* refactor: move logSecret into module init
* feat: initialise StorageCore in maintenance mode
* feat: authenticate websocket requests in maintenance mode
* test: add mock for new storage fns
* feat: add MaintenanceEphemeralStateRepository
refactor: cache the secret in memory
* test: update service worker tests
* feat: add external maintenance mode status
* feat: synchronised status, restore db action
* test: backup restore service tests
* refactor: DRY end maintenance
* feat: list and delete backup routes
* feat: start action on boot
* fix: should set status on restore end
* refactor: add maintenanceStore to hold writables
* feat: sync status to web app
* feat: web impl.
* test: various utils for testings
* test: web e2e tests
* test: e2e maintenance spec
* test: update cli spec
* chore: e2e lint
* chore: lint fixes
* chore: lint fixes
* feat: start restore flow route
* test: update e2e tests
* chore: remove neon lights on maintenance action pages
* fix: use 'startRestoreFlow' on onboarding page
* chore: ignore any library folder in `docker/`
* fix: load status on boot
* feat: upload backups
* refactor: permit any .sql(.gz) to be listed/restored
* feat: download backups from list
* fix: permit uploading just .sql files
* feat: restore just .sql files
* fix: don't show backups list if logged out
* feat: system integrity check in restore flow
* test: not providing failed backups in API anymore
* test: util should also not try to use failedBackups
* fix: actually assign inputStream
* test: correct test backup prep.
* fix: ensure task is defined to show error
* test: fix docker cp command
* test: update e2e web spec to select next button
* test: update e2e api tests
* test: refactor timeouts
* chore: remove `showDelete` from maint. settings
* chore: lint
* chore: lint
* fix: make sure backups are correctly sorted for clean up
* test: update service spec
* test: adjust e2e timeout
* test: increase web timeouts for ci
* chore: move gitignore changes
* chore: additional filename validation
* refactor: better typings for integrity API
* feat: higher accuracy progress tracking
* chore: delay lock retry
* refactor: remove old maintenance settings
* refactor: clean up tailwind classes
* refactor: use while loop rather than recursive calls
* test: update service specs
* chore: check canParse too
* chore: lint
* fix: logic error causing infinite loop
* refactor: use <ProgressBar /> from ui library
* fix: create or overwrite file
* chore: i18n pass, update progress bar
* fix: wrong translation string
* chore: update colour variables
* test: update web test for new maint. page
* chore: format, fix key
* test: update tests to be more linter complaint & use new routines
* chore: update onClick -> onAction, title -> breadcrumbs
* fix: use wrench icon in admin settings sidebar
* chore: add translation strings to accordion
* chore: lint
* refactor: move maintenance worker init into service
* refactor: `maintenanceStatus` -> `getMaintenanceStatus`
refactor: `integrityCheck` -> `detectPriorInstall`
chore: add `v2.4.0` version
refactor: `/backups/list` -> `/backups`
refactor: use sendFile in download route
refactor: use separate backups permissions
chore: correct descriptions
refactor: permit handler that doesn't return promise for sendfile
* refactor: move status impl into service
refactor: add active flag to maintenance status
* refactor: split into database backup controller
* test: split api e2e tests and passing
* fix: move end button into authed default maint page
* fix: also show in restore flow
* fix: import getMaintenanceStatus
* test: split web e2e tests
* refactor: ensure detect install is consistently named
* chore: ensure admin for detect install while out of maint.
* refactor: remove state repository
* test: update maint. worker service spec
* test: split backup service spec
* refactor: rename db backup routes
* refactor: instead of param, allow bulk backup deletion
* test: update sdk use in e2e test
* test: correct deleteBackup call
* fix: correct type for serverinstall response dto
* chore: validate filename for deletion
* test: wip
* test: backups no longer take path param
* refactor: scope util to database-backups instead of backups
* fix: update worker controller with new route
* chore: use new admin page actions
* chore: remove stray comment
* test: rename outdated test
* refactor: getter pattern for maintenance secret
* refactor: `createSpawnDuplexStream` -> `spawnDuplexStream`
* refactor: prefer `Object.assign`
* refactor: remove useless try {} block
* refactor: prefer `type Props`
refactor: prefer arrow function
* refactor: use luxon API for minutesAgo
* chore: remove change to gitignore
* refactor: prefer `type Props`
* refactor: remove async from onMount
* refactor: use luxon toRelative for relative time
* refactor: duplicate logic check
* chore: open api
* refactor: begin moving code into web//services
* refactor: don't use template string with $t
* test: use dialog role to match prompt
* refactor: split actions into flow/restore
* test: fix action value
* refactor: move more service calls into web//services
* chore: should void fn return
* chore: bump 2.4.0 to 2.5.0 in controller
* chore: bump 2.4.0 to 2.5.0 in controller
* refactor: use events for web//services
* chore: open api
* chore: open api
* refactor: don't await returned promise
* refactor: remove redundant check
* refactor: add `type: command` to actions
* refactor: split backup entries into own component
* refactor: split restore flow into separate components
* refactor(web): split BackupDelete event
* chore: stylings
* chore: stylings
* fix: don't log query failure on first boot
* feat: support pg_dumpall backups
* feat: display information about each backup
* chore: i18n
* feat: rollback to restore point on migrations failure
* feat: health check after restore
* chore: format
* refactor: split health check into separate function
* refactor: split health into repository
test: write tests covering rollbacks
* fix: omit 'health' requirement from createDbBackup
* test(e2e): rollback test
* fix: wrap text in backup entry
* fix: don't shrink context menu button
* fix: correct CREATE DB syntax for postgres
* test: rename backups generated by test
* feat: add filesize to backup response dto
* feat: restore list
* feat: ui work
* fix: e2e test
* fix: e2e test
* pr feedback
* pr feedback
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-01-20 15:22:28 +00:00
- [MaintenanceStatusResponseDto ](doc//MaintenanceStatusResponseDto.md )
2025-08-21 17:15:11 -05:00
- [ManualJobName ](doc//ManualJobName.md )
- [MapMarkerResponseDto ](doc//MapMarkerResponseDto.md )
- [MapReverseGeocodeResponseDto ](doc//MapReverseGeocodeResponseDto.md )
- [MemoriesResponse ](doc//MemoriesResponse.md )
- [MemoriesUpdate ](doc//MemoriesUpdate.md )
- [MemoryCreateDto ](doc//MemoryCreateDto.md )
- [MemoryResponseDto ](doc//MemoryResponseDto.md )
2025-11-11 01:38:50 +11:00
- [MemorySearchOrder ](doc//MemorySearchOrder.md )
2025-08-21 17:15:11 -05:00
- [MemoryStatisticsResponseDto ](doc//MemoryStatisticsResponseDto.md )
- [MemoryType ](doc//MemoryType.md )
- [MemoryUpdateDto ](doc//MemoryUpdateDto.md )
- [MergePersonDto ](doc//MergePersonDto.md )
- [MetadataSearchDto ](doc//MetadataSearchDto.md )
2026-01-09 17:59:52 -05:00
- [MirrorAxis ](doc//MirrorAxis.md )
- [MirrorParameters ](doc//MirrorParameters.md )
2025-08-21 17:15:11 -05:00
- [NotificationCreateDto ](doc//NotificationCreateDto.md )
- [NotificationDeleteAllDto ](doc//NotificationDeleteAllDto.md )
- [NotificationDto ](doc//NotificationDto.md )
- [NotificationLevel ](doc//NotificationLevel.md )
- [NotificationType ](doc//NotificationType.md )
- [NotificationUpdateAllDto ](doc//NotificationUpdateAllDto.md )
- [NotificationUpdateDto ](doc//NotificationUpdateDto.md )
- [OAuthAuthorizeResponseDto ](doc//OAuthAuthorizeResponseDto.md )
- [OAuthCallbackDto ](doc//OAuthCallbackDto.md )
- [OAuthConfigDto ](doc//OAuthConfigDto.md )
- [OAuthTokenEndpointAuthMethod ](doc//OAuthTokenEndpointAuthMethod.md )
2025-10-27 22:09:55 +08:00
- [OcrConfig ](doc//OcrConfig.md )
2025-08-21 17:15:11 -05:00
- [OnThisDayDto ](doc//OnThisDayDto.md )
- [OnboardingDto ](doc//OnboardingDto.md )
- [OnboardingResponseDto ](doc//OnboardingResponseDto.md )
2025-09-05 17:59:11 -04:00
- [PartnerCreateDto ](doc//PartnerCreateDto.md )
2025-08-21 17:15:11 -05:00
- [PartnerDirection ](doc//PartnerDirection.md )
- [PartnerResponseDto ](doc//PartnerResponseDto.md )
2025-09-05 17:59:11 -04:00
- [PartnerUpdateDto ](doc//PartnerUpdateDto.md )
2025-08-21 17:15:11 -05:00
- [PeopleResponse ](doc//PeopleResponse.md )
- [PeopleResponseDto ](doc//PeopleResponseDto.md )
- [PeopleUpdate ](doc//PeopleUpdate.md )
- [PeopleUpdateDto ](doc//PeopleUpdateDto.md )
- [PeopleUpdateItem ](doc//PeopleUpdateItem.md )
- [Permission ](doc//Permission.md )
- [PersonCreateDto ](doc//PersonCreateDto.md )
- [PersonResponseDto ](doc//PersonResponseDto.md )
- [PersonStatisticsResponseDto ](doc//PersonStatisticsResponseDto.md )
- [PersonUpdateDto ](doc//PersonUpdateDto.md )
- [PinCodeChangeDto ](doc//PinCodeChangeDto.md )
- [PinCodeResetDto ](doc//PinCodeResetDto.md )
- [PinCodeSetupDto ](doc//PinCodeSetupDto.md )
- [PlacesResponseDto ](doc//PlacesResponseDto.md )
2026-05-18 11:09:33 -04:00
- [PluginMethodResponseDto ](doc//PluginMethodResponseDto.md )
2025-11-14 14:05:05 -06:00
- [PluginResponseDto ](doc//PluginResponseDto.md )
2026-05-26 15:47:05 -05:00
- [PluginTemplateResponseDto ](doc//PluginTemplateResponseDto.md )
- [PluginTemplateStepResponseDto ](doc//PluginTemplateStepResponseDto.md )
2025-08-21 17:15:11 -05:00
- [PurchaseResponse ](doc//PurchaseResponse.md )
- [PurchaseUpdate ](doc//PurchaseUpdate.md )
2025-11-14 14:42:00 -05:00
- [QueueCommand ](doc//QueueCommand.md )
- [QueueCommandDto ](doc//QueueCommandDto.md )
2025-11-25 08:19:40 -05:00
- [QueueDeleteDto ](doc//QueueDeleteDto.md )
- [QueueJobResponseDto ](doc//QueueJobResponseDto.md )
- [QueueJobStatus ](doc//QueueJobStatus.md )
2025-11-14 14:42:00 -05:00
- [QueueName ](doc//QueueName.md )
- [QueueResponseDto ](doc//QueueResponseDto.md )
2025-11-25 08:19:40 -05:00
- [QueueResponseLegacyDto ](doc//QueueResponseLegacyDto.md )
2025-11-14 14:42:00 -05:00
- [QueueStatisticsDto ](doc//QueueStatisticsDto.md )
2025-11-25 08:19:40 -05:00
- [QueueStatusLegacyDto ](doc//QueueStatusLegacyDto.md )
- [QueueUpdateDto ](doc//QueueUpdateDto.md )
- [QueuesResponseLegacyDto ](doc//QueuesResponseLegacyDto.md )
2025-08-21 17:15:11 -05:00
- [RandomSearchDto ](doc//RandomSearchDto.md )
- [RatingsResponse ](doc//RatingsResponse.md )
- [RatingsUpdate ](doc//RatingsUpdate.md )
- [ReactionLevel ](doc//ReactionLevel.md )
- [ReactionType ](doc//ReactionType.md )
2026-07-01 16:12:50 -07:00
- [RecentlyAddedResponse ](doc//RecentlyAddedResponse.md )
- [RecentlyAddedUpdate ](doc//RecentlyAddedUpdate.md )
2026-06-01 16:10:07 +02:00
- [ReleaseChannel ](doc//ReleaseChannel.md )
- [ReleaseEventV1 ](doc//ReleaseEventV1.md )
- [ReleaseType ](doc//ReleaseType.md )
2025-08-21 17:15:11 -05:00
- [ReverseGeocodingStateResponseDto ](doc//ReverseGeocodingStateResponseDto.md )
2026-01-09 17:59:52 -05:00
- [RotateParameters ](doc//RotateParameters.md )
2025-08-21 17:15:11 -05:00
- [SearchAlbumResponseDto ](doc//SearchAlbumResponseDto.md )
- [SearchAssetResponseDto ](doc//SearchAssetResponseDto.md )
- [SearchExploreItem ](doc//SearchExploreItem.md )
- [SearchExploreResponseDto ](doc//SearchExploreResponseDto.md )
- [SearchFacetCountResponseDto ](doc//SearchFacetCountResponseDto.md )
- [SearchFacetResponseDto ](doc//SearchFacetResponseDto.md )
- [SearchResponseDto ](doc//SearchResponseDto.md )
- [SearchStatisticsResponseDto ](doc//SearchStatisticsResponseDto.md )
- [SearchSuggestionType ](doc//SearchSuggestionType.md )
- [ServerAboutResponseDto ](doc//ServerAboutResponseDto.md )
- [ServerApkLinksDto ](doc//ServerApkLinksDto.md )
- [ServerConfigDto ](doc//ServerConfigDto.md )
- [ServerFeaturesDto ](doc//ServerFeaturesDto.md )
- [ServerMediaTypesResponseDto ](doc//ServerMediaTypesResponseDto.md )
- [ServerPingResponse ](doc//ServerPingResponse.md )
- [ServerStatsResponseDto ](doc//ServerStatsResponseDto.md )
- [ServerStorageResponseDto ](doc//ServerStorageResponseDto.md )
- [ServerVersionHistoryResponseDto ](doc//ServerVersionHistoryResponseDto.md )
- [ServerVersionResponseDto ](doc//ServerVersionResponseDto.md )
- [SessionCreateDto ](doc//SessionCreateDto.md )
- [SessionCreateResponseDto ](doc//SessionCreateResponseDto.md )
- [SessionResponseDto ](doc//SessionResponseDto.md )
- [SessionUnlockDto ](doc//SessionUnlockDto.md )
- [SessionUpdateDto ](doc//SessionUpdateDto.md )
2025-11-17 17:15:44 +00:00
- [SetMaintenanceModeDto ](doc//SetMaintenanceModeDto.md )
2025-08-21 17:15:11 -05:00
- [SharedLinkCreateDto ](doc//SharedLinkCreateDto.md )
- [SharedLinkEditDto ](doc//SharedLinkEditDto.md )
2026-02-12 12:08:38 -05:00
- [SharedLinkLoginDto ](doc//SharedLinkLoginDto.md )
2025-08-21 17:15:11 -05:00
- [SharedLinkResponseDto ](doc//SharedLinkResponseDto.md )
- [SharedLinkType ](doc//SharedLinkType.md )
- [SharedLinksResponse ](doc//SharedLinksResponse.md )
- [SharedLinksUpdate ](doc//SharedLinksUpdate.md )
- [SignUpDto ](doc//SignUpDto.md )
- [SmartSearchDto ](doc//SmartSearchDto.md )
- [SourceType ](doc//SourceType.md )
- [StackCreateDto ](doc//StackCreateDto.md )
- [StackResponseDto ](doc//StackResponseDto.md )
- [StackUpdateDto ](doc//StackUpdateDto.md )
- [StatisticsSearchDto ](doc//StatisticsSearchDto.md )
feat: restore database backups (#23978)
* feat: ProcessRepository#createSpawnDuplexStream
* test: write tests for ProcessRepository#createSpawnDuplexStream
* feat: StorageRepository#createGzip,createGunzip,createPlainReadStream
* feat: backups util (args, create, restore, progress)
* feat: wait on maintenance operation lock on boot
* chore: use backup util from backup.service.ts
test: update backup.service.ts tests with new util
* feat: list/delete backups (maintenance services)
* chore: open api
fix: missing action in cli.service.ts
* chore: add missing repositories to MaintenanceModule
* refactor: move logSecret into module init
* feat: initialise StorageCore in maintenance mode
* feat: authenticate websocket requests in maintenance mode
* test: add mock for new storage fns
* feat: add MaintenanceEphemeralStateRepository
refactor: cache the secret in memory
* test: update service worker tests
* feat: add external maintenance mode status
* feat: synchronised status, restore db action
* test: backup restore service tests
* refactor: DRY end maintenance
* feat: list and delete backup routes
* feat: start action on boot
* fix: should set status on restore end
* refactor: add maintenanceStore to hold writables
* feat: sync status to web app
* feat: web impl.
* test: various utils for testings
* test: web e2e tests
* test: e2e maintenance spec
* test: update cli spec
* chore: e2e lint
* chore: lint fixes
* chore: lint fixes
* feat: start restore flow route
* test: update e2e tests
* chore: remove neon lights on maintenance action pages
* fix: use 'startRestoreFlow' on onboarding page
* chore: ignore any library folder in `docker/`
* fix: load status on boot
* feat: upload backups
* refactor: permit any .sql(.gz) to be listed/restored
* feat: download backups from list
* fix: permit uploading just .sql files
* feat: restore just .sql files
* fix: don't show backups list if logged out
* feat: system integrity check in restore flow
* test: not providing failed backups in API anymore
* test: util should also not try to use failedBackups
* fix: actually assign inputStream
* test: correct test backup prep.
* fix: ensure task is defined to show error
* test: fix docker cp command
* test: update e2e web spec to select next button
* test: update e2e api tests
* test: refactor timeouts
* chore: remove `showDelete` from maint. settings
* chore: lint
* chore: lint
* fix: make sure backups are correctly sorted for clean up
* test: update service spec
* test: adjust e2e timeout
* test: increase web timeouts for ci
* chore: move gitignore changes
* chore: additional filename validation
* refactor: better typings for integrity API
* feat: higher accuracy progress tracking
* chore: delay lock retry
* refactor: remove old maintenance settings
* refactor: clean up tailwind classes
* refactor: use while loop rather than recursive calls
* test: update service specs
* chore: check canParse too
* chore: lint
* fix: logic error causing infinite loop
* refactor: use <ProgressBar /> from ui library
* fix: create or overwrite file
* chore: i18n pass, update progress bar
* fix: wrong translation string
* chore: update colour variables
* test: update web test for new maint. page
* chore: format, fix key
* test: update tests to be more linter complaint & use new routines
* chore: update onClick -> onAction, title -> breadcrumbs
* fix: use wrench icon in admin settings sidebar
* chore: add translation strings to accordion
* chore: lint
* refactor: move maintenance worker init into service
* refactor: `maintenanceStatus` -> `getMaintenanceStatus`
refactor: `integrityCheck` -> `detectPriorInstall`
chore: add `v2.4.0` version
refactor: `/backups/list` -> `/backups`
refactor: use sendFile in download route
refactor: use separate backups permissions
chore: correct descriptions
refactor: permit handler that doesn't return promise for sendfile
* refactor: move status impl into service
refactor: add active flag to maintenance status
* refactor: split into database backup controller
* test: split api e2e tests and passing
* fix: move end button into authed default maint page
* fix: also show in restore flow
* fix: import getMaintenanceStatus
* test: split web e2e tests
* refactor: ensure detect install is consistently named
* chore: ensure admin for detect install while out of maint.
* refactor: remove state repository
* test: update maint. worker service spec
* test: split backup service spec
* refactor: rename db backup routes
* refactor: instead of param, allow bulk backup deletion
* test: update sdk use in e2e test
* test: correct deleteBackup call
* fix: correct type for serverinstall response dto
* chore: validate filename for deletion
* test: wip
* test: backups no longer take path param
* refactor: scope util to database-backups instead of backups
* fix: update worker controller with new route
* chore: use new admin page actions
* chore: remove stray comment
* test: rename outdated test
* refactor: getter pattern for maintenance secret
* refactor: `createSpawnDuplexStream` -> `spawnDuplexStream`
* refactor: prefer `Object.assign`
* refactor: remove useless try {} block
* refactor: prefer `type Props`
refactor: prefer arrow function
* refactor: use luxon API for minutesAgo
* chore: remove change to gitignore
* refactor: prefer `type Props`
* refactor: remove async from onMount
* refactor: use luxon toRelative for relative time
* refactor: duplicate logic check
* chore: open api
* refactor: begin moving code into web//services
* refactor: don't use template string with $t
* test: use dialog role to match prompt
* refactor: split actions into flow/restore
* test: fix action value
* refactor: move more service calls into web//services
* chore: should void fn return
* chore: bump 2.4.0 to 2.5.0 in controller
* chore: bump 2.4.0 to 2.5.0 in controller
* refactor: use events for web//services
* chore: open api
* chore: open api
* refactor: don't await returned promise
* refactor: remove redundant check
* refactor: add `type: command` to actions
* refactor: split backup entries into own component
* refactor: split restore flow into separate components
* refactor(web): split BackupDelete event
* chore: stylings
* chore: stylings
* fix: don't log query failure on first boot
* feat: support pg_dumpall backups
* feat: display information about each backup
* chore: i18n
* feat: rollback to restore point on migrations failure
* feat: health check after restore
* chore: format
* refactor: split health check into separate function
* refactor: split health into repository
test: write tests covering rollbacks
* fix: omit 'health' requirement from createDbBackup
* test(e2e): rollback test
* fix: wrap text in backup entry
* fix: don't shrink context menu button
* fix: correct CREATE DB syntax for postgres
* test: rename backups generated by test
* feat: add filesize to backup response dto
* feat: restore list
* feat: ui work
* fix: e2e test
* fix: e2e test
* pr feedback
* pr feedback
---------
Co-authored-by: Alex <alex.tran1502@gmail.com>
Co-authored-by: Jason Rasmussen <jason@rasm.me>
2026-01-20 15:22:28 +00:00
- [StorageFolder ](doc//StorageFolder.md )
2025-08-21 17:15:11 -05:00
- [SyncAckDeleteDto ](doc//SyncAckDeleteDto.md )
- [SyncAckDto ](doc//SyncAckDto.md )
- [SyncAckSetDto ](doc//SyncAckSetDto.md )
- [SyncAlbumDeleteV1 ](doc//SyncAlbumDeleteV1.md )
- [SyncAlbumToAssetDeleteV1 ](doc//SyncAlbumToAssetDeleteV1.md )
- [SyncAlbumToAssetV1 ](doc//SyncAlbumToAssetV1.md )
- [SyncAlbumUserDeleteV1 ](doc//SyncAlbumUserDeleteV1.md )
- [SyncAlbumUserV1 ](doc//SyncAlbumUserV1.md )
- [SyncAlbumV1 ](doc//SyncAlbumV1.md )
2026-04-22 16:52:23 +02:00
- [SyncAlbumV2 ](doc//SyncAlbumV2.md )
2025-08-21 17:15:11 -05:00
- [SyncAssetDeleteV1 ](doc//SyncAssetDeleteV1.md )
2026-02-25 12:12:41 -06:00
- [SyncAssetEditDeleteV1 ](doc//SyncAssetEditDeleteV1.md )
- [SyncAssetEditV1 ](doc//SyncAssetEditV1.md )
2025-08-21 17:15:11 -05:00
- [SyncAssetExifV1 ](doc//SyncAssetExifV1.md )
- [SyncAssetFaceDeleteV1 ](doc//SyncAssetFaceDeleteV1.md )
- [SyncAssetFaceV1 ](doc//SyncAssetFaceV1.md )
2026-02-23 08:50:54 -06:00
- [SyncAssetFaceV2 ](doc//SyncAssetFaceV2.md )
2025-08-27 14:31:23 -04:00
- [SyncAssetMetadataDeleteV1 ](doc//SyncAssetMetadataDeleteV1.md )
- [SyncAssetMetadataV1 ](doc//SyncAssetMetadataV1.md )
2026-06-05 00:59:03 +02:00
- [SyncAssetOcrDeleteV1 ](doc//SyncAssetOcrDeleteV1.md )
- [SyncAssetOcrV1 ](doc//SyncAssetOcrV1.md )
2025-08-21 17:15:11 -05:00
- [SyncAssetV1 ](doc//SyncAssetV1.md )
2026-04-30 09:44:27 -04:00
- [SyncAssetV2 ](doc//SyncAssetV2.md )
2025-08-21 17:15:11 -05:00
- [SyncAuthUserV1 ](doc//SyncAuthUserV1.md )
- [SyncEntityType ](doc//SyncEntityType.md )
- [SyncMemoryAssetDeleteV1 ](doc//SyncMemoryAssetDeleteV1.md )
- [SyncMemoryAssetV1 ](doc//SyncMemoryAssetV1.md )
- [SyncMemoryDeleteV1 ](doc//SyncMemoryDeleteV1.md )
- [SyncMemoryV1 ](doc//SyncMemoryV1.md )
- [SyncPartnerDeleteV1 ](doc//SyncPartnerDeleteV1.md )
- [SyncPartnerV1 ](doc//SyncPartnerV1.md )
- [SyncPersonDeleteV1 ](doc//SyncPersonDeleteV1.md )
- [SyncPersonV1 ](doc//SyncPersonV1.md )
- [SyncRequestType ](doc//SyncRequestType.md )
- [SyncStackDeleteV1 ](doc//SyncStackDeleteV1.md )
- [SyncStackV1 ](doc//SyncStackV1.md )
- [SyncStreamDto ](doc//SyncStreamDto.md )
- [SyncUserDeleteV1 ](doc//SyncUserDeleteV1.md )
- [SyncUserMetadataDeleteV1 ](doc//SyncUserMetadataDeleteV1.md )
- [SyncUserMetadataV1 ](doc//SyncUserMetadataV1.md )
- [SyncUserV1 ](doc//SyncUserV1.md )
- [SystemConfigBackupsDto ](doc//SystemConfigBackupsDto.md )
- [SystemConfigDto ](doc//SystemConfigDto.md )
- [SystemConfigFFmpegDto ](doc//SystemConfigFFmpegDto.md )
2026-06-01 14:52:29 -04:00
- [SystemConfigFFmpegRealtimeDto ](doc//SystemConfigFFmpegRealtimeDto.md )
2025-08-21 17:15:11 -05:00
- [SystemConfigFacesDto ](doc//SystemConfigFacesDto.md )
- [SystemConfigGeneratedFullsizeImageDto ](doc//SystemConfigGeneratedFullsizeImageDto.md )
- [SystemConfigGeneratedImageDto ](doc//SystemConfigGeneratedImageDto.md )
- [SystemConfigImageDto ](doc//SystemConfigImageDto.md )
2026-06-10 21:02:27 +02:00
- [SystemConfigIntegrityChecks ](doc//SystemConfigIntegrityChecks.md )
- [SystemConfigIntegrityChecksumJob ](doc//SystemConfigIntegrityChecksumJob.md )
- [SystemConfigIntegrityJob ](doc//SystemConfigIntegrityJob.md )
2025-08-21 17:15:11 -05:00
- [SystemConfigJobDto ](doc//SystemConfigJobDto.md )
- [SystemConfigLibraryDto ](doc//SystemConfigLibraryDto.md )
- [SystemConfigLibraryScanDto ](doc//SystemConfigLibraryScanDto.md )
- [SystemConfigLibraryWatchDto ](doc//SystemConfigLibraryWatchDto.md )
- [SystemConfigLoggingDto ](doc//SystemConfigLoggingDto.md )
- [SystemConfigMachineLearningDto ](doc//SystemConfigMachineLearningDto.md )
- [SystemConfigMapDto ](doc//SystemConfigMapDto.md )
- [SystemConfigMetadataDto ](doc//SystemConfigMetadataDto.md )
- [SystemConfigNewVersionCheckDto ](doc//SystemConfigNewVersionCheckDto.md )
- [SystemConfigNightlyTasksDto ](doc//SystemConfigNightlyTasksDto.md )
- [SystemConfigNotificationsDto ](doc//SystemConfigNotificationsDto.md )
- [SystemConfigOAuthDto ](doc//SystemConfigOAuthDto.md )
- [SystemConfigPasswordLoginDto ](doc//SystemConfigPasswordLoginDto.md )
- [SystemConfigReverseGeocodingDto ](doc//SystemConfigReverseGeocodingDto.md )
- [SystemConfigServerDto ](doc//SystemConfigServerDto.md )
- [SystemConfigSmtpDto ](doc//SystemConfigSmtpDto.md )
- [SystemConfigSmtpTransportDto ](doc//SystemConfigSmtpTransportDto.md )
- [SystemConfigStorageTemplateDto ](doc//SystemConfigStorageTemplateDto.md )
- [SystemConfigTemplateEmailsDto ](doc//SystemConfigTemplateEmailsDto.md )
- [SystemConfigTemplateStorageOptionDto ](doc//SystemConfigTemplateStorageOptionDto.md )
- [SystemConfigTemplatesDto ](doc//SystemConfigTemplatesDto.md )
- [SystemConfigThemeDto ](doc//SystemConfigThemeDto.md )
- [SystemConfigTrashDto ](doc//SystemConfigTrashDto.md )
- [SystemConfigUserDto ](doc//SystemConfigUserDto.md )
- [TagBulkAssetsDto ](doc//TagBulkAssetsDto.md )
- [TagBulkAssetsResponseDto ](doc//TagBulkAssetsResponseDto.md )
- [TagCreateDto ](doc//TagCreateDto.md )
- [TagResponseDto ](doc//TagResponseDto.md )
- [TagUpdateDto ](doc//TagUpdateDto.md )
- [TagUpsertDto ](doc//TagUpsertDto.md )
- [TagsResponse ](doc//TagsResponse.md )
- [TagsUpdate ](doc//TagsUpdate.md )
- [TemplateDto ](doc//TemplateDto.md )
- [TemplateResponseDto ](doc//TemplateResponseDto.md )
- [TestEmailResponseDto ](doc//TestEmailResponseDto.md )
- [TimeBucketAssetResponseDto ](doc//TimeBucketAssetResponseDto.md )
- [TimeBucketsResponseDto ](doc//TimeBucketsResponseDto.md )
- [ToneMapping ](doc//ToneMapping.md )
- [TranscodeHWAccel ](doc//TranscodeHWAccel.md )
- [TranscodePolicy ](doc//TranscodePolicy.md )
- [TrashResponseDto ](doc//TrashResponseDto.md )
- [UpdateAlbumDto ](doc//UpdateAlbumDto.md )
- [UpdateAlbumUserDto ](doc//UpdateAlbumUserDto.md )
- [UpdateAssetDto ](doc//UpdateAssetDto.md )
- [UpdateLibraryDto ](doc//UpdateLibraryDto.md )
- [UsageByUserDto ](doc//UsageByUserDto.md )
- [UserAdminCreateDto ](doc//UserAdminCreateDto.md )
- [UserAdminDeleteDto ](doc//UserAdminDeleteDto.md )
- [UserAdminResponseDto ](doc//UserAdminResponseDto.md )
- [UserAdminUpdateDto ](doc//UserAdminUpdateDto.md )
- [UserAvatarColor ](doc//UserAvatarColor.md )
- [UserLicense ](doc//UserLicense.md )
- [UserMetadataKey ](doc//UserMetadataKey.md )
- [UserPreferencesResponseDto ](doc//UserPreferencesResponseDto.md )
- [UserPreferencesUpdateDto ](doc//UserPreferencesUpdateDto.md )
- [UserResponseDto ](doc//UserResponseDto.md )
- [UserStatus ](doc//UserStatus.md )
- [UserUpdateMeDto ](doc//UserUpdateMeDto.md )
- [ValidateAccessTokenResponseDto ](doc//ValidateAccessTokenResponseDto.md )
- [ValidateLibraryDto ](doc//ValidateLibraryDto.md )
- [ValidateLibraryImportPathResponseDto ](doc//ValidateLibraryImportPathResponseDto.md )
- [ValidateLibraryResponseDto ](doc//ValidateLibraryResponseDto.md )
- [VersionCheckStateResponseDto ](doc//VersionCheckStateResponseDto.md )
- [VideoCodec ](doc//VideoCodec.md )
- [VideoContainer ](doc//VideoContainer.md )
2025-11-14 14:05:05 -06:00
- [WorkflowCreateDto ](doc//WorkflowCreateDto.md )
- [WorkflowResponseDto ](doc//WorkflowResponseDto.md )
2026-05-18 11:09:33 -04:00
- [WorkflowShareResponseDto ](doc//WorkflowShareResponseDto.md )
- [WorkflowShareStepDto ](doc//WorkflowShareStepDto.md )
- [WorkflowStepDto ](doc//WorkflowStepDto.md )
- [WorkflowTrigger ](doc//WorkflowTrigger.md )
- [WorkflowTriggerResponseDto ](doc//WorkflowTriggerResponseDto.md )
- [WorkflowType ](doc//WorkflowType.md )
2025-11-14 14:05:05 -06:00
- [WorkflowUpdateDto ](doc//WorkflowUpdateDto.md )
2025-08-21 17:15:11 -05:00
## Documentation For Authorization
Authentication schemes defined for the API:
### bearer
- **Type**: HTTP Bearer authentication
### cookie
- **Type**: API key
- **API key parameter name**: immich_access_token
- **Location**:
### api_key
- **Type**: API key
- **API key parameter name**: x-api-key
- **Location**: HTTP header
## Author