Staying with my parents is a bit like a mini residency. This weekend I worked quite a bit on the reference pages website for L5 and performed a variety of smaller bugfixes to the lang.

* max() and min() can now accept tables
* added exp() function
* deltaTime global var now outputs millis() to match Processing/p5 output
* added resetMatrix() and fixed addMatrix() (and used these to complete the L5 studies project photocrapier)

only 60 of the reference pages (out of about 200ish total) left to do.

I did 10 more pages of the reference and deployed to the (not-so-secret) website. Basically, the reason it takes so long for each reference page is that I use writing the page as a chance to go through and bug fix the actual function I'm referencing. loadTable() and saveTable() were my time stealers today, among other things. for example, I modified saveTable() to deal with both a single table as well as a table of tables. That added...dozens of lines of code, plus debugging.

I also kicked off #DecemberAdventure today after forgetting about this annual tradition and then seeing it pop off on Mastodon here. I participated in the last 2 years and basically liked it so much I continued doing it year round on my log page, so I made an anchor tag to jump to my December Adventure 2025 posts here:

https://leetusman.com/nosebook/log/#december-adventure-2025

Log

#DecemberAdventure #L5

Today was spent working on reference pages and debugging the L5 language library, getting ready for the pre-alpha release. What I worked on today: save() can take an optional filename. I added an alternate data structure for single element tables to saveTable. I updated text() to deal with non-strings. Lots of fixes to events: key detection majorly mproved, fixing delete and function keys, etc reporting. Surgical fix so that keyTyped() reports true at the correct spot. Cleaned up mouseWheel() (no need to report x-value since wheel only scrolls vertically). The biggest update/fix was debugging and correcting the order of mouse handling events. mousePressed() runs as soon as the user clicks the mouse. mouseReleased() runs as soon as the user releases the mouse click. mouseClicked() runs immediately after mouseReleased(). Phew. Worked through a ton of reference pages and it looks like I have a bit under 30 left to do now. At the rate of 10 a day I seem to be on now maybe there are 2 - 3 days left.

Oops, I thought I was going to go to bed but I started to code sketch doing #L5studies tonight and made a procedurally-generated "painterer" inspired by NoPaint painting app.

churned through a bunch more reference pages, updated the p5.js to L5 conversion script too to help me with that. Thinking I will likely finish the remaining reference pages tomorrow.

#L5 #DecemberAdventure

A BIG DAY FOR ME: I HAVE AN INITIAL ALPHA RELEASE OF L5, which I have been working on for 4 months so far. I also have a nice website up for it with 200 documentation pages!

https://L5lua.org

My next step is to try to get the word out to friends to try out L5, give initial feedback, and see if folks find it useful, want to contribute, etc.

I then need to concentrate on getting some more tutorials done, more/better error() message reporting, just general bug-fixing/refactoring, and add a L5 mode to the Processing IDE application.

#DecemberAdventure #L5

L5: A Processing Library in Lua

I've slowly been adding tutorials and examples pages, ported from p5.js and Processing (and thanks to a CC-BY-NC-SA license), but adapted for L5.

https://l5lua.org/examples/

https://l5lua.org/tutorials/

It'll take me some time but I plan on adding many more.

#L5 #DecemberAdventure

Examples - L5: A Processing Library in Lua

I'm looking for some suggestions about the https://L5lua.org documentation site for L5.

At first I tried to optimize the site for small page load, focusing on making all images webp files.

Question 1: Is there some html or css only option that allows "falling back" from webp to loading jpg instead if needed for browsers that can't load webp?

Question 2: For example code that shows interaction or animation i'm showing animated gifs. These gifs can be quite large! I want L5 and the website to be able to work on lower-powered and lower-bandwidth computers, even ones without JS. Could my use of gifs be improved?

I'm currently recording the window with SimpleScreenRecorder at low fps as a mp4, then using imagemagick to convert to gif. On a tip, I found ezgif.com converts even smaller. Anyone know their 'recipe'? I would love to automate the process in the command line.

Question 3: Any other tips for how I can make the site work better, particularly for low bandwidth and offline browsing?

Boosts ok! Politely written responses appreciated!

L5: A Processing Library in Lua

I just added downloadable offline documentation for L5. You can download the entire L5 website for offline use, easily, with or without images. Added to the download page.

