Thanks to the success of Semantle, I decided to become a game developer. I’m going to try it for a year, and see if I can make a living at it. At the end of May, I quit my job, and started working on a new game called Surfwords. Now, at the beginning of August, I’m nearly done. As soon as I get this released, it’s on to the next thing (probably an archaeology-themed solitaire card game, although maybe I’ll do a two-player version too).

I love words, and I love word games. My favorite is Montage, which is a cross between Taboo and a crossword puzzle. You have to figure out a playable word, clue it, and have your partner guess before both opponents do, all within a one-minute timer. That’s the level of intensity I crave.

I was also inspired by Super Hexagon: it’s simple, you lose a lot, and with practice, you can improve. Surviving for a minute is a real achievement. One thing I like about Super Hexagon is that it more-or-less could have been written for the Vectrex in the eighties, but in fact it wasn’t released until 2012. This gives me hope for the world: there are games out there that are destined to become absolute classics, that we could be making right now.

Surfwords is a fast-paced word building game. Letters drop from the top of the screen in two columns. You have to choose which column to take at each row, in order to build up a series of words. It’s dead simple: you can pick it up and immediately start playing it. But it’s not at all easy.

prefix OWNE; incoming left: X H A; incoming right: R R E

I want to talk about some things that went well, and some things that went poorly, in the hopes that I can learn something from the experience.

One of the easiest things was buying music. I had a bit of a false start: I reached out to a band I like to ask them to make music, and didn’t hear back. Then I reached out to another band I liked, and they quoted me a price which, while totally understandable, was outside of my budget. But then a friend pointed me to Patrick Cornelius. I sent him a “mood board” of tracks that I liked, and he wrote me original music with exactly the sound I was going for, at a price I could afford, and within my timeline. Working with a true professional is wonderful. Next time, I will start buying music and images first thing, to give the maximal possible lead time.

A surprisingly annoying thing was the word list. I started with the word list I had used for Semantle, which I had cobbled together from a variety of Internet sources, but it quickly became clear that this was not going to work: it had too many words that no word game player would like: “nd” (as in 2nd, but without the 2) or “nco” (presumably, an abbreviation for non-commissioned officer, except that would be uppercase, and word games don’t usually allow initialisms). So then I tried the venerable “ENABLE2K” word list, but it was also filled with junk. Oh, unscrupulousnesses, sure, unscrupulousness is a noun, it must be pluralizable. No. Also, as the name implies, it hadn’t been updated in a while. So, no “twerk”, or even “blog”. In the end, I did a ton of work to manually remove thousands of bogus “ness” plurals and add in modern words. Of course, the work is never done: while writing this diary, I thought up a more few missing words, and so I had to go in and add them. There’s nothing more frustrating than a word game that won’t allow a word that you know is real. I have some experience with this: I once sent some raffia to Will Shortz to protest the word’s non-inclusion in Spelling bee.

For Surfwords, it would be equally frustrating for the game to expect you to know an obscure word. When you fail to make a word in Surfwords, the game tells you what you could have done:

OWNE is not a word; you should have gone for OWNER

But if it shows you a word you didn’t know, you’ll get annoyed. Oh, “pseudocholinesterases”, sure, I definitely should have gone for that. So Surfwords has two word lists: words it expects you to know and words you might know. The first is derived from Google n-grams, but n-grams has a lot of flaws: often a word will be present, but its plural won’t. And some short words are supposedly common, but are actually likely common because they’re typos or OCR errors for more-common words. Finally, some words that I think are commonly known aren’t: several of my testers didn’t know the word “fen”. I readily accept that I have a larger-than-average vocabulary, but I think “fen” is a perfectly ordinary word, and I am baffled that it has turned out to be so obscure.

Today, I’m announcing the release of my word lists. They are licensed as permissively as possible, because I would like them to become standard for word games, to replace the Scrabble word list, which is not freely licensed.

So much for the content. Now, on to the technology. I chose to use the Godot Engine. I’ve been supporting them on Patreon for years, and the price is certainly right. Godot has a decent user experience: it’s got a built-in editor, which is fast and responsive. The built-in debugger is usable, although I miss the ability to evaluate arbitrary code at breakpoints (“wait, what did that function return?”).

Godot has its own programming language, GDScript, which I have been describing as “shitty Python”: it’s a colons-and-indentation syntax with optional static typing. But it doesn’t have function pointers, and you can’t always refer to a class from inside itself.

GDScript is also quite slow. Surfwords stores two sets of words, described above. They’re not exactly big data — the lists total under 200k words, under 2 megabytes. In memory, they’re stored in a trie. But building the trie in GDScript took about 20 seconds on mobile processors. So that had to be fixed. Godot has optional C# support, and the interoperability between GDScript and C# worked fine for me. So my first rewrite of the trie code was in C#. Unfortunately, when it came time to build custom binaries for Android and iOS (stripping out all of the 3d stuff that I wasn’t using to save space), I had a really hard time with the C#.

So I rewrote the loading code again: first, I made a preprocessor in Python to convert the word lists directly to tries (sharing common suffixes) and spit out JSON, and then I wrote code to load the JSON and generate GDScript objects, which Godot can save and load natively. Unfortunately, that was still too slow: each trie node was an object, and the overhead of constructing all of those objects was too high. So my third rewrite stored everything as four large integer arrays (Godot has support for a few types of strongly-typed arrays which are memory-efficient and don’t require boxing). The arrays are: for each trie node, a pointer to its list of children, the number of direct children, a count of total descendants (with the sign bit used to track whether the node can end a word). And for the trie node children, pairs of [letter, child index].

Loading these four arrays could be just a mmap each, although in practice there’s probably a memcpy in there. Finally, it’s fast enough! This has the obvious disadvantage that the code is now incomprehensible gibberish. On reflection, I think I might be able to reduce it to three arrays. But at the beginning of the project, as I wrote my todo list, I wrote a final item: “It doesn’t have to be beautiful code. It has to work.” And the code works now, so I am not going to mess with it to shave a few millisecond off of the game’s load time.

