Built a browser-based pixel editor on ICP called ICPixel.
The goal was to get as close as possible to a “real” tool (think Aseprite-level workflow), but fully in the browser and without relying on any traditional backend.
Frontend is React + TypeScript (Vite), backend is a Motoko canister. All user data (projects, balances, logs) lives directly in the canister and survives upgrades. Auth is Internet Identity, using the principal as the user key.
The canvas engine is fully custom (Canvas 2D, no external libs). Rendering runs through a compositor that reads the layer stack and applies filters at render time, so everything stays non-destructive. The drawing system (tools, strokes, undo, frames) is kept outside React state and handled imperatively - React is only used for UI.
Some of the things it does:
-
Multi-layer editing with non-destructive filters
Layers support opacity/visibility/locking, with filters like hue, brightness, blur applied at render time. -
Frame-based animation with onion skinning
Timeline-based animation with adjustable playback and per-frame layer control. -
Multi-tab workspace (independent project states)
Up to 2 canvases open at once, each with its own layers, frames, undo stack, and camera. Shared renderer underneath. -
Full selection toolkit + pixel tools
Lasso, magic wand, rectangle select, marching-ants rendering, mirror drawing, dithering, pixel-perfect modes. -
Import/export + local-first workflow
Works without login. Projects can be saved locally and re-imported anytime. -
On-chain project storage
Logged-in users can persist projects directly to the canister. -
Built-in non-custodial wallet
Address is derived client-side from the principal. No backend key handling. Ledger calls go directly to the ICP ledger. -
Simple on-chain “pixel” resource system
Purchases are logged on-chain, with admin-gated crediting for auditability. -
Flexible export pipeline (static, animated, and project formats)
Supports PNG (single frame), WebM (full animation), sprite sheet export, and full project export as.icpixelfiles. -
NFT generator + full collection export (in-browser)
Trait groups are defined directly through the layer structure, with adjustable rarity weights and weighted preview generation. The export produces a complete ZIP package (traits, metadata, config, preview) entirely client-side - no uploads or backend processing.
UI has two modes: a dark “standard” one and a Win95-style grey theme. The editor loads instantly and is fully usable without logging in - auth only kicks in for persistence and wallet features.
Overall goal was to keep it fast, self-contained, and closer to a desktop tool than a typical web editor, while still leaning into what ICP enables.
Actively updating, improving.
Check it out: https://icpixel.org
Twitter: https://twitter.com/ICPixelEditor


