Kernelin projects / Photo Studio

A photo editor where every slider is live, because the pixels are computed on the GPU.

Edge-preserving denoise (169 neighbours per pixel), then exposure, white balance, shadows and highlights, contrast, saturation, sharpening and vignette. The whole pipeline is plain Kotlin; Kernelin compiles it to WebGPU. The test chart shows the effect in numbers: PSNR against the noise-free original.

starting…
Before After

Denoise

Radius
Color tolerance
Strength

Light

Exposure (stops)
Contrast
Highlights
Shadows

Color

Temperature
Tint
Saturation

Detail and effects

Sharpen
Vignette
GPU denoise
–
–
GPU develop (per slider move)
–
exposure … vignette
CPU, same Kotlin (Wasm, 1 thread)
–
optional
GPU speedup
–
denoise + develop
Image quality (PSNR)
–
vs noise-free chart

Why this matters

Good denoise is expensive

Edge-preserving filters look at every neighbour of every pixel: 169 × 3.8 million = 650 million weighted samples per frame. On a CPU that's seconds per slider move; on the GPU it's interactive.

Measured, not eyeballed

The test chart (ColorChecker patches, Siemens star, zone plate, gray wedge) is drawn and noised on the GPU, so PSNR against the clean original says exactly how much the denoise recovers.

One codebase

The same Kotlin functions run in the browser on the GPU, in a JVM batch tool for servers, and in unit tests. No GLSL, no WGSL, no CUDA to keep in sync.

The code

loading…