I know that the code works because I have a suite of unit tests. Godot has a third-party unit testing framework, GUT. GUT has a ton of whizzy features, but I mostly just wrote three dozen manual tests for the parts of the game that were easiest to test and hardest to get right: letter selection and failure explanation. I also wrote one exhaustive test for letter selection, which turned up an interesting case that I’ll describe later. But first, I have to explain why letter selection is so tricky.

In the first draft of the game, what’s now called “hard letter selection” was the only setting. This drove testers crazy, because of the problem that I initially called “bash/hue”, but which I now call “hash/hue”, since “bas” is apparently not a common word (what do you mean you’re unfamiliar with ancient Egyptian concepts of the soul? Didn’t you go through an Egyptomania phase as a kid?).

prefix: HAS; incoming left: H U Z; incoming right: A Q E

Here, you might be tempted to go for “hash”, since longer words are worth more points. But if you do, you’ll be doomed: none of UZ, UE, QZ, and QE can start any words. So you have to end “has” and start “hue”. This is fair: you can see it coming. But it’s super hard.

Instead, in normal mode, when picking a new letter to add, I consider all four possibilities: - A: prefix + two next letters, then end-of-word - B: prefix + two next letters, continuing - C: prefix + one next letter, then end-of-word, then starting a new word - D: end immediately, then start a new word.

For each of these possibilities, I have to consider each pair of next letters. So, A is really: prefix + left bottom + left middle, prefix + left bottom + right middle , prefix + right bottom + left middle, prefix + right bottom + right middle. Whichever of these choices you make, you need to be able to continue. Case A is easy: any letter can start a word (although there are only three X words in the short list: xenon, xylophone, and xylophones). The other cases are trickier. Here’s one especially tricky one that my exhaustive testing turned up:

prefix: BAI; incoming left: A, S, F; incoming right: L I X

What letters should we give here? The user might be thinking of “bail”, or “bails”. But what if they’re thinking of “bailiff”? There’s a problem: if they go for “bail”, the only continuation is “ifs”, so we have to give them a “s”. If they go for “bails”, the only next word must start with either F or X, so the next letter must be one of AEIJLORU (J? oh, fjord, sure). That doesn’t leave room for the terminal F of “bailiff”. So we can’t always support the all of user’s possible choices. But we can support “bail” and “bails”, so we’re still OK.

There’s a related problem with explaining what happened after the user fails: given that we sometimes use random letters, and given that those random letters sometimes make unintended words, how do we tell the user what they should have done? The answer is, frankly, the yuckiest code in Surfwords. It’s totally unprincipled. But it does seem to work, and I’m glad to have the unit tests to prove it.

There are a fair number of things in Godot that don’t work well. Some of them are fixed in the next version, 4.0. I decided not to upgrade yet, because 4.0 is not released, and I think it would be a mistake to depend on pre-release software. Among the issues I hit:

  • On a M1 Mac, building for the simulator doesn’t work.
  • Rounded corners on mobile devices are not well supported
  • General polyline badness
  • Slow text rendering (if you notice some choppiness during the splash screen, that’s what’s going on in the background). I wasted like a week trying various ways to get around this, including doing my own text rendering, but in the end, I gave up and accepted that I would have to have jank somewhere and put it in the splash screen.
  • Regular Buttons don’t support different icons for hover. TextureButtons do, but they aren’t styled like buttons.
  • No built-in set data type
  • The Google Play Games Services plugin has three different versions (corresponding to different Godot versions, none of which is the current version), and they’re all based on v1 of the API, which requires full internet permissions. To be fair, Google’s Play Games Services examples are, as of this writing, also based on v1, and Google’s messaging on this could use some help. In the end, I rewrote just the portion that I cared about to use v2.
  • Out line font fading doesn’t work right. I decided to just live with this, but it is ugly.
  • Full screen didn’t work on OS X due to some random setting (possibly window/stretch/aspect="keep") — I just differentially debugged until it started working.
  • Dialogs get weirdly long

Speaking of Google Play Games Services: making that work was a total nightmare. Admittedly, some of the fault is mine: in one case, I typoed a method name. But that should have caused Godot to give me an error, and instead, it just silently did nothing. Another time, I wasted a bunch of time because I used the wrong kind of OAuth token. The docs were clear, but the token type was counterintuitive (of course you have to use a “web” token rather than a “Android” token for your Android app). And the docs were very clear:

Note that the Intent returned from the Task must be invoked with Activity.startActivityForResult(Intent, int), so that the identity of the calling package can be established.

Yep, that’s right, it inspects your call stack to figure out your permissions, rather than doing something sensible, like taking permissions as an argument. And it can only inspect that call stack if you use the method that does a callback (even though the callback is not used for anything). That’s quality engineering.

But actually, the design of Play Games Services is evil: it automatically installs a provider, playgamesinitprovider, which asks my users to log in before they even start the game. This is an atrocious user experience: my users don’t know if they care about leaderboards until they play the game. When I remove the provider (using horrible Gradle hackery), logging into Play Games doesn’t work unless the Play Games app is installed, and sometimes it doesn’t seem to prompt the user to install it (sometimes it does — I’m not sure what the difference is).

I think one possible lesson here is that I should have just written my own Play Games Services plugin from scratch to start. And another lesson is that maybe I should have just used dreamlo. But I didn’t want to deal with the identity management, so I didn’t.

Another thing that didn’t work: I wanted to do a cool flowing wave background. I was using Material Maker. I ran into a few minor issues with Material Maker itself — for instance, a slight annoyance which required me to manually hack my shader after export. But it was pretty easy to use, and the model is easy to understand.

The background was going to be really pretty! And working on it was lot of fun, if somewhat time-consuming. Honestly, I was never 100% happy with what I had made. But eventually, I hit the “good enough” point. And that’s where things went wrong. When I exported to Android, I was getting like 30 frames per second on my new-ish phone. So I dug into the generated shader code, and found several micro-optimizations with how gradients were handled. After several hours of messing around, I managed to increase the performance… to 32 frames per second! I scrapped the feature. If I were doing a non-phone game, I would try Material Maker again. But honestly, I think maybe next time I should just find an shader artist to make me a shader.

