
Went beach.

Went beach.
I’ve been playing the very good Squeakross this weekend. It is adorable and the aesthetics are absolutely immaculate, but I’ve found the actual picross puzzles to be a point of frustrating friction in the game when compared to the picross-style puzzles in my bicross game.
Picross puzzles, aka nonograms, can relatively easily have ambiguous solutions. Because the hints only tell you how many consecutive blocks are in a row/column, they don’t tell you where they are. If the crossing hints (the perpendicular rows/columns) don’t provide enough information to nail down the blocks, they can float or swap positions while satisfying the clues.
Option A (Diagonal \ ):
[X] [ ] < 1
[ ] [X] < 1
^ ^
1 1
Option B (Diagonal / ):
[ ] [X] < 1
[X] [ ] < 1
^ ^
1 1
This, I learned to write this blog post, is called an “Elementary Switch.” Which is a 2 by 2 corner where the hints for both rows are 1 and the hints for both columns are 1. There are two valid ways to solve this, and the clues cannot distinguish between them.
The puzzles in Squeakross have this same problem, and the game accounts for this ambiguity by having a few different states that the hints can be in. I like this approach and find it compelling, but I kinda like the approach I took in bicross more.
A major difference in bicross from other picross-style games that I’ve seen is that the levels in bicross are procedurally generated and don’t correspond to some pixel-based image. In classic picross-style puzzles based on images, it is easy to have ambiguities like the elementary switch.
In games like Squeakross you can kinda guess your way around a situation like this because there’s no negative repercussion in a miss, but in bicross — especially the RPG and daily flavors — you can’t because of the HP system that punishes you for missing. For bicross, I needed provable solvability because I wanted to ensure that no matter the seed, the resulting level would never ask the player to make a random guess.
To fix this, I used a 3 step pipeline that generates a solution first, then tests it.
It starts with randomness. Using a seeded RNG, I generate a boolean grid. I immediately run a simple filter to make sure the game is in the “fun-zone,” a kind of arbitrary density measurement I came up with while play testing. The fun-zone checks to see if the grid’s density ks between 20% and 70%? If not, it’s trash and I throw it out. If yes, it moves on to the next step.
I calculate the hints (the numbers on the side, like 2 . 1 or 5) from the grid, and then throw the grid away. I ask a function called hasUniqueSolution:
Can you reconstruct the grid using ONLY these hints?
This function is kind of the “perfect logical player,” using iterative constraint propagation:
(0,3) must be filled.(0,3) to be filled, the solver zoots to the permutation list for column 3 and deletes any possibilities that don’t have a filled block at row 0.This pruning loop repeats, rows restricting columns, columns restricting rows, until it either solves the puzzle or gets stuck. Mathematically, a puzzle can have a unique solution that requires advanced look-ahead or backtracking, where if you place a block here, ten moves later you break the game, but that is some seriously big-brain-chess-playing-shit. Bicross’ solver verifies line solvability, so if it cannot force a solution using simple intersection logic it returns false. If it gets stuck, or if it finds ambiguity, like more than one valid permutation remaining, that level doesn’t get served up to the player. We burn it down and generate a new one.
A downside of this is that it uses CPU cycles. If you peek at the browser’s console, you can see that for every level played, the game usually generates and rejects 5-10 candidates in the background…which is also one of the reasons (the other one being mobile-friendliness) why I don’t generate levels larger than 10 by 10 grids. But I was honestly shocked that this pretty profoundly naive, action-heroically-brutish generate-and-solve loop is fast enough to run in the milliseconds during a level transition.
const propagate = (rows, cols, iteration) => {
// Safety break for infinite loops
if (iteration >= maxIterations) return { rows, cols };
// 1. Filter rows based on current column possibilities
const newRows = constrainRows(rows, cols);
const rowsChanged = hasChanged(rows, newRows);
// 2. Filter columns based on the new row possibilities
const newCols = constrainCols(newRows, cols);
const colsChanged = hasChanged(cols, newCols);
// Case A: Contradiction found (0 valid permutations left)
if (isUnsolvable(newRows, newCols)) return null;
// Case B: Converged! No more changes possible (Solved or Stuck)
if (!rowsChanged && !colsChanged) return { rows: newRows, cols: newCols };
// Case C: Keep optimizing
return propagate(newRows, newCols, iteration + 1);
};
I made another camera toy. This one follows pico cam, the other pico cam, lut cam, and leibovitz. This newest one is called lutul. And, while it isn’t my most feature-rich camera toy, I think it is likely my most polished camera toy.
As the name kinda suggests, lutul lets you take or upload photos and then apply some pre-made lut (look up table) filters to those photos. The filters in there right now are kinda film inspired, and end up being like OG instagram from way back when. In the future I’ll probably add some more, or make the luts more configurable.
Beyond the filters you can also apply grain to the images.
One of the biggest “aha!” moments that differentiates this camera toy from my others is that I dropped the requirement of needing to be able to live preview the filter before taking the photo. This allowed me to use mobile phones’ in built camera application! You can trigger that right from html and then hand the image back to a web app!?
<input type="file" accept="image/*" capture="environment">
Who knew!?
Let me know if you end up taking any photos with lutul! I’d love to see them.
I made a game. I’ve written about it in passing a few times, but here is an honest to goodness intro to it!
Bicross is 3 versions of the same basic game,
Bicross is totally client-side, browser-based nonogram/picross-a-like puzzle game. What makes it (kinda) unique is that the level’s aren’t manually made. Instead, the levels are procedurally generated on demand using constraint solving. This ensures that they’re A, solvable, and B, not ambiguous.
Here is a randomly searched for video that explains how to play picross. It is mostly applicable to the basics of Bicross, too! And here is a written explanation on picross basics, if you’d rather read than watch a thing.
You fill spaces with plants. You can flag places with oni. If you try to fill an incorrect space it counts against you. Oni can go anywhere without penalty.
The numbers on the edge tell you how many plants go in that row or column.
3 means three filled cells in a row.2 · 1), there must be at least one empty space between the groups.Huge shout out to all the folks who’ve play tested the game for me! Especially Ivan, Eric, Sam, and Spindley Q. You helped me bring this project to the next level.
I’d love to hear from you if you play Bicross, too!
A photo in lieu of week notes.
In response to my most recent week notes, Adrian shared this lovely quote on goblins with me. It comes from my favorite game designer, Avery Alder,
being goblin is a way of flagging that you want to include people not in spite of their sloppiness and uneven emotional growth, but because of it — because goblins come as they are, and they grow in community with one another. Being goblin means being intergenerational in an un-precious way. It means that kids are a part of community, that their messes and tantrums and experiments and giggles all take place between our feet. It’s about acknowledging disability and madness and trauma in a way that removes normalcy as our baseline. Every body is a weird body and weird is good. Accommodating one another’s weirdness isn’t just worthwhile and important, and it’s not useful to frame it as noble or anything like that. Accommodating one another’s weirdness is the literal basis of goblin community. It’s how you nest, it’s how you romp, it’s what goblins always and necessarily do.
There’s this line in The Hobbit that haunts me. For one thing, it is part of a wider problematic habit running throughout all of Tolkien that, moving in the mythopoetic space, leads to these sweeping statements that define or collapse an entire culture into a single stroke. It seems to me to be like the most damning thing you could say about a culture, though:
Now goblins are cruel, wicked, and bad-hearted. They make no beautiful things, but they make many clever ones.
Emphasis my own, and the quote continues on, really chest-out, to double and triple down on its thesis…
They make no beautiful things, but they make many clever ones.
Whenever I make a web toy or game I toss it on to the url smallandnearlysilent.com — I like keeping the root of that domain name a kind of mysterious listing of what lives there without any other context.
This week I made an about page for small and nearly silent. I’m not super duper sure why I did it, but it was a fun activity to draft it while running at the gym. I kept saying it out loud to myself because I didn’t have anything to write on.
I abhor fiddling with text editors and IDEs. They’re not things that interest me any more. My ideal one would stay out of the way, and would let me use a mouse as much as I please because I’m not a 10x vi person, nor a powerful emacs emoter…yet, this week, I grew furious — not wanting to have to work through something so painfully ugly any more I threw VS Code (which I use at work) away.
Needing something in its place and not yet ready to wander out to sea, away from work, I jumped through the hoops and set up acme-lsp. I think that it is mostly working? Time will tell. I find that I struggle to use Acme within very large projects, so I’ve also been using helix. It is fine. It doesn’t like that I want to use the mouse, but it doesn’t seem to demand finicky configuration and plays nicely with what I need it to do. It is also not heinously ugly.
I added a tiny bit of complexity to my broughlike. It now has multi-step exit doors that require you to collect 1 or 2 keys before they’ll open and it also has collectable zappers that let you attack a level’s worth of enemies all at once.
I started on another variant of my bicross, picross-a-like game, too. This one will be a daily puzzler where everyone who plays it on a given day is presented with the same set of levels. It is still cooking.
I’ve been reading the docs for ink and doing some experiments with it. One of my goals for 2026 is to make a more narrative focused game, and I think I’m going to do that with ink. I started to build out my now thing, built around minikanren but I realized that was gonna be a whole new kinda rabbit hole, and would likely keep me far away from my actual goal of…you know…making a game with a story in it instead of making a game engine to potentially, maybe, possibly, house a story.
Tolkien, on small websites in The Lord of the Rings,
“But it is not your own Shire,” said Gildor. “Others dwelt here before hobbits were; and others will dwell here again when hobbits are no more. The wide world is all about you; you can fence yourselves in, but you cannot fence it out.”
As is likely embarrassingly obvious from this very week notes, I continue with my project of reading a whole bunch of Tolkien stuff.
I’ve also had Mark Fisher on my mind lately, so started to read his essay, “The Weird and the Eerie.”
The world and work remain existent. The world, especially, seems precarious these days.
I wanna make beautiful things.
Will I succeed in making week notes a weekly activity this year?
Only time will tell!
…also, I mean…I feel like the answer is already “no” and that is fine, but anyways.
When I made this post’s title I was thinking I’d make this a pattern I could follow for the year but now that I see it in the wild I am offended by it, so, it may not end up sticking.
At the end of my #DecemberAdventure, I re-learned what I learned last year:
that 20 minutes a day can be surprisingly productive,
that I am happiest in writing code when it’s just for me or for a small group of people I know personally.
I find stats and data tracking antithetical to the experience of feeling joy, so I’ve got no bona fide numbers about this, but this year’s December Adventure certainly seemed to be the most adventuresome — with projects spanning everything from quilting to game development to programming language design to home redecoration and more.
We followed the same informal pattern this year as we’ve done previous years by sharing the idea around the Fediverse and collecting adventure logs. This year we added an IRC channel, #decadv on libera.chat that we’ve decided to keep around, too.
Huge shout out to everyone who joined in this year, regardless if you joined in for a day or the entire month, if you read along with the logs or wrote one, thank you for jumping in!
Here’s a thread where folks collected some of their favorite projects.
Here, an obligatory end of year wrap up kinda post that, as I started to write in what I assume is the classical platonic form for all blogs wherein I reflect thoughtfully on stuff I read, or games I played, or projects I twiddled at, and what not, I became overwhelmed by the act of creating a kinda cursory and meandering review, because, what, in this run on sentence, do I have to contribute that I really wanna commit to you, dear reader?
Instead, let’s try the following.
Right now, in 2025, I’ve got an enormous list of books that I’ve read, Spotify provides nearly eugenic stats on my listening habits, Steam will tell me what games I played (or at least left launched), I have a directory of hobby projects that grew over the course of the year, and my mandatory time tracking from work lets me recreate every single work day down to 15 minute intervals…but none of these really reflect how my year was — how it went.
Zooting past the requisite virtue signaling to indicate my constant and painful awareness that the state of the world writ-large is probably best summed up as “not so great” between the rise of fascist nationalism, the world’s continued headlong plunge into “certainly, capitalism is the one and only thing to fix the problems of capitalism,” and all center’s of power continuing to totally disregard the reality that we’re not awaiting climate collapse, but are activity living amidst it…I think I had a good year?
A lot of aspects that contributed to my having a good year were result of my doing uncozy things.
Primary among these uncozy things was coming to terms with the fact that I can’t see for shit, and it is getting worse. Rather than continuing to hide this from friends and coworkers (which mostly meant living my life through a computer and pretending that I could totally make out the poorly organized FigJam board they were screen sharing over a Slack Huddle) this year I finally (a tiny bit) opened up about it and it was totally fine. I obsessed about it previously, convinced that there’d be questions or it’d be weird to navigate stuff like “but you can still drive?” I was scared of it being taken as a costume I was wearing instead of, like…my lived experience.
With that admission made, my phone’s magnifier app and I were able to do a bunch of traveling this year. The whole family went on our first international vacation, I went to a work retreat (kinda mandatory), and I visited a long-time internet friend in person in Minnesota. Despite loathing the physical act of traveling, being in each location was amazing.
…traveling a couple times a year doesn’t solve the whole “living like a hermit” thing, though. So, this year I’ve also started to make more effort to interact with folks outside of required settings, which are work and school pickup. I honestly have done a pretty shit job of this, but I am thinking 2026 will be better for it. I’ve been trying to play with folks online more. Scheduling remains an impenetrably difficult problem of the contemporary human condition.
Another thing aligned with “uncozy” is that I became increasingly frustrated with how uncozy much of the software I’m required to use has become. So, in an effort to return to cozy, this year I developed a handful of applications that are adequately “me shaped” to help seize back some cozy from our cozy-hating computers.
So, what about next year?
Some aspirational goals include…
I wanna make more games, and I wanna push myself to figure out the bits of game development that I’ve shied far away from so far, including narrative, graphics of any real effort, 3d environments, and audio. I also wanna do more collaborative projects, but, again, see the difficulties of scheduling.
I wanna let my note taking system fix me, and totally give in to just using the cheapo journals and bic pens i like rather than pretend that obsidian will ever do anything at all for me.
I wanna keep up what I’ve been doing at the gym by being kind of a chaos goblin but a chaos goblin focused on cultivating more usable strength, stamina, and flexibility — in 2026 I wanna double down on the usable stamina and flexibility especially since right now the strength bit is kinda my easy-mode gym time.
I wanna figure out how to make a good matcha latte (this is a rollover goal from 2025 that I’ve failed to accomplish).
I wanna engage more consciously with stuff. I read a lot, but I mostly read because I love the act of reading. Kinda letting it wash over me. To accomplish this, I like the framing of thinking “with the grain,” and “against the grain.” I know some folks who write responses to everything they read. This seems like a blush to far for me…but who knows!?
Last but not least, I’m really proud of a bunch of the stuff I’ve made this year, including
I also did a bunch of programming language design adjacent projects which taught me a heap about programming, language design, and what I’m looking for in my own personal toolkit — and, while it isn’t its own language, I’ve extended a little functional programming library that I’ve dragged around for years into a full fledged thing that I’m pretty darn tootin’ pleased with, b.js.
…maybe in 2026 I’ll be better about making week notes weekly. Time will tell!

