Nodes/ComfyUI-SimpleScribbleCanvas/Simple Scribble Canvas
ComfyUI Node

Simple Scribble Canvas

Draw Your Layout Right in the Graph — No Krita Detour Required

By palealloy2999-prog·Created 9 days ago·Updated 7 days ago· 0
Simple Scribble Canvas
    • image
    ◄aspect_ratio1:1 square►
    ◄megapixels0.5►
    ◄multiple16►
    ◄brush_size1►
    ◄drawing►

    Scribble ControlNet is the most fun conditioning type there is: you scratch out three blobs and a horizon line, and the model turns it into a finished scene. The annoying part has always been the handoff - draw in Krita, export, drag into ComfyUI, discover the aspect ratio is wrong, redraw. Simple Scribble Canvas deletes that loop by putting a white canvas inside the node: you draw in the graph and the IMAGE comes out of a wire.

    It's a one-node pack with zero Python dependencies and no model files. That's the whole pitch.

    How it works

    The frontend drops a DOM canvas widget on top of the node and handles pointer events itself - capture, round caps, coalesced sampling so fast strokes stay smooth - and stops them propagating so drawing doesn't drag the node around. Every time you lift the pen the canvas is serialised with canvas.toDataURL("image/png") and stuffed into the node's drawing input, a STRING widget whose text box the JS hides. That base64 PNG is what lives in your workflow JSON and what the backend reads next run.

    On execution, nodes.py fills an RGB image white at the computed resolution, pastes your drawing centred on it, and returns a normalised float tensor. So the output is always a white-background, black-ink map - the convention scribble ControlNet expects, which is why you skip the preprocessor entirely. The KB calls scribble "the most creative-friendly preprocessor" of the classic set, and it's still shipping in the 2025–26 Z-Image and Flux 2 unions, so this isn't a dead-era trick.

    The inputs that actually matter

    Five widgets, all of them plain dropdowns or hidden state:

    • aspect_ratio - 1:1 square through 9:21 portrait and 21:9 landscape. Match it to your Empty Latent; ComfyUI rescales the control image internally, so a mismatch just squeezes your composition.
    • megapixels - 0.2 to 3.0, snapped to the multiple grid: 1.0 MP at 1:1 is 1024×1024, 0.5 MP at 16:9 with multiple 64 is 960×512. No exact 512×512 in the 1:1 list (464 or 560) - doesn't matter for ControlNet, quietly annoying if you're fussy.
    • multiple - 8, 16, 32 or 64. Set 64 for SDXL-family checkpoints; 16 is fine for SD 1.5.
    • brush_size - 1, 2, 3, 5, 16, 32, 64, in canvas pixels. On a 1024px canvas shown 400px wide a 1px brush is a hairline; use 3–5. The Black and White toolbar buttons remember separate sizes - Black 1, White 32, because White is really an eraser.
    • drawing - the hidden base64 PNG. Don't touch it.

    Output is one image socket: into ControlNet Apply's image input, or Preview Image. The node isn't an output node, so nothing runs until it's connected to something that executes.

    Install

    It's in the Comfy registry, so the easy path is ComfyUI Manager → search Simple Scribble Canvas → install → restart. Manually:

    cd ComfyUI/custom_nodes
    git clone https://github.com/palealloy2999-prog/ComfyUI-SimpleScribbleCanvas
    

    Restart ComfyUI and add image/Scribble → Simple Scribble Canvas. No requirements.txt, no pip install, no models - pyproject.toml declares an empty dependency list.

    One version note: the pack declares requires-comfyui >= 0.39.0 and imports from comfy_api.latest import ComfyExtension, the newer backend authoring API. On older ComfyUI you get no node at all plus a console import error - the same symptom the KB notes for packs with no NODE_CLASS_MAPPINGS, and it means "new," not "broken."

    Common issues, honestly

    Changing resolution can eat your drawing. The big one, straight from the author's README. Strokes are never scaled - change aspect ratio or megapixels and the old PNG is pasted 1:1 into a new canvas, centred. Bigger adds white margins; smaller crops, no undo, no recovering it by enlarging again. Set aspect and megapixels before you draw.

    No undo, no layers, no import, no pen pressure. You get Black, White and Clear, and the drawing lives in the workflow JSON rather than on disk - so duplicating the node keeps your sketch, and sharing the workflow shares the doodle. Need real editing? Draw elsewhere.

    "Invalid saved data" errors. A corrupt or non-PNG drawing value gives you Drawing must be a base64 PNG data URL. or Unable to decode saved scribble PNG., plus "Cannot restore drawing. Saved data retained; reload or Clear." on the frontend. The bad data is kept so you don't lose it silently - hit Clear to reset.

    Canvas won't draw, or the widget looks wrong. The whole UI is a DOM widget registered via app.registerExtension - the category the Nodes 2.0 frontend rewrite broke across the ecosystem. If strokes don't register, switch back to the legacy canvas.

    Scribble output gets ignored by the model. Usually not this node. The weak spot on 2026 bases is ControlNet support, not your drawing - the KB records Anima users saying scribble/lineart nets "barely move the image" at full strength, and modern unions publish lower scales than the old 1.0 default (0.65–0.8 for Flux 2).

    Categoryimage/Scribble

    Inputs (5)

    NameTypeDefaultDescription
    aspect_ratioCOMBO1:1 square9 options: 1:1 square, 3:4 portrait, 5:8 portrait, 9:16 portrait, 9:21 portrait, 4:3 landscape, +3
    megapixelsCOMBO0.515 options: 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, +9
    multipleCOMBO164 options: 8, 16, 32, 64
    brush_sizeCOMBO17 options: 1, 2, 3, 5, 16, 32, +1
    drawingSTRING—

    Outputs (1)

    NameTypeDescription
    imageIMAGE—