Speaking of my terrible choices: I decided to make the UI adjust to the screen size. This led to a bunch of last-second changes as a playtester requested screen rotation support for tablets. My UI code was generally terrible. Some of this is due to one of the aforementioned Godot bugs. Some of it is just that I didn’t have a good sense of what sorts of UI interactions I would need, and how they would interact with Godot’s scene system. So I have a lot of special cases where I ought to have a general system. I spent a few hours debugging a case where I set rect_size before rect_min_size (which doesn’t work: rect_size is clamped to rect_min_size). And some of it is because making the game portion of the UI adjust is really tricky: what size do users actually want?

But Godot generally doesn’t have great support for fine-grained manipulation of UI. For instance, I wanted a little breathing room around the dialog describing “hard endings mode”. Normally, one would do this by adjusting the margins, or padding, or something. But the margin settings didn’t work. The only setting that worked was the “expand_margin_*” settings — which move the border outside of the requested area of the dialog (requiring the dialog to be manually shrunk to accommodate it).

Playtesters had several useful suggestions. Next time, I’ll definitely start with a color palette in mind, rather than building one as I go. I’ll also think about the tutorial from the beginning; because I added Surfwords’s late in development, it’s not as interactive as I would have liked. I am very glad that I got Surfwords in front of an early tester back before I had done any visual design, since that helped uncover the has/hue problem in time for me to spend a bunch of time fixing it without delaying the release. Special thanks to playtesters John, Sky, Josh, Praveen, and Rachel for expecially useful feedback, but thanks to all playtesters.

Surfwords will be available for iOS, Android, Mac, Windows, and Linux soon.

This post includes spoilers for:
- Perhaps The Stars
- Worm
- Worth The Candle
- The Wave (1981 film)

For me, Bridger’s narrative-warping powers destroyed Perhaps The Stars as a novel. I don’t think it was the only flaw — but it was the flaw from which the novel could not recover.

The problem with narrative-warping powers is both that it destroys the characters’ agency (even, in Perhaps The Stars, over their own psyches). Narrative-warping powers aren’t the only thing that can do this: sufficient alien mind-control works too. I basically had to pretend that the entire bit about Shards in Worm hadn’t happened so that I could stand to finish it.

It didn’t matter that Mycroft made decisions which lead to his death (twice), because the plot demanded that he return.

To be fair, Mycroft’s second return, in the chapters leading up to and including “No One”, was rather well-written. The way that the prose shifted to include more and more of his distinctive style, leading up to the moment when the fateful words “No one” were uttered, was quite delightful. But I don’t think that impressive prose style is enough to carry the novel; we had already had three volumes of that.

It didn’t matter what arguments Faust made, because he was destined to be Priam. If Faust knew who Mycroft was, how did he not know that he himself was Priam, and Gordian Troy? And if he knew, how did he not expect a Trojan Horse? (For that matter, how did the Trojans not expect a Trojan horse? There’s an earlier Egyptian story, The Taking of Joppa, in which the Egyptians use a similar tactic, and which pre-dates the fall of Troy by hundreds of years. Maybe Priam hadn’t read The Taking of Joppa, which is not an excuse that Faust has available).

So why did Worth The Candle work? Degenerate Cycles (perhaps the bleakest cosmological concept since quantum immortality) showed the GM’s thumb on the scales. It worked because the stakes in Worth The Candle were not whether Juniper would get the good ending. The stakes were whether Wales could come to terms with the loss of his friend. That’s why Fenn’s resurrection wasn’t a cheat. Fenn was resurrected. Arthur wasn’t.

These are stakes that are particularly poignant to me this past week, as I think about the end of Terra Ignota. First, I remember coming upon my copy of Too Like The Lightning when I was cleaning out my brother’s apartment after his death. I didn’t realize it was mine, and we gave it away, and then I had to buy it again to reread in preparation for the release of Perhaps The Stars. And then Tuesday, I was in court fighting my bullshit unreasonable noise ticket (I won), and I remembered the last time I had been in court over some petty bullshit (my landlord dropped my air conditioner out the window and then blamed me for it), and my brother came up to watch, and I know he would have wanted to come up to watch this one too.

I think people will vary in how much the narrative-warping bothers them. If the story had otherwise worked, I think I would might have been willing to treat the entire Homer thing as a symptom of Mycroft’s insanity. But I also was struck by a few more problems that made the whole thing fall apart for me.

Frist, Gordian. Prior to Perhaps The Stars, I sort of assumed that they were a self-improvement cult, like EST or NLP. But actually they’re more like the Bene Gesserit. Or are they? For instance, if they’re so smart, how come they ain’t rich? This is a real question: they’re clearly resource-limited, which is one reason they envy Utopia.

I just started listening to Your Undivided Attention, and the first episode discusses how casinos manipulate players into spending more money. They give an example that Felix Faust would love (my brother would have loved it too):

A good example of this is, I think we talked about this once, that in psycholinguistics if you have two theoretical pain medications, one’s called Pavel, and one’s called Bavel. Which one works faster?

I’m going to leave their answer off, because I replicated this at a very small scale and 4/5 people agreed so and I’m pretty sure that you will too (it helps if you say them out loud). Bouba/Kiki is a more famous example of a similar phenomenon, but nobody is trying to sell you a bouba. The podcast isn’t really about casinos qua casinos. It’s about the tech industry. As Jeff Hammerbacher (of Facebook) noted: “The best minds of my generation are thinking about how to make people click ads.” If Gordian has such a deep level of insight into humanity, then why aren’t they using it to either (a) make money, or (b) become more popular?

(I want to exclude the possibility that the answer is actually the same as Louis Jordan’s original answer: I don’t think 50 hours a week of hard work beats 20 hours a week of Jedi mind tricks).

Also, if Gordian techniques really work, the fact that they are in German wouldn’t stop people from learning them. Like, I understand that in 2012 (when Terra Ignora was initially conceived), machine translation sort of sucked. And I’m sure that it’s very hard to translate deep psychological insight. But if the techniques work well enough to win a war against Utopia, then the incentives are certainly strong enough to get a translation. This article aside, generally useful technologies spread unless something stops them. And German isn’t enough.

