#1500·upscayl

[FEATURE REQUEST] Support PSD input with layer-preserving upscale (export layered PSD)

Author: HITEYYCreated Aug 17, 2026Updated Sep 17, 2026
Labelsenhancementstale

Checklist

  • I have checked that this issue isn't addressed in the FAQ.
  • I have searched for this in the issues tab.

Description

Currently Upscayl only accepts flat raster formats (PNG/JPG/WebP) and outputs a single flattened image. This request is for PSD input support that preserves individual layers through the upscale pipeline, rather than just flattening to a composite before processing.

Use-case

Designers/illustrators working in Photoshop often need to upscale a whole PSD (e.g. old low-res artwork, scanned line art with separate ink/color/shading layers) while keeping layers editable afterward — not just get a single merged high-res PNG.

Proposed approach

  1. Parse the PSD using an existing library (e.g. psd.js/ag-psd for Node, or python-psd-tools) to extract each raster layer along with its bounds, blend mode, opacity, and visibility.
  2. Upscale each raster layer independently through the existing Real-ESRGAN/NCNN pipeline, scaling each layer's bounding box/offset by the same factor as the canvas.
  3. Handle non-raster layer types separately:
    • Layer masks: scale with a standard resample (bicubic), not through the AI model, since they're greyscale mattes rather than photographic content.
    • Text layers / adjustment layers / smart objects: these have no pixel data to upscale — either leave them untouched (vector-based, so they scale natively) or flag them in the UI as "not upscaled, structure preserved."
  4. Reassemble into a new PSD with the original layer order, names, blend modes, and opacity intact, using a PSD writer (ag-psd supports writing).
  5. Given PSDs can have many layers, this should reuse the existing batch-processing queue so layers process sequentially without blowing up memory/VRAM.

Known trade-offs

  • Processing time scales with layer count.
  • Very large PSDs (multi-layer, high-res) may hit memory limits — worth capping or warning users.

Related Problem(s)

No response

Alternatives

No response