https://l5lua.org/download/#offline-documentation

#L5 #DecemberAdventure

Download - L5: A Processing Library in Lua

I've been adding lots of examples to the L5 documentation site, including implementations of 10print and Conway's Game of Life written in L5. I also adapted some tutorials and examples from p5.js (thanks to Creative Commons licensing!).

https://l5lua.org/examples/conways-life/

I still need to add more tutorials and to build some better "getting started" materials that show exactly how to get a Mac and Windows machine set up specifically for a cozy coding environment with L5.

#L5 #DecemberAdventure

Conway's Game of Life - L5: A Processing Library in Lua

It took me two days. After a comprehensive review of my own intro coding notes for p5.js and reviewing many other creative commons licensed sources I selected and then very liberally adapted and built off the Happy Coding Tutorials to create an 11 part comprehensive:

A complete introduction to programming with L5

https://l5lua.org/tutorials/

I am still interested in developing a few more useful tutorials on setting up for various systems (Mac, Windows particularly) for a variety of code editors. Open to suggestions and contributions!

Also want to clean up and build out the working with video tutorial and create a new one on breaking out to the wider system with Lua's os.execute()

In the process of working on the tutorials I found minor inconsistencies between L5 and p5.js in key and mouse handling, so I patched it so they have parity.

#L5 #DecemberAdventure

Tutorials - L5: A Processing Library in Lua

I'm wondering where the right place to set up "discussions" should be for L5. There is a robust Discord and Discourse forum for Processing and p5.js, and yet I'm not on those things. There is also a subreddit, but again I'm not on that.

Maybe I could add a github discussions 'forum' since the repos are already there? But do i want to enable capture within the Microsoft system there? Alternatively, maybe join the Discourse forum and have a L5 forum heading? But I don't know. I do think these things matter and help spread the word about the library and {code, documentation} contribution. I'm just not keen on getting deeper into other "social media" and related.

Separately: I added @oppen 's Walking Lines example to the examples page. I'd love to have more community-contributed examples and tutorials by the way!

I made a little Cadavre Exquis code sketch for breakfast today, implemented in L5. The original images from 1926 - 27 should be public domain in the US.

#L5 #DecemberAdventure

after installing a new hard drive (and having to reinstall my Void Linux distro on the new drive), i decided to re-install the OS on my parents' unused 2014 macbook. i thought about putting linux on there but the goal is to have an old Mac to test L5 programs on. I installed Love2d and L5, tested a bug I had found on iOS and also found it on the Mac. It's a minor bug that when going to fullscreen, if you had set up a background color in setup() it doesn't persist when going to fullscreen. Somehow the Mac side it clears/resets the drawing buffers. Not present on Linux. Need a Windows machine to test and see if it persists. I noted the bug here, in case anyone wants to test on other eras of macOS or on Windows until I get my own old windows machine.
https://github.com/L5lua/L5/issues/3

I also tested to see if it had the same shader error reported earlier from the 2009 Windows machine but it didn't. It worked fine for shader code.

background color from setup doesn't persist in fullscreen on Mac · Issue #3 · L5lua/L5

Describe the bug This is a bug on Mac (and iOS) but not Linux. Need to test on Windows. If you set a background color in setup, and go fullscreen, the color doesn't get displayed on screen. To Repr...

GitHub

Thanks to a contributed code suggestion from the community, patched the save() function in L5 so that if the current directory is not writeable then it will save to the default directory and print a warning and location of the save.

#L5 #DecemberAdventure

Day 3 of #Genuary2026 and I'm using #L5

prompt: Fibonacci sequence

Day 4 of #Genuary2026

prompt: Lowres. An image or graphic with low resolution, where details are simplified or pixelated.

This one feels in my wheelhouse much more than the previous ones. So I started having some fun and made something I'm excited about. I think I will use it as a 'filter' to create a music video for some no-input mixing board mixes I want to put online.

Little test here. I was having too much fun so this is a larger video file with my own music recorded with my collaborator ZZZelin. I'll upload some screenshots too.

#L5

and here's the code for that one:

```
--genuary 2026 day 4
require "L5"

function setup()
fullscreen()
img = {}
for i = 1, 9 do
img[i] = loadImage('assets/graff/'..i..'.jpg')
end
mouseDragged() --pick an image to start
end

function draw()
buffer_w = map(mouseX, 0, width, 15, 200)
buffer_h = map(mouseY, 0, height, 15, 200)
pg = createGraphics(buffer_w, buffer_h)

pg:beginDraw()
image(current_img, 0, 0, buffer_w, buffer_h)
pg:endDraw()

translate(width, height)
rotate(PI)
image(pg:getCanvas(), 0, 0, width, height)
end
function mouseDragged()
current_img = random(img)
end
```

Day5 of #Genuary2026 in #L5. The prompt is to write Genuary in some way without a font. I made this little drawing thing and drew the title, using an offscreen buffer that continuously repeats my drawing

--genuary 2026 day 5
require("L5")

function setup()
background(255)
blocksize = 250

-- Create offscreen canvas
offscreenCanvas = createGraphics(800, 600)
end
function mouseDragged()
background(frameCount % 255)
offscreenCanvas:beginDraw()

strokeWeight(random(7))
stroke(random(255))
line(mouseX,mouseY,pmouseX,pmouseY)

offscreenCanvas:endDraw()
end

function mouseReleased()
for y=1,height,blocksize/4 do
push()
translate(0, y)
image(offscreenCanvas:getCanvas(), 0, 0)
pop()
end
end

Day7 of #Genuary2026 and today's prompt was something related to booleans. Programmed in #L5
(Hmm, on upload, i see the video gets upscaled! it should only be 100 pixels wide! that's why this looks so pixelated).

Also, on reflection, this doesn't look like generative art as such, but it was still fun to program and i'm ready for bed! :)

--genuary 2026 day 7
require("L5")
function setup()
windowTitle('Genuary day 7: Boolean play')
total = 0
val = {
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
}

size(110,200)
textAlign(CENTER, CENTER)

describe('a grid of values that can be toggled between 0 and 1 when clicked.')
end

function draw()
background(0)
textSize(80)
fill(255,0,0)
text(total,width/2,height-50)
fill(255)
textSize(10)
total = 0
for y = 1,#val do
for x = 1,#val[1] do
text(val[y][x], x* 10 , y * 10)
if val[y][x] == 1 then
total = total + 1
end
end
end
end

function mouseDragged()
local _x = floor(mouseX/10)
local _y = floor(mouseY/10)

local total = 0
if val[_y][_x] == 1 then
val[_y][_x] = 0
else
val[_y][_x] = 1
end
end

I added a web-based survey for L5 (there is the option to fill it out, then send it via email). I had tried to do it with just HTML and CSS but the mailto link didn't copy the info correctly so there is now a minimal javascript to send the info correctly. There is also a link to a google form, as well as a <noscript>-wrapped text that explains what to copy an paste and send in an email. I tested on Netsurf, Dillo, Brave, Firefox, w3m and offpunk.

I also tightened up some info on the L5 landing page.

The biggest recent site change I made was that I added a downloadable zip folder as the recommended L5 Starter project, based on feedback from Gottfried, who filled out the survey! This should make it easier for folks to begin using L5.

I put out a local call in my network in NYC to meet up to work on L5 next week as a group to document installation and test on old Macs and PCs and more than 10 folks responded! I'm now looking for a room for us all to meet next Tuesday afternoon and wrote to a couple friends looking for space suggestions.

#L5

Although Genuary is still going on I felt drawn to work on something without the prompts today. I started working on something with scrolling marquee text, but printing out an excerpt from my daily journal entry. Obvious references are the works of Barbara Kruger and Jon Rubin, but I wasn't thinking of that at the time, and this is much simpler, made in about 20 minutes. Just came out of me. Coded in #L5.

CW: mentions violence, political news

require("L5")

function setup()
windowTitle("Thinking out loud")
textSize(100)
fill(0)
noStroke()
fullscreen()
describe("scrolling text from top to bottom, alternating direction, vaguely reminiscent of a flag, with thoughts on today.")