One thing that could stop technologies from spreading is patents (especially if they were longer-lasting than our current patents). And this gets to a problem with Terra Ignota as a whole: while it examines religion, history, gender, and government, it seems to treat property as a given. I think it would be uncharitable to say that this is unsurprising from a professor at the University of Chicago, but I do admit that the thought crossed my mind. Two of Kohaku Mardi’s three triggers are about property. But the nature of property is entirely unexamined. What sorts of things can be property? What sort of right is a property right? This is especially hairy in a poly-legal system: I say you’ve trespassed; you say you’re practicing your freedom to roam. I say you’re infringing my eternal patent; you say that patents on mathematics are illegitimate and anyway your patent expired after seventeen years. All this is to say that a land value tax would totally fix the Mitsubishi problem. And some wishy-washy corporate social responsibility thing, which is what they ended up with, would totally not.

One possible explanation for this omission is that the philosophy of property didn’t really get interesting until the 19th century, while Terra Ignota’s philosophical core is in the 17th and 18th centuries. I don’t know if this is actually true: maybe there’s a bunch of interesting stuff in the 18th century, but the 19th has JS Mill, Karl Marx, and Henry George (and arguably William Foster Lloyd). Schelling, in the 20th century, provides another novel argument. But Thomas Carlyle was 19th century, so I’m not sure that the date theory works. Palmer has collaborated with Cory Doctorow, who has certainly written plenty about the nature of property, so I have to admit that I don’t understand this omission.

This also feeds into the weakness of the ending. OK, so Utopia has surrendered — but why doesn’t everyone just quit Utopia and join a new hive, Utopia B, which doesn’t recognize Utopia’s surrender? After all, they’ve already lost their space elevator and given away most of their patents. What’s left that Utopia has that Utopia B doesn’t? Mars itself? But if you believe that Original Utopia owns Mars, then you’re back to geographic nations.

Let me also say that an ending in which J.E.D.D. Mason was successful in reforming the hives was completely unexpected, and rather unsatisfying. What I expected was something more like the ending of The Wave: J.E.D.D. Mason tells everyone that they are fools to follow him no matter his personal charisma, that the idea of salvation is a myth, and that any change that he could impose by fiat would be better imposed through democratic means.

I wonder if this is just a failure to suspend disbelief. Like, I recognize that there’s some special thing that J.E.D.D. Mason has, and that somehow everyone who meets him recognizes. In a real sense, he’s not just one of us. So maybe if I had met him, I, too, would worship. But maybe not. Even if I accept that J.E.D.D. Mason is a god (and I think it’s far more likely that he’s simply the normal, extra-terrestrial-but-not-extra-planar sort of alien and that the entire scene with his death and resurrection was theater; the fact that it is possible to reverse-engineer Bridger’s technology is some evidence for this), that doesn’t mean I have to worship him. I think a lot of people would object to being ruled by an alien god, and I think they would be right to.

I often feel, in philosophical fiction, that my position is not well-represented. This was one problem that I had with Ken Liu’s Reborn. Perhaps The Stars didn’t really have that problem with respect to my political view: my position in the war was that of the the Blacklaw Hiveless: I would have just wanted to be left alone. (I’m actually somewhat sympathetic to OS, but only in the context of a philosophical novel; in actual reality, the unaccountable killers who claim they’re protecting us are stunningly incompetent). And I also understand that my position is unpopular. War is popular. Last Thursday was Veterans Day, and even otherwise sensible people posted bullshit like “thanks for your service” instead of what they ought to have posted, which is “fuck you murderers, I’m not celebrating you.” Which is, somewhat surprisingly, ultimately with J.E.D.D. Mason said.

But my religious views were rather unrepresented: everyone seemed to believe that (a) J.E.D.D. Mason was in fact a god, and (b) that this meant that he was worthy in some way of respect. It seems possible that this was supposed to be unbelievable. That is, whether by questioning Jehovah Mason, we are supposed to question Original Flavor Jehovah, and the logic of theocracy in general. Like, “this is what believing in God looks like from the outside”. The thought experiment carefully separates out a lot of the baggage of religion: there’s no tradition, J.E.D.D. Mason isn’t our creator, and you can’t object to any particular thing that he represents because (until the end), he refuses to tell you what his plans are. I don’t understand why nobody — no Utopian, no Humanist, no Gordian said, “well, imagine that you are some kind of God. So what?”

And “So what?” is, unfortunately, my reaction to the entire denouement of the book.

A few more things:

  1. Whenever I saw Sniper being thwarted, I couldn’t help but imagine Dora the Explorer saying, “Sniper, no sniping!” (She even speaks Spanish, like a good Humanist!). I would have liked to see more of Sniper.

  2. I was extremely surprised to see something named after Aung San Suu Kyi. At least I assume that’s what was going on? That was definitely confusing.

  3. Huxley should have replied to Faust: “Yes, we will bring Distance, but so will you. How much faster will emulated brains run? Reykjavik to Antarctica is already 60ms - but if ems run faster, that would feel like minutes, or hours, or days. And if they run slower, then we waste lifetimes as the sun darkens.”

  4. There were some really good bits: the Odyssey set-piece was fun, Dominic’s return was beautiful, and I enjoyed that Thisbe, being a cinematic sort, had to do a villain speech and that’s what did her in. Oh, and J.E.D.D. Mason’s speech about killings during war is the sort of common sense that is under-appreciated.

Since I last wrote, I have moved my pottery practice from Brickhouse to my basement. This saves me a 45-minute commute, but it means that I have to recycle my own clay and fire my own kiln. I also don’t have as many people to bounce ideas off of. I have found a clay body that I like pretty well: Brown Bear from Kentucky Mudworks. On the rare occasions when I throw, it’s smooth and has good legs. And for handbuilding, it is easy to join and rarely cracks. The only major problem is that it does slump a bit in the kiln. Oh, and it’s brown, which limits my glazing options unless I want to put on a layer of white slip.

Before I left Brickhouse, I started collaborating with John Seroff. I build pieces, and he decorates the surface. This is generally his practice — he has worked with several other artists at Brickhouse as well. So now he comes by my place once a week and we hang out and play with clay. Working with John is tremendously fun. We each admire the other’s work, and neither of us is afraid to take technical or aesthetic risks on a piece. And it’s fun to hang out in the studio and discuss culture and world events. I have to mention this up front because my work with John is a big part of the story of this year.

