InkForge is a GPU-backed raster drawing app: a stamp-based brush engine with six procedural tips, a layer compositor with twelve blend modes, four selection modes, a frame-animation timeline with GIF89a and WebM encoders written from scratch, and a fourteen-mode AI panel driving a local ComfyUI graph or Gemini/Replicate. Written twice: native macOS in Swift/AppKit/CoreGraphics, then again on an HTML5-canvas engine for Windows and Linux.
A drawing app is judged in the milliseconds between pen and pixel. Every stroke in InkForge renders as evenly spaced stamps along the path, with smoothing and interpolation between samples, and pressure mapped to size and opacity at once. Canvas rotation and zoom are true matrix transforms - not view tricks - so brush texture stays faithful at any angle.
Pressure comes from anywhere: a dedicated Wacom driver on the native build, and Pointer Events on the web build - so the same brush dynamics work on a tablet, a pen display or a trackpad.
The first build is native macOS: Swift, AppKit and CoreGraphics, GPU-backed bitmaps, zero Electron. But a native macOS app never reaches Windows - so the drawing engine was rebuilt, system by system, on an HTML5 canvas: the same 13 tools, the same blend modes, the same .inkforge format.
Two full codebases of the same product are also a design test: any feature that ports between AppKit and web canvas is a feature defined by its behavior, not by its framework. Windows installers build themselves on GitHub Actions on every v* tag.
A dense dark surface: one tool bar up top, vertical size and opacity sliders on the free-hand side, three panels on the right. No floating window ever covers the drawing.


Rotate / Zoom / Size. Drag to adjust, double-click to reset. Rotation is a true canvas transform and zoom anchors to the cursor - the drawing hand never leaves the pen.

Per-layer blend mode and opacity, plus αLock · Clip · Ref · Mask · FX: transparency lock, clip-to-base-alpha, a reference layer for fill boundaries, masks and effects - all non-destructive.

An HSB wheel - hue ring around a saturation/brightness square - with sliders, hex input, color history and harmony sets: complementary, analogous, triad and split.
Full keyboard coverage. Left hand on keys, right hand on the pen - the menus exist, but they are never required.
| B | Pen - the primary pressure brush |
| S E G | Smudge · Eraser · Fill - smear, pressure erase, flood fill with tolerance |
| I T | Eyedropper · Text - color pick, multi-line type |
| M | Selection - rect · ellipse · lasso · wand; Shift adds, Option subtracts |
| V | Transform - move and scale, Shift locks aspect |
| H Z Space | Pan · Zoom - navigation; hold Space to pan |
| F J R | Texture tips - Dry Brush · Ink · Charcoal, of six procedural tips |
| [ ] | Brush size - down / up mid-stroke |
| ⌘N | New canvas - size, DPI and presets |
| ⌘Z ⌘⇧Z | Undo / redo - snapshot history |
| ⌘A ⌘D | Select all / deselect |
| ⌘⇧I | Invert selection |
| ⌘⇧A | Open the AI panel (section 05) |
| ⌘E | Export - PNG / JPEG / TIFF |
The AI is a tool inside the drawing, not a website beside it. Every result lands as a new layer above the original - maskable, erasable, paintable.


The sketch on the left was drawn with the pen tool; "Sketch to Painting" sent it as img2img input with a short prompt, a Strength slider deciding how much composition survives. The snow-capped peaks came back as a new layer above the line layer - which stays intact below.
An installer per platform, and the full source on GitHub. The cross-platform build is where active development continues; the native macOS build is the original Swift implementation.