Skip to main content

The Power of Pride Bundle 2026 — $10 PWYC Edition
On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

woodring

77
Posts
2
Topics
14
Followers
A member registered Oct 29, 2025 · View creator page →

Creator of

Recent community posts

(1 edit)

Old historical, see my top post in this thread for the latest single widget version

https://woodring.itch.io/patternshop tutorial and deck

See: https://missooni.itch.io/patternshop-cinnamon for a Decker drawing with layers

patternshop

a compositing tool for cards and ps canvases as layers

https://woodring.itch.io/patternshop

Also: see https://missooni.itch.io/patternshop-cinnamon for a more Decker-like experience with layers

reload if the video is not playing

tutorial and playable deck: https://woodring.itch.io/patternshop

direct download of deck: https://codeberg.org/woodring/decker.patternshop/raw/branch/main/patternshop.deck

project and readme, which is pasted below: https://codeberg.org/woodring/decker.patternshop/src/branch/main

see https://codeberg.org/woodring for more decker things

synopsis

It’s a module and several contraptions that emulate layered drawing in other drawing tools. Or, it can be thought of as “Decker mega-underpaint mode.”

https://woodring.itch.io/patternshop

teaser video apng

  1. make at least three cards

  2. put the patternshop contraption on each of those cards.

  3. switch to interactive mode.

  4. press 0 (zero) on each of the cards to activate the contraption.

  5. draw on the first card in interactive mode.

  6. switch to the second card. what was drawn on the first card appears there.

  7. draw on the second card.

  8. switch to the third card. what was drawn on the second will be under the first.

  9. et voila, layered drawing!

Why is this important? Imagine:

  • card1 has a rough sketch.

  • card2 shows card1, to trace over card1’s sketch.

  • card1 is deactivated, automatically removing the sketch, without having to manually erase it from card2.

  • card3 shows the outline of card2, to add shading without worrying about staying exactly in the lines.

layered drawing - how it works

patternshop is a contraption that combines multiple images into one. In another PS or other drawing programs, it’s what’s called layering. In graphics, it’s what we call compositing or image composition.

Another analogy is that it’s like old school cel drawing, for animation, where the scene is composed of several stacked layers of transparent celluloid.

The mode of operation is to draw on the patternshop canvas, which is a transparent drawing surface, in front of the card background. All of the active patternshop drawing surfaces are combined together - in a stack. Then, the combined stack is copied onto each card background of each card that patternshop is on. This provides the combined result on each layer - i.e., card.

Images are combined in card order. To change it so a drawing appears under another, reorder the cards in the Decker menu, i.e. File->Cards. Later cards in the stack appear under the ones in front of it. For n layers, make n+1 cards with patternshop on it. The final card will show everything together, by itself.

IMPORTANT: Drawing on patternshop requires interactive mode - not drawing mode. Decker drawing mode only works on cards. To use the Decker drawing tools, draw on a card then use the patternshop swap function to move the image to the patternshop contraption. Alternatively, use ps_layercake contraption to copy it.

When drawing on a card, with an image on the patternshop canvas, it will be under the canvas - which is what might be wanted for more accurate underpainting. Drawing on patternshop only supports the freehand pencil with custom brushes and patterns.

But, what makes patternshop different is that allows for drawing on the canvas and simultaneously seeing the card background underneath - to trace over it. It’s like Decker’s built-in underpainting, but with patternshop there’s an arbitrary number of underpainting layers.

Note: the only composite mode that patternshop supports is under. To achieve over, move the card to the front of the card stack. The other compositing modes that Decker likely aren’t used in practice by most people and are not included.

