YOUR COLOUR STUDY
These are the measured proportions of the paint on your palette.
Any multiple of these amounts works. Clear your palette to try it. This study is now assisted.
WELCOME TO YOUR STUDIO
The pigment percentages show the measured volume you added, rounded together to total 100%. The match score appears only after the paint is blended. It is a perceptual game score, not a physical percentage of colour accuracy. Undo removes the last scoop and replots the remaining paint. New colour starts a fresh study.
On iPhone, open the hosted game in Safari, tap Share, then Add to Home Screen. Open it once while online to save the game for offline play.
Keyboard: 1–4 add the corresponding pigment, Space folds the paint, and Ctrl/⌘ Z undoes a scoop. Touch works on the mixing surface.
A LITTLE OF THE SCIENCE
The paint surface reimplements the velocity → height → alpha history → surface-normal technique described by Misaki Nakano / mofu. A viscous fluid solver moves four pigment height fields; studio highlights reveal their ridges and thin smears.
Colour uses 38 spectral samples, D65 lighting and the Kubelka–Munk mixing model, with spectral data and concentration weighting from Spectral.js by Ronald van Wijnen (MIT). The target and liquid use the same colour model.
Matching uses CIEDE2000 on the fully blended colour calculated from your measured recipe. Glossy lighting does not affect the score. The displayed percentage is a game score, 100 × exp(−ΔE / 20); it is not a laboratory accuracy percentage. An exact recipe gives ΔE 0.
This is a physically informed digital approximation. Pigment spectra are reconstructed from RGB, not measurements of specific paint brands. Real paint, lighting and display calibration vary. Transport with per-pigment volume correction keeps pigment totals stable as you move it. Exact measured recipe amounts are tracked separately from the floating-point fluid simulation. Fold together homogenizes the visible paint to that measured recipe.
All mixing runs on your device. Online room pairing uses a short-lived Cloudflare signaling room, then an encrypted direct WebRTC connection. Offline pairing uses no signaling server; it still requires a shared local network. Pass-and-play works with all radios off. No accounts or tracking. WebGL 2 and floating-point render targets are required for the fluid effect. All code and data are embedded in this file.
A little friendly competition
First to 93% wins. No hints. Each win brings a new shared colour, and your score carries forward.
Open once online to save the app before travelling.
Create a room, or enter your friend’s code. The match connects directly between your phones.
Join the same Wi-Fi or hotspot first. Internet is not needed. Scan the invitation, then scan the reply on the first phone.
With Wi-Fi switched off, choose Pass & play instead. Some public and airplane networks block direct connections.
Invite your friend.
Point at the other phone’s Pigment QR code.