open-source · Rust · MIT

pre-alpha — the engine, CLI and MCP server already run

claws + draws · a blazing-fast image editor for developers, written in Rust

Craws is a pipeline editor: an ordered chain of parametrized ops over a tiled, content-hash-cached, linear-light engine. Drive it from this GUI, a headless CLI, CI, or an AI agent over MCP.

★ GitHub
fig.01 — pipeline.json · live
craws — IMG_2153.webp — 720×1080 @ 100%
decode
resize
exposure
crop
grayscale
draw
export
craws sample — a warm café portrait
open_imagerecompute 48/48

propertiesopen_image

source
IMG_2153.webp
size
720×1080
color
sRGB → linear f32
tiles
256² · premultiplied

histogram

luminance · RGB

02 proof over vibes

Perf claims get numbers, not adjectives.

Every bar is a criterion benchmark on a 24-megapixel photo, release build. When craws grew its own resampler and a SIMD encoder, these are the numbers that moved.

resize · 6000→1920 · lanczos3 faster
before
323 ms
after
54 ms
encode · jpeg q90 · 24MP2.4× faster
before
910 ms
after
375 ms
4-step chain · slider tweak faster
before
85 ms
after
11.8 ms
exposure · 24MP · cached580× faster
before
49 ms
after
85µs

measured · 6000×4000 · one machine — the BLAZING contract

03 the toolbox

Ten operations. One JSON file.

Every op is one line in a pipeline — composable, versionable, replayable. The same pipeline over the same input returns bit-identical pixels.

resize

Resample

resample
{ "op": "resize", "width": 1600, "filter": "lanczos3" }

Own separable resampler — 6× faster than the crate it replaced, with no gamma-space bleed and no dark fringing. One dimension can preserve aspect ratio.

04 the content-hash cache

Change one node. Recompute one node.

Each step is a node keyed by the blake3 hash of its inputs and params. Edit a value and the cache works out exactly which tiles of which nodes have to run again — everything upstream is served straight from memory.

decode

#d18a6

recompute

resize

#d1fd0

recompute

exposure

#c1052

recompute

crop

#e20fa

recompute

grayscale

#384ed

recompute

draw

#e217d

recompute

export

#d1929

recompute

[COLD RUN]

cold run — every node computes every tile from scratch

recompute cache hit

05 one engine, four ports

The engine has no opinion on who calls it.

domain ← engine; codecs, GPU and AI are adapters behind traits; the CLI, the MCP server and the GUI are equal ports and never know about each other.

craws-engine

tiled · content-hash cache · linear f32 · rayon

domaincodecsgpuai
craws-app

GUI

A Tauri 2 + React viewport. Pan and zoom run on the GPU; a slider previews in a fragment shader so the bridge stays idle — measured 165 fps, 21× the naive round-trip.

craws

CLI

craws run pipeline.json — headless, scriptable, deterministic. Format follows the file extension; a timing report follows every run.

no GPU

CI

The CPU path always exists. Drop craws into a pipeline and batch-process on a runner — bit-identical output makes it safe to diff.

craws-mcp

MCP

13 tools over stdio. An agent opens an image, annotates it, exports it — automated documentation figures, the killer use case.

🦀🎨

One engine. Every port. No adjectives without a number.

Craws is MIT-licensed, pre-alpha, and already blazing. The perf claims are criterion benches — go run them yourself.

❯ git clone craws

Craws 🦀🎨 · claws + draws · built in Rust on tiles, blake3 and linear light

github.com/Aver005/craws · MIT

0%
[warm]