usage notes

  • To save your work, save the deck. Everything is retained between sessions.

  • Reordering cards to change layer combining order is immediate, after closing the card order dialog.

  • The starting visibility of patternshop and ps_layercake is transparent for the canvas to provide tracing over the card background, by default. They can both toggle between “solid”, “transparent”, “invert”, and “none”.

  • Everything is hotkey driven - for two reasons: (1) save screen real estate, but more importantly (2) when drawing, especially with a tablet, it is common to have a hand hovering over hotkeys or program the tablet for the hotkeys. It starts with a toolbar that can be hidden with q after learning the hotkeys.

    • Buttons for 4, Z, and X only work with hotkeys. They are visually present to show what they hotkey is.
  • As noted earlier, there’s a second contraption, ps_layercake, which is an advanced rubberband/select box that knows how to work with patternshop contraptions and cards.

  • The patternshop and ps_layercake contraptions can be used in any Decker project, as long as the ps module is copied over, too. They will not work without it.

  • Switching to a card will composite (combine) all layers if there is an activate patternshop on a card. It only updates “on view”; i.e., changing cards or having an animated widget on that card. But, having an animated widget on a patternshop card will slow Web Decker down quite significantly. While drawing, I do not suggest having animated widgets on the cards.

controls for patternshop

patternshop home row

1: toggle canvas visibility between “solid”, “transparent”, “invert” and “none”. starts in “transparent”. “solid” will hide the card background and “none” will hide the canvas.

2: toggle to the last brush used. starts with brush “1”.

3: toggle to pattern 0 and back to the last pattern used.

4: eyedropper tool that picks a pattern under the cursor. picks from the canvas first and the card second. does not change the pattern if it is pattern 0.

5: goto a card named palette. to be used in concert with 4, w, e, and ps_layercake’s custom brush function - to store patterns and brushes on a card, like a real-world palette. the palette card can contain whatever you wish - as long as it has a patternshop contraption on it. pressing 5 when on the palette card returns you to the previous card.

after learning the hotkeys or needing to temporarily move it

q: hide the toolbar

palette support

w: copy the brush from the palette card.

e: copy the pattern from the palette card

off patternshop home row

6: swap the image between the canvas and the card. to use Decker drawing tools - draw on the card and then swap it to the canvas.

7: erase the canvas.

8: set the brush. it will ask to provide a brush number or custom brush name. 2 swaps between two brushes.

9: set the pattern. it will ask to provide a pattern number in. for quicker pattern changing, use 4 and 5 with 3.

0: activate/deactivate the patternshop on this card. once activated, it will show all other active patternshops combined in card order. to remove a layer, deactivate it with 0. IMPORTANT activating a pattershop will ERASE any existing card background image.

undo and redo

z: infinite undo for canvases - up to available memory. no effect for cards. TODO need to put an undo limiter in to not accidentally run out of memory.

x: redo after undo. drawing after redoing will clear the redo stack.

ps_layercake support

r: make a ps_layercake at 100,100

ps_layercake hotkey to support patternshop

y: remove all layercake instances from the card. IMPORTANT: if there is more than one on a card, it will remove ALL of them.

controls for ps_layercake

ps_layercake is a select/rubberband box companion for patternshop. It can copy and move selections around the canvas and card background, more selectively than the patternshop swap (6) function.

It works in interactive mode, like patternshop. The upper-left box moves it and the lower-right box resizes it. All of the other controls are hotkey driven, like the rest of patternshop.

Also, it can be copy and pasted to any other card, just like any other contraption, moving the copied image between cards.

layercake to-and-from the card background

c: copy card background into layercake.

v: paste layercake onto card background.

n: merge card background into layercake. this is different than c, because it treats pattern 0 as transparent.

m: merge layercake onto card background. like n, this is different than v, because it also treats pattern 0 as transparent.

layercake to-and-from the canvas

d, f, h, j: copy, paste, merge into, merge onto for the canvas layer, instead of the card background.

other functions

t: toggle layercake visibility between “solid”, “transparent”, “invert” and “none”.

g: erase the layercake image contents.

b: save the layercake image contents as a custom brush. it will ask for a name.

y: remove all layercake instances from the card. IMPORTANT if there is more than one on a card, it will remove ALL of them.

on patternshop to support layercake

r: make a ps_layercake at 100,100

https://woodring.itch.io/patternshop

I’ve simplified Neo even further & removed the enable button. I hope this is close to what you need.

It has several properties for programming:

.canvas: get/set the image
.clear: clear the image
.locked: disable composition

And most importantly:

.active: sets the “active” card name. composites from the first up to but NOT including the active card. it assumes that you are drawing on active and thus don’t want it composed. setting it to nil automatically detects what card it is on.

