Hi everyone,
For the past couple of months I’ve been building an open source posterization and spot-color separation engine called Reveal, in collaboration with Claude (Anthropic) and Gemini (Google) — AI pair programming, not AI-generated art. We just released v1.0.0.
It was built specifically to solve a mechanical problem in screen printing and risograph: taking full-color continuous-tone images and separating them into a limited number of flat, printable spot colors without relying on digital halftones or CMYK workarounds.
The Tech / How it Works
It doesn’t just do a dumb pixel count. The engine analyzes an image’s structural “DNA” in the Lab* color space (measuring lightness standard deviation, chroma boundaries, hue entropy, and spatial weighting).
Based on that math, it automatically routes the image to one of 28 built-in archetypes (25 strict profiles like “Film Noir” or “Faded Vintage,” plus 3 adaptive “pseudo” profiles for edge cases). It then clusters the palette and outputs separated layers.
The Catch (And why I’m posting here)
Right now, the tool is packaged as a Photoshop plugin (built using their JS/UXP architecture). However, the core logic is written in dependency-free JavaScript that reads like pseudocode — no frameworks, no Node.js APIs in the core, just pure math. This makes it straightforward to port to any language.
I would love to see this ported to GIMP or Krita, but I’m not well-versed in GIMP’s Python architecture or Krita’s PyQt environment.
I wanted to drop the repository here to see if any FOSS developers find the color science interesting enough to want to build a bridge or port the core logic over to the open-source imaging ecosystem.
Links:
- GitHub Repo: GitHub - electrosaur-labs/reveal: An Opinionated Posterization Engine for Screen Printing · GitHub
- You can see example separations in the
reveal/README.md at main · electrosaur-labs/reveal · GitHub
Happy to answer any questions about the clustering math, the posterization algorithms, or how the archetype routing works under the hood!