messages = loadStrings('thoughts.txt')
--print(messagePos[1])
--print(#messagePos)
--messagePos = {
messagePos = {}
for i=1,#messages do
messagePos[#messagePos + 1]=
{x = random(width), y = 100 * i - 50, delta = 1, bg = 'red', c = 'white'}

--even or odd?
if (i % 2 == 0) then
messagePos[#messagePos].bg = 'white'
messagePos[#messagePos].c = 'red'
else

end
end
fill(0)
end

function draw()
background(255)

for i=1,#messagePos do

fill(messagePos[i].bg)
rect(0, messagePos[i].y - 100, width, 100)
fill(messagePos[i].c)

text(messages[i], messagePos[i].x,messagePos[i].y)
messagePos[i].x = messagePos[i].x + messagePos[i].delta

-- check offscreen
if messagePos[i].x > width or messagePos[i].x < -width then
messagePos[i].delta = messagePos[i].delta * -1
end
end

end

I switched from Genuary projects back to working on #L5. I am doing testing of alternative implementations of filter() with fallbacks for older machines that can't handle some aspects of shader code. My research shows me that some GPU stuff is needed for Love2d to work at all, so i tried to match the minimum requirements. Will be doing testing this month on a variety of older machines and OSes.

The L5 community survey I put out has only gotten a few responses so far but they've been extremely helpful and led to some fixes and better documentation and starter. From one person's survey I learned of some more synthesis options in Love2d, so I am feeling much more confident we could match most of the functionality of Processing's Sound Library or p5.sound. I've mapped out the Processing Sound API and ways to replicate with Love2d native and adding in a lightweight lovefft library. I have other stuff to work on for the next few months but will definitely put time into this in the spring.

A report on the first L5 Contributors Meetup, held today in Brooklyn.

https://leetusman.com/nosebook/L5-meetup

#L5

Met with Jessica to do some brainstorming to build out documentation for those interested in contributing to L5. we talked about ease of use of p5.js but it’s still a fairly extensive development environment to set up or contribute documentation to. i had an online meeting with a team of students interested in doing usability testing of L5 for beginners and we talked about some ideas of how that could be done. there’s a big bottleneck, or a barrier is more accurate, that the easiest way for beginners to get started coding is to drag their directory holding their project with code on top of love2d, but that won’t print out “print()” function code, which instead requires command line set up currently. i want to complete a L5 mode for the processing pde but not sure how long that will take.

had an alternate idea. what if we override the Lua print command so that all print statements display (in white text?) in the render window as well as print out in cli? this would help beginners and provide an onscreen console for debugging, separate from the window error messages. but it does mean always rendering and maybe you don’t want that. maybe there is a printDebug() or printScreen() function that you place in setup() that turns on the print render, and that we add to the L5-starter example. this could work like printing in pico-8, rendering from top to bottom with an L5_env.printY that tracks the y-position for the next print(). pico-8 is smart and changes the text color based on the underlying pixels.

I implemented this in a test branch! Took me some time.

Documented in this github issue:
https://github.com/L5lua/L5/issues/7

The branch is here:
https://github.com/L5lua/L5/tree/print-in-window

To use, add the showPrint() command to your skech, and it will now display all debug print statements in the window.

The goal is to make #L5 easier to use for those not using the command line.

I'd love some feedback on this! Should this be added to L5 officially? (And where should these kinds of discussions be held?)

Worked more on this today.

showPrint() now uses the default font no matter what other user fonts are loaded. The default size of the onscreen text is 16, but you can now specify an optional textsize argument.

Download L5 from the print-in-window branch and add showPrint() to you setup() to test:
https://github.com/L5lua/L5/tree/print-in-window

I think this is a big improvement especially for beginner users but would love feedback.

#L5

GitHub - L5lua/L5 at print-in-window

L5 is a fun, fast, cross-platform, and lightweight implementation of the Processing API in Lua. - GitHub - L5lua/L5 at print-in-window

GitHub

There's now an L5 category on the Processing Foundation's forum? Still not sure where else to start or create a forum for L5 (still thinking Cerca might be nice!) but thought it's a good idea to post there as well.

https://discourse.processing.org/t/about-the-l5-category/47800/2

About the L5 category

Hi! Thanks for starting this thread. I’m Lee. I initiated L5 this fall/winter. L5 is a Lua-based creative coding library that should feel like home to those coming from p5.js or Processing. L5 is only 6MB, works on older computers and is lightning-fast on recent ones. It’s built on top the software framework Love2d, and was designed with concepts of permacomputing in mind. L5 is cross-platform, and already has a lot of tutorials, a full reference, and some new approaches to documentation. For ...

Processing Community Forum
Well this is exciting. L5 running on an Asus Eee PC from 2008! Thanks to encouragement from @andnull and handholding from @garvalf for fixing the last shipped version of Love2d for i386 processor machines . i haven't done too too much testing . this is literally a first step but i am excited to see it work

wow i was way too excited and stayed up another hour. shader tests i've done have worked! neeed to document more and test the complete API. basically we are running love2d 11.3 instead of 11.5 so it's possible some things could break due to this?? not sure.

I also merged the shader-fallback code branch and the new printToScreen() branch I developed and been testing this week. Feeling good! Now to sleep.

Also exciting: Jessica wrote a Contributors guide intro https://l5lua.org/contributing/

and I've now merged code or tutorials or typos, bug fixes from at least 10 folks I think.

Contributing - L5: A Processing Library in Lua

Added a Mac install guide for beginners. Fixed some bugs.

https://l5lua.org/tutorials/install-mac/

Corrected printToScreen() so that color and fill state are saved and restored after printing print() text to screen (which is optional and can be turned on with new printToScreen() function ). Also, printed text is drawn on top of filter() if one is applied to the canvas window.

Huge overhaul of install instructions and many improvements to the https://L5lua.org website today.

Worked with a friend and carried on in the evening before bed.

Added step-by-step install instructions for Mac, Windows, Linux.

Added GUI and cli instructions for running programs.

Improved some tutorials, adding printToScreen() functionality/description.

Added photos to Mac install instructions.

Created new getting-started page for after install.

And more subtle improvements.

L5: A Processing Library in Lua

accomplished my immediate todo list for L5-related documentation so i'm back to doing some code sketching. tonight i tried to recreate the permacomputing flower logo but i i couldn't figure out the math so i made this instead.
i started to make a L5 logo drawing thing, here. unfortunately i think it's ugly so far :)
@lee And what were you listening to here? Modal jazz, but is that Miles? Sorry to deviate from L5...
lee (@[email protected])

7.02K Posts, 558 Following, 510 Followers · artist, educator, programmer, learner, traveler, eater, biker, reader, writer, musician. i teach and make new media art and work with art collectives. based in NYC. I only accept follow requests from people who have their own posts, an avatar and bio.

Merveilles
@jrp i can't tell which posts you're referencing unfortunately. it just links m to the whole thread!
@lee Oh damn, AP troubles between Mastodon and Hubzilla i guess. This one: #^https://merveilles.town/@exquisitecorp/116031813595969374 - and this one: #^https://merveilles.town/@exquisitecorp/115999475256810501
lee (@[email protected])

7.02K Posts, 558 Following, 510 Followers · artist, educator, programmer, learner, traveler, eater, biker, reader, writer, musician. i teach and make new media art and work with art collectives. based in NYC. I only accept follow requests from people who have their own posts, an avatar and bio.

Merveilles

@jrp yeah yah, that's from Live Evil from Miles Davis and that episode on NTS radio with (Berlin-based) Holly Herndon and Mat Dryhurst from their show i sang in at KW.

https://www.mixcloud.com/NTSRadio/starmirror-w-holly-herndon-mat-dryhurst-11th-december-2025/

Starmirror w/ Holly Herndon & Mat Dryhurst - 11th December 2025

An in conversation with musicians, technologists, and longtime collaborators Holly Herndon & Mat Dryhurst, featuring AI choirs and soundscapes from their new exhibition at the KW Institute for Contemporary Art in Berlin, entitled "Starmirror", on view until 18.01.26. Together, they reflect on their shared practice across machine learning, AI, and their musical influences, and present selections from the installation. Find the full tracklist and related episodes on NTS: https://www.nts.live/shows/guests/episodes/starmirror-holly-herndon-mat-dryhurst-11th-december-2025

Mixcloud
@lee
Holly Herndon and Mat Dryhurst
Thank you, those choirs sound religious to me actually. Interesting project, will read further about it.

@jrp some of the references are a little hand-wavey but i like the quality of the music and how they play with their ieas. and you're right on the religious choral sound

> As the artists explain, “We took inspiration from Hildegard von Bingen, who channeled visions from the divine to propose a new harmony between humans and the cosmos. We see analogies between her celestial hierarchy and the stack of influential protocols that determine our culture.”