I have not posted recently because I am a perfectionist, and none of my work is perfect. I keep thinking that the next kiln load will have the perfect piece and then I can finally blog. But my art is improving, and I want to track that. I also keep thinking that I would finish the project of building handles for all of my kitchen cabinets and then post the complete set. But instead, I have mostly been making vases. I am still short three handles, of which two are merely awaiting glaze firing and mounting.

So I am going to start by showing all of the handles that I have completed, and then come back and silently update the post once I finish the last few. Can you spot the one that’s driftwood instead of clay?

Making these animal and human forms was fun, but I sort of burned out a bit on it. So those handles are mostly from late 2018. And a lot of the animals are nonspecific. Oh, it’s a critter, sure. But I think I could get a stronger effect by increasing the mimesis. The hand and foot handles are my favorites, and I think a lot of their power is because they are sculpted from life. The elephant seems to be everyone else’s favorite. I have started to get back to figure sculpting in 2020, but don’t have anything out of the kiln yet.

The bulk of my work lately has been slab-built vases. I can trace two threads of development: first, stacking slabs, and second, polyhedral pieces with tar paper. To start, I want to show my two stacked slab pieces from late 2018. First, I stacked slabs with some overlap.

Stacked slabs 1

Then I did the same, but with one vertical strip.

Stacked slabs 2

Then I added a head and some arms, to make a finial for one of my fenceposts. Now I just have to make like twelve more finials.


My next idea was to stack without overlap. This is considerably more difficult, because the seams have to be neater. First, I made these two vases that love each other very much. John Seroff did the carving.

Two vases who love each other very much

Then I made a taller vase with the same general concept. It barely fit in my kiln.

Two vases who love each other very much II

I also made a lidded jar. I actually made two, but the first one was too squat and the glaze didn’t come out the way I wanted it, so I rebuilt it. This one is about 16 inches tall. And of course now that I’m looking at the photo, I see a crack, probably where I inserted the dart to bulge that section. I may have to make a third one. With a less shiny black glaze.

Vase with folded arms

The end, for now, of that line of development is this nine-necked vase. It was in the last kiln of 2019, or, perhaps, the first kiln of 2020, mid-firing as the clock struck midnight. It will be shown at Back to the Table, an exhibit of tableware at the Plaxall Gallery in Long Island City.

Nine-necked Vase

I had a really hard time visualizing how the base of this was going to work, and in the end, I had to add that extra foot. I think part of the problem is that building up at an angle tends to cause sagging, so I started out straighter than I had planned. I’m pretty happy with the glaze, especially the mossy green. But I think that this is about the last piece in this line that I will make for a while.

The second thread started with a funerary urn that I made. I wanted something monolithic and stark, and it needed to be fairly large (about one cubic inch per pre-cremation pound of body-weight). So I cut some tar paper forms, and used them to hold up slabs. The result was not amazing, but it definitely looks sufficiently bleak.

John had been watching me grow as a potter, and asked me if I wanted to collaborate. I built a teapot using tar paper templates, and one of my first animal heads. I was going for a fox, but I was not yet strong enough to get there. So I declared that the result was a coyote. The body has pentagonal symmetry. This is a good choice for me, because my work is always a little sloppy. A sloppy square is obviously sloppy. A sloppy hexagon has non-parallel opposing sides. But a sloppy pentagon is basically fine. John’s photo:

Coyote Teapot

Then I got to thinking about what else I could make with this technique. I realized that pottery rarely has what origami artists call “valley folds.” You can get mountain folds by paddling a thrown piece, or by joining slabs. But valley folds require a bit more thought, because they are hard to press together to get a good joint. So here is my first piece with valley folds. It’s foreshortened in this photo and since I gave it away I can’t reshoot — it’s actually quite a bit slimmer than the photo implies:

Vase with Valley Folds

John next suggested that we do a series, and the first complete set that came to mind was the platonic solids. So I built some platonic solid teapots, and John decorated them. His process is slow and he likes to work with a wide variety of people, so I think I ended up making the pieces a bit faster than they could get decorated. So only two and a half of the five are done (John’s photos; the last one needs to be glazed):

Icosahedron Teapot

Tetrahedron Teapot

Octahedron Teapot

The logical conclusion of this was to go into Blender and design a stupidly complex 36-piece vase, and then have John decorate it. So that is what I did. John’s photo:

Alien apple

It soon became clear that the tar paper is really only necessary for the dead-flat surfaces. By instead bellying out the slab as one would for a pinch pot, I was able to assemble large vertical surfaces. One of the first of these was a nudibranch-inspired vase. This one doesn’t really have true valley folds, as the “wings” are accessible from both sides, but it does use vertically-joined slabs.

Nudibranch Vase

Finally, we reach the point where the two threads converge: a piece with multiple necks, bulged vertical slab sides, and valley folds: Cathedral Vase I. Also, I now have enough work that I need to think of names. I am very happy with the glaze on this one even though the teal-and-orange combination is a bit of a cliche.

Cathedral Vase I

I say Cathedral Vase I, as John is working on the surface of II now. Hopefully, I will manage to file another update before 2021. No promises.

A friend asked: “Why aren’t you working on the development of a
decentralized communications platform?”

My answer was that I don’t know how to solve the unwanted communication (spam, brigading, etc) problem.

I don’t think anyone else does, and I think most people are unaware of how hard it is. That’s because it’s a problem of mechanism design in addition to being a problem of engineering. And most people are just not devious enough to design mechanisms that are resistent to adversarial usage. A while ago, I brought the issue up on the mastodon issue tracker, and did not get much traction.

Someone recently proposed an option to diable replies on Mastodon posts. This is, abstractly, not a terrible idea: I don’t have comments on my blog, and I could imagine making certain social media posts where I don’t want comments. There was even the really neat follow-up idea of “no replies except for people who are @mentioned”. But what does “no replies” mean? To understand this, you need to know a little bit about how Mastodon (or, more precisely, the underlying ActivityPub standard) works:

There are a number of servers (e.g.,, etc), and each user belongs to one. If I post an “activity” (roughly, a tweet), it goes into my public outbox, and anyone who has read access to my outbox can read it. A reply is just an activity with the inReplyTo field set. If you post a reply, it (a) goes into your public outbox, and (b) goes to my inbox on my server. My server might, when receiving a reply, forward it on to the folks who saw the original message (that is, my followers, who would otherwise not notice it in your public outbox unless they were also following you).

So things that disabling replies could mean include:

  1. I configure my server to not notify me about replies (i.e. they do not appear in my inbox)
  2. I configure my server to not forward replies.
  3. I add a field to my message indicating that I do not wish for people to reply to it, and other servers will enforce this in their UI.

All three things of these things are reasonable to want, but the third only works for “well-behaved” participants. I put “well-behaved” in quotes here, because of course if someone says something mean or false about me and then sets it to no-reply, I might well wish to override the “no-reply” setting so that at least my followers can see my rebuttal. So it was quite surprising to me to see, here, someone suggesting requiring (“must”, in RFC-speak) the third, unenforceable option.

I also saw a suggestion to implement a proof of work system, Hashcash, to reduce the frequency of direct harassment. This seems extremely unlikely to be useful for this, because Hashcash is intended to stop large numbers of messages, but even one message per sender is sufficient to harrass people (the most common risk is one message per person from a thousand people). Also, Bitcoin has shown us that there are something like seven orders of magnitude between the hash rate of an ASIC and that of a typical CPU. This makes setting a correct Hashcash cost impossible. A memory-hard hash function might reduce this gap, but probably not by enough. Also, most “clients” are actually someone else’s server, meaning that the effect would not be felt by the message sender directly.

I wish I knew of better solutions, but at least I am glad that I don’t falsely believe that good there are solutions out there that nobody has the will to implement. That would be depressing.

Since last time I wrote, I’ve made a few more pieces. Note: pieces are not in chronological order. A few technical details are at the end.

We’ll start with a recent one that I’m proud of:

rat vase

Yep, it’s a vase with rats coming out of it. The black glaze is Marilee’s Lava with 7% Mason 6666 black stain, which I put together myself. I have now manufactured a few glazes, including this; a lichen glaze which slid so dramatically that I haven’t dared to use it on a real piece; and a supposedly mint green which actually came out so much more matte than the reference photo that I suspect I must have fucked up somehow. I’ve also played with oxides some and gotten results varying from unnoticeable to garish to awesome. I’m not sure how I feel about a process with such high-variance results but I’ll probably keep exploring anyway.

Here’s the first piece I made that I still like:

deco pot

Probably I’ll stop liking it once I improve further. I enjoy the texture, but I wish it were more precise. I still don’t really know how to get precise lines — somehow, even with a ruler, it always comes out messy. So I’ve been trying to learn to make pieces that embrace the mess.

I also made vases as holiday presents for everyone on my team. The project we were working on is called The Aleph (after the Borges story), so all of the vases have Alephs on them. This is my favorite:

aleph vase

One co-worker in particular got excited about the pottery, so I made her a casserole:


My cats insist on photobombing my pottery photos. This is the rare Mutex photobomb — it’s usually Semaphore. The texture on the casserole was made with an old daisy wheel. The piece is really quite large — it cooks^Hholds almost 16 lbs of cat. I used S762 kitchenware clay, a buff stoneware with fine grog. It reportedly goes happily into a cold oven without cracking, so I guess the body lives up to its name. Unfortunately, most of the studio’s glazes, and some commercial glazes come out muddy or crazed on this body, so I’m pretty limited in where I’m willing to use it.

One piece I made out of it was my second orcish teapot. But before I get to the second one, I have to show you the first:

orcish teapot 1

The body here has exactly the hue I wanted, but about two shades too light. That’s significantly better than some other possible outcomes: the glaze combination I used is a bright green celadon on top of a chameleonic red-brown. Too little green, and you get mud; too much and you get blobs of snot.

Other folks insist on calling this a warthog teapot, but what does a warthog need with a teapot? Maybe the orcs used warthog tusks to make it. Another potter at my studio had been doing a bunch of stuff with spikes, and I was a bit inspired. Peter’s spikes are broader than mine, and straight rather than bent. He throws them on the wheel, which I did for these and for my doorknob, but which I’ve since given up: handbuilding them is faster for me. And it’s easier to get close-to-identical copies, at least at my skill level.

three-horn doorknob

I like the idea of a second draft of a piece, and wish I had the patience to do it more often. The casserole above is actually a second draft: the first one was too thin and ended up cracking. The second one has straighter walls and better texture, and I think the handles are nicer too.

Here’s that second orcish teapot:

orcish teapot

The second orcish teapot did not come out the way I had planned, but I am not disappointed, because it’s pretty metal. Literally: the black glaze is primarily black copper oxide, and the horns have some red iron oxide stirred into the clear. Copper oxide usually produces green, and I had hoped to reproduce something like the original glaze by adding a bit of copper oxide to a not-green-enough glaze. You can see the normal copper green where the oxide has bled into the white interior glaze. That’s not the color I wanted on the outside either, but it’s attractive if not particularly orcish.

Britt suggests adding bentonite to oxides to get a more even application. Brickhouse’s studio oxide washes don’t have this, so they settle out very rapidly, making it hard to get an even application. I made up a copper oxide wash with some methylcellulose (AKA “CMC gum”), which I have used in the kitchen in the past. It burns off in the kiln, but suspends the oxide enough to get an evener application. However, I think I might have more oxide in this wash than I really want. Copper oxide is quite corrosive: one little drop of the oxide glaze slid off my piece and ruined a kiln shelf.

I know that the standard approach here is to glaze a bunch of test tiles, and not glaze the final piece until the test tiles are done, but the turnaround time on test tiles can be up to three weeks, so I often test on finished pieces. I do take glaze notes inside a crappy webapp I threw together, which at least helps me avoid making the same mistake twice.

All of these horns got me excited about animal forms, so I went back to handbuilding. The rat vase was the first thing I made with animal faces. Then I made a skunk mug:

skunk mug

I have to admit that this one, too, was partially inspired by [Peter]((’s work — he had been doing “eat, fart, love” mugs (“I don’t pray”, he explains). So when I made a skunk mug, the “eat, spray, love” slogan came to me in a flash. The face has kind of a funny shape, but I think it’s not too far from what a real skunk’s face looks like. It’s just that our mental image of a skunk has been warped by Pepé Le Pew.

Another thing that inspired me to make animal forms was this Pikamug:

Pikachu mug Pikachu mug: tail

Once I had made this for one cousin, I knew I would have to make something for his sister, and their mom suggested Ponyta:

Ponyta mug

One rule I have is that everything I make has to be at least somewhat functional. This constraint is somewhat arbitrary — just about anything hollow could be a vase. But it does mean that I am forced to pay attention to how a piece could be used, and think about smoothness and weight. I should probably institute a “no vases” rule at some point, since I basically never use a vase for anything. Maybe I’ll ban teapots too, except that I have yet to make a teapot that’s technically even base-level competent yet. For instance, the first orcish teapot doesn’t pour very well because the glaze covered up the holes. The second’s spout is too low. So I may have to make a few more of those.

Here’s a completely boring bowl where I like the glaze; it reminds me of a night sky:

bowl of stars

The waiting is a real struggle: the most recent work I can show is some jars that I threw in late December, and then sculpted the lids of in January, and then glazed a few weeks ago, and just got out of the kiln. In fact, the third pot’s lid didn’t look great after glaze firing, so I’ve reglazed it and am refiring it. Here are the remaining two jars: a French bulldog, and a demon:

Bulldog jar

Demon jar

This delay means I can’t show you my alligator teapot or my Baba Yaga’s hut teapot, or my seed pod vase, or my second doorknob, which is completely different than the first one. So I guess I’ll have to post again.

Technical details:

I’m working at Brickhouse Ceramic Arts Center in Long Island City. My primary clay body is the studio’s brown stoneware, but I’ve also used Laguna B-Mix and S762 from Ceramics Supply. The studio fires at Cone 6 in oxidation. I use the studio’s glazes, as well as some commercial glazes from Amaco, Mayco, Coyote, and Potter’s Choice. If you like any of the glazes above and want more details, let me know and I’ll happily share.

Reiner Knizia is one of my favorite board game designers. One thing I really admire is that he’s willing to noodle on a theme (e.g. his four early tile-laying games) until he’s satisfied with it. He’s gone through a few versions of Lost Cities, including Keltis: Das Kartenspiel (hereinafter, “Keltis” — there are a few other Keltis variants, but this is the one I’ve been playing.

First, I’ll briefly explain the rules of Lost Cities, and then the changes in Keltis. Then I’ll explain why these changes produce lower variance. Finally, I’ll explain why I’ve been thinking about this.

The Lost Cities deck consists of twelve cards in each of five suits. Nine cards per suit are numbered 2-10; the rest are identical “investment” cards, which multiply a player’s score in that suit. Each player has a hand of eight cards. On their turn, they either play or discard. Plays and discards are both by suit. After playing, they draw either from the deck or any discard pile. As soon as the last card is taken from the deck, the game ends. There are two things that make the game interesting: 1. You can only play cards in each suit in-order: first any investment cards, then the numbers in ascending order (with gaps permitted). 2. If you don’t play any cards in a suit, you get zero points for that suit. Otherwise, your score in a suit is negative twenty points plus the sum of the values of the cards played in that suit. This generally means that you only open a suit if you’re pretty sure you’re going to make 20 points in it.

Keltis has a few differences from Lost Cities, but from our perspective, the most important ones are: 1. The value of each card is approximately the same. Cards still have numbers, but the point value for a suit depends only on the number of cards in that suit. 2. You can play a suit in either ascending or descending order.

Here’s how this leads to lower variance: In Lost Cities, opening with a hand of, say, the 9 and 10 of each of four suits is somewhat unlucky. You don’t want to discard anything, because your opponent will snap it up from the discard pile. But you also don’t particularly want to open a suit, because you’re guaranteed to lose a point on it. In general, getting cards in the wrong order can turn what would be a good suit bad. There’s nothing more frustrating than ending the game with the 7-8-9 of a suit and missing six points just because of bad timing. In Keltis, that would be an acceptable opening hand, since the 10s are all immediately playable.

And in Lost Cities, if you have 3-4-6 in a suit (13 points already), you’ll surely open that suit since you expect to get approximately two of the 7-8-9-10 cards. But in a quarter of games you’ll get just one, and in a quarter of games you’ll get three. And it’s possible to get zero or all four. In Keltis, this is approximately true as well (the card distribution is a bit different, so not exactly). But in Keltis, this will result in a swing of a few points — not 30 points (or more with investment cards).

It’s always nice to have data to back up a theory, so I found this page. It claims that, in fact, Keltis (listed as “Keltis Card”) is lower-variance. Well, more precisely, it makes a more-complicated claim about Elo ratings, but I think the effect is the same.

Subjectively, I think Lost Cities might be a slightly more fun game, and this says bad things about me. There’s a real excitement as things come down to the wire: will I suck out and get that blue ten (which is now worth 40 because of investments), or won’t I? That part of the game is pure gambling, and while it’s fun, it’s not something I feel proud of enjoying. But at least I’m not alone: Keltis gets 6.7 on BGG, while Lost Cities gets 7.1.

I have been thinking about this because I just had opposite feedback about dynamic range in two of my prototypes. In Sekhmet, the range was considered too low: a given tile could score between 1/2 and 2 points. In Banshee, the tile values are between 1 and 10, and the player who happened to draw the 10-point tiles was very likely to be able to use them and win. Similar problems don’t necessarily demand parallel solutions, so while I’m going to replace all the 1s with 2s in the next test of Banshee, I’ll probably fix Banshee by completely replacing the way that tiles score — and in the process, maybe reduce the range.

There’s a really neat technique for doing simple encryption that you can decrypt with your eyes. It goes like this, assuming that your data is a black-and-white image:


First, make a new image with the same size as your original image. Fill it in totally randomly.

Now, resize your random image to have twice as many pixels in each dimension. Each 2x2 pixel square of the resized image gets one of these “macropixels”:


One has the top-left and bottom-right pixels black; the other has the top-right and bottom-left pixels black. Let’s say that we’ll replace black pixels with the left image and white pixels with the right image. Your new image will have exactly half of its squares black, and the other half white. This is your key (although it doesn’t actually matter which side is the “key” and which is the “data”). Here’s an example:


Now, take your original image, and encode it like this: where there’s a black pixel, take the macropixel that’s different from your key, and where there’s a white pixel, take the one that’s the same as your key.


Notice that this new (“ciphertext”) image has no information from the original image. If your original pixel was black, there’s a 50-50 chance that it will be the same as the black pixel from the key, and a 50-50 chance that it will be different. It’s the visual version of an xor-based one-time-pad.

Now comes the really cool part: to decrypt the image, you can print the key on a transparency, and overlay it on the ciphertext:


You’ll see fully-black macropixels where the original image was black, and half-tone where it was white. No special hardware needed — just apply eyeballs.

As part of the Museum of Math’s opening puzzle hunt in 2012, I used this to create a fun reveal. They had transparent disks designed to be overlayed to display moiré patterns. Instead, I encrypted a puzzle answer, and printed the key on one disk and the ciphertext on the other. When the disks were rotated to the right angle, the answer image would pop out. Of course, this isn’t very secure — if you look at the images, you’ll see the grid axes, and then there are only four possible rotations. But if you don’t have one of the disks, it’s totally secure. And it’s a cool effect. When I visited the museum recently, the museum staff mentioned that the Fitzwilliam Museum had been inspired by my little toy, and have a version of it in their upcoming codebreaking exhibit (opening October 24th). So if you happen to be in Cambridge (the one in the UK) between next week and next April, please drop by and take it for a spin.

The game of Set is not a strategic game. Nonetheless, there are techniques that good Set players use that new players ought to learn in order to get competitive more quickly. Since I recently taught a few new folks how to play, I thought I would discuss the strategies I use. For background, keep in mind that each pair of cards has a unique third card that makes a set with it.

Step one is to just scan the whole board, without any particular feature in mind. This strategy will almost never find sets for new players, because they haven’t got their pattern recognizers wired up right. But it’s good to do anyway, because you’ll need it for the next step.

Step two is to look only at the most-common attribute. If there are six red cards, pop out the reds and look just at those. Since you’ve just scanned the board, you’ll be able to find the attribute quickly. Among the cards with that attribute, you’ll be able to see a set if there is one. If not, you can quickly check the greens and purples. If you still haven’t found a set, you’ll know you need differing colors. Here, it’s often easiest to start with the smallest two categories: if there are three green and three purple cards, you only have nine pairs of cards to look at. And since you’ve scanned the board, you can often simply remember whether a pair’s third card is available.

When new cards are dealt (especially when there are no sets among the twelve cards on the board), it’s a good idea to look at those cards first. And if you’ve been tracking the distribution of attributes, you’ll know what’s common. On a board with lots of ovals, a new oval is exciting because it’s very likely to complete a set.

At the beginning of the game, the average number of sets on the board is almost three. Pretty often, even if someone else got one, there will still be one remaining.

As an aside, very few board and card games discuss strategy in their rule books, which I think is a shame. Sure, there’s some fun to learning the early tricks on your own. But with most games, the real depth happens after you’ve played a few rounds. Adding a tiny strategy guide to game manuals would help new players to enjoy games more.

Some game designs seem more robust than others.

Dominion is a very robust design. They recently reprinted the base game, and replaced six of the original twenty-five cards because they were too underpowered or too situational. What other game could not only survive having nearly a quarter of its components being nearly useless, but manage to sell millions of copies despite this? Maybe we can look at some of the reasons behind this robustness, and learn something that we can apply to our own games.

  1. Underpowered is better then overpowered. If Rebuild had been in the base game, folks would have complained a lot more. It’s a one-card engine that’s basically a must-buy.

  2. High variance adds to robustness. It’s harder to detect a bias in a noiser signal.

  3. Nobody is forced to take a bad card (except through something like Swindler, where the availability of bad cards is arguably a perk). Having a choice available that nobody ever takes are is terrible. The effect is that the designer has wasted some time, and there’s a bit of additional cognitive load. Otherwise, it’s fine. If there’s a whole subgame that’s useless, that’s bad because players shouldn’t have to learn a useless subgame. But if the choice is just one card vs another, it turns out, it’s workable to have a few less-good choices.

There are other reasons that Dominion is a great game, but I don’t know if there are other reasons why it’s a robust game.

It’s OK for a game to be less robust. With a less robust design, the flaws in those six Dominion cards might have been discovered during development, and they would not have been printed. But I think that overall, robustness is a virtue. Once a game gets out into the world, players will discover, over the course of many years, how the game ought to be played. A robust game will better survive that experimentation process.

I made a greebled teapot:

Greebled teapot

I was inspired by nostalgebraist (re)posting this image, entitled “A cube and its greebled version”:

"A cube and its greebled version. Rendered by Gargaj / Conspiracy.", CC-BY-SA

Of course, mine is more regular (but, being handmade, is also much more irregular). It’s slab-built: first I carved an annular sector and a circle on a slab. Then I cut and rolled the sector (making a truncated cone), and molded the circle over a dome to make the bottom. I attached the two pieces, and cut a hole for the spout. The spout is a coil with a hole poked through it, hand-molded, with both carving and additions to get the greebling. The handle was a thinner slab, also with both carving and addition. As the piece was drying, the handle cracked, so I had to repair it with paper clay (which, as far as I can tell, is some kind of magic). Then I had to make a lid, and I realized that I had not thought at all about what the handle should be like. So I just whipped up something that would work with the texture.

The glaze is three coats of Coyote’s Really Red (two on the bottom, which turned out to be plenty). I thought that a complicated form should have a simple glaze. Also, having spent like fifteen hours greebling the thing, I wasn’t about to spend another fifteen painting it. And I recently had some bad luck with the studio glazes; I tried to make a mug that was yellow, black, and red-brown, and got greenish-brown, brown, and green (respectively) instead. So I stuck with something I knew would work.

Greebled teapot

I’ve been messing around with ceramics for nine or so months now, and this is the piece that I’m proudest of.