2026-05-24 · StackFill
CMYK is not a color mode — it's a promise to the press
Most 'CMYK support' in web tools means the file gets converted to CMYK at the end. That's not the same thing. Here's what print-grade output actually requires.
A lot of web-to-print platforms describe themselves as "CMYK-aware." It's almost always a marketing claim, not an engineering one. Here's what's usually behind it:
- The platform's editor renders in sRGB (because it's running in a browser).
- The customer designs in sRGB.
- At export time, the platform runs a one-shot RGB-to-CMYK conversion and writes the result to a PDF.
- The output is technically a CMYK PDF — but it's CMYK derived from an RGB pipeline. The brand reds shift orange. The deep blues go muddy. The paper-white preview was never the press-white the customer actually gets.
That gap is why print buyers don't trust web-to-print platforms for brand-critical work. It's not that the platform lies — it's that "CMYK output" can mean two very different things.
What "real" CMYK requires
For a render to actually match the press, every step of the pipeline has to be CMYK-native:
- Source artwork is CMYK from the start. The approved press file already has CMYK swatches, spot colors where applicable, and trim/bleed marks defined. Nothing is converted at the end — the file was authored for the press.
- The renderer doesn't go through RGB. Standard browser rendering (canvas, SVG, HTML-to-PDF, headless Chromium screenshots) all live in RGB. The moment your pipeline touches one of them, you've lost CMYK. The renderer has to draw directly in the destination color space — which in practice means tools like Ghostscript, MuPDF, or commercial libraries, not browser engines.
- Spot colors stay separated. PMS 286, PMS 7427, foil swaps — these have to round-trip through the renderer as spot color channels, not get flattened to a CMYK approximation.
- The preview the customer sees is rendered through the same path. Otherwise you're back to "screen color doesn't match press color," just with extra steps.
What StackFill does
We made one architecture decision early that drove everything else: the renderer is owned, not borrowed. We do not use headless Chrome to screenshot the editor. We do not export the canvas. We parse the uploaded PDF into a structured scene graph and render directly from that scene graph using pdf-lib + fontkit + a Ghostscript finishing pass in a stateless container.
The same scene graph drives:
- The editor's canvas (rendered as SVG in the browser for the operator).
- The customer-facing fill preview (also SVG; resolution-independent, color-managed).
- The final press PDF (Ghostscript pass produces PDF/X-1a with CMYK and spot colors intact).
There's no "convert to CMYK at the end" step because nothing ever leaves CMYK. The source PDF was CMYK; the scene graph stores CMYK swatches; the renderer writes CMYK directly.
This is why we ask shops to upload their already-approved press file. Not because we're allergic to design tools — but because the press file is already in the color space we're going to render in, and the press file is what the press was tuned against.
What this means in practice
If you've ever fielded the conversation "I designed this in RGB, but the printer needs CMYK, can you just convert it?" — that's the exact pipeline failure we sidestep. The customer can fill out a name and a phone number, but they can never push the source artwork through an RGB step.
The trade-off is honest: StackFill won't help you design the file. It'll only help you safely vary fields on a file the print shop has already validated. Inside that constraint, the output is as close to "the press will produce exactly what the customer approved" as we know how to make it.
That's the actual promise. "CMYK-aware" doesn't capture it; "the preview is the press" does.