This means you can have exactly one patternshop widget on the first page and then dynamically enable what it composites up to. When the user switches layers, copy the card image to the corresponding layer.

.active assumes it will composite from “first” up to but not including the “active”. You might want to have it do a 1 drop in the script if you want the first layer to be on the second card.

The paste in the community page is updated and I’ll be updating the HTML and codeberg soon.

(1 edit)

I added a quick and dirty hack inspired by Missooni’s Patternshop Cinnanom, on my Patternshop page. It’s completely a single contraption now (Patternshop Neo) without any modules. Download the patternshop_neo.html to try it out or get it from my codeberg page.

  1. The first card is the first layer, no contraption needed
  2. Each additional card is a layer, add a Patternshop contraption to it
  3. Use the arrow keys to flip left and right between layers
  4. Use the regular Decker drawing tools to draw on a layer (turn them on in the Decker menu)
  5. Switch back to interact mode (pointer finger or the menu) to have the layers composed - you’ll have to do this when you switch to a layer. Missooni has it part of the layer selection to automatically do that.

This can be much more easily used standalone now as a contraption.

It has several properties for programming:

  • .canvas: get/set the image
  • .clear: clear the image
  • .locked: disable composition

And most importantly:

  • .active: sets the “active” card name. composites from the first up to but NOT including the active card. it assumes that you are drawing on active and thus don’t want it composed. setting it to nil automatically detects what card it is on.
(1 edit)

Added Patternshop Neo html, a quick and dirty hack inspired by Missooni’s Cinnanom. It will be downloaded and you’ll have to manually open it in your browser from the downloaded files.

(6 edits)

I̶ ̶d̶o̶n̶’̶t̶ ̶h̶a̶v̶e̶ ̶a̶ ̶t̶u̶t̶o̶r̶i̶a̶l̶ ̶f̶o̶r̶ ̶i̶t̶ ̶y̶e̶t̶ ̶-̶ ̶b̶u̶t̶ ̶i̶t̶’̶s̶ ̶p̶r̶e̶t̶t̶y̶ ̶s̶i̶m̶p̶l̶e̶.̶ Have the first card blank, make more cards and drop a Patternshop widget onto it. Arrow keys to flip through the layers. The checkbox enables composition.

To incorporate it into yours I think would be pretty simple. I might have to update it for your use case, because I didn’t read your code closely. So, a few things might be need to be refactored. But, overall, I think it mostly works how you have this set up, it would just need a few tweaks.

EDIT: There’s a demo HTML on my Patternshop page, now.

I made a new Patternshop that massively simplifies things and I think will improve this a lot.

I could change mine… but I’d rather just make yours better :)

Let me know if it makes sense - it gets rid of the module and everything is encapsulated in the widget now. I think it works the way that you have Cinnanom working.

  1. Grab the first image in the card stack
  2. Composite everything up to the active layer
  3. Paste it onto the active card’s patternshop layer

It’s here: https://codeberg.org/woodring/decker.patternshop/src/branch/main/patternshop_neo.deck

Please see https://missooni.itch.io/patternshop-cinnamon for a more Decker-like drawing with layers

See https://missooni.itch.io/patternshop-cinnamon for a more Decker-like drawing experience with layers (rather than my complicated mess)

Very neat

👍

Sorry for the late response.

It’s cool. I haven’t looked at it yet, but feel free to use it in any way you see fit. I don’t mind at all, naming or otherwise.

(3 edits)

Not to jump on the bandwagon to bash - but, to give another supporting perspective on this.

Even if it was an LLM, mistake or not, we shouldn’t support that either.

Silicon Valley has perpetrated en masse plagiarism and are telling us that it’s okay. And, they’re in the process of reselling our culture back to us. That’s… a problem.

Personally, I’ve been directly on the receiving end of plagiarism - where someone has stolen my published work to get an advanced university degree. My institution would do nothing about it and threatened to fire me if I kept pressing. It feels bad man - to have your work claimed by others and be normalized.

I generally give my stuff away - because I don’t care if someone copies it or learns from it. But, most people want to be recognized for their work, even if that doesn’t result in compensation. I feel good when someone uses something that I made. I’ll keep my copyright on things that I’ve put enough work into that I want to say, “I made that, isn’t it cool?”

