Wheel Reinvention Jam

September 25 - October 1, 2023

A one-week jam to change the status quo.

Project updates

Imagine this: the Big Boss has some important changes to make and pushes them to Gitea. Gitea notifies Aura about the push and Aura queues jobs to be handled as soon as possible. These jobs then run, quickly succeed, and the result shows back up in Gitea. All this is now working in Aura. (Big Boss' satisfaction is not guaranteed.) &aura

With the release of Darke Files 0.5.0, I included a webhook feature that lets you configure Darke Files server to post some info to a specified URL whenever a new commit is pushed. I wanted to integrate Darke Files into a CI system but I didn't find any that fit my needs, so the webhook was the only feature you got. I went into more detail back when I released that version here https://discord.com/channels/239737791225790464/1053016918023487549/1053018234628087828

Times have changed and now I have a build server that can do the things I want it to do. Aura now contains an endpoint specific to the webhook payloads Darke Files server sends out. You just have to map between the two systems in Aura's config and provide the missing pieces of information. You can read more about the integration in the expanded Aura README and the submit-darke docs.

The screenshot montage contains (from top to bottom):

  • the repository on Darke Files server
  • the project in Aura
  • the config for the integration in Aura

Yes, this is a crossover showcase-post.
https://darke.handmade.network/ | https://darkedev.itch.io/darke-files | &darke
https://handmade.network/p/431/aura/ | https://github.com/unnamedtiger/aura | &aura

This project was featured on the jam recap stream. Here's the final demo video I made for that stream. It goes into more detail about how the editor works.


demo with example based calculations

Just successfully leaked a secret in an Aura build job. Y'all just have to be careful. &aura

Builds for &sound-maker are now available! There's one for windows and the .love file can be run on any platform with Love2D installed https://github.com/icy-lava/sound-maker/releases
Unfortunately there's no project saving/loading yet, only export/import of sound files

&imp bit late for the jam but finally rendering lines and markers!

I'm happy to say I accomplished my main goal for the jam: to implement a song editor with enough functionality to make songs on the Playdate itself (previously I had been writing them out note by note in code). There's a demo of the editor here: https://handmade.network/snippet/2520 I uploaded the final build here: https://handmade.network/snippet/2519

As my final jam update, here's a song I just made with the editor over about 45 minutes (yes I got a hand cramp!). &organette

My main goal for the jam was to implement an editor sufficient to make compositions on the playdate itself. Here's a simple demo of the editor in action: https://vimeo.com/870213926

I'm uploading my final build for the Wheel Reinvention Jam here. It's a zipped .pdx file, which can be sideloaded on a physical Playdate or opened with the free Simulator included in the sdk (I used SDK version 2.0.3).

I'll post a demo of it soon!

I was not expecting to need to have a Day 1 patch for &badpaint. But since the webhook token for the crash handler was in the public repo, a bot or someone started spamming invalid crash reports to the webhook. Don't have your tokens be public, kids!

Anyway, here's the finished jam release! Feel free to play with it :) Attached is an image a friend made with it https://github.com/Ahmaykmewsik/badpaint

I slapped together a horrendous websocket server and now have basic networking functioning! A user on a different machine can drag their avatar and their position will be broadcasted to all other connected users! &discord-proxchat

My efforts at modeling a non-trival object in &shapeup.

Got the most minimal of minimal viable products, mostly a vague demo of a direction of an idea, but the final commit before the end of the jam has been done
You can move images around and save them 👍 &sis

A ton is missing to turn this into something an end user could grok.

In particular, the defined functions on the top have names instead of being visualized, and they are just in one big list at the moment instead of being organizable by types.

But I learned a lot about some core ideas for how to "attach" a cosmetic operation while being able to dynamically disable those visuals while keeping the compute part the same when composing different programs. And being able to do things I would normally need a keyboard for, like generating lists of rectangles, was pretty cool.

Just like normal programming, at the moment this system is difficult to understand if you're not the one doing it yourself, but I think with some more work that can be fixed.

But being able to take an existing operation and "open" it up to see what it's made of is still a neat ability.

Here, I can "rect cut" a data structure on the stack then display it as an overlay.

Unfortunately I didn't get to the interesting history-editing features I had in mind during the jam. I did at least manage to produce a git commit graph with collapsible commits. The idea is to condense the history of a repo so that the branching structure stands out more than all the individual commits. &dragit

Basic stack evaluation over time, paired with rendering rectangles that are scaled by the top two items on the stack.

The top bar holds functions you've defined, the side bar is a "working space" for sticking programs together.

&saw UI improvements. Added note placing sound as @daniel_hooper suggested. Also, now sheet duplicate on D key placed under the cursor.

Managed to add a couple more features and got the hardware working since my last update. A lot went wrong during this jam, tried my best to find ways to compensate. What I'm most salty about is I filmed a cool "build vlog" of getting it working for the first time last night, unfortunately my PC isnt up to the task of editing the 4k footage (I didnt know it would struggle with that, new to video editing :owlofshame:), so all I can share is a short clip with no audio. Perhaps I'll get the video out some time after the jam. RIP. &zunderglow

Aura now lets you create a new project from the web interface. I think that vital feature nicely rounds out what I've got time for this jam. Of course there are things I didn't get to, most notably authentication, artifacts, and integration into several major and minor version control servers, but I'll save these for later.

With that Aura 0.1.0 is released! Try it out and let me know what you think.
https://handmade.network/p/431/aura/ | https://github.com/unnamedtiger/aura | &aura

&badpaint is ready to be released! As a super duper preview version, but I'm pretty proud of the main concept I stumbled upon. This turned out a LOT better than I was expecting! I'm looking forward to seeing what other people do with this.

To round off my participation in the jam the gui I'm making using &rdic is now at a stage where I will start using it.
What I show in the video is that all my fundamentals work as intended. At this point it's a matter of features and refinement.
It's far from complete and full of gaping holes, but that is something I will iron out as I go. I have to use it for something to ship if I don't want to disappoint @samhsmith after all. 😛

&saw works in the browser! Controls are not very convenient, because browser doesn't send input events when cursor is outside of the window. However, it's quite awesome how you can write same C code and it will work on any platform without extra adjustments. C is a true cross-platform language.

made a new logo for the jam hope everyone likes it &badpaint

Life happened for a little bit, but when I could, I've been chipping away at the method for inputting numbers I've been thinking about for a while (since before the jam)
It doesn't actually do anything with the inputted value yet, and it's quite rough around the edges, but I think it's pretty fun
Hoping I can get some stuff done on stuff like loading from and saving images to directories and stuff as well haha &sis

By popular demand (it's me, i'm popular demand) timestamps are now relative. They also update, just in case you're looking at a job that just completed. And if you don't want to do the math, the entire thingy has a tooltip with the full date and time. Also visible here: the job log containing whatever the job wrote to stdout/stderr. &aura

Holy ship, it's alive. I've actually got a runner that just sits there and regularly checks in with the controller, asking for work to do. A tiny, productive robot. &aura

I added a visualization of the signed distance field in &shapeup. Blue is a positive (exterior) distance, red is a negative (interior) distance.

New synth sounds: kick, square, sawtooth. Implemented track looping. Now project is automatically saved and can be loaded from a file. &saw

And to think this thing didn't exist a week ago :D &sound-maker

It's surprising how much an undo functionality goes. I just finished implementing it and immediatley found myself drawn compelled to try to actually craft something that I put a little bit more time into. I spent maybe 5 minutes on this, trying to make more subtle effects. Having this much control over what the glitches produce is maybe a little antithetical to the philosophy of glitch art I'm realizing, but hey, it's pretty cool to be more in control of what happens. &badpaint

have the beginnings of a toolbar with brush size, tool type etc. Also made the paint show the asyncronous nature of the rendering, as processing larger images can take a while. Nothing that a little multithreading can't handle though.

there's many more features I want to add but I'm going to start focusing on getting a privative release version of &badpaint ready by the end of the jam. I want to put this in people's hands and see what happens. the other artist type folks I've shown this to seem eager to play with it &badpaint

If things don't seem to be moving fast enough, you can check the job page in Aura to see exactly what a job is still waiting for. In the first case, the "test:macos" job is waiting for the "build:macos" job to complete, but the latter also hasn't started yet. In the second case the "deploy" job was created with a built-in delay. &aura

The new Runner Status page in Aura lets you check if all the robots who should be running build jobs for you are productive. It also lists the tags that are used for picking the correct build runner for a given job. &aura

Implemented an audio recorder. This is an important step towards exporting and importing sounds. Playing around with the new possibilities :)

