Jimmy Miller wrote a lovely response to Sean Goedecke’s “Seeing like a Software Company,” which you know is itself riffing on James C. Scott’s Seeing Like a State. I loved Jimmy’s response, and it felt to me like it walked right up to the edge of a different conclusion, but didn’t make it all of the way there. I want to directly point at and name the thing I see in Jimmy’s response:
Jimmy is making an anarchist argument.
Not the Hollywood kind. Not the broken windows kind. Random looting in the streets kind. The real one. The one carried by Yiddish-speaking garment workers in the Lower East Side, by Kropotkin cataloguing mutual aid from exile, by Emma Goldman insisting that revolution that doesn’t include joy isn’t worth having, and by Ursula K. Le Guin building an entire planet (well, moon) around the idea in The Dispossessed. The anarchism that’s about how people take care of each other when they’re failed by the official systems.
Here’s a version of the argument as I see it if you haven’t read the pieces: Scott argues that states impose “legibility” on complex systems, like neat rows of trees, standardized naming, legible taxation, and in doing so destroy the messy, illegible structures that made those systems work. Sean applies this framework to software companies. He lays out with a lot of coherent balance that legibility is a tradeoff: companies need it for enterprise deals and long-term planning, but they also depend on illegible work, like backchannels, favors, and tacit knowledge to actually function. Jimmy then takes Sean’s balanced view and pushes it slightly askew by arguing that legible processes aren’t just inefficient, they’re coercive. They don’t measure values; they replace them. The metric becomes the value. The thin rule kills the thick one.
And then Jimmy ends with this:
choose to truly care about something.
Push back. Be essential.
I love this. I also think it’s not taking the idea far enough.
Individual refusal is powerful and necessary but the anarchist tradition that I think Jimmy is channeling — whether he’d call it that or not — has more to say about what comes next after choosing to care. You can’t do this alone. Individual resistance without mutual aid is burnout with a backstory.
Sean describes these “permanent zones of unsanctioned illegibility” where the actual work happens like when someone on a team reaches out to someone else on another team and says “hey, can you make this one-line change for me?” No ticket. No planning process. One person helping another because they have a relationship and the work needs doing. Sean frames these as workarounds. Necessary but awkward and illegible.
But what if they’re not workarounds? What if they’re the actual thing?
Colin Ward spent a lot of his career arguing for this. A thing he claims is that anarchist society already exists everywhere, like “a seed beneath the snow.” The informal, self-organizing networks that people build to take care of each other aren’t a fallback for when institutions fail. They’re the primary social reality that all institutions are layered on top of.
Ward built on Kropotkin who argued for cooperation, and that cooperation isn’t naive idealism. Instead, it’s the mechanism on which complex communities survive. The old-growth forests that Scott writes about, the ones the German state replaced with legible monocultures? Those forests worked because of the messy web of mutual dependence between species. The underbrush was load-bearing. The diversity was structural. Remove it for legibility and the whole thing becomes fragile.
Sean’s backchannels are underbrush.
A potentially less esoteric thing to ground this in is Ursula K. Le Guin’s The Dispossessed.
I think it is essential reading for anyone who recognized themselves in Jimmy’s piece, because it (kinda spoilers for The Dispossessed, here) suggests the understanding that this fight never ends. Anarres, the anarchist moon, doesn’t have laws. But it develops conventions, soft bureaucracies, social pressures that function like laws. The Division of Labor posting system isn’t formally coercive because you can refuse any assignment, but the social cost of refusal is expensive. People who are “willing to make lists” accumulate power. The revolution calcifies into process.
This is every software company that started with “we don’t have process, we just talk to each other” and ended up with SAFe Agile, and a quarterly OKR ceremony. Le Guin teaches us that legibility isn’t something imposed once by villains. It’s like a totally entropic force. It accretes. And the response isn’t to win once and declare victory. It’s permanent revolution. Not in the dramatic sense, but in the sense of continually choosing the thick over the thin, the contextual over the mechanical, the human relationship over the ticket.
And you can’t do that alone. That’s the whole point.
Which is where the Yiddish anarchist tradition maybe has something to teach the software industry…
The landsmanshaftn were mutual aid societies organized by immigrants from the same town or region. They weren’t anarchist institutions, exactly because spanned the full political spectrum, from socialist to religious to apolitical. But the pattern was anarchist in Ward’s sense. Super importantly, they weren’t ideological projects. They were practical responses to material need. People needed healthcare, burial funds, someone to vouch for them, a place to speak their language. So they built networks to provide those things, outside and beneath the official structures that weren’t supporting them. The Workmen’s Circle, the Yiddish press, the reading groups, none of it was waiting for the revolution. It was doing the revolution in the form of people taking care of each other.
That’s exactly what Sean’s backchannels are. Someone needs a one-line change. They know who can do it. They ask. No ticket, no process, no ideology. Just a practical response to a material need, built on a relationship. The landsmanshaftn didn’t organize because they had a theory of mutual aid. They organized because the landlord wasn’t going to fix the heat.
Emma Goldman understood this. Her insistence on joy, on dancing, on living as though the world you want already exists wasn’t frivolity. It was the recognition that mutual aid isn’t only strategy. It’s where the good life happens. The revolution isn’t the dramatic moment of refusal. It’s daily practice.
This whole analogy I’ve constructed has limits. Software engineers choosing to resist OKRs are not in the same position as garment workers organizing against bosses who could have them killed. The stakes are different…but also the stakes are there in a world where healthcare, housing, and food are predicated upon your employment status. The organizational pattern in the way mutual aid emerges wherever legibility fails the people it claims to serve, I think that’s real, and it shows up at every scale.
Jimmy asks us to choose to “truly care about something.” I’d push it one step further: choose to truly care about each other. Rather than throw wrenches in OKRs, defend the backchannels. Protect the people who do the illegible work. Recognize that the mentorship, the favors, the “hey can you help me with this” conversations aren’t obstacles to productivity, they’re not breaks in flow-state. They’re the thing itself. They’re the seed beneath the snow.
…and they should also be the fun part. The part where work actually feels like it matters. If your revolution is all grim refusal and no joy, I feel for you, and I think you’re doing it wrong, or being forced into it, or you’ve been value-captured by a different set of metrics.
…I also feel like I should say the word “union” here at least once, you know, just because its an obvious step along the way, but I also think they’re kinda the quarterly OKR planning equivalent to what I’m saying.
The December Adventure in March has come and gone. It was chill and good, but also maybe not chill enough? A week is a very short period of time, and I saw a lot of folks mentioning that they were stressed or guilty at not being able to find the time or energy to adventure.
I successfully got a WASM version of Goblin Farmer cooking, so now all you need to play is a browser. No pesky downloading binaries, and dancing the security dance — asking, “do I trust this?”
…I mean, still do that dance in the browser, but…
Some other adventures:
Keep it classy adventurers, until next time!
Beware thunderous ides!
Keep them at bay,
Make cute guys.
In honor of March December Adventure, and Marchagotchi, I’d like to introduce Bamagotchi!
Bamagotchi is a mobile-friendly toy where you can make your own virtual pets by using a HyperTalk-ish language of my own concoction (so sorry). It’s kind of a live-coding sandbox where you can tweak and poke the code to animate your pixel-art blob freak, change its moods, and generate custom buttons to feed, play, or absolutely anything with it in real time.
Any creature is also easily shareable — in the guts menu where you write and extend the code, you can also export and import your beasties. The full code of the creature is encoded into the exported .png as well as in the .json file; you can use either to distribute and share creations.
Bamagotchi is, obviously, inspired by the original Tamagotchi, but also by things like PICO-8, TIC80, and bitsy. I’d love to see what you make with it! Happy adventuring.
Hear ye, hear ye! Let it be made decree!
The week starting with the Ides of March, Sunday March 15th, will be a December Adventure week! So far, every adventure has taken place in December, and rolled across an entire month, but the times have been laden with miasma most dire, so let us together adventure for a special week.
December Adventure, March 15 - 21, 2026.

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.
Step 1, generate a level
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.
Step 2, constraint propagation
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:
- Permutation Generation: For every row and column, the solver calculates the complete search space—every possible valid arrangement of blocks that satisfies the hints.
- Intersection: It stacks all those valid permutations on top of each other. If index 3 is filled in every single valid permutation for row 0, then
(0,3) must be filled.
- Pruning: If row 0 forces
(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.
Step 3, acceptance criteria
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.
Proof in the pudding?
const propagate = (rows, cols, iteration) => {
if (iteration >= maxIterations) return { rows, cols };
const newRows = constrainRows(rows, cols);
const rowsChanged = hasChanged(rows, newRows);
const newCols = constrainCols(newRows, cols);
const colsChanged = hasChanged(cols, newCols);
if (isUnsolvable(newRows, newCols)) return null;
if (!rowsChanged && !colsChanged) return { rows: newRows, cols: newCols };
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 a zen-mode version of the game.
- Bicross RPG, is an RPG version of the game where you can earn power ups, and build up hearts and stuff.
- Bicross Daily, is very similar to the RPG version, but everyone who plays on a given day is presented with the same set of levels kinda like in wordle.
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.
- Groups: A number like
3 means three filled cells in a row.
- Gaps: If you see multiple numbers (e.g.,
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.
- I don’t usually take the holidays off from work, it is a nice time to catch up on stuff while still being able to hang out with my family who are all off from school and work.
- I’ve moved where I work in the house so that it is easier for me to hang out with the dog who’s struggling to go up and down stairs, which is kinda problematic since we live on the second floor…but we’ve found a workable and not awful solution.
- For years I’ve let my workspace kinda fall together as it does, an amalgamation of stuff found and had that works for me. With this shifting of my work space, though, I’ve taken the opportunity to more intentionally make it into a space that I wanna be, and can present from.
- Currently the only missing element are a whole bunch of plants — the two major perks of the otherwise kinda subpar location of my desk are that it actually has easy access to more than 1 electrical outlet (rare in New England) and has heaps and loads of natural sunlight!
- Over the holidays, I picked up both Dungeon Encounters and UFO 50 on sale.
- Dungeon Encounters is very very very much my jam; a hyper stripped down (maybe overly?) jrpg leaving you with the barest bones of a story (it’s like a sentence long) some over world traversal and a battle system. It’s all about the battle system.
- So far I’ve played the first 4 games in UFO 50. Barbuta seems fun, worth checking out more deeply; I didn’t get how to play Bug Hunter in the few minutes I spent with it; Ninpek is simple, but twitchy, so not my style; Paint Chase is simple and fun, but maybe a little too simple? I’ll keep playing, though, because they’ve already introduced some other mechanics that complicate things in interesting ways.
- On the 31st I attended the FoC online meetup. It featured dithering (be-still my heart) and an in-depth presentation from Jasmine Otto on a tool for making/making sense of interactive fiction.
- I was really inspired by everything I saw, and started to sketch out a tool to make interactive fiction that uses b.js. Right now it is only in a notebook, but I’m hoping to make that the next project I poke at in free time;
- so far this year my free time has been devoured by reading both The Hobbit and Hanif Abdurraqib’s They Can’t Kill Us Until They Kill Us…which also means that I’ve had to listen to a lot of Chance the Rapper and Carly Rae Jepsen.
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
- bicross RPG, a picross-a-like RPG game with procedurally generated, provably solvable levels
- leibovitz, the 3rd web camera I’ve made. This one combining everything that I’ve learned from the others
- floating clock, a big floating clock for macOS
- notepad, doesn’t have a web presence because it is really just for me, but it is a swiftUI clone of the classic Mac notepad app
- strata, a game of grids and probability that I kinda modeled off of Sol Cesto
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!