I think that’s why so many people here in the Decker community are anti-AI/ML or are standing up for anti-plagiarism: it’s because we want to share - we want to see someone enjoy something we’ve made. And so, it feels awful when someone else claims your work as their own; LLMs or otherwise, no matter the circumstances.

Plagiarism should never be okay, no matter what form it comes in. Even if it’s a mistake, it’s wrong and we can say it’s wrong.

(2 edits)

It may not have everything you want, but this does have layers with toggable visibility for freehand pencil/paint:

https://woodring.itch.io/patternshop

It used to have different compositing operators, other than underpaint. But, I figured the 99% use case was underpaint compositing, so I dropped the rest.

(2 edits)

By the way, a question a bit related to this is, is there a Decker shortcut cheatsheet someplace?

I know the documentation describes some of them, with inline text, but it’d be nice to have a table. I haven’t found it, if there is.

(2 edits)

For your first one, as a stop gap, my editor card can be modified to read & write the deck script:

https://codeberg.org/woodring/decker.whiteboard/src/branch/main/whiteboard.deck

search and replace:

deck.modules[w.module_name.text].script

to

deck.script

lines 71, 84, 96, 108

After editing the whiteboard deck, load it and cut and paste the editor card into your deck. Then, I’d have an offscreen button with a hotkey that takes you to the card that has the editor or last card. (though, you can’t have control+key hotkeys for buttons)

or alternatively

Modify the card to add four new buttons and copy the scripts editor.1 through 4. Attach them to the 4 new buttons that read and write the deck.script, instead, which retains the module editor functionality, too.


Totally stop gap, but the editor card is how I do live module edits. I flip between the cards with arrow keys and move it where I need it. That’s just my workflow, though.

(15 edits)

Updates:

20260521

  • blank character sheet PDF
  • notes on what YARNS is about in the summary up top

20260515

  • pre-saved PDF for the 8 page rules booklet for YARNS

20260514

  • example skill sets now available in the optional combat pdf
  • added an errata document that explains things that might be too ambiguous in the ’zine; and also a lot of notes about why and how I designed YARNS

20260513

  • added download for optional combat rules PDF and MD

To be added:

  • example characters from games played with YARNS

Just a random thing:

Why is Manipulate and Sleuth the same skill?

Do you know the old TV show Columbo? He’s a master homicide detective because he can: (1) get into people’s heads, (2) understand them to manipulate them, but (3) also figure how they commited the murder because he’s inside their head. Empathy & Read Intent are in-the-moment gut read of someone, where Manipulate & Sleuth are calculated. Columbo is good at both in YARNS. And, Rapport, too.

Cool. If you have any suggestions on how to improve it, I’m all ears.

For instance, I had it set up to work with my tablet, but I set the keys to match what I defined. There’s probably a more logical setting for Photoshop/Krita, but I don’t use them enough to know what they are off the top of my head.

Updated 20260102

  • release

Updated 20260103

  • initialized bpm to account for negative sys.ms and fixed jitter due to 60Hz quantization

Updated 20260501

  • increased viewport size
(9 edits)

Updated 20260701

  • Simplified Patternshop Neo even further

Updated 20260630

  • Added Patternshop Neo html, a quick and dirty hack inspired by Missooni’s work. It will be downloaded and you’ll have to manually open it in your browser from the downloaded files.

Updated 20260627

Updated 20260429

  • Added a button to start from scratch on first and last card

Updated 20260430

  • Added a note on card navigation with Left and Right arrow keys (<- and ->)
  • Added links

Updated 20260501

  • Updated Decker to v1.66
  • Expanded viewport
  • Go to “card2” on wipe
(2 edits)

https://woodring.itch.io/patternshop tutorial and playable deck

  • added a button to start from scratch

Cool. Thanks so much.

Looking forward to seeing what you’re cooking up there.

Tutorial is still on the way - but I’ve been slacking. (I’m asking Houdini will let me submit this to the App Jam - which will force me to finish it. I’d give myself a deadline of the 29th to be fair.)

https://itch.io/post/15815697 - I started it two days before that post, so it’s been 21 days.