Aura now has collections, so if you want to group a bunch of commits under for example a merge request, you can. &aura

Now when hovering over a socket you can see its name and audio buffer. I've also added a way to add modules into the workspace (they were hardcoded before). Among some other tweaks and additions. &sound-maker

Did some minor UI improvements. Added instrument settings UI, not all the settings work yet.You can hear how two identical tracks cancel each other out when stereo width is 0 and phases are opposite: 0 and 0.5. &saw

I was feeling low energy this evening, so I just let myself do some easy and satisfying tasks rather than pushing on the edit UI. I got the tracks properly sorted by pitch, fixed the audio clipping on chords, added support for multiple songs and a menu to switch between them, and hand-transcribed another song for fun. The fixed audio clipping really makes it much more pleasant to interact with. &organette

I figured out a better method for hooking into volume changes, so now we can change multiple users volumes simultaneously. &discord-proxchat

Loading in avatar images and selecting the correct user's volume to change. &discord-proxchat

through experimentation i discovered a very intuitive way to display the compressed that you're distorting which lets you be very hands on. I'm having way too much fun with this &badpaint

got a basic "info panel" working. it shows the local assumptions and the current goal (at the cursor).
as in my previous demo, the first example shows using the rw tactic to use theorems to rewrite the goal into the form x = x, which is trivally true.
the second example shows unfolding definitions (negation is defined as P -> False) and introducing assumptions.
sadly, i only had two days to work on the project this week (so i didn't really get to the "interactivity" i had hoped for). still it was a lot of fun and i learned a couple of things 👌 &kibi-pa

Put all the job data into the database in Aura. With that the page listing all jobs for a commit and the page for a single job are also done. Then I added a page listing all queued jobs. I'll get the timestamps fixed before the week is up, hopefully. &aura

Warning: loud noises
Getting to a point where it's fun to mess around with this thing! The widgets don't look great but at this point I don't have time for that since the weekend will be taken up by Ludum Dare.
Can't wait till I get more modules working to play with :D
In particular I need a recorder so you can put sounds in and take them out

CactusViewer update 2.1.0 is released!

This update brings:

  • Image cropping
  • Gaussian Blur filters
  • Image saving functionality for any changes
  • No resource usage on idle (update only on relevant window events)
  • improvements to histogram rendering and a few bug fixes

You can download the image viewe and read the patch notes here:

I have been working on &rdic for a long time now, but for the jam I decided to make it publicly available and push for an alpha or beta version of sorts.
In other news, I got clipping working, though not for all my drawing functionality. I can't really explain in short form all the infrastructure heavy lifting that went into making it possible, but now I should be able to do scrollable regions, drop-downs, and more.
I'm also showing at the end my ability to redraw things conditionally, though it's hard to see because it is shown with 2x2 pixel dots.

Finally made some progress. Made a little enclosure in openscad for the receiver and got colour data updating from a raylib gui. &zunderglow

&imp, labelling axes, change the size of the "plot box", and starting on 2d mode

This is now producing sounds similar to music I like! My goal for the jam is to be able to edit and compose a song like this on the device itself, rather than in code.

I also automated the process of uploading and running the build on the device, so I'm now able to iterate pretty quickly. Need to figure out how to keep big chords from blowing out the speaker. &organette

Ben posted this idea in the jam channel and I'm giving it a shot. So far I got some very primitive volume control of a user in a Discord voice channel from a browser extension, by way of disgusting hacks. &discord-proxchat

ShapeUp is starting to be useful! Today I added coloring, rotation, and lots of editing keyboard controls. &shapeup

Some super basic layering of 'images', but more importantly, functional gui (immediate ui mode is surprisingly easy to program), which is a first for me &sis

we have drawing!!! &badpaint

Witness my visual git client! You can tell it's visual because you can pan and zoom. &dragit

(This is actually just proving that I have an Orca app up and running with git commands, which...took a while. The fun stuff starts now, finally.)

A bunch of things are clickable in the Aura web interface now. All of the data comes directly from the SQLite database. If you just want to poke around the program, you can run the executable in demo mode (as seen here) which will already contain some sample data. &aura

you can now save image edits to disk, including rotation, cropping, and image value changes

Added piano roll panning, tracks composing, rewind. &saw

Working on an audio tool for the jam :D &sound-maker

&imp much better put together

&imp some 3d axes in raylib.. realized theres no 3d text functions so had to switch to rolling those for a bit

Wanted to get this done yesterday (super simple text boxes), but luckily it was as easy as I imagined
Also hm the font is not epically great, but I'm gonna stick with it for at least the jam

**[WARNING, FLASHING IMAGES] **things got really cool really quickly. This is randomly corruptting the data right after the png is filtered for beautiful results. Forcing the filter to be a particular algorithm (displayed here) gives different characteristic results. And when running -02 it even does all this in a frame! (with smaller images). Now to figure out how to "paint" this... &badpaint

I refactored the piano roll code, now I'm able to edit and play multiple tracks simultaneously. Also, added a font, so I can use text labels in UI. &saw

we have png corruption! After struggling with png encoder libraries, I finally got loadpng working, which has great error reporting as well as settings to turn off important checks that the decoding algorithm does to allow for more corruption. Randomly changing some bytes somewhere only works some of the time, you can see the errors the decoder is throwing in the console. Corrupting the png itself is quite error prone to just break the file, but with some checks turned off it works pretty well. According to some info I found which I found (which I'll post in #the-library ) png corruption becomes more powerful when you corrupt the data in-between one of the stages of encoding the png instead of just at the end. &badpaint

It ain't much, but I got &jymbo to build and print binary abstract syntax trees for polynomials! This one is a basic quadratic

Added mirroring, "blobby" toggle, better camera controls, resizing handles, and you can select objects by clicking on them. &shapeup

The main page of Aura features a list of all projects on the server. It won't stay quite as empty, there are still a few more links coming, once I've created the pages behind them and figured out what goes where. I don't expect this to be used much, most people probably open a page with a deeplink posted where ever the job was started from, e.g. a bot commenting in your MR.
Tech wise the entire thing now sits on top of an SQLite database which is the source for the list of projects you can see here. &aura

Cactus Viewer now now waits on Window events, instead of unnecessarily redrawing on idle, still supports UI animations and handles events set by image loader threads to wake up the process.
(tried demonstrating updates with printf("I");, best I could)

&sis Got a simple bitmap font (I'm sorry) and a way to draw boxes
Window resizing still works well, but there's still some unwanted behaviour when the window goes below a certain size
This video is really low quality and frame/refreshrate because of the recording app I use, might have to look for something slightly better

Piano roll and playback control working. Candyman theme cover in &saw

After 90 minutes of mostly SDK wrangling, &organette can play a (very) small subset of all possible songs.

Really happy with what I was able to accomplish in one day, mostly thanks to raylib. Super fun library.

I ported over my UI code from my in-progress engine into the project so I can have a immediate mode rendering thing going on, that took a good deal of work. But I still wanted to get something happening on day 1 so I made a simple thing that pushes some pixels to the side randomly when you hold down a key. It's not much, but hey it already looks cool! :D

Before I get started with implementing UI proper for manipulating an image, I think I'm going to first build up an architecture for swapping the image in-between different formats. The characteristic of how an image distorts is heavily based on the format the image is in (you can already see that here, the handmade logo distorts differently than the animal pics), so I want to have that more solid before I start making "tools" proper. This is just manipulating raw pixel data, which is nice, but the kind of magic I wanna explore comes from breaking more complex compressed formats! &badpaint

Surprised by so few lines are needed to get some basic text editing

Got basic sound and UI working. &saw

first steps with badpaint, dragging an image into a window and display using raylib functionality. Attempted to load ANY file, but discovered it's not as simple as disabling confirming the header is valid, you also need the header info to actually read the file at all, so putting that aside for now and moving onto image manipulation basics. &badpaint

got some basic proof tactics with manual proof goal inspection working. &kibi-pa

If we zoom out to look at an entire project, there might be different places your jobs could live. Attach your jobs to commits, days, or anything else that makes sense to you. Then group those entities in collections, for example representing branches, merge requests, or more. &aura

Got my framebuffer set up to be dynamic, so that UI elements and such won't deform drastically on window resize &sis

I've fought with CSS, and while I'm not sure if I won, I'm coming back with loot. If you've got a bunch of build jobs running for your project you might want to inspect one of these more closely. The job page has the info you need, with metadata in the left column, and more importantly the job log to the right. &aura

This Wheel Reinvention Jam I'm building a build server I've named Aura. The goal I've set myself for Monday is to create the major pages in the Web UI. I've started with the most complex one and you can see the first revision below. This page lists out all build jobs that exist for a single commit. &aura

You can also blur images for these specific purposes:

image saving pipeline, which should allow you to save whatever the shader is displaying, so any image value changes for now like saturation or gamma, etc. Planning to implement more basic image editing functions such as cropping, soon.
the render and encoding pipeline now works.

CactusViewer 2.0 is officially out!
This is a big one.
This update brings radical changes to the architecture, code structure, style, and intruduces a number of new features:


  • New render backend, replacing OpenGL with a Direct3D 11 renderer.
  • New handmade immediate-mode UI library that supports animations, themes, and subpixel antialiasing for text, replacing ImGui.
  • Windows Image Component decoders, opening the range of supported formats to pretty much anything Windows can open with their apps, plus the automatic support for any extra installed image codecs that WIC can support.
  • WebP codecs using Google's libwebp decoders, supporting both still and moving images.


  • Histograms with toggleable red, green, blue, and mix channels.
  • Live image value sliders to adjust brightness, saturation, contrast, and gamma.
  • A toggle to enable sRGB rendering.
  • Controls for rotating images without changing the file.
  • Support for reading EXIF metadata and displaying it, and correctly rotating JPEGs.
  • 3 UI themes to choose from in settings, including a light theme.
  • Fullscreen mode


  • An update to the coding style and naming convensions to something consistent, with better building scripts.
  • Moved the main repo to the current, under the master-2.0 branch, the previous version with ImGui and OpenGL is still available and be found under the branch: master-1.0.


Over the last two or so weeks I've been working on a little handmade image viewer, and since I've started a new job I won't have much time to add more features to it. Since it's stable and I already use it on my own rig, I'm releasing CactusViewer alongside the source code today!


  • Supports PNG, JPG, JPEG, BMP, and GIF extensions.
  • Scans folder of opened image and allows flipping through supported images within folder.
  • Multithreaded file loading.
  • image pan and zoom with fitting modes; to width or height.
  • Pixel color inspector and a quick copy of HEX value to clipboad.
  • Animated GIF support with play/pause and seek controls.
  • Quick toggle between nearest-neighbor and linear filtering for pixelart images.
  • Pixel grid.
  • Customizable background color with support for checkerboard with custom colors.
  • Drag and drop support to opening image files.
  • Switches to turn individual RGB channels off and switch between premultiplied alpha and straight RGB.
  • Keyboard controls to pan, zoom, flip through files and GIF controls.
  • Customizable settings to save each image's zoom and pan locations within a session, or to reset image zoom and pan upon file change.

You can check out the source code, and find prebuilt binaries for Windows here: