Can PhotoCraft Open PSD and PSB Files?
We tested PhotoCraft web v0.7.0 with 16 layered Photoshop files on 14 October 2026. Everything opened. Saving was the hard part, and the details matter for your files.
We opened 16 layered Photoshop files in PhotoCraft web v0.7.0, saved each one twice, and took the saved copies apart. The run happened on , in an automated browser on our own Mac, with the app served locally rather than loaded from the live site.
All 16 files opened, including the PSB. Saving was where the trouble started. Unedited, 13 of 16 files produced a saved copy; after a single brush stroke, only 5 did. Across all 32 passes, 18 came back limited and 14 failed outright, and no pass was completely clean.
One thing to keep straight as you read: this is our test, on our hardware. The PhotoCraft team publishes its own compatibility numbers from a desktop test harness, and we repeat those below, kept separate from ours.
What is a PSD file?
A PSD file is Photoshop's working document. Where a JPEG stores one flat picture, a PSD stores layers: separate pieces of artwork, text or adjustment stacked on top of each other, each one editable on its own. Masks ride along inside the file, hiding parts of a layer without erasing them. That stack is why designers keep working files as PSD, and why a compatible editor has real work to do.
PSB is the same idea in a bigger box. It is Photoshop's format for very large documents, for files that outgrow the 2 GB ceiling a PSD allows. If you have ever been handed a multi-gigabyte composite, it was probably a PSB.
Why is PSD compatibility hard?
Photoshop has been growing the format for more than three decades, and a single document can lean on many features at once. The color mode can be RGB, or CMYK, the four-ink model print shops use, or Lab, a mode built around how people perceive color. It can be grayscale, duotone (a two-ink print technique) or indexed color (a palette-capped mode for small files). Bit depth, meaning how many distinct shades each color channel can store, can be 8, 16 or 32 bits. Layers can also carry masks, layer effects, blend modes (the rules for how two layers tint each other), editable text and smart objects, which embed whole other files inside the document. Clipping masks, where one layer's shape trims another, round out the list.
Software like PhotoCraft has to understand all of that, draw it the way Photoshop would, and write it back out without dropping pieces. That is why a file can open looking perfect and still fail on save. We tested both directions.
What does the PhotoCraft team say?
The project's README makes two compatibility claims. Re-saving a file keeps its render for “307 of the 309 files in the psd-tools test set”, and “PSB, 16 and 32-bit files, and CMYK and Lab documents open natively.”
Both statements describe the team's own desktop test harness, which runs the full psd-tools corpus on their machine. They were not measured in a browser, and we did not reproduce that 307 figure. Everything below this paragraph comes from our own smaller run: 16 files, 32 passes, one browser. Where the two differ in scope, that difference is real, so we keep the numbers apart instead of merging them into one score. Read the pinned README if you want their wording in full.
How did we run the test?
The 16 sample files came from the psd-tools project, an MIT-licensed open-source collection of Photoshop test documents, pinned to commit ff23cb8 so the exact inputs stay checkable. The set was picked to exercise different parts of the format: color modes, bit depths, groups, text, effects, masks, placed objects (Photoshop's smart objects), blending, and one small PSB.
Each file ran twice. U meant saving it untouched. E meant attempting a brush stroke near the center, then saving. All 32 planned passes ran.
One Apple silicon Mac running macOS 26.6.2, headless Chrome (a browser running without a visible window), a 1440 × 1000 viewport (the window size the app was tested at), WebGPU graphics (the modern browser graphics support PhotoCraft uses), and the pinned web build served locally rather than loaded from the live site.
For every pass we captured whatever the Cmd+S save shortcut produced, then put the saved bytes through three checks. An independent low-level parser read the header and layer records. A second parser, ag-psd, cross-checked the structure. Where both files would decode, we compared the stored preview images, pixel by pixel. Each captured file was also reopened in a fresh instance of the app. Pixel checks ran at screen level, and the limits section below explains exactly what that means.
Did everything open?
Yes, all 16. The PSB opened, as did the 16-bit and 32-bit files and every color mode in the set: CMYK, Lab, grayscale, duotone and indexed color. Documents built around editable text, layer effects, masks, placed objects, blend modes and clipping masks came in as well.
Two files arrived changed on the way in. The duotone sample opened flattened to a single grayscale layer, its two inks uninterpreted, and the indexed-color sample converted itself to RGB with a warning. Those conversions matter later, when we tried to save.
Which files saved correctly in your test?
Strictly, none: no pass earned a clean PASS. What we saw instead was 5 of 16 files rated limited and the other 11 failing at least one save. A PASS requires every applicable check to succeed, and nothing cleared that bar.
A limited rating (LIMITED in the table below) still means the saved file was usable. It means the save involved a format conversion, a visible render difference, or a check we could not complete. It is not a pass, and we would rather say so than blur it.
The failures and the near-misses each deserve a closer look, and the table further down holds every file. Here is the short tour.
Which files would not save?
Three files produced nothing at all, even untouched: both CMYK samples and the grayscale sample. The save shortcut simply returned no file within the 12-second capture window, and we confirmed the keystroke had been delivered.
Editing made saving strictly worse. After the brush stroke, eight more files refused to save: the 16-bit RGB file, both Lab files, and the documents built around text, layer effects, masks, placed objects and blend modes. Across the whole run, untouched saves produced a file 13 times out of 16; edited saves managed it 5 times out of 16.
What happened to the files that did save?
Conversions were common. The duotone document saved as a single grayscale layer, so its two-ink setup survived only as a flat image. The indexed-color document saved as ordinary RGB.
Some saves were flawless on screen. The untouched saves of the group, mask and placed-object files reopened with pixel-exact display comparisons. That is genuinely good, with a caveat: a matching flat image does not prove every layer feature inside survived, which is why these files still rate limited rather than pass.
The small PSB was the best result of the run. Converted to a PSD on save, it reopened with a pixel-exact display comparison in the untouched pass, both Cyrillic layer names intact. The edited pass also saved and reopened, with the brush change visible in the saved composite. Keep the scale in mind: one 101 × 55, 8-bit file, and writing an actual .psb file was not on the menu.
Other saves carried visible differences. The text file drifted slightly on screen. The 32-bit file showed small differences in both passes, and the blend-and-clipping document rendered substantially differently, with about 48,700 pixels off in our comparison. The two untouched 16-bit saves, one RGB and one Lab, parsed and reopened, but no independent decoder could compare their pixels with the source, so their fidelity stays unverified.
One last honesty note. Where the composite did change after the brush stroke (the 32-bit file and the PSB), our checks stop short of proving exactly where the edit landed in the saved layer data. And for duotone, indexed color and the group file, the edited save looked identical to the untouched one; in the group file, the app said painting on the selected group needs a mask.
Every result, file by file
Here is the complete reviewed record, including the checks we could not finish. Each sample name links to its original file in the psd-tools repository, and the wording stays plain on purpose: this is the evidence, not a summary of it. On a narrow screen, the table scrolls sideways.
| Sample | What it covers | Open | Untouched save (U) | Save after edit (E) | Saved format and changes | Takeaway |
|---|---|---|---|---|---|---|
| S01 | 16-bit RGB PSD, 4 × 4 px, gradient fill with a mask | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; independent pixels UNVERIFIED. | FAILNo file after Cmd+S within the 12-second capture window. | U saved as a 16-bit RGB PSD. E produced no file. | The header kept its 16-bit depth, but no independent decoder could compare source and saved pixels, so fidelity stays unverified. |
| S02 | 8-bit CMYK PSD, 4 × 4 px, gradient fill | LIMITEDOpened; full visual and layer checks unverified. | FAILNo file after Cmd+S within the 12-second capture window. | FAILNo file after Cmd+S within the 12-second capture window. | Neither pass produced a file. | The file opened, but saving it, edited or untouched, never produced bytes. |
| S03 | 16-bit CMYK PSD, 4 × 4 px, gradient fill with a mask | LIMITEDOpened; full visual and layer checks unverified. | FAILNo file after Cmd+S within the 12-second capture window. | FAILNo file after Cmd+S within the 12-second capture window. | Neither pass produced a file. | Both the untouched save and the save after the brush attempt came up empty. |
| S04 | 8-bit Lab PSD, 4 × 4 px, gradient fill | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; display difference within tolerance. | FAILNo file after Cmd+S within the 12-second capture window. | U saved as an 8-bit Lab PSD. E produced no file. | The untouched save had no pixels above the 5/255 tolerance, with a maximum channel difference of 1; full color and fill checks remain unverified. |
| S05 | 16-bit Lab PSD, 4 × 4 px, gradient fill with a mask | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; independent pixels UNVERIFIED. | FAILNo file after Cmd+S within the 12-second capture window. | U saved as a 16-bit Lab PSD. E produced no file. | The header kept Lab mode and 16-bit depth; pixel fidelity was not independently verified. |
| S06 | 8-bit grayscale PSD, 4 × 4 px, gradient fill | LIMITEDOpened; full visual and layer checks unverified. | FAILNo file after Cmd+S within the 12-second capture window. | FAILNo file after Cmd+S within the 12-second capture window. | Neither pass produced a file. | This file opened in both runs, yet neither save attempt left a captured file behind. |
| S07 | 8-bit duotone PSD, 4 × 4 px, two source layers | LIMITEDOpened flattened as grayscale; inks not interpreted. | LIMITEDSaved and reopened as grayscale, one raster layer. | LIMITEDSaved and reopened; composite unchanged from U. | Both saves: 8-bit grayscale PSD; the two layers became one. | The two-ink duotone setup was gone in the save, and the edited composite looked unchanged from the untouched one. |
| S08 | 8-bit indexed-color PSD, 4 × 4 px, fixed palette | LIMITEDOpened with an indexed-to-RGB conversion warning. | LIMITEDSaved and reopened as RGB, one raster layer. | LIMITEDSaved and reopened; composite unchanged from U. | Both saves: 8-bit RGB PSD, with one raster layer added. | The palette-based mode was converted to RGB on the way in; the planned single-pixel edit was never verified. |
| S09 | 8-bit RGB PSD, 100 × 200 px, layer group with a vector mask | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; stored composite pixel-exact. | LIMITEDSaved and reopened; composite unchanged from U. | Both saves: 8-bit RGB PSD; the group and its three nodes survived. | The app said painting on the selected group needs a mask, so an applied edit was never established. |
| S10 | 8-bit RGB PSD, 400 × 400 px, editable text layer | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; small composite render drift. | FAILNo file after Cmd+S within the 12-second capture window. | U saved as an 8-bit RGB PSD with the text record kept. E produced no file. | The untouched save drifted in 561 pixels above 5/255 (maximum 40); font or antialiasing handling is one possible cause, unconfirmed. |
| S11 | 8-bit RGB PSD, 800 × 640 px, text with layer effects | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; display difference within tolerance. | FAILNo file after Cmd+S within the 12-second capture window. | U saved as an 8-bit RGB PSD with all 12 nodes kept. E produced no file. | The untouched save stayed within tolerance (maximum 2 against 5/255); text and effect parameters were not fully checked. |
| S12 | 8-bit RGB PSD, 100 × 150 px, raster and vector masks | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; stored composite pixel-exact. | FAILNo file after Cmd+S within the 12-second capture window. | U saved as an 8-bit RGB PSD with three nodes kept. E produced no file. | The flat composite matched, but the individual mask channels and paths were not fully verified. |
| S13 | 32-bit RGB PSD, 100 × 150 px, vector masks | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; small display-projection difference. | LIMITEDSaved and reopened; composite changed from U. | Both saves: 32-bit RGB PSD with four nodes kept. | The untouched save had 56 pixels above 5/255 (maximum 11); the edited save changed 155. Full float precision and mask fidelity remain unverified. |
| S14 | 8-bit RGB PSD, 256 × 256 px, linked and embedded objects | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; stored composite pixel-exact. | FAILNo file after Cmd+S within the 12-second capture window. | U saved as an 8-bit RGB PSD with all four node names kept. E produced no file. | A matching flat image does not prove the linked resources or editable smart objects survived intact. |
| S15 | 8-bit RGB PSD, 512 × 512 px, blend modes and clipping masks | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved and reopened; substantial composite difference. | FAILNo file after Cmd+S within the 12-second capture window. | U saved as an 8-bit RGB PSD with 13 nodes kept. E produced no file. | The untouched save changed 48,697 pixels above 5/255 (maximum 255); kept layer names do not prove the blend and clipping setups survived. |
| S16 | 8-bit RGB PSB, 101 × 55 px, two Unicode layer names | LIMITEDOpened; full visual and layer checks unverified. | LIMITEDSaved as PSD and reopened; stored composite pixel-exact. | LIMITEDSaved as PSD and reopened; composite changed from U. | Both saves: PSB converted to an 8-bit RGB PSD; both Unicode names kept. | One small PSB produced usable PSD saves; it says nothing about PSB export or large documents. |
What does this mean for your files?
For a quick look, promising. If you want to open a layered file in a browser, inspect it, or pull a layer out, PhotoCraft v0.7.0 handled everything we offered it, PSB and print-color documents included.
If you plan to edit a file and hand it back to Photoshop later, treat saving as experimental. Work on a copy, keep your original untouched, and reopen the saved copy before you delete anything. Edited saves were the weakest area in the whole run, and the CMYK and grayscale files, the modes print work lives in, would not save at all.
The cheapest test is also the most relevant one. Open a copy of your own file in the editor and see what happens. Ten seconds with your own document beats any compatibility table, including ours.
How much should you trust this test?
It has edges, and none of these numbers should be read as a general compatibility rate for PhotoCraft or a prediction about your files. Before you lean on this page, know where it stops.
- One Apple silicon Mac, one headless Chrome channel, and a locally served build. The browser reported itself as HeadlessChrome/155.0.0.0; the exact version was not recorded separately. Hardware, memory and display-profile records are incomplete too. Nothing here measures other browsers, other machines or the production site.
- Cmd+S was the only save path we exercised. The export dialog could not be automated, so it went untested.
- The capture window was 12 seconds, shorter than the 30 we had planned. A file that saved late would have been missed.
- Sixteen small files ran, and ten larger candidates were left untested. PSB coverage is a single 101 × 55, 8-bit file, so large, deep or text-heavy PSBs remain unknown territory.
- We had planned to toggle a layer's visibility, but automation could not reliably reach the eye control, so the edit pass used a brush stroke instead. The indexed-color file also skipped its planned single-pixel edit.
- Pixel comparisons ran at screen level, using an 8-bit display projection with a 5/255 channel tolerance. They show whether the saved file looks the same, and cannot prove full 16-bit or 32-bit precision.
- We never opened any output in Photoshop. The comparison you would care about most is the one we did not run.
- The 307/309 desktop score and our 16-sample browser run measure different things. Read them side by side, never averaged together.
Sources and evidence
The run behind this page left a full evidence trail in this site's repository for 14 October 2026: the test design, the sample manifest, raw results, per-sample screenshots, the saved files themselves, pixel comparisons and the reviewed interpretation. Those are repository records rather than downloads on this page.