immich-app/immich · warning · BadRequestException
Editing live photos is not supported
Error message
Editing live photos is not supported
What it means
Thrown by editAsset when asset.livePhotoVideoId is set, i.e. the image is the still component of a live/motion photo paired with a video. Because the still and its motion video must stay in sync, the editor refuses to transform only the image, returning 400 BadRequest.
Source
Thrown at server/src/services/asset.service.ts:540
assetId: id,
edits,
};
}
async editAsset(auth: AuthDto, id: string, dto: AssetEditsCreateDto): Promise<AssetEditsResponseDto> {
await this.requireAccess({ auth, permission: Permission.AssetEditCreate, ids: [id] });
const asset = await this.assetRepository.getForEdit(id);
if (!asset) {
throw new BadRequestException('Asset not found');
}
if (asset.type !== AssetType.Image) {
throw new BadRequestException('Only images can be edited');
}
if (asset.livePhotoVideoId) {
throw new BadRequestException('Editing live photos is not supported');
}
if (isPanorama(asset)) {
throw new BadRequestException('Editing panorama images is not supported');
}
if (asset.originalPath?.toLowerCase().endsWith('.gif')) {
throw new BadRequestException('Editing GIF images is not supported');
}
if (asset.originalPath?.toLowerCase().endsWith('.svg')) {
throw new BadRequestException('Editing SVG images is not supported');
}
// check that crop parameters will not go out of bounds
const { width: assetWidth, height: assetHeight } = getDimensions(asset);
if (!assetWidth || !assetHeight) {View on GitHub (pinned to 199723261c)
Solutions
- Detect asset.livePhotoVideoId in the UI and disable the editor for live photos.
- Offer a separate flow that splits the live photo into a plain still before editing.
- Show the user that live-photo editing is intentionally unsupported.
Example fix
// before const editable = asset.type === 'IMAGE'; // after const editable = asset.type === 'IMAGE' && !asset.livePhotoVideoId;
Defensive patterns
Strategy: validation
Validate before calling
if (asset.livePhotoVideoId) {
throw new Error('Live photos cannot be edited as flat images.');
}
await api.put(`/assets/${asset.id}/edits`, { edits }); Type guard
const isLivePhoto = (a: { livePhotoVideoId?: string | null }): boolean =>
Boolean(a?.livePhotoVideoId); Prevention
- Treat livePhotoVideoId as a non-editable flag in the UI.
- Surface a 'live photo' badge so users know editing is intentionally blocked.
- Split the live photo into a plain still if editing is required.
When it happens
Trigger: PUT /assets/{id}/edits on an asset that has a non-null livePhotoVideoId (a live photo still).
Common situations: User uploads an iOS/Android motion photo and tries to crop or rotate it through the standard image editor; client does not distinguish live photos from plain images.
Related errors
- Only images can be edited
- Editing panorama images is not supported
- Editing GIF images is not supported
- Editing SVG images is not supported
- Asset dimensions are not available for editing
AI-assisted analysis of immich-app/immich@199723261c (2026-08-12).
Data as JSON: /api/errors/fa6319015a3095cb.
Report an issue: GitHub.