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

  1. Detect asset.livePhotoVideoId in the UI and disable the editor for live photos.
  2. Offer a separate flow that splits the live photo into a plain still before editing.
  3. 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

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


AI-assisted analysis of immich-app/immich@199723261c (2026-08-12). Data as JSON: /api/errors/fa6319015a3095cb. Report an issue: GitHub.