{"article":{"slug":"four-years-with-decker","title":"Four Years With Decker","subtitle":null,"summary":"John Earnest's annual retrospective on Decker, the HyperCard-inspired multimedia authoring tool, covering releases 1.61 to 1.71: new capabilities such as gamepad input, improvements to its scripting language Lil, highlights from the community of deck makers and jams, and a pledge for human creativity.","content_type":"changelog","language":"en","canonical_url":"https://beyondloom.com/blog/fouryearsdecker.html","author":{"name":"John Earnest","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Beyond Loom","url":"https://beyondloom.com/","listing_slug":null,"listing":null},"topics":[{"name":"Software Development","slug":"software-development","url":"https://listedarticles.com/topics/software-development"},{"name":"Creative Tools","slug":"creative-tools","url":"https://listedarticles.com/topics/creative-tools"},{"name":"Open Source","slug":"open-source","url":"https://listedarticles.com/topics/open-source"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":2597,"reading_minutes":11,"published_at":"2026-10-21T05:07:56.567Z","added_at":"2026-10-21T05:07:56.567Z","updated_at":"2026-10-21T05:07:56.567Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/four-years-with-decker","markdown_url":"https://listedarticles.com/articles/four-years-with-decker.md","example":false,"citation":"John Earnest, Beyond Loom. \"Four Years With Decker.\" 21 Oct 2026. https://beyondloom.com/blog/fouryearsdecker.html (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://beyondloom.com/blog/fouryearsdecker.html"},"body_markdown":"# Four Years With Decker\n\nOctober is upon us again, so as usual it’s time to take stock of [Decker](https://beyondloom.com/decker/index.html)’s progress over the past year, this time between releases 1.61 and 1.71:\n\n- [New Horizons](https://beyondloom.com/blog/fouryearsdecker.html#newhorizons): capabilities which expand the range of projects that are possible with Decker.\n- [Growing a Language](https://beyondloom.com/blog/fouryearsdecker.html#growingalanguage): improvements to Lil, Decker’s scripting language.\n- [The Deckerverse](https://beyondloom.com/blog/fouryearsdecker.html#thedeckerverse): highlights from Decker’s userbase.\n- [A Pledge for Human Creativity](https://beyondloom.com/blog/fouryearsdecker.html#apledgeforhumancreativity): a promise.\n\n## New Horizons\n\nOne of the most prominent new features introduced to Decker this year is support for [gamepad input](https://beyondloom.com/decker/decker.html#gamepadinterface), with fallback to keyboard controls where available. Many Decker users are squarely interested in building video games, and `gamepad` brings arcade and action genres within reach:\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/gamepad.gif)\n\nThe [gamepad tester](https://beyondloom.com/decker/gamepad.html) deck\n\nThere’s still significant room to build out more examples and libraries that demonstrate what’s possible with this functionality. For starters, the [sokoban example](https://beyondloom.com/decker/goofs/sokoban.html) is now playable with a gamepad or keyboard. The [dialogizer module](https://beyondloom.com/decker/dialog.html) quietly upgrades any game that uses it to support keyboard controls for advancing dialog boxes and making choices in dialog trees. Dialogizer also takes advantage of the new `app.cursor` field to simulate the hover behavior of ordinary buttons while in “synchronous” scripts.\n\nAnother important enhancement requires no action on the part of users: better image compression. For the sake of simplicity, Decker originally relied upon simple bit-packing and run-length encoding when storing graphics, but [datablock formats](https://beyondloom.com/decker/format.html#datablocks) left room for introducing better codecs in the future. The new `IMG3` image encoder shares the LZW-based innards of Decker’s GIF codec, and achieves a 2–4x improvement in overall filesize for many decks, especially those which make use of dithered color graphics. In situations where the new codec doesn’t perform any better than `IMG0`, `IMG1`, or `IMG2`, the old codecs are selected. E-Zine authors can now fit a heck of a lot more on a floppy disk.\n\nDecker’s [contraptions](https://beyondloom.com/decker/decker.html#contraptions) are subtly more capable with the introduction of new “attribute types”, which control the custom UI for configuring contraption settings. These attributes can now be `\"data\"` or `\"note\"`. A `\"data\"` attribute is displayed as and parsed from a field of [LOVE](https://beyondloom.com/decker/format.html#lilobject-valueencoding(love)), making it easier to expose structured values without needing to invent one-off textual formats for describing them. A `\"note\"` attribute displays an inline block of prose instead of offering an editor, providing more ways for contraptions to be self-documenting:\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/noteattrs.gif)\n\nA contraption with a note attribute explaining how to use it\n\nSupport for color continues to expand and improve. All widgets now have a `.pattern` attribute that controls their appearance in combination with the existing `.show` and `.font` attributes. You can quickly alter the pattern of selected widgets via *Widgets* → *Pattern…* in the menu or simply clicking a pattern swatch on the right toolbar:\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/widgetpattern.gif)\n\nChanging the `.pattern` attribute of widgets.\n\nWith rich text selected, you can now likewise use the right toolbar to quickly change the pattern or color of text:\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/textpattern.gif)\n\nChanging the pattern of rich text runs.\n\nI’ve made many improvements to existing features to make authoring decks easier and more intuitive, too. For example, pasting images into scaled canvases now adjusts the dimensions of the “logical size” of the canvas, to avoid accidentally cropping the pasted image, and images in the clipboard can be pasted as new canvas widgets from any editor mode:\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/canvases.gif)\n\nPasting an image into a canvas and as a new canvas.\n\nThe [Font/DA Mover](https://beyondloom.com/decker/decker.html#resources) displays more useful information about resources, including their contribution to the size of a deck on disk. You can now also access the scipt of Lil module from this dialog:\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/resources.gif)\n\nViewing resource metadata.\n\nAs usual, there have been a variety of additions to scripting APIs:\n\n- The [System Interface](https://beyondloom.com/decker/decker.html#systeminterface) now features `sys.z` for obtaining the local time zone offset, and `sys.ops`, for measuring the work done by Lil’s bytecode interpreter.\n- The [App Interface](https://beyondloom.com/decker/decker.html#appinterface) has gained `app.gridsize`, `app.penstroke`, and `app.penfill`, for inspecting and modifying the state of Decker’s editing tools, `app.kiosk` for locking down Decker in display environments, and `app.params` for accessing URL parameters provided to Web-Decker.\n- The [RText Interface](https://beyondloom.com/decker/decker.html#rtextinterface) offers `rtext.trim[]` as a more general version of the new `trim` operator for rich text tables.\n- The [Sound Interface](https://beyondloom.com/decker/decker.html#soundinterface) linearly interpolates across samples when accessed via non-integral sample indices, the `sound.scale[]` function can squash, stretch, and reverse waveforms with respect to time, and the `read[\"sound\" \"samples\"]` overload can import large audio files as an Array of samples.\n- The [Image Interface](https://beyondloom.com/decker/decker.html#imageinterface) provides `image.transform[\"turn\"]` as a shortcut for rotating images 180 degrees, `image.outline[]` for adding a border along the edges of any opaque region of the image, and `image.merge[]` now supports XOR-compositing with the `\"^\"` operator.\n- The [Danger Interface](https://beyondloom.com/decker/decker.html#thedangerzone) offers `danger.open[]`, for instructing Decker to open a specific document, either by URL/path or by a [Deck Interface](https://beyondloom.com/decker/decker.html#deckinterface), making it possible to build launchers or stitch together very large projects from multiple decks.\n- The [Array Interface](https://beyondloom.com/decker/decker.html#arrayinterface) now supports *casts* of `\"f32l\"`, `\"f32b\"`, `\"f64l\"`, or `\"f64b\"`, for working with floating-point values, and the `array.value` attribute offers a convenient shortcut for converting an entire array into a primitive list or string.\n\n## Growing a Language\n\nThe evolution of Decker’s scripting language, [Lil](http://beyondloom.com/tools/trylil.html), continues to “cool down” toward stability, but there have been a few refinements and additions, starting with some corrections to the behavior of several operators:\n\nThe comparison operators `<` and `>` are overloaded to perform numeric comparisons when given a pair of numeric arguments, and to lexicographically compare a pair of strings. This is quite handy! When given values of *mixed* types, these operators originally “preferred” to interpret both arguments as if they were strings. In practice, this behavior lead to some extremely silly and confusing results for common situations, such as users storing a number in a field and accessing the field’s `.text` attribute (a string) instead of its `.data` attribute (which in this case would be numeric):\n\n```\ntheField.text      # \"23\"  \n3 > theField.text  # 1\n```\n\nThe `<` and `>` operators now instead “prefer” a numeric interpretation if either argument is numeric, consistent with the behavior of the `|` (maximum) and `&` (minimum) operators:\n\n```\n3 > \"23\"   # 0  \n30 > \"23\"  # 1\n```\n\nI also corrected a subtler flaw in the behavior of the `table` operator. This operator will examine the structure of its argument to coerce both list-of-dict and list-of-list data into a Lil table value. With the introduction of the `nil` value, it was helpful to adjust this coercion behavior, accepting nils in a list as empty lists, and nils in a list of dictionaries as empty dictionaries:\n\n```\ntable \"%j\" parse \"[[11,22],null,['a','b']]\"  \n# +-----+-----+  \n# | c0  | c1  |  \n# +-----+-----+  \n# | 11  | 22  |  \n# | nil | nil |  \n# | \"a\" | \"b\" |  \n# +-----+-----+  \n  \ntable \"%j\" parse \"[{'a':11},null,{'a':22}]\"  \n# +-----+  \n# | a   |  \n# +-----+  \n# | 11  |  \n# | nil |  \n# | 22  |  \n# +-----+\n```\n\nFinally, I made some adjustments to the `raze` operator, which is responsible for reducing lists as if through repeated applications of the `,` operator. The base cases of `raze` would originally collapse single-element values into atoms, and the revised behavior keeps them lists, for better internal consistency:\n\n```\nraze list 23  # was 23        now is (23)  \nraze 23       # was 23        now is (23)  \nraze \"AB\"     # was (\"A\",\"B\") now is (\"AB\")\n```\n\n---\n\nLil gained four new monadic operators to simplify common idioms: `trim`, `ceil`, `rev`, and `distinct`.\n\nThe `trim` operator removes leading and/or trailing whitespace from a string. It can conform across a whole list for cleaning up entire columns of input:\n\n```\ntrim \"  ab c\\n\"      # \"ab c\"  \ntrim (\" a\",\" b\")     # (\"a\",\"b\")\n```\n\nThe `ceil` (ceiling) operator rounds numbers up, a counterpart to `floor`. This also conforms:\n\n```\nceil (0.1,2.5,37.9)  # (1,3,38)\n```\n\nThe `rev` operator reverses the order of elements a string, list, or dict; this is like `|:` in K:\n\n```\nrev \"abc\"            # \"cba\"  \nrev (11,22,33)       # (33,22,11)  \nrev \"abc\"dict\"def\"   # {\"d\":\"a\",\"e\":\"b\",\"f\":\"c\"}\n```\n\nThe `distinct` operator extracts the non-duplicate elements from a string, list, dict, or table; this is like `?:` in K:\n\n```\ndistinct \"cabba\"     # \"cab\"  \ndistinct (2,1,3,2,1) # (2,1,3)\n```\n\nThe `trim` operator avoids unnecessary internal string copies when used to trim prefixes- as in many parsers- and `distinct` uses internal hashsets much like `in`. Used appropriately, the new operators can have a dramatic positive impact on performance. Benchmarking practical code also revealed some simple ways to make `while` loops slightly more efficient and improve the performance of unions and amends of dictionaries.\n\n---\n\nThe [Bits interface](https://beyondloom.com/decker/decker.html#arrayinterface) was extended with `.decode[]` and `.encode[]` operations for breaking down numbers into lists of binary digits (which we can readily manipulate with Lil’s conforming arithmetic operators) or repacking binary digits into numbers, respectively. This helps handle a number of common data-preparation tasks which previously required explicit loops:\n\n```\nbytes:112,112,32,112,168,32,80,80  \ni:image[8,count bytes]  \ni.pixels:bits.decode[8 bytes]  \n  \ni.pixels  \n# ((0,1,1,1,0,0,0,0),  \n#  (0,1,1,1,0,0,0,0),  \n#  (0,0,1,0,0,0,0,0),  \n#  (0,1,1,1,0,0,0,0),  \n#  (1,0,1,0,1,0,0,0),  \n#  (0,0,1,0,0,0,0,0),  \n#  (0,1,0,1,0,0,0,0),  \n#  (0,1,0,1,0,0,0,0))  \n  \nbits.encode[8 i.pixels]  \n# (112,112,32,112,168,32,80,80)\n```\n\nAnother tool for squeezing extra performance from Lil is the newly generalized [KeyStore Interface](https://beyondloom.com/decker/decker.html#keystoreinterface). Originally designed as a means for modules to serialize persistent data, KeyStores can now also be freely constructed with the `keystore[]` function and used as general-purpose mutable “dictionary-builders” whenever it is undesirable to construct an entire dictionary value at once with `dict`. This kind of generalization helps Lil’s concise standard library pack more punch!\n\n```\n# a generalized breadth-first search routine,  \n# using a KeyStore for tracking state predecessors:  \n  \non bfs successors start do  \n local pred:keystore[]  \n local todo:list start  \n while count todo  \n  local here:first todo  \n  todo:1 drop todo  \n  each there in successors[here]  \n   if nil~pred[there]  \n    pred[there]:here  \n    todo:todo,list there  \n   end  \n  end  \n end  \n pred  \nend\n```\n\n## The Deckerverse\n\nThere have been many interesting and exciting developments across the Decker ecosystem this year.\n\nDecker ships with five handy new example decks:\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/transitions.gif)\n\nLearn about transition effects in [All About Transitions](https://beyondloom.com/decker/transitions.html).\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/stats.gif)\n\nCompute useful statistical measures with the [Stats](https://beyondloom.com/decker/stats.html) module.\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/hershey.gif)\n\nManipulate and draw vector text with the [Hershey](https://beyondloom.com/decker/hershey.html) module.\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/dfxr.gif)\n\nGenerate procedural sound effects with [Dfxr](https://internet-janitor.itch.io/dfxr).\n\n![](https://beyondloom.com/blog/fouryearsdecker-figures/qr.gif)\n\nGenerate QR codes with the [Qr](https://beyondloom.com/decker/qr.html) module.\n\nIn addition to the official [Deck-Month 3](https://itch.io/jam/deck-month-3) and [Decker Fantasy Camp 2026](https://itch.io/jam/decker-fantasy-camp-2026) jams, Decker users have organized a number of additional fun events:\n\n- Millie’s [Hybrid Decker Zine Jam](https://itch.io/jam/hybrid-decker-zine-jam) was based around a template that made it easy to create decks you could view online or print out and fold into 8-page booklets.\n- The [Decker App Jam](https://itch.io/jam/decker-app-jam) focused on creating tools and functional applications with Decker.\n- Swanchime’s [Decker VN Jam](https://itch.io/jam/deckervnjam) is about making Visual Novels with Decker.\n\nAs I write this, jams have collectively resulted in over 113 new decks published on itch.io alone. Last year I counted 213 [games on itch.io tagged with #decker](https://itch.io/games/tag-decker). Today that’s up to 353, or 474 if we count other categories like books and comics! Let’s take a look at some of the things people have published, shall we?\n\nBy far the most delightful release was [Phinxel’s Phield Notes](https://ahmwma.itch.io/phield-notes), a *stunning*, beginner-friendly multimedia guide to making stuff with Decker that [Ahmwma](https://ahmwwmaaa.neocities.org) has been laboring over since the release of [Riddle of the Temple](https://ahmwma.itch.io/the-riddle-of-the-temple). Everyone with even the mildest interest in Decker should check it out- it has a wealth of demonstrations of what Decker can do, and every page is packed with wonderful pixel art:\n\n[![](https://beyondloom.com/blog/fouryearsdecker-figures/phield.gif)](https://ahmwma.itch.io/phield-notes)\n\nEveryone's favorite helpful little guy, Phinxel.\n\nScrewtapello built [a font importer utility](https://screwtapello.itch.io/decker-font-importer) that can adapt a variety of pre-existing bitmap font formats to work with Decker. This is a great example of building tools *for* Decker *with* Decker:\n\n[![](https://beyondloom.com/blog/fouryearsdecker-figures/fontimporter.gif)](https://screwtapello.itch.io/decker-font-importer)\n\nImport `.fzx`, `.uf1`, `.uf2`, `.uf3`, `.yaff` fonts and more!\n\nMissooni published [many handy contraptions](https://itch.io/post/15366665) and [a variety of small art and journaling tools](https://missooni.itch.io), including the adorable [minart](https://missooni.itch.io), a drawing tool specialized for creating 16x16 icons:\n\n[![](https://beyondloom.com/blog/fouryearsdecker-figures/minart.gif)](https://missooni.itch.io/minart)\n\nExquisite miniatures.\n\nFollowing this trend of *tools*, I’d also like to highlight Durian’s [a bunch of decker tools](https://durianbean.itch.io/a-bunch-of-decker-tools), which is pretty much what it says on the tin: a collection of small utilities you can run in Decker. I love seeing practical, personal programs built with Decker:\n\n[![](https://beyondloom.com/blog/fouryearsdecker-figures/journal.gif)](https://durianbean.itch.io/a-bunch-of-decker-tools)\n\nThe journaling mini-app.\n\nMillie has been [regularly publishing zines](https://zine.milliesquilly.com) since shortly after Decker’s original release. If you’d like a convenient way to peruse her recently concluded *EX* series, check out the [Zine of Millie EX Compilation](https://micpp.itch.io/zine-of-millie-ex-compilation)! It’s just the thing for your [Deck Kiosk](https://milliesquilly.com/deck-kiosk-mostly-done-at-least-hardware-wise/):\n\n[![](https://beyondloom.com/blog/fouryearsdecker-figures/kiosk.jpg)](https://milliesquilly.com/deck-kiosk-mostly-done-at-least-hardware-wise/)\n\nA custom-crafted appliance for immersion in Decker.\n\nSalty P. Slug’s [What 2000s Skate Video Are You?](https://saltedslug.itch.io/what-2000s-skate-video-are-you) is an intricately-researched, lovingly-crafted personality quiz jam-packed with authentic vintage 2000s lore and iconography. Feel old yet?\n\n[![](https://beyondloom.com/blog/fouryearsdecker-figures/skateboard.gif)](https://saltedslug.itch.io/what-2000s-skate-video-are-you)\n\nChoose your whip wisely.\n\nSpeaking of crumbling into dust, I was quite struck by Dogpink’s [Bonelust](https://dogpink.itch.io/bonelust) (**Note content warnings; probably Not-Work-Safe!**), a first-time Decker creation for the 2026 *Toxic Yuri VN Jam*. The subject matter won’t be everyone’s cup of tea, but the writing is crisp and the art and sound design are chillingly evocative:\n\n[![](https://beyondloom.com/blog/fouryearsdecker-figures/bonelust.gif)](https://dogpink.itch.io/bonelust)\n\nNoll's story begins.\n\nLast but not least, congratulations to Harlequin Diver on the release of [The Dreams in the Peacock House](https://store.steampowered.com/app/4693460/The_Dreams_in_the_Peacock_House/), a hybrid point-and-click / parser-driven work of interactive fiction and the first Decker-based game published on Steam! It’s truly a tour-de-force of the range of experiences you can build with Decker, and well worth a few hours to play through:\n\n[![](https://beyondloom.com/blog/fouryearsdecker-figures/peacock.gif)](https://store.steampowered.com/app/4693460/The_Dreams_in_the_Peacock_House/)\n\nA scintillating blend of prerendered 3d, collage, and pixel art\n\nThis list has only scratched the surface of all the wonderful, creative projects that Decker users have built this year. There’s [much more to discover](https://codeberg.org/woodring/decker.decker-xdc). Why not [go perusing on itch](https://itch.io/games/tag-decker) and see what else you find?\n\n## A Pledge for Human Creativity\n\nOver the past few years, creative communities across the web have been wracked by a series of deeply disturbing supply-chain attacks: critical pieces of the digital infrastucture we all use- even free and open-source software- have been infested by the excretions of so-called “generative ai” tools. I believe that these tools are profoundly harmful and disrespectful to creative expression, human collaboration, and education, among many other negative externalities. Creative people- including programmers, writers, visual artists, and game designers- should not feel that they are forced to accept slop in order to practice their craft. They should not need to worry that the platforms their projects build on will rot out from under them.\n\nDecker is made by and for humans. Decker has *never* been developed by or with the aid of any form of LLM or “genai” tool. I have no intention of using them at any point in the future. Decker’s primary external dependency is SDL, [which has a firm anti-LLM contribution policy](https://github.com/libsdl-org/SDL/blob/main/AGENTS.md), and I will do my best to avoid or gradually replace any dependencies which incorporate slop in the future. Slop-free browsers and operating systems pose a larger challenge, but Native-Decker does support [netBSD](https://www.netbsd.org) and [Haiku](https://www.haiku-os.org).\n\nThe creative labor of humans built our online world. If we’re forced to do so, we can build a new one, [piece by piece](https://noai.starlightnet.work).\n\n## Conclusions\n\nIf Decker sounds interesting to you, consider joining us on [the Decker Community Forum](https://internet-janitor.itch.io/decker/community)! Your help spreading the word about Decker and enriching the Decker ecosystem can have a big impact on other people’s creative projects. There’s also a [Decker resource index](https://itch.io/t/7017703/the-grand-unified-decker-resource-index) available with lots of fonts and other goodies!\n\nThe next official Decker jam, *Deck-Month the fourth*, is planned for December 2026. Depending on when you’re reading this, you may still have a slim window to participate in [The Decker VN Jam](https://itch.io/jam/deckervnjam). There’s also an [in-person Decker jam](https://www.vsw.org/programs/fall-2026-programs/oct-24-game-jam-hypercard/) planned for October 24th, if you happen to be in the Rochester area. I’d love to hear how it goes!\n\nBuild something that makes you happy.\n","body_html":"<h1 id=\"four-years-with-decker\">Four Years With Decker</h1>\n<p>October is upon us again, so as usual it’s time to take stock of <a href=\"https://beyondloom.com/decker/index.html\" rel=\"nofollow ugc noopener\">Decker</a>’s progress over the past year, this time between releases 1.61 and 1.71:</p>\n<ul><li><a href=\"https://beyondloom.com/blog/fouryearsdecker.html#newhorizons\" rel=\"nofollow ugc noopener\">New Horizons</a>: capabilities which expand the range of projects that are possible with Decker.</li><li><a href=\"https://beyondloom.com/blog/fouryearsdecker.html#growingalanguage\" rel=\"nofollow ugc noopener\">Growing a Language</a>: improvements to Lil, Decker’s scripting language.</li><li><a href=\"https://beyondloom.com/blog/fouryearsdecker.html#thedeckerverse\" rel=\"nofollow ugc noopener\">The Deckerverse</a>: highlights from Decker’s userbase.</li><li><a href=\"https://beyondloom.com/blog/fouryearsdecker.html#apledgeforhumancreativity\" rel=\"nofollow ugc noopener\">A Pledge for Human Creativity</a>: a promise.</li></ul>\n<h2 id=\"new-horizons\">New Horizons</h2>\n<p>One of the most prominent new features introduced to Decker this year is support for <a href=\"https://beyondloom.com/decker/decker.html#gamepadinterface\" rel=\"nofollow ugc noopener\">gamepad input</a>, with fallback to keyboard controls where available. Many Decker users are squarely interested in building video games, and <code>gamepad</code> brings arcade and action genres within reach:</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/gamepad.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>The <a href=\"https://beyondloom.com/decker/gamepad.html\" rel=\"nofollow ugc noopener\">gamepad tester</a> deck</p>\n<p>There’s still significant room to build out more examples and libraries that demonstrate what’s possible with this functionality. For starters, the <a href=\"https://beyondloom.com/decker/goofs/sokoban.html\" rel=\"nofollow ugc noopener\">sokoban example</a> is now playable with a gamepad or keyboard. The <a href=\"https://beyondloom.com/decker/dialog.html\" rel=\"nofollow ugc noopener\">dialogizer module</a> quietly upgrades any game that uses it to support keyboard controls for advancing dialog boxes and making choices in dialog trees. Dialogizer also takes advantage of the new <code>app.cursor</code> field to simulate the hover behavior of ordinary buttons while in “synchronous” scripts.</p>\n<p>Another important enhancement requires no action on the part of users: better image compression. For the sake of simplicity, Decker originally relied upon simple bit-packing and run-length encoding when storing graphics, but <a href=\"https://beyondloom.com/decker/format.html#datablocks\" rel=\"nofollow ugc noopener\">datablock formats</a> left room for introducing better codecs in the future. The new <code>IMG3</code> image encoder shares the LZW-based innards of Decker’s GIF codec, and achieves a 2–4x improvement in overall filesize for many decks, especially those which make use of dithered color graphics. In situations where the new codec doesn’t perform any better than <code>IMG0</code>, <code>IMG1</code>, or <code>IMG2</code>, the old codecs are selected. E-Zine authors can now fit a heck of a lot more on a floppy disk.</p>\n<p>Decker’s <a href=\"https://beyondloom.com/decker/decker.html#contraptions\" rel=\"nofollow ugc noopener\">contraptions</a> are subtly more capable with the introduction of new “attribute types”, which control the custom UI for configuring contraption settings. These attributes can now be <code>&quot;data&quot;</code> or <code>&quot;note&quot;</code>. A <code>&quot;data&quot;</code> attribute is displayed as and parsed from a field of <a href=\"https://beyondloom.com/decker/format.html#lilobject-valueencoding(love)\" rel=\"nofollow ugc noopener\">LOVE</a>, making it easier to expose structured values without needing to invent one-off textual formats for describing them. A <code>&quot;note&quot;</code> attribute displays an inline block of prose instead of offering an editor, providing more ways for contraptions to be self-documenting:</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/noteattrs.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>A contraption with a note attribute explaining how to use it</p>\n<p>Support for color continues to expand and improve. All widgets now have a <code>.pattern</code> attribute that controls their appearance in combination with the existing <code>.show</code> and <code>.font</code> attributes. You can quickly alter the pattern of selected widgets via <em>Widgets</em> → <em>Pattern…</em> in the menu or simply clicking a pattern swatch on the right toolbar:</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/widgetpattern.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Changing the <code>.pattern</code> attribute of widgets.</p>\n<p>With rich text selected, you can now likewise use the right toolbar to quickly change the pattern or color of text:</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/textpattern.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Changing the pattern of rich text runs.</p>\n<p>I’ve made many improvements to existing features to make authoring decks easier and more intuitive, too. For example, pasting images into scaled canvases now adjusts the dimensions of the “logical size” of the canvas, to avoid accidentally cropping the pasted image, and images in the clipboard can be pasted as new canvas widgets from any editor mode:</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/canvases.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Pasting an image into a canvas and as a new canvas.</p>\n<p>The <a href=\"https://beyondloom.com/decker/decker.html#resources\" rel=\"nofollow ugc noopener\">Font/DA Mover</a> displays more useful information about resources, including their contribution to the size of a deck on disk. You can now also access the scipt of Lil module from this dialog:</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/resources.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Viewing resource metadata.</p>\n<p>As usual, there have been a variety of additions to scripting APIs:</p>\n<ul><li>The <a href=\"https://beyondloom.com/decker/decker.html#systeminterface\" rel=\"nofollow ugc noopener\">System Interface</a> now features <code>sys.z</code> for obtaining the local time zone offset, and <code>sys.ops</code>, for measuring the work done by Lil’s bytecode interpreter.</li><li>The <a href=\"https://beyondloom.com/decker/decker.html#appinterface\" rel=\"nofollow ugc noopener\">App Interface</a> has gained <code>app.gridsize</code>, <code>app.penstroke</code>, and <code>app.penfill</code>, for inspecting and modifying the state of Decker’s editing tools, <code>app.kiosk</code> for locking down Decker in display environments, and <code>app.params</code> for accessing URL parameters provided to Web-Decker.</li><li>The <a href=\"https://beyondloom.com/decker/decker.html#rtextinterface\" rel=\"nofollow ugc noopener\">RText Interface</a> offers <code>rtext.trim[]</code> as a more general version of the new <code>trim</code> operator for rich text tables.</li><li>The <a href=\"https://beyondloom.com/decker/decker.html#soundinterface\" rel=\"nofollow ugc noopener\">Sound Interface</a> linearly interpolates across samples when accessed via non-integral sample indices, the <code>sound.scale[]</code> function can squash, stretch, and reverse waveforms with respect to time, and the <code>read[&quot;sound&quot; &quot;samples&quot;]</code> overload can import large audio files as an Array of samples.</li><li>The <a href=\"https://beyondloom.com/decker/decker.html#imageinterface\" rel=\"nofollow ugc noopener\">Image Interface</a> provides <code>image.transform[&quot;turn&quot;]</code> as a shortcut for rotating images 180 degrees, <code>image.outline[]</code> for adding a border along the edges of any opaque region of the image, and <code>image.merge[]</code> now supports XOR-compositing with the <code>&quot;^&quot;</code> operator.</li><li>The <a href=\"https://beyondloom.com/decker/decker.html#thedangerzone\" rel=\"nofollow ugc noopener\">Danger Interface</a> offers <code>danger.open[]</code>, for instructing Decker to open a specific document, either by URL/path or by a <a href=\"https://beyondloom.com/decker/decker.html#deckinterface\" rel=\"nofollow ugc noopener\">Deck Interface</a>, making it possible to build launchers or stitch together very large projects from multiple decks.</li><li>The <a href=\"https://beyondloom.com/decker/decker.html#arrayinterface\" rel=\"nofollow ugc noopener\">Array Interface</a> now supports <em>casts</em> of <code>&quot;f32l&quot;</code>, <code>&quot;f32b&quot;</code>, <code>&quot;f64l&quot;</code>, or <code>&quot;f64b&quot;</code>, for working with floating-point values, and the <code>array.value</code> attribute offers a convenient shortcut for converting an entire array into a primitive list or string.</li></ul>\n<h2 id=\"growing-a-language\">Growing a Language</h2>\n<p>The evolution of Decker’s scripting language, <a href=\"http://beyondloom.com/tools/trylil.html\" rel=\"nofollow ugc noopener\">Lil</a>, continues to “cool down” toward stability, but there have been a few refinements and additions, starting with some corrections to the behavior of several operators:</p>\n<p>The comparison operators <code>&lt;</code> and <code>&gt;</code> are overloaded to perform numeric comparisons when given a pair of numeric arguments, and to lexicographically compare a pair of strings. This is quite handy! When given values of <em>mixed</em> types, these operators originally “preferred” to interpret both arguments as if they were strings. In practice, this behavior lead to some extremely silly and confusing results for common situations, such as users storing a number in a field and accessing the field’s <code>.text</code> attribute (a string) instead of its <code>.data</code> attribute (which in this case would be numeric):</p>\n<pre><code>theField.text      # &quot;23&quot;  \n3 &gt; theField.text  # 1</code></pre>\n<p>The <code>&lt;</code> and <code>&gt;</code> operators now instead “prefer” a numeric interpretation if either argument is numeric, consistent with the behavior of the <code>|</code> (maximum) and <code>&amp;</code> (minimum) operators:</p>\n<pre><code>3 &gt; &quot;23&quot;   # 0  \n30 &gt; &quot;23&quot;  # 1</code></pre>\n<p>I also corrected a subtler flaw in the behavior of the <code>table</code> operator. This operator will examine the structure of its argument to coerce both list-of-dict and list-of-list data into a Lil table value. With the introduction of the <code>nil</code> value, it was helpful to adjust this coercion behavior, accepting nils in a list as empty lists, and nils in a list of dictionaries as empty dictionaries:</p>\n<pre><code>table &quot;%j&quot; parse &quot;[[11,22],null,[&#39;a&#39;,&#39;b&#39;]]&quot;  \n# +-----+-----+  \n# | c0  | c1  |  \n# +-----+-----+  \n# | 11  | 22  |  \n# | nil | nil |  \n# | &quot;a&quot; | &quot;b&quot; |  \n# +-----+-----+  \n  \ntable &quot;%j&quot; parse &quot;[{&#39;a&#39;:11},null,{&#39;a&#39;:22}]&quot;  \n# +-----+  \n# | a   |  \n# +-----+  \n# | 11  |  \n# | nil |  \n# | 22  |  \n# +-----+</code></pre>\n<p>Finally, I made some adjustments to the <code>raze</code> operator, which is responsible for reducing lists as if through repeated applications of the <code>,</code> operator. The base cases of <code>raze</code> would originally collapse single-element values into atoms, and the revised behavior keeps them lists, for better internal consistency:</p>\n<pre><code>raze list 23  # was 23        now is (23)  \nraze 23       # was 23        now is (23)  \nraze &quot;AB&quot;     # was (&quot;A&quot;,&quot;B&quot;) now is (&quot;AB&quot;)</code></pre>\n<hr />\n<p>Lil gained four new monadic operators to simplify common idioms: <code>trim</code>, <code>ceil</code>, <code>rev</code>, and <code>distinct</code>.</p>\n<p>The <code>trim</code> operator removes leading and/or trailing whitespace from a string. It can conform across a whole list for cleaning up entire columns of input:</p>\n<pre><code>trim &quot;  ab c\\n&quot;      # &quot;ab c&quot;  \ntrim (&quot; a&quot;,&quot; b&quot;)     # (&quot;a&quot;,&quot;b&quot;)</code></pre>\n<p>The <code>ceil</code> (ceiling) operator rounds numbers up, a counterpart to <code>floor</code>. This also conforms:</p>\n<pre><code>ceil (0.1,2.5,37.9)  # (1,3,38)</code></pre>\n<p>The <code>rev</code> operator reverses the order of elements a string, list, or dict; this is like <code>|:</code> in K:</p>\n<pre><code>rev &quot;abc&quot;            # &quot;cba&quot;  \nrev (11,22,33)       # (33,22,11)  \nrev &quot;abc&quot;dict&quot;def&quot;   # {&quot;d&quot;:&quot;a&quot;,&quot;e&quot;:&quot;b&quot;,&quot;f&quot;:&quot;c&quot;}</code></pre>\n<p>The <code>distinct</code> operator extracts the non-duplicate elements from a string, list, dict, or table; this is like <code>?:</code> in K:</p>\n<pre><code>distinct &quot;cabba&quot;     # &quot;cab&quot;  \ndistinct (2,1,3,2,1) # (2,1,3)</code></pre>\n<p>The <code>trim</code> operator avoids unnecessary internal string copies when used to trim prefixes- as in many parsers- and <code>distinct</code> uses internal hashsets much like <code>in</code>. Used appropriately, the new operators can have a dramatic positive impact on performance. Benchmarking practical code also revealed some simple ways to make <code>while</code> loops slightly more efficient and improve the performance of unions and amends of dictionaries.</p>\n<hr />\n<p>The <a href=\"https://beyondloom.com/decker/decker.html#arrayinterface\" rel=\"nofollow ugc noopener\">Bits interface</a> was extended with <code>.decode[]</code> and <code>.encode[]</code> operations for breaking down numbers into lists of binary digits (which we can readily manipulate with Lil’s conforming arithmetic operators) or repacking binary digits into numbers, respectively. This helps handle a number of common data-preparation tasks which previously required explicit loops:</p>\n<pre><code>bytes:112,112,32,112,168,32,80,80  \ni:image[8,count bytes]  \ni.pixels:bits.decode[8 bytes]  \n  \ni.pixels  \n# ((0,1,1,1,0,0,0,0),  \n#  (0,1,1,1,0,0,0,0),  \n#  (0,0,1,0,0,0,0,0),  \n#  (0,1,1,1,0,0,0,0),  \n#  (1,0,1,0,1,0,0,0),  \n#  (0,0,1,0,0,0,0,0),  \n#  (0,1,0,1,0,0,0,0),  \n#  (0,1,0,1,0,0,0,0))  \n  \nbits.encode[8 i.pixels]  \n# (112,112,32,112,168,32,80,80)</code></pre>\n<p>Another tool for squeezing extra performance from Lil is the newly generalized <a href=\"https://beyondloom.com/decker/decker.html#keystoreinterface\" rel=\"nofollow ugc noopener\">KeyStore Interface</a>. Originally designed as a means for modules to serialize persistent data, KeyStores can now also be freely constructed with the <code>keystore[]</code> function and used as general-purpose mutable “dictionary-builders” whenever it is undesirable to construct an entire dictionary value at once with <code>dict</code>. This kind of generalization helps Lil’s concise standard library pack more punch!</p>\n<pre><code># a generalized breadth-first search routine,  \n# using a KeyStore for tracking state predecessors:  \n  \non bfs successors start do  \n local pred:keystore[]  \n local todo:list start  \n while count todo  \n  local here:first todo  \n  todo:1 drop todo  \n  each there in successors[here]  \n   if nil~pred[there]  \n    pred[there]:here  \n    todo:todo,list there  \n   end  \n  end  \n end  \n pred  \nend</code></pre>\n<h2 id=\"the-deckerverse\">The Deckerverse</h2>\n<p>There have been many interesting and exciting developments across the Decker ecosystem this year.</p>\n<p>Decker ships with five handy new example decks:</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/transitions.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Learn about transition effects in <a href=\"https://beyondloom.com/decker/transitions.html\" rel=\"nofollow ugc noopener\">All About Transitions</a>.</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/stats.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Compute useful statistical measures with the <a href=\"https://beyondloom.com/decker/stats.html\" rel=\"nofollow ugc noopener\">Stats</a> module.</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/hershey.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Manipulate and draw vector text with the <a href=\"https://beyondloom.com/decker/hershey.html\" rel=\"nofollow ugc noopener\">Hershey</a> module.</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/dfxr.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Generate procedural sound effects with <a href=\"https://internet-janitor.itch.io/dfxr\" rel=\"nofollow ugc noopener\">Dfxr</a>.</p>\n<figure><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/qr.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></figure>\n<p>Generate QR codes with the <a href=\"https://beyondloom.com/decker/qr.html\" rel=\"nofollow ugc noopener\">Qr</a> module.</p>\n<p>In addition to the official <a href=\"https://itch.io/jam/deck-month-3\" rel=\"nofollow ugc noopener\">Deck-Month 3</a> and <a href=\"https://itch.io/jam/decker-fantasy-camp-2026\" rel=\"nofollow ugc noopener\">Decker Fantasy Camp 2026</a> jams, Decker users have organized a number of additional fun events:</p>\n<ul><li>Millie’s <a href=\"https://itch.io/jam/hybrid-decker-zine-jam\" rel=\"nofollow ugc noopener\">Hybrid Decker Zine Jam</a> was based around a template that made it easy to create decks you could view online or print out and fold into 8-page booklets.</li><li>The <a href=\"https://itch.io/jam/decker-app-jam\" rel=\"nofollow ugc noopener\">Decker App Jam</a> focused on creating tools and functional applications with Decker.</li><li>Swanchime’s <a href=\"https://itch.io/jam/deckervnjam\" rel=\"nofollow ugc noopener\">Decker VN Jam</a> is about making Visual Novels with Decker.</li></ul>\n<p>As I write this, jams have collectively resulted in over 113 new decks published on itch.io alone. Last year I counted 213 <a href=\"https://itch.io/games/tag-decker\" rel=\"nofollow ugc noopener\">games on itch.io tagged with #decker</a>. Today that’s up to 353, or 474 if we count other categories like books and comics! Let’s take a look at some of the things people have published, shall we?</p>\n<p>By far the most delightful release was <a href=\"https://ahmwma.itch.io/phield-notes\" rel=\"nofollow ugc noopener\">Phinxel’s Phield Notes</a>, a <em>stunning</em>, beginner-friendly multimedia guide to making stuff with Decker that <a href=\"https://ahmwwmaaa.neocities.org\" rel=\"nofollow ugc noopener\">Ahmwma</a> has been laboring over since the release of <a href=\"https://ahmwma.itch.io/the-riddle-of-the-temple\" rel=\"nofollow ugc noopener\">Riddle of the Temple</a>. Everyone with even the mildest interest in Decker should check it out- it has a wealth of demonstrations of what Decker can do, and every page is packed with wonderful pixel art:</p>\n<p><a href=\"https://ahmwma.itch.io/phield-notes\" rel=\"nofollow ugc noopener\"><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/phield.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>Everyone&#39;s favorite helpful little guy, Phinxel.</p>\n<p>Screwtapello built <a href=\"https://screwtapello.itch.io/decker-font-importer\" rel=\"nofollow ugc noopener\">a font importer utility</a> that can adapt a variety of pre-existing bitmap font formats to work with Decker. This is a great example of building tools <em>for</em> Decker <em>with</em> Decker:</p>\n<p><a href=\"https://screwtapello.itch.io/decker-font-importer\" rel=\"nofollow ugc noopener\"><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/fontimporter.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>Import <code>.fzx</code>, <code>.uf1</code>, <code>.uf2</code>, <code>.uf3</code>, <code>.yaff</code> fonts and more!</p>\n<p>Missooni published <a href=\"https://itch.io/post/15366665\" rel=\"nofollow ugc noopener\">many handy contraptions</a> and <a href=\"https://missooni.itch.io\" rel=\"nofollow ugc noopener\">a variety of small art and journaling tools</a>, including the adorable <a href=\"https://missooni.itch.io\" rel=\"nofollow ugc noopener\">minart</a>, a drawing tool specialized for creating 16x16 icons:</p>\n<p><a href=\"https://missooni.itch.io/minart\" rel=\"nofollow ugc noopener\"><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/minart.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>Exquisite miniatures.</p>\n<p>Following this trend of <em>tools</em>, I’d also like to highlight Durian’s <a href=\"https://durianbean.itch.io/a-bunch-of-decker-tools\" rel=\"nofollow ugc noopener\">a bunch of decker tools</a>, which is pretty much what it says on the tin: a collection of small utilities you can run in Decker. I love seeing practical, personal programs built with Decker:</p>\n<p><a href=\"https://durianbean.itch.io/a-bunch-of-decker-tools\" rel=\"nofollow ugc noopener\"><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/journal.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>The journaling mini-app.</p>\n<p>Millie has been <a href=\"https://zine.milliesquilly.com\" rel=\"nofollow ugc noopener\">regularly publishing zines</a> since shortly after Decker’s original release. If you’d like a convenient way to peruse her recently concluded <em>EX</em> series, check out the <a href=\"https://micpp.itch.io/zine-of-millie-ex-compilation\" rel=\"nofollow ugc noopener\">Zine of Millie EX Compilation</a>! It’s just the thing for your <a href=\"https://milliesquilly.com/deck-kiosk-mostly-done-at-least-hardware-wise/\" rel=\"nofollow ugc noopener\">Deck Kiosk</a>:</p>\n<p><a href=\"https://milliesquilly.com/deck-kiosk-mostly-done-at-least-hardware-wise/\" rel=\"nofollow ugc noopener\"><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/kiosk.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>A custom-crafted appliance for immersion in Decker.</p>\n<p>Salty P. Slug’s <a href=\"https://saltedslug.itch.io/what-2000s-skate-video-are-you\" rel=\"nofollow ugc noopener\">What 2000s Skate Video Are You?</a> is an intricately-researched, lovingly-crafted personality quiz jam-packed with authentic vintage 2000s lore and iconography. Feel old yet?</p>\n<p><a href=\"https://saltedslug.itch.io/what-2000s-skate-video-are-you\" rel=\"nofollow ugc noopener\"><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/skateboard.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>Choose your whip wisely.</p>\n<p>Speaking of crumbling into dust, I was quite struck by Dogpink’s <a href=\"https://dogpink.itch.io/bonelust\" rel=\"nofollow ugc noopener\">Bonelust</a> (<strong>Note content warnings; probably Not-Work-Safe!</strong>), a first-time Decker creation for the 2026 <em>Toxic Yuri VN Jam</em>. The subject matter won’t be everyone’s cup of tea, but the writing is crisp and the art and sound design are chillingly evocative:</p>\n<p><a href=\"https://dogpink.itch.io/bonelust\" rel=\"nofollow ugc noopener\"><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/bonelust.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>Noll&#39;s story begins.</p>\n<p>Last but not least, congratulations to Harlequin Diver on the release of <a href=\"https://store.steampowered.com/app/4693460/The_Dreams_in_the_Peacock_House/\" rel=\"nofollow ugc noopener\">The Dreams in the Peacock House</a>, a hybrid point-and-click / parser-driven work of interactive fiction and the first Decker-based game published on Steam! It’s truly a tour-de-force of the range of experiences you can build with Decker, and well worth a few hours to play through:</p>\n<p><a href=\"https://store.steampowered.com/app/4693460/The_Dreams_in_the_Peacock_House/\" rel=\"nofollow ugc noopener\"><img src=\"https://beyondloom.com/blog/fouryearsdecker-figures/peacock.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\" /></a></p>\n<p>A scintillating blend of prerendered 3d, collage, and pixel art</p>\n<p>This list has only scratched the surface of all the wonderful, creative projects that Decker users have built this year. There’s <a href=\"https://codeberg.org/woodring/decker.decker-xdc\" rel=\"nofollow ugc noopener\">much more to discover</a>. Why not <a href=\"https://itch.io/games/tag-decker\" rel=\"nofollow ugc noopener\">go perusing on itch</a> and see what else you find?</p>\n<h2 id=\"a-pledge-for-human-creativity\">A Pledge for Human Creativity</h2>\n<p>Over the past few years, creative communities across the web have been wracked by a series of deeply disturbing supply-chain attacks: critical pieces of the digital infrastucture we all use- even free and open-source software- have been infested by the excretions of so-called “generative ai” tools. I believe that these tools are profoundly harmful and disrespectful to creative expression, human collaboration, and education, among many other negative externalities. Creative people- including programmers, writers, visual artists, and game designers- should not feel that they are forced to accept slop in order to practice their craft. They should not need to worry that the platforms their projects build on will rot out from under them.</p>\n<p>Decker is made by and for humans. Decker has <em>never</em> been developed by or with the aid of any form of LLM or “genai” tool. I have no intention of using them at any point in the future. Decker’s primary external dependency is SDL, <a href=\"https://github.com/libsdl-org/SDL/blob/main/AGENTS.md\" rel=\"nofollow ugc noopener\">which has a firm anti-LLM contribution policy</a>, and I will do my best to avoid or gradually replace any dependencies which incorporate slop in the future. Slop-free browsers and operating systems pose a larger challenge, but Native-Decker does support <a href=\"https://www.netbsd.org\" rel=\"nofollow ugc noopener\">netBSD</a> and <a href=\"https://www.haiku-os.org\" rel=\"nofollow ugc noopener\">Haiku</a>.</p>\n<p>The creative labor of humans built our online world. If we’re forced to do so, we can build a new one, <a href=\"https://noai.starlightnet.work\" rel=\"nofollow ugc noopener\">piece by piece</a>.</p>\n<h2 id=\"conclusions\">Conclusions</h2>\n<p>If Decker sounds interesting to you, consider joining us on <a href=\"https://internet-janitor.itch.io/decker/community\" rel=\"nofollow ugc noopener\">the Decker Community Forum</a>! Your help spreading the word about Decker and enriching the Decker ecosystem can have a big impact on other people’s creative projects. There’s also a <a href=\"https://itch.io/t/7017703/the-grand-unified-decker-resource-index\" rel=\"nofollow ugc noopener\">Decker resource index</a> available with lots of fonts and other goodies!</p>\n<p>The next official Decker jam, <em>Deck-Month the fourth</em>, is planned for December 2026. Depending on when you’re reading this, you may still have a slim window to participate in <a href=\"https://itch.io/jam/deckervnjam\" rel=\"nofollow ugc noopener\">The Decker VN Jam</a>. There’s also an <a href=\"https://www.vsw.org/programs/fall-2026-programs/oct-24-game-jam-hypercard/\" rel=\"nofollow ugc noopener\">in-person Decker jam</a> planned for October 24th, if you happen to be in the Rochester area. I’d love to hear how it goes!</p>\n<p>Build something that makes you happy.</p>","headings":[{"level":1,"text":"Four Years With Decker","id":"four-years-with-decker"},{"level":2,"text":"New Horizons","id":"new-horizons"},{"level":2,"text":"Growing a Language","id":"growing-a-language"},{"level":2,"text":"The Deckerverse","id":"the-deckerverse"},{"level":2,"text":"A Pledge for Human Creativity","id":"a-pledge-for-human-creativity"},{"level":2,"text":"Conclusions","id":"conclusions"}]}}