To be fair to everyone else, I’d give myself 8 more days and submit it by the 29th without any more edits after that.

Would that be OK? This jam came at a convenient time and will force me to finish the tutorial by the 29th.

(1 edit)

Updated teaser:

reload if the video is not playing

OK - it’s been redone. Hopefully this is the last one for a while.

  • no more layer buttons; order is implicit on card order

  • no more operation buttons; probably the only thing that is wanted is underpaint. over is achieved by reordering the cards.

  • everything has a hotkey and the buttons show what they are. they can be hidden.

  • UNDO! (infinite right now, but I should limit it - otherwise, you can run out of memory)

  • support for the palette card: a goto/return button, an eyedropper, copy brush and pattern from palette

  • probably a few other things

Yeah - this is going to way simplify everything… sorry for the delay. It will be a much better, though.

As an aside - I only just now noticed there was a WigglyPaint retrospective.

Related to that - in my attempts for making this easier to use:

  1. make compositing order implicit based on the card order, since there’s already the ability to reorder cards

  2. make the background automatically the composite target

  3. probably all that is wanted is underpaint/masking, so I’ll probably remove operator selection. or make it less up front and center

  4. I like the palette/swatch selection. so make it go directly to a “physical palette” where you can select the pattern visually with a select tool. apply your patterns in swatches like paint. kind of like how layercake can be used now to lift brushes off the palette.

this will remove all of the buttons and probably all that’s needed is a few hot keys to operate the layercake tool.

(2 edits)

teaser for the tutorial deck

–removed– needs to be redone

(1 edit)

Also, the README is simplified a lot. Maybe it’s actually readable for some now, before I get the tutorial deck done. (I tend to write too much - my ADHD brain’s tendency to info dump.)

Another big usability refactor. It’s down to two widgets. patternshop and ps_layercake. Will be working on the tutorial, now.

I’ll try to get it out soon - I’d like to have your feedback, in particular - as I thought this might be useful for you. Thanks for your interest.

(3 edits)

Video and tutorial card are still on their way.

I’ve made a couple of more usability passes as I’ve been trying to use it for real (the actual reason this exists).

off the top of my head:

  • wipe (clear) button
  • +/- buttons for incrementing and decrementing the brush and pattern on canvas layers
  • other things that I don’t remember

I’ve done a pretty simple sketch of a face and torso where I sketch the rough on one layer, switch to another to outline the face by overpainting, and then switch to a third to add shading by underpainting. It works pretty well.

There will be a learning curve - but (not that this excuses it) most drawing programs with layering, that I know of, have a steep learning curve.

What needs to be added - but the last two, I don’t know if I’ll get to it. It works for my needs and the amount of work to make them functional is way over my annoyance threshold.

  • the tutorial
  • DONE ~don’t allow C to be activated if there are no active layers~
  • DONE ~a “logical lock” - once switched to layer mode, make it ask more when switching to composite mode and vice versa - to protect drawings from being wiped.~
  • (maybe, but I probably won’t) a grid widget for globally reordering layers (an overview of the composite)
  • (maybe) a couple of levels of undo

it’s already gone through a big revamp for usability as I tested it under “real” conditions.

it’s been massively simplified to three contraptions; card, canvas, and layercake.

(2 edits)

I’ve made several updates. In particular, added over and under composite modes, along with several other things.

It probably operates more like people expect, now.

I plan on merging a lot of the functionality into the canvas target and layer widgets, to reduce the number of contraptions. Card target and layer contraptions will mostly remain the same. While the cards seem relatively limited compared to the canvases, they both serve a purpose: 1. being able to composite with the existing Decker drawing tools, and 2. a composited background for a canvas layer to trace over or underpaint.

(51 edits)

Patternshop, a widget for many-layered drawing.

Patternshop’s been massively simplified to a single widget, inspired by Missooni, but the rest is left here for historical reasons.

