devlog(1)

glfmn.io devlog(1)
Name

devlog

Short notes about what I am thinking about or working on.

Entries

2026-10-23

I'm not sure I'm doing a great job at this devlog thing lol.


I shifted attention pretty hard towards my live-coding tool: image blocks. I got some contributions from a helpful and kind stranger, which gave me a lot of energy to get back into image blocks.

I've been focused on improving and expanding my tests with new techniques like swarm testing, inspired by my previous thrust of work with the willow.

I've also taken some time to go back and address some TODOs, and I think I'm at an okay spot to get back into actually implementing the parser. I made small change to the syntax for ["declaration"s], function declaration syntax is next on my list.

I want to support default function arguments, so I plan to switch to a more zig/futhark/javascript style function declaration syntax:

fn osc(size: f32)(uv: [2]f32) [3]f32 = cos ('time * size + (x uv))

osc returns a function of type [2]f32 -> [3]f32, and "captures" values. This allows default arguments, while still having "currying" and function composition as the primary interface for building up patches.


With the change in season, I've taken a small step back from hobby programming (only on my train commute now) to focus on sewing. I've nearly completed a mockup for a long wool skirt, and it taught me the importance of transferring all pattern markings. I skipped some out of laziness and it's come back to bite me.

I'm using some dead-stock flannel for the mockup since it has about the right drape and thickness, but it's hell to get the seam ripper through it without tearing up the fabric. I've almost got the waistband attached now, but I need to make sure that the size is accurate since I think I may need to size down from the mockup for the final skirt.

I would also like to modify the pockets since I like my pockets deeper, ideally to finish right where my hands would naturally sit inside them with my arms fully extended, and I think I may attach the pockets before seaming up the skirt. The current construction method leaves a small gap between the side seam and the split for the pockets that I think I could avoid easier of I seamed everything up from the side after.

2026-07-26

I've been working on an implementation of the willow data model. As a result, I've had databases on the mind as of late. After reading (probably too many) papers, I decided to implement the matklad comptime ORM tutorial, and it really helped me understand what the interface to a database/storage engine could be.

I've still got a lot to sort out since the willow data model encourages range based queries across 3 dimensions: path, subspace id (a public key) and timestamp.

The properties of Entries create a few interesting challenges, which the willow authors summarize pretty well:

Willow requires some features not found in off-the-shelf solutions. While there exist several solutions for managing and querying multidimensional data indexed by fixed-width integers or floating point numbers, lexicographically sorted strings of strings (i.e., Paths) are a different beast. Fingerprint aggregation is another feature you will not find in SQLite.

Given the Data Model's unique constraits, I ended up in an analysis paralysis, and just needed to move forward with something. Thankfully, I remembered matklad's tutorial, which was a blast to implement!.

I love the approach he takes by providing an interface and then directing you to implement it. I learned a lot just from the provided interface, and even more by comparing our implementations!

I was also able to speak a little bit with Sammy and Aljosha, and Aljosha keyed me into LMDB, an in process database/key-value store which memory maps files, and uses copy-on-write storage, and towards Zip trees. Now that I've done the comptime ORM tutorial, it might be interesting to experiment a bit with zip trees & using memory mapped files for the database.