Hands-on review
Asks Jev for the colour of every pixel and renders the distributions as a painting. A small local experiment where every README claim checked out.
Good for
- Seeing what a probability distribution looks like when you paint it
- A zero-dependency local app: one Python file, no build step
- A short, honest README where every statement matches the code
Watch out for
- A 32x32 canvas is thousands of questions; the grid size is the bill
- The key sits in browser local storage in plain text, as the README says
- The endpoint is hard-coded, so no gateway or proxy
Tested Sep 20, 2026 at ecf9c48d290e · Python 3.9 and Node 18 in Docker, offline; its own tests plus a security check of every documented claim
How we reviewed this: we ran it in Docker on Python 3.9 and Node 18 with no network, ran all three documented test commands, and checked each of the README’s claims against the running server.
What it does
jev-paint, by Arvind Achimala, is a local studio that turns Jev into a painter. You describe an image; for every pixel it asks a typed question, and the renderer turns the distributions — not just the winners — into brush colour, underpainting and relief.
Four modes: a 16-colour Choice per pixel, a yes/no silhouette, three Nouls for RGB channels, or a hue Choice plus two Scores for saturation and lightness. Requests scale with the canvas: an 8×8 palette painting is one request of 64 questions; 32×32 in HSL mode is eight requests and around 3,000 questions.
We measured that ourselves by running its request builder across every mode and grid size. The README’s “larger grids make more requests” is accurate, and the numbers are steep enough that the grid selector is effectively the spend control.
Everything checked out
This is the rare review where the interesting finding is that there isn’t one. We verified each claim:
- Server binds to loopback; a forged
Host header gets 403, a cross-origin request gets 403, a request without a key gets 401, bad JSON gets 400.
- Logging is disabled outright — the handler’s log method is overridden to do nothing, with a comment saying never to log headers, prompts or credentials. Upstream errors return a status code without relaying the body.
- Nothing is written to disk. Paintings live in memory and vanish on reload.
- The bundled fixtures contain public art prompts and probabilities, no credentials.
- Its tests pass on the versions the README names, including Node 18.
The state sent is exactly the description, the canvas size, an origin convention and a one-line task. No account data, no device information.
Three things worth knowing rather than fixing: the endpoint is hard-coded, so you can’t point it at a gateway; the client’s overall timeout is longer than the server’s per-request one, so a cancelled request still costs; and the key lives in browser local storage in plain text, which the README states plainly.
Verdict
A local creative experiment, as the author says — and the best-behaved small project in this round. If you want to understand what a calibrated probability looks like, painting one is a surprisingly good way in.
For other demos, see TypeSafe Mario and JevPilot.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Sep 20, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.