A friend recently asked how to get started watching Gundam, and as I tripped all over myself, equal parts excitement and not wanting to sound like a lunatic, I fumbled around for a good answer.
What I landed at was inelegant and I eventually panicked and found a watch list online. BUT! BUT! What is a blog for if not do overs!? Also, what follows has literally no information in it about where to get started watching Gundam, it is all about why I like Gundam…and Jane Austen.
“Okay, so, like, they’re both about tensions between duty, social position, and personal desires.”
I love Gundam for all the same reasons that I love Jane Austen.
Austen writes drawing room comedies about marriage and property in Regency England. Gundam is a space opera about war, its impacts on the people that make and are victims to it, and giant mech suits…also sometimes magical teens…
Folks in Austen’s books have to navigate rigid class structures where marriages are strategic alliances and personal feeling has to be balanced against social obligation. Gundam, especially the Universal Century timeline stuff, is filled with characters torn between personal relationships and their positions within military and political hierarchies.
They also both, mostly, focus on characters who have enough privilege to have choices, but not enough power to escape circumstances. Characters in both aren’t peasants without agency, but they’re also caught in larger systems they can’t opt out of…save for Iron Blooded Orphans…what I find compelling about both Austen and Gundam is watching the gap between personal desire and institutional logic do stuff.
Elizabeth Bennet wants to marry for love and respect, but in her world marriage is fundamentally about economic security and social alliance. Her refusal of Collins is personal desire asserting itself. Her family’s panic is institutional logic demanding she comply. The whole novel is the tension between those two forces, and arguably Austen’s project is figuring out if you can thread the needle; if Darcy can be both economically suitable and emotionally right. Having cake. Eating it.
Char Aznable wants…well, it’s hard to say exactly what Char wants, which is part of what makes him such a compelling mask-wearing disaster. He wants revenge for his father. He wants Amuro to acknowledge him. He wants Lalah back. He wants to be Casval Rem Deikun, or maybe he wants to stop being Casval. He’s committed himself to leading a colonial independence movement, and then to dropping asteroids on Earth. His personal desire, this unresolved stuff with Amuro and the ghost of Lalah, gets channeled through institutional logic in a way that threatens to kill many millions of people.
Both Elizabeth and Char are presented as the smartest people in most rooms they enter. Both are hyper-conscious of social dynamics and relish in having the ability to wield sometimes devastating wit. Both are shaped by wounds from their past that they can’t move away from: Elizabeth’s wound is social humiliation and economic precarity (this is maybe a stretch, tbh). Char’s is literal patricide and the loss of his birthright. Both are performing roles while pursuing deeper agendas. But, you know, Char’s agenda involves colonial war rather than securing a good marriage, but the emotional architecture is similar.
Emma Woodhouse and Suletta Mercury also pair well! Emma wants to play matchmaker, but the social institution of matchmaking is actually about managing property and bloodlines. Her meddling with Harriet kinda sorta almost destroys Harriet’s life because Emma is applying personal whim to institutional machinery. She thinks she’s helping. She’s actually just another gear in the system. Badly done.
Suletta wants to help Miorine to maybe understand what’s happening around her. But she’s a tool in her mother’s (who is also a Char stand in!?) plan, and the arranged marriage she’s been pushed into is institutional logic and corporate alliance dressed up as personal connection. Witch from Mercury kinda beats you over the head with this. Both Suletta and Miorine are heirs to massive corporate power but have almost no control over how that power operates or what’s expected of them.
The arranged marriage plot is straight out of Austen, and the show mostly kinda knows it, I think. But, whereas Emma eventually learns to see the system clearly and makes choices within it. Suletta has to learn that some systems can’t be reformed from within…and so kinda becomes a killing machine for a wee bit there to burn down the sources of corporate power entrapping her and Miorine and everyone else.
…and then I cut a lot more rambling examples that reveal me to be waaaaay to deep into this line of thought…
Smash cut!
There’s also something Austen-like in how Gundam does drawing room politics. Austen is very very good at showing how personality, wit, and emotional intelligence play out in constrained social settings where everyone is performing their role. The dinner party at Netherfield, the card games at the Musgroves. These are all arenas where characters perform their social identities while maneuvering for advantage or connection.
Gundam has all those diplomatic dinners, peace negotiations, military briefings where characters are similarly performing their institutional identities while personal tensions try to poke through from underneath. The constant political maneuvering in Unicorn. Every conversation in the Buch Concern boardrooms in Witch. What you say and what you mean are usually different things, and the camera lingers on faces the same way Austen lingers on small gestures and loaded phrases. But then, also, the giant mech battles are kinda Gundam’s drawing room politics, too, maybe?
My unhinged ending is that Iron Blooded Orphans is the exception (that I’ve seen…I’m not actually so obsessive as to have watched all of every single Gundam thing ever…yet). Mikazuki and the Tekkadan crew are trying to break into the social structure that other Gundam protagonists are trying to figure out how to navigate or escape. They’re not conflicted aristocrats trying to balance duty and feeling. They’re child soldiers attempting to use violence to gain legitimacy within the system that exploited them, kinda like an inverted Austen story.
I think that the stories in Gundam that work the best are the ones that understand that the tragedy isn’t just that war is bad, but that institutional logic and personal desire are fundamentally incompatible, and someone has to lose. Meanwhile, Austen’s stories posit that you can thread that needle, at least sometimes, if you are clever and lucky and good. Gundam is less optimistic. Maybe because within Gundam war as an institution is more totalizing than marriage is. There’s no Darcy compromise available when the institutional machinery is designed to kill…which is a very hilariously heavy thing to have written, but then I realized that Gundam GQuuuuuuX is out and that is where I suggested my friend start because…like…who doesn’t wanna see what Hideaki Anno does with Gundam?
Besides thinking too much about Gundam, I’ve been learning more about Gleam and Erlang and playing a lot of both Pokemon X and Pokemon ZA with my kids. We’re going for the full Lumiose City experience. I’ve also been thinking a bit about the next december adventure, because I’ve been making plodding progress on a game, I think I may continue to work on that throughout the close of the year.
In a sneaky moment, I assumed that the new The Last Dinner Party album would take over my listening, but what has actually taken over my listening and what I’m already ready to call my favorite album of the year is Florence + The Machine’s new album, “Everybody Scream.”
Oh! And I “released” a silly macOS app I made. FloatingClock.