07/07Creative tool · WebGL · Web app

Mr Gradient

A gradient editor that makes light on your graphics card. Every picture comes from a seed and a set of rules, and you shape it by dragging the picture itself.

Role
Product design, UI, build
Type
Personal project · Creative tool
Status
Live · mrgradient.com
Year
2026
02/10

Why I made this

I wanted a gradient I could get back.

The gradients I liked usually arrived as flat images. Change one colour and you start again from nothing.

So a picture here is never an image. It is a seed and a recipe, and the same seed gives the same picture every time.

No AI, no account, no server. Nothing leaves the browser — which is also why a link to a gradient can hold the whole project.

Recorded from the live site: one gradient, a glass lens, moving
03/10

The opening

Most gradient tools ask you to think like the tool.

Observations from tools I have used and from my own first version. No research was run.

The picture is the output; the work happens somewhere else, in a column of sliders.

  1. Sliders before picture

    You change a number and then look up to see what it did.

  2. Words for the machine

    Field, falloff, influence. My own first version used exactly these.

  3. Throwaway results

    Press randomise and the one you liked is gone.

04/10

The approach

Six rounds. Each one started from what was wrong with the last.

  1. A spec

    Near-black interface, one orange, a panel on the right, and the shader as the single source of truth.

  2. Layers

    Up to four layers, each with its own engine. The panel became Create, Sculpt, Motion, Finish.

  3. Glass moves out

    Glass started as a finishing effect. It kept wanting to be an object you place, so it got its own tab.

  4. The blunt round

    I had the editor taken apart. Modes went, plain words came in, the blobs became draggable, and Space became Generate.

  5. Publishing

    Shaped glass and a lens, Chrome and Holo, a landing page — and a decision not to add a text layer.

  6. Motion

    A sunray look, and triggers that let the gradient answer the pointer.

05/10

Design decisions

  1. 01

    Seeds, not prompts

    Every gradient is a number and a recipe. Nothing is generated by a model.

    Why
    A seed can be shared, reopened and nudged. A prompt only ever gives you something near what you had.
    Effect
    Each part of the generator draws from its own named stream of randomness, so tuning one part never reshuffles the others.
    Mr Gradient screen
  2. 02

    The canvas is the control

    There is no Edit button. Handles appear when the pointer is over the picture: drag a blob, click it for its colour, scroll to resize, double-click to add one.

    Why
    The thing you are looking at should be the thing you are holding.
    Effect
    The panel is left with only what cannot be pointed at.
    Mr Gradient screen
  3. 03

    Lock what you like

    Space makes a new gradient. Four locks — Style, Look, Layout, Colours — keep whatever you already like.

    Why
    Randomising is only useful if it cannot take away the part you came for.
    Effect
    Every result also lands in a strip under the canvas, so nothing is lost.
    Mr Gradient screen
  4. 04

    Plain words

    Style, Look, Blob, Background, Strength, Fade, Spread. The code still says recipe, engine, field and ground.

    Why
    Labels are for the person looking at the picture, not for the person who wrote the shader.
    Mr Gradient screen
  5. 05

    One orange

    The interface is near-black, so the only colour on screen is the gradient. One orange exists, for selection and Export.

    Why
    A colourful tool for making colour competes with the thing being made.
    Mr Gradient screen
  6. 06

    Glass is an object

    Fluted, ribbed, prism, wave, frosted or a lens — cut as a rectangle, an ellipse, an arch, a ring or a flower, and moved on the canvas.

    Why
    As a finish effect it was a toggle. As an object it became something to compose with.
    Mr Gradient screen
06/10

How a picture is made

A picture is up to four layers. A layer is a seed, a style, a look, and two to eight blobs.

  • Black#050505
  • Bone#F3EFE6
  • Signal#FF4B20

Typeface

Anybody

Anybody is the display face on the landing page. The editor itself is set small in a quiet sans, and stays out of the way.

page
#050505
accent
#FF4B20
styles
14
looks
9
glass
6 styles · 5 shapes
motion
10 loops + morph
  1. Fourteen styles

    Dark Bloom, Aurora, Liquid Chrome, Golden Hour and ten more. Each decides a palette, a direction and where the weight sits.

  2. Nine looks

    Mesh, Flow, Aurora, Plasma, Liquid, Light, Chrome, Holo, Sunrays. Same blobs, same colours, different light.

  3. Six kinds of blob

    Ellipse, ribbon, arc, line, bloom, ring — each with a position, a size, a softness and a strength.

  4. Checked before you see it

    A generated picture is scored on a few plain measurements and, if it fails, tried again on a fresh stream — up to 24 times.

Mr Gradient: Put glass in front of it
Put glass in front of it
Mr Gradient: One composition, nine ways to light it. This one is Chrome
One composition, nine ways to light it. This one is Chrome
07/10

Interaction

Move the pointer across this page. It is leaving light — the same idea, borrowed.

  • 01

    Space

    A new gradient. The locks decide what survives.

  • 02

    Hover to try

    Hovering a motion tile plays it as a draft. Nothing is committed until you pick it.

  • 03

    Loops that close

    Drift, Flow, Breathe, Orbit, Tide, Warp and the rest end exactly where they began, so video and GIF repeat without a seam.

  • 04

    Keys for everything

    1 to 5 for the tabs, E to explore, B to breed two gradients, ⌘K for the rest.

08/10

The build

Built with

  • WebGL2 + GLSLthe renderer
  • React 19the editor
  • TypeScripteverything, including the CPU mirror
  • Vitebuild
  • Playwrighteight suites on a real GPU

One fragment shader draws everything, and a second copy of it runs on the CPU to keep it honest.

  1. One pass

    Layers, looks, masks, glass and chromatic aberration live in a single shader. Tiled exports have no seams because there is nothing to stitch.

  2. GPU and CPU agree

    The shader is mirrored in TypeScript. Tests fail if any colour channel differs by more than 3 levels out of 255.

  3. Export is a re-render

    Stills are drawn again offscreen in 2048px tiles, never a screenshot of the preview. Video samples whole loops.

  4. Three kinds of code

    Embed, React and HTML carry the real shader. GLSL is one static frame. CSS is an approximation in layered radial gradients.

Mr Gradient: The editor
The editor
Mr Gradient screen
09/10

The result

Live. It exports stills, video and code.

PNG, JPG and WebP up to 4×. WebM, MP4, animated WebP and GIF. Embed, React, HTML, GLSL, CSS and design tokens. A share link holds the whole project, and no server reads it.

mrgradient.com
10/10

What I learned

The biggest thing I changed my mind about was the words.

I named the controls after how the shader works, because that is how I was thinking: recipe, engine, field, falloff. It took a blunt review of the editor for me to see that none of those words describe a picture.

The other one was glass. I had filed it under finishing touches. It turned out to be the part worth building a tab for.