%%WGT0{"w":[{"name":"patternshop1","type":"contraption","size":[512,342],"pos":[0,0],"show":"transparent","def":"patternshop","widgets":{"visible":{},"active":{}}}],"d":{"patternshop":{"name":"patternshop","size":[512,342],"margin":[0,0,0,0],"script":"on view do\n  if !visible.locked\n    me.show: \"transparent\"\n    visible.show: \"transparent\"\n    order: 1 drop keys deck.cards\n    i: (first deck.cards).image\n    if active.text\n      n: (extract index where value = active.text from order)[0]\n    else\n      n: (extract index where value = me.parent.name from order)[0]\n    end\n    each c in n take order\n      i: deck.cards[c].image.copy[].paste[i 0,0 1]\n    end\n    visible.paste[i]\n  end \nend\n\non set_canvas x do\n  visible.paste[x]\nend\n\non get_canvas do\n  visible.copy[]\nend\n\non set_locked x do\n  visible.locked: x\nend\n\non get_locked do\n  visible.locked\nend\n\non set_clear x do\n  visible.paste[image[card.parent.size]]\nend\n\non get_clear do\n  visible.paste[image[card.parent.size]]\nend\n\non set_active x do\n  active.text: x\nend\n\non get_active do\n  active.text\nend","attributes":{"name":[],"label":[],"type":[]},"widgets":{"visible":{"type":"canvas","size":[512,342],"pos":[0,0],"show":"transparent","border":0,"scale":1},"active":{"type":"field","size":[100,20],"pos":[-32,-32],"locked":1,"show":"none","style":"plain"}}}}}

Usage:

  • The first card is the first layer, no contraption needed
  • Each additional card is a layer, add a Patternshop contraption to it
  • Use the arrow keys to flip left and right between layers
  • Use the regular Decker drawing tools to draw on a layer (turn them on in the Decker menu)
  • Switch back to interact mode (pointer finger or the menu) to have the layers composed - you’ll have to do this when you switch to a layer. Missooni has it part of the layer selection to automatically do that in Patternshop Cinnanom.

This can be much more easily used standalone now as a contraption.

It has several properties for programming:

.canvas: get/set the image
.clear: clear the image
.locked: disable composition

And most importantly:

.active: sets the “active” card name. composites from the first up to but NOT including the active card. it assumes that you are drawing on active and thus don’t want it composed. setting it to nil automatically detects what card it is on.
(6 edits)

I was using it for frame timing for the bpm.

current time - last beat > bpm gap -> send a bang

so, i just hacked it by reoverflowing to positive by adding 2^31.

i just realized it’s still not 100% correct, because i’m not accounting for the timing gap (jitter) that is getting lost due to 60 Hz quantization.


update: oh, right. it wasn’t working because the “last frame” time was never initialized - so “current time” - “last frame” will always be negative, since it’s “current time” - nil (0). that’s the real reason.

so, anyways - i don’t know if negative sys.ms is supposed to be a thing, but it certainly wasn’t expected. it’s how i usually time gaps and don’t worry about initializing the first frame time for the possibility of negative time.

(1 edit)

Here’s a version that’s a little more robust that will regenerate the card and allows for interactive updates to it:

# paste this into a card's (slide's) script (menu Card->Script...)
on view do
  # boilerplate start
  if card.widgets.sentinel
    each k in keys card.widgets
      card.remove[card.widgets[k]]
    end
  end

  f: card.add["field" "sentinel"]
  f.show: "none"
  # boilerplate end
            
  # your slide commands go here for each card
  # this is different for each card (slide)
  f: card.add["field" "title"]
  f.pos: 30,30
  f.text: "here is a title"
  f.font: "menu"
    
  f: card.add["field" "info"]
  f.pos: 50,100
  f.size: 200,200
  f.text: "here is some information"
end
(4 edits)

As always, it depends.

If you want something simple or a DSL (domain specific language) like Adelie, not that I know of. Though, John has made a lot of different tools and modules that could stand in for parts of it.

But, the other way is that you can is using the built in Decker commands. If I add this to a card’s script, (go to the toolbar menu, Card->Script...) I can programmatically generate the card:

removed – see my next comment for an improved version

Again, maybe not 100% of what you’re looking for, but it’s there: https://beyondloom.com/decker/decker.html#cardinterface

Fixed.

(1 edit)

I’m not sure how sys.ms is represented, but I think it has overflowed and wrapped into negative. It’s currently returning a negative value.

updated: does appear to be signed 32-bit overflow, adding 2^31 hacks around it