Sunday, August 23, 2020

The Message

I've long been interested in the intersection of politics and religion. It was particularly on display this past week at the Democratic National Convention, where each session opened and ended with one or more member of the clergy leading a prayer. As with all American political events, every major speech ended with some variation of "May God bless the United States of America." The final night, in its video biography of Joe Biden, went into some detail on his personal Catholic faith and showed his interactions with pastors from other faith traditions.

And, of course, the Democratic party is widely considered the less religious of the two major parties. I fully expect that the Republican convention next week will contain considerably more religiously-charged language throughout the event.

It's somewhat fortuitous that these events fell while I finished a book about another, far more intense relationship between politics and religious: the role of the Christian church in Nazi Germany. More than a year ago my dad recommended the book Preaching in Hitler's Shadow. Edited by Dean G. Stroud and published in 2013, this is an amazing book that focuses on the sermons preached by members of the Confessing Church and other antifascist German pastors during the time between the 1932 elections (when the Nazi party won a plurality of votes) and the end of WW2.

There is a fairly long and very well-written introduction introducing the historical context of the situation in Germany at the time. Stroud had initially intended to write a book about the sermons, but eventually decided to focus on the sermons themselves; fortunately, he presents all of his research in a very coherent and thoughtful way. I had only a very vague understanding of what was happening in the German church: I had seen photos of churches with swastikas surrounding altars and pulpits, knew that the Pope Pius has been criticized for failing to speak out against Hitler, and was familiar with Bonhoeffer's role in the Confessing Church.

As one might expect, there was a huge range of responses to the Nazis. The dominant group at the time was a group called the German Christian movement; Stroud notes the confusion of the name and reserves "German Christian" for that faction while saying "Christians in Germany" or other phrases for the broader church. The German Christians were heavily influenced by anti-semitic and pro-Aryan thoughts, well in advance of Hitler's chancellorship but even more so afterwards. They "modernized" Christian theology by eliminating the Old Testament and Paul's epistles to expunge Jewish influences from the Bible. In the remaining New Testament, Jewish people are cast as the villains, oppressing an Aryan Jesus; in the present day, they believed, they could finally avenge Jesus's death and create a pure Germanic Christianity. (This theology bears some eerie similarities to the Levitican theology in Neal Stephenson's "Fall": Jesus's sacrifice is a weakness, and Jesus must be strong, so the central tenet of Christianity is discarded, and a new faith is declared built around power.)

(Oh, and one other tie-in to recent reading: It wasn't until the appendix that I realized that German pastors actually had their salary paid by the state. That was surprising to me, and made me rethink a lot about their situation. It reminded me of trifunctional societies, as presented by Thomas Piketty in Capital & Ideology, where there's a balance between the warrior aristocracy class and the scholarly clergy class: in Germany, clergy (clerics / clerks) performed some administrative functions for the state, including recording births, deaths, and so on. As usual, I find that my American upbringing can make me kind of blind to how common it was to not have a separation between church and state.)

The German Christian movement went to great lengths to ingratiate itself to Hitler, seeking to unify all of the disparate Protestant churches under a single, powerful, "positive" umbrella, and going so far as requiring all pastors to swear a loyalty oath to Hitler. Ironically, Hitler didn't seem to care about this at all: for all the GC's fawning and obsequiousness, Hitler only had contempt for Christianity, whether German or otherwise. He paid some lip service to Christian traditions and values in the first year after his election, as he consolidated political support and power, but for the most part he didn't believe the church was a threat to worry about or an asset worth controlling.

Fortunately, plenty of other pastors within Germany disagreed, and the bulk of the book is devoted to their words: entire sermons, translated from the German, preached at great personal risk to flocks under the watchful eye of the authoritarian Nazi state. These pastors were variously interrogated, beaten, exiled, thrown into concentration camps, or murdered by the state. The courage of these people alone is inspiring, as merely speaking out carried enormous risk. But they didn't "merely speak out": they spoke with incredibly strong, prophetic words, with great care and skill, battling for the soul of their nation.

One of my favorite things about this book is how it focuses on language: in the introduction and the footnotes, Stroud draws attention to not merely what the pastors were saying but how they were saying it. They were operating in an incredibly charged linguistic atmosphere: Nazi theorists and propagandists took language very seriously, and intentionally bent words and phrases to shape the minds and actions of the German people. Pastors, and particularly those who follow expository preaching, seem to be in a uniquely strong position to counter this threat of the Nazification of the German language, minds, culture and society. I walked away from this book with an image of these pastors doing rhetorical battle against the poisonous words of the Nazis, using their own words to draw distinctions between the Gospel and National Socialism, or to ironically comment on Nazi obsessions, or just make people think about what they heard and said.

One way Stroud does this is by keeping particularly charged words untranslated in the text: throughout the sermons, he notes where pastors used words like Volk or Reich, which carried enormous weight in Nazi propaganda. Depending on the context, pastors sometimes subverted these Nazi thoughts, as when they noted that the Jewish people are also a Volk, or when they draw attention to the Reich of heaven. Some of the footnotes could be distracting, but those in-line notations are especially welcome.

The earliest sermons are from some of the most familiar names: Dietrich Bonhoeffer, Karl Barth and Martin Niemoller. I recognized the name Karl Barth but didn't really know anything specific about him; fortunately, each sermon has a brief introduction that introduces the pastor's biography and theology and what they were doing in Nazi Germany. Barth was a very important figure in founding the Confessing Church, and long after the war was one of the most influential theologians of the 20th century. Throughout his career he was a proponent of what was called "neo-orthodoxy", which was a reaction against liberal theology and sought to refocus attention on the actual text of scripture. Reading his biography and sermon reminded me that my left/right division isn't very useful. Nazis were a very right-wing movement, and neo-orthodoxy seems like a conservative (even, in a non-pejorative sense, reactionary) movement; but these movements weren't at all aligned with one another. It's awesome to see how the strong convictions of neo-orthodoxy gave its proponents a strong spine in resisting Nazism, a spine that was often missing from people without strong convictions.

My single favorite sermon in the collection is probably "A Sermon about Kristallnacht" that was preached by Helmut Gollwitzer on the Sunday after Kristallnacht. Mere days before the Nazis had led a pogrom across all of Germany, smashing the windows of Jewish stores, destroying synagogues, ransacking and looting houses, beating and murdering Jews. His sermon opens on page 118 with "Who then on this of all days still has a right to preach? Who then should be preaching repentance on such a day?  Have not our mouths been muzzled on this very day? Can we do anything but fall silent? What good has all the preaching and the hearing of sermons done us and our people and our church? ... What do we expect God to do, if we come to him now singing, reading our Bibles, praying, preaching, and confessing our sins as if we can really count on his being here and on all this being more than empty religious activity? Our impertinance and presumption must make him sick. Why don't we at least just keep our mouths shut? Yes, that might be the right thing to do. What if we just sat here for an entire hour without saying a word, no singing, no speaking, just preparing ourselves silently for God's punishment, which we have already earned?"

(Transcribed by hand, please excuse typos.)

The whole thing is great, but to just pick out another passage on 122, he continues with "It is inside us all; this truth that upright men and women can turn into horrible beasts is an indication of what lies hidden within each of us to a greater or lesser degree. All of us have done our part in this: one by being a coward, another by comfortably stepping out of everyone's way, by passing by, by being silent, by closing our eyes, by laziness of heart that only notices another's need when it is openly apparent, by the damnable caution that lets itself be prevented from every good deed, by every disapproving glance and every threatening consequence, by the stupid hope that everything will get better on its own without our having to become courageously involved ourselves."

Throughout the sermon, he doesn't just condemn the actions of the attackers and the silent complicity of all Germans: he calls to scripture, specifically John the Baptist, using gospel words to highlight the evil of what had transpired and was still happening. Near the end on page 124 he rhetorically asks "'What then should we do?' In answer John the Baptist places your neighbor right before your eyes just at the moment of forgiveness. The unwillingness to repent destroys the bridge leading to your neighbor. Repentance rebuilds this bridge. This neighbor does not excel in any way that would cause the world to find him worthy of help -- nowhere is it said that he deserves our help. Nowhere are we told that between him and you there is a common bond of race or a people (Volk) or special interests or class or sympathy. He can only point to one thing, and it is that one thing that makes that person your neighbor -- he lacks what you have. You have two cloaks, he has none; you have something to eat, he has nothing to eat; you have protection, he has lost all protection; you have honor, honor has been taken away from him; you have a family and friends, he is completely alone; you still have some money, his is all gone; you have a roof over your head, he is homeless. In addition to all this, he has been left to your mercy, left to your greed (see yourself in the example of the tax collector!), and left to your sense of power (see yourself today in the example of the soldier!)."

These pastors were not preaching into a vaccuum, either politically or theologically. On page 81, Paul Schneider comments during a sermon "Let us never say that this does not concern us, for the German Christian Faith Movement is now claiming to be the religion of all Germans."

That aisde really resonated with me. It feels very unfair to feel pressured to denounce people who others see as sharing your community who you don't agree with; think of the demands for Muslim politicians in America to denounce terror attacks carried out by ISIS, or for Christian churches to denounce Westboro Baptist. You naturally think, "Those people aren't like me, and I resent the implication that I'm responsible for them and being grouped together with them." But, I think it's important when the faction in question is in power or is ascendent. During my lifetime, the "Moral Majority" and other Christian groups in America have claimed to speak on behalf of all Christians, and presented a version of Christianity that is almost unrecognizable to me: pro-war, anti-love, embracing guns and vengeance instead of mercy and sacrifice. I think we can safely ignore the small fringe groups, but when someone claims to speak for all Christians and has a large megaphone, it's important for everyone's sake for other Christians to make clear that this is not true.

The pastors in this book choose many different ways to speak out. Many pastors strike at the overall Nazi ideology, or the heresies of the German Christian movement, pitting systems of ideas against one another. Other pastors speak out against specific actions, as with the urgent sermons in the aftermath of Kristallnacht and the invasion of Poland. They're biblical sermons, anchored in scripture, but they don't shy away from denouncing the particular offenses taken by the Third Reich. Reading these reminded me of how some churches in the United States during Christmas have erected nativity scenes with Jesus, Mary and Joseph encased in separate cages, bearing powerful witness to the atrocities we are committing at the border as we tear families apart. Lots of people in America in 2020 were outraged by these Nativity scenes, and talked about how churches should stay out of politics, which is all distressingly similar to how many Germans criticized anti-Nazi pastors in the 1930s who spoke out against the evils being done in their own country.

We have separation of church and state in America, which I think is a good thing that protects both institutions from each other. But being separate from the government does not mean being separate from the people or the nation. For some time now, many people have thought of religious speech as being diametrically opposed to secular action, talking as a replacement for doing. "Thoughts and prayers" is the common soporific in America, inviting people to divert their energies away from meaningful change and into useless navel-gazing. But, it doesn't have to be this way. Later in life Helmut Gollwitzer said of preaching that "In no other form of speech are things taken so seriously, is our whole existence so challenged, even put at risk. In no form of speech does our word itself so much take the form of action, of intervention in the history of hearers, as in this." (page 115). Think of the powerful sermons from people like Martin Luther King Jr. or Dr. William Barber. Their speech spark literal movements, and, as Helmut implies, are a form of action, a kind of pushing that demands response. To be sure, not every sermon or preacher rises to this level, but this form of speech is capable of it, a divine intervention into earthly affairs that can shock us out of our complacency and move us to do what we must do.

Friday, August 14, 2020

I Made A Thing

I started a little hobby project that turned into a midsized hobby project, and now it's done! Probably!

Lexencrypt is a word jumble, kind of. The letters in the grid constantly shift and cycle, and the initial impression is probably a bit disorienting. But as time progresses, a pattern eventually emerges, and the hidden word will begin to reveal itself. Find the word, type it in, and advance to the next board.

Or something like that! I've had a hard time describing the game when I write the summaries for the app stores, which is always a great sign. Personally I find the experience of playing it a little like solving one of those "magic eye" pictures, where it can help to relax and unfocus your eyes. Or you can take a more methodical approach, sweeping your eyes across row by row until you find a string of letters that form a word.

I slapped together a bare-bones version of the game for my birthday party earlier this summer, and have just pushed out the first update, which turns it into more of a proper game. It now has simple sound effects, tracks your game stats, and, most importantly, saves your game as you progress. There are some new surprises to find for people who make it deep enough inside.

Lexencrypt is available for free on Google Play and the App Store! Below, some typical ramblings on how I got here.

The origin of Lexencrypt was the title screen for a game called "Something Strange" that I wrote back in high school. That was a QBasic game, and like almost all of my games of that era it was a text adventure. I wanted to do something fun for the title screen, though, so I made a little text thing that would randomly fill the screen with letters, constantly cycling between them; but when a letter in the right position randomly rotated to the right character, it would turn white and freeze in place. So you would be left with the words "SOMETHING STRANGE" standing still in the center of the screen, while all around it the alphabet roiled and pulsed.

Many years later, when I was first learning Android development, I whipped up a game called "Nonsense" based around the same concept. I would pull a random word from the dictionary, pick a random place on the screen to place it, and then start flipping characters. Over time the tiles would land on the right letter, and you would then type it in to win. I added a sense of progression to it; I forget now what all I did, but I think I started using different colors or something, and would also start playing music (from MediaStore!) once you got deep enough.

The first physical Android device was the G1, which was a terrible device to develop for: it had a touchscreen and a trackball and a slide-out keyboard. But Nonsense was, I think, pretty fun to play on that phone; the keyboard made it feel natural to tap out the answer once you found it.

This would have been back in... 2008 or 2009, maybe? I'd completely forgotten about it until a friend recently reminded me of it back in the spring, so it's one of the things that I thought of when pulling things together for my birthday party.

I decided to use the game as an excuse to learn Flutter, a newish development platform. I'm generally highly skeptical of "write once run everywhere" systems, but in this particular case it made a lot of sense: my party guests were a mix of Android and iPhone folks, and while I could have taken the opportunity to finally learn Swift, I instead opted to pick up Dart (my micro-review: I would like it a lot more if I didn't already know Kotlin) and add the possibility of making a web app version.

Like most times I've learned a new platform, I started off with the sample app and then just kept adding things and changing stuff. I'm sure that my code style is garbage, and I wouldn't ever use it as a showcase, but it is a lot of fun and feels gratifying to just hack around and make something new.

While working on it, I mercilessly cut out all features that didn't feel absolutely essential to my core delivery for the party: multiple boards to advance, and eventually launching a new URL to continue the scavenger hunt. Even with that minimal portfolio, it took a ridiculous amount of time to make. I kept a list of things that I wanted to do if I ever wanted to polish this up.

It was pretty interesting to think about all the differences between this app and the much older one. A surprising difference is that this one feels slower, despite today's chips being significantly more powerful than in 2008. Part of that might be the Flutter runtime, part might be the significantly larger screen resolutions pushing more pixels. I might have been drawing on a raw Canvas back in 2008 but I honestly can't remember. Anyways, I got it to a point that I was pretty happy with, using some tricks that I almost definitely wasn't using over a decade ago.

Releasing the app was pretty fun, and went a heck of a lot smoother than I expected. I'd heard horror stories about the Apple app review process, but it wasn't too bad at all for me. I did get held up pretty early on by a request for a video demonstrating how my app was used; that definitely makes sense, as it's (somewhat intentionally) kind of disorienting when you first open it. I used the built-in iPhone screen recorder to make a movie of using the app, with the microphone turned on to capture my voice talking through what it was doing, then uploaded that to an unlisted YouTube video and included a link in my Test Flight submission. Once that was in, I was approved for beta testing in less than a day, and once I applied for release to the app store, I think it took less than 12 hours.

Google Play is, as always, a different beast, run by implacable robots instead of humans. This submission actually took quite a bit longer than before; back in the day Google was (in)famous for being the Wild West and letting any random app up, but these days they run tons of automated tests and malware scans and stuff. It's still just a couple of hours, though.

After taking a break to digest all the sausage and cake I ate on my birthday, I've been continuing to work on the game over nights and weekends, running down that list of deferred features from before. I'm getting (slightly) better at grokking the Flutter-y way of doing things and can phrase my Google searches more effectively, which has significantly sped up my progress.

There's still more that I could do, of course - there are an infinite number of Ideas in the world - but I'm pretty satisfied with where things are at now: simplicity can be good, and there's a nice variety of things happening up through level 50, which feels like enough to keep people busy for a good while. This seems like a good stopping point for development, barring any bugs or other unexpected events.

This was a fun little one-off experiment, a far cry from both my usual personal game projects and my usual professional app projects. I doubt I'll do much like this in the future, but it was good to stretch some muscles that I haven't used in a while and make a thing. And, heck, maybe I'll revisit this concept again in 2032 and make yet another version!

Tuesday, August 04, 2020

Party Like It's 1999

I had a milestone birthday this summer. It turns out that 2020 is not a great year for celebrations!

I'd started vaguely thinking late last year about what, if anything, to do for the occasion. For the last couple of years I haven't done any events, instead opting for solo backpacking trips or marathon gaming sessions or other low-key "me time" events. But it seemed appropriate to mark the occasion somehow. I started to think through some possibilities: maybe renting out some venue (an arcade? a park?) or just crashing at Crissy Field for a come-as-you-are thing.

Needless to say, COVID put all that on ice. Like a lot of people, I think I was in denial at first, hopefully thinking that "Oh, if this is all over by May, then people will be relieved to see each other in person again, and my party could be a great opportunity to do that!" And I felt very fortunate that I hadn't made any big plans yet; I feel really badly for people who planned 2020 weddings or otherwise had sunk a lot of time or money into something that COVID took away.

At a certain point, I finally accepted reality: no matter what government regulations were or weren't in place, the virus definitely would still be around, and people wouldn't want the hugs and homemade cake I had planned. (Well, maybe some people would, but those same people would be the riskiest ones to be around.)

By this time, though, I'd gotten attached to the idea of having a proper birthday celebration. At some level, it felt like it would be giving up to fall back to my traditional low-key solo outing. And, with everyone's social lives so constrained, I thought it would be more important than ever to have an opportunity to bring people together. One of the hardest things for me about the COVID era has been the monotony: days seem to bleed into each other, with so little changing in my daily experiences, and I find myself really starved for novelty and experiences. So, if I could somehow make an experience for others, then that might be something they'd enjoy. And in the meantime it would give me something to do other than get mad at politics!

I brainstormed for a while about what to do. The obvious solution was "Host a Zoom call," but I was pretty leery of it. I've been getting pretty burned out on Zoom, and I'm sure lots of other people are too. And the scenario just seemed kind of depressing to me: opening a laptop and seeing a dozen people in tiny little squares on the screen, all staring at each other and doing the awkward "Hi! Can you hear me? Yes, I can hear you, can you hear me?" thing.

But, I definitely did want to see other people, so some sort of video chat would be a very welcome component. I started to mull over the dynamic of a traditional physical birthday party and how I could adapt some of that experience to cyberspace. Everyone doesn't all show up at your front door at the exact same minute: there's usually a gradual ebb and flow, from early birds through late stragglers. There are clumps of people talking with each other. There's music, and food, and lots of chatter.

The more I thought about it, I really liked the idea of some sort of staggered arrival to a video call. What if there was some sort of activity for my guests, a game or something, that would lead into the video? That would add more variety and fun, and also lend a nice cadence to the day. I flashed back to some of my earliest childhood birthday parties, which featured scavenger hunts, with each guest hunting for treasures and all coming together at the end for cake. That sounded perfect!

As I brainstormed more, I gradually came to realize that what I was doing was really creating a game. The overall process for putting together my birthday party was shockingly similar to how I made my Shadowrun campaigns. I had a big ole' Google Doc where I mapped out the stages, the overall arc of the experience, various ideas I had. As the idea was refined I edited it more and more tightly, stripping out bad ideas and foregrounding the fun ones. I created a burndown checklist of all the tasks I had to complete to pull this off, which grew for some time before gradually diminishing. I made a separate Google Doc for the copy, writing fiction and instructions and all the narrative glue to pull things together.

That narrative ended up being pretty fun. This part actually ended up being a little backwards: in my Shadowrun games, I often zero in on a story relatively early on and then build out missions to support that story. For my birthday, I had all the missions planned first, then realized that it might be annoying to just say "Do this, and then do that!", so I whipped together a lighthearted and silly story to tie everything together. Which, amusingly, is much closer to how AAA game development typically works, with the writers brought in to the process after everything else is done.

Anyways... here are some highlights! Let's see... I think I'll focus on the order of how people experienced this, versus the order of preparation.

I sent out an evite invitation to the party. I don't think I've ever sent an evite before, but I receive them decently often. It's what I would have used for a physical party, and I think it helped set the tone.

Evite isn't a great site, and has really annoying ads and upselling (and upselling to remove ads), but it worked pretty well. It's simple, everyone already knows it, and it's easy to track what's going on.

Actually, I take that back: One thing evite is really bad at is RSVPs. For typical parties it doesn't matter at all, you just need a ballpark number while preparing and want to encourage people to come at the last minute. But in my case, I had logistics to consider. I needed to mail out physical supplies, which meant I would need to mail everything a week in advance, which meant I would need to order everything several weeks in advance, which meant I would need to know exactly who was coming early-ish. But evite doesn't have any support for requiring RSVPs by a certain date. After some Googling, I learned that their suggested work-around was to limit the number of guests to the number who had accepted by your decided day. Which seems hacky, but whatever!

So, yes: shipping! I decided to make use of the US Postal Service while we still have it. There are some extremely affordable Flat Rate boxes, but the stuff I had in mind wouldn't fit on one of those. Fortunately, they do also have (free!) Priority Mail boxes, which are a bit more expensive (they're charged based on weight and distance instead of dimensions), but not ridiculously so. I got 17 "4" boxes for my 33 guests and started packing!

While this pandemic definitely sucks, we are very fortunate to be living in 2020 and not 1950 or even 1990. I was able to do pretty much everything online and through the mail. The USPS mailed me empty boxes for free, I packed them up at home, bought postage through, scheduled a pickup, laid out all of the boxes by my mailbox, then several hours later someone came by to pick them up. No visits to the post office, no flagging down a carrier, everything was very efficient and socially distanced.

Inside the box, guests would find a cheerful and colorful warning sign, keyed to their personal time zone, about when the festivities would begin.

I printed these at... Office Max, I think? The per-sheet prices were extremely reasonable; the shipping was more expensive than the printing itself, but I was happy to pay to minimize my exposure risk.

After the stated time expired, guests opened their boxes, and found goodies inside!

The shipping manifest included:
  1. One or more lei
  2. One or more birthday party hat
  3. A heartfelt typed letter from yours truly
  4. Four sheets of paper with lines and circles on them
  5. A Mysterious Treasure Chest with a 3-digit padlock
I bought most of the party favor things from Michael's. The heartfelt typed letter was also printed from Office Max. The treasure chest was really fun, and something I spent a long time sourcing. I had a very specific idea in mind, which would require a small box with a small but usable lock. I spent multiple hours researching until I stumbled across an excellent box at Michael's, which was also shockingly cheap ($3.49 per chest!). I bought the padlocks separately, which were also pretty cheap, but I had to buy from multiple vendors since no single seller had as many as I needed.

Around this time I started getting some confused text messages: "Where's the Zoom link?" I gave a few hints and nudges, but most guests figured it out on their own: it's Puzzle Time!

The first phase involved aligning the sheets of paper with lines and circles over the heartfelt typed letter. Tiny holes cut into the paper provided a screen into the underlying letter, eventually revealing the hidden communication: a URL!

Making this was one of many time-consuming elements of party prep, but was a lot of fun. I used an X-Acto knife to cut out the desired characters from one of the letters, taped to a sturdy piece of paperboard. I then used the paperboard as a template to cut out more characters from stacks of letters. I could do about 7 sheets of (flimsy) paper at a time, though my knife was getting pretty dull by the end!

I used two of the pieces of paper for each letter, then used a ruler and a coaster and some crayons to make my marks. Most of the markings went on the paper, with some of the edges marked on the underlying letter. The recipients would then align the edges with the paper to restore it to the original position. I included a couple of dummy papers too to keep it from getting too easy.

And, what was at that URL? More puzzles!

I'd overthought this landing page. Since I was mailing out the packages in advance, I was somehow worried that, like, some people would start working on the puzzles days before and get through it too early, having an unfair advantage over people who waited. What a dumb worry! This wasn't a competitive game or anything, and folks have better things to do than defy the wishes of the birthday boy. But, in order to prevent this imagined scenario, I added a content gate (again, my video-game-author instincts kicking into play). I asked a question that would be keyed to the day of my birthday. That morning, I would update the back-end with the correct answer, so nobody would be able to proceed before I was ready

For the record, I am not a web developer. I think the last time I made an HTML page was back in the 1990s, and my web skills are still at about that level. Still, since this wasn't a professional gig, I had a lot of fun with it. For the tech, I used Ktor, a Kotlin framework for web development, along with FreeMarker for templatized web pages. Everything was done with static content and URL redirects, no cookies or sessions or any storage. I hosted the site on Heroku, and, boy, I can see why it's so popular! Even with practically zero experience in dev ops it was a breeze to manage deployments. I purchases some novelty one-off domain names from Google Domains and pointed them at my Heroku apps. All in all I think I spent $8.03 on Heroku (one month of a hobby dynamo to get SSL, plus a tiny amount for traffic) and $12 for each Google domain (good for a year but I won't be renewing).

The "plot", such as it is, kicks in soon after this. The nefarious intellectual property lawyers from Hasbro, Inc. are furious at my reckless infringement of the Teenage Mutant Ninja Turtles copyright, and I have gone into hiding to evade them.

One big goal of mine while planning this out was to bring guests through a multitude of different channels and experiences, again evoking an old-fashioned treasure-hunting ethos that brings you through different environments, and also giving some more novelty to the experience and hopefully some moments of delight. In some ways I thought of this "game" as being a little like an ARG, weaving together various physical-world and digital-world venues with different clues people would follow as they hopped between them and followed the trail. There were a few big differences, though. ARGs are designed to be really hard to solve and take a long time, while I really wanted everyone to get through in an hour or so and had some decidedly non-tech-savvy folks on my invite list. ARGs also tend to encourage collaboration, while this game was more solo.

But, not TOO solo! I wanted to make sure that, early on, I could bring the guests together digitally, to get some of that sense of cooperation and collaboration, and also to give me a graceful opportunity to provide hints to people who were getting stuck. So, after solving the first couple of puzzles, I brought people into a private Discord server.

The event was scheduled to start at noon PST, and I was poised at my laptop throughout: one window open to the Zoom meeting where everyone would wind up at the end, and my Discord window open. I stared at it, wondering when the first people would come in. 12:05 rolled by. Zero people had made it. 12:10 came and went. Still zero people. I felt a sense of dread rising within my stomach. "This is just like the Antumbra offices all over again! I made the opening stages too hard! Nobody will make it here! They've probably all given up already! This is a terrible birthday party!"

And then, at 12:11, the first guest arrived: my good friend Josh from high school! He was followed seconds later by a current friend from work, and then more soon after. It was pretty remarkable that folks all over the country, from the west coast to the east coast, independently working on the same puzzles, completed them in almost the exact same amount of time.

I'd initially planned to do more game-y stuff within the Discord; my concept was to have a bot that you would chat with, and who would eventually send you on your way. After a lot of research, I eventually determined that I couldn't do exactly what I wanted, at least not without a lot more coding than I was willing to do. (Oddly enough, Slack and Discord could each do half of what I wanted: having a bot automatically communicate with you when you joined a channel, and having a bot respond to what you say in a private conversation with it.)

But it all worked out well. There was some good chatter in the main channel, and it was fun to see people gradually pop in as time went on: again, it had the cadence of a "real" party, which was exactly what I wanted. It was fun to see some people be prompt, and others arrive to see lots of activity.

The main meat, though, was a private message that the MEE6 bot would send, pointing them towards their next puzzle.

I have to admit that I am not a regular Discord user. At some point I'll probably get on it for real since more and more of my favorite game companies and communities seem to be moving there, but I am still stuck in my ways. Anyways, I poked around for a bit for various bots, the MEE6 one did the most of what I wanted and was easy to configure. It just sent this welcome message to everyone who joined the server, providing some more flavor text to the "quest" and pointing them towards two things: a Google Photos album and another URL to continue.

The album included a bunch of beautiful nature shots, all taken from the same backpacking trip. But what trip?

Some folks who know me very well, or who are big fans of Lord of the Rings, could probably guess it quickly. Others, though, could use the magnifying glass to zoom in on the writing of one particular photo, which would bring them within a Google search of the answer.

And, from here, they would (most likely) have to use Google Maps (or an old-fashioned atlas or something) to find what specific town near the track I was "hiding" in.

This eventually segued into another bit of fiction, as "I" have "escaped" from New Zealand and am returning back to the States.

The Donatello shout-out here was a late addition. As in my video games, I try to keep some narrative coherence, and periodically remind my players of the overarching plot arc. This was an extremely silly "plot", but I still think it was kind of fun, and it tickled me to remind my guests of the very low stakes. And, in a weird way, it almost felt kind of like character development... for me. (For the record, I was a huge fan of the Ninja Turtles as a kid, and hadn't thought about them at all for decades, and think fondly of them now and listen to their official podcast.)

The next puzzle comes up soon: a long playlist appears, and the guest is challenged to figure out what one song in it doesn't belong.

This was one of my favorite kind of puzzles, with many possible approaches and solutions. You can just brute-force your way through it. Wrong guesses aren't really penalized, although they did result in this menacing warning.

A simple scan through the playlist will almost immediately reveal the theme: the vast majority of songs are about California, and, heck, have California in the title. Some of them are more subtle: Free Fallin' doesn't have any California places in its title, but the lyrics do ("Livin' in Reseda", "Down Ventura Boulevard", "Over Mulholland"). But you could narrow the possibilities down pretty quickly, then either listen to them, or crunch through them.

It was pretty important for me to have a music portion to the party. Like I said before, I was trying to recapture some of the essence of a party, and music is a big party of that. I actually had a checklist of stuff I wanted to do: music, food, movies, games, chatting. I'd built out an entire movie puzzle that was oriented around the 80s movie The Wizard before cutting it out near the end; once again, I think my experience in "game development" has helped me evaluate this stuff and ask basic-but-easily-overlooked questions like "Is this as fun for people to play as it is for me to make?"

The solution to this puzzle was "The El" by Rhett Miller. I'm pretty pleased with that: most of my guests are either from California, and thus have a leg up on recognizing California place names, or from Chicago, and thus have some experience with the El. (And "The El" does, at a glance, look like it could be a Spanish name, in line with other items on this playlist.)

Curating this list was pretty fun. I did a lot of searching in Spotify and on Google to build up a big list, then gradually whittled it down to a smaller-but-still-longish playlist that would take about two and a half hours to listen straight through. I think maybe a third of the songs on there are ones that I'd never heard before. I tried to represent a mix of genres and time periods, but also cut out everything I hated. In the end I think there are only two songs on there that I really love ("California" by Grimes and "I Remember California" by R.E.M.), but there are a lot of bangers; I became particularly fond of the opening guitar lick of Sausalito Summernight and the bouncy fun of San Luis Obispo.

From the music puzzle, guests proceeded to the next part of the game: an actual honest-to-goodness game!


This was probably the most ridiculous, indulgent part of the whole project, to write an entire game from scratch, but I was dedicated to the idea: I love games, and programming, so I thought it would be fun to put something together.

I'll probably include a separate post about this later. It's a very simple and completely non-narrative game, sort of a word jumble type of thing. I used it as an excuse to learn Flutter, a newish cross-platform development ecosystem, and wrote my first-ever iOS app and first-ever web app. I had to be really strict about feature creep and do the bear minimum to make sense for my party, since as ever there's an infinite number of improvements you can make to any game.

But, yeah, it was totally unnecessary and fully satisfying to go through the whole process of releasing a new game to Google Play and the App Store, just so a dozen or so people could use it as a step along the scavenger hunt! The web site directed them to the App Store, they would download and install the game, play it for a few stages, then a new button would appear, they would tap that, and be taken forward into the next stage of the hunt!

(For the record, that's an animated GIF above. Most but not all of the Turtle content in the hunt was animated.)

This led into another "content gate". I probably overthought the "security" aspects of my treasure hunt; the odds of some random person playing my totally unadvertised game during the few hours that easter egg / backdoor were open was astronomically low. Still, I didn't want randos stumbling into my precious birthday party! So, since this link was accessible to anyone who played my game, I had guests verify information that came with their physical box. This is something that could theoretically be brute-forced, since, again, I wasn't really doing any session tracking or anything fancy on the server; so I also added a free-form text field, sowing doubt in the mind of a hypothetical hacker that even running through every possible combination would yield a correct solution.

Getting this wrong would lead to yet another warning. The list of my adversaries grows larger and broader!

This line eventually led to a numeric and audio puzzle:

This was kind of inspired by numbers stations, like Yankee Hotel Foxtrot. Here's the actual audio.

As I discovered during the event, that does not work on all browsers! Like a fool, I had only tested on Firefox, but apparently it doesn't work on Chrome (and maybe Safari?). But, by this point everyone was in the Discord server, so I was able to provide folks with hints. In the meantime, a few resourceful people were able to check the HTML source code and directly track down the .wav file location, which played fine when you open it directly.

Oh! Speaking of the source code, I'm pleased that people did poke into it, since I had a few more Easter eggs buried within.

If you haven't figured it out already, those audio numbers are the opening part of the Fibonacci sequence. For some reason this was in my head from an old Square One Mathnet episode. Thinking back on it, there was a LOT of PBS-type stuff in this hunt, from Carmen Sandiego geography to Square One math puzzles. Some people got it from Fibonacci, others directly calculated the sequence scheme, a couple needed help. A surprisingly large number of people didn't know what to do with the surprisingly large number that was the answer. The solution, of course, was to use it to unlock the combination padlock on their Mysterious Treasure Chest!

There were a whole bunch more trinkets inside, including:
  1. One or more noisemaker.
  2. One or more tightly-wrapped (albeit stale) brownie.
  3. A set of Teenage Mutant Ninja Turtle-branded party napkins.
  4. A set of Teenage Mutant Ninja Turtle temporary tattoos.
  5. A pen.
  6. A card reading "Shine a light on me!"
This shifting between analog and digital puzzles just tickled me so much. As I said later, it reminded me of the rhythms of my favorite shadowruns: you do legwork to gain access to the facility, then the decker jacks into the matrix to open some doors, then the team advances and finds a port on the secured network, then the decker takes over the facility, etc. The chaining together of physical space and cyberspace is one of my favorite things, both to experience and to create.

In this particular "run", guests had to figure out what the heck was going on. To jump ahead to the solution: the pen included a blacklight. Shining the blacklight onto the card revealed a hidden message written with invisible ink.

Not a particularly helpful message! This says "Other side!". Flipping the card over and shining the light reveals yet another message, "Look There", between some arrows. A few people were stumped by this step, which was guiding them back to the arrows way back on the first "Please Do Not Open Before Noon PDT" cards. Shining the light on that would reveal the final message: yet another URL to yet another website, guiding you back into cyberspace once again!

I'd decided pretty early on that I wanted to do something with invisible ink, and I particularly loved the idea of hiding a message in plain sight early on, and having guests return to it later with more information and resources to extract meaningful data. The padlock was an obvious example of that, the greeting card with invisible ink a much less obvious one. Actually getting the ink took quite some doing! I'd initially thought of using lemon juice and having people heat it, but, as it turns out, this doesn't work well at all. I then went down a rabbit hole of making my own invisible ink with a reagent. You can find a bunch of formulas online, most of them don't work or don't work well. I finally found one that was good: you make the ink by mixing together tap water and baking soda, draw the message in it, then make the reagent by combining rubbing alcohol with turmeric. The message fades into invisibility, and the reagent brings it out really nicely. I'd gotten pretty far along this distribution plan, going so far as buying cute little bottles to hold the reagent, before belatedly asking myself: "Is it really OK to send 100% isopropyl alcohol through the postal service?"

I did some research and determined that the answer was a hard nope. Well, more like a hard please don't. Highly concentrated alcohol is considered an explosive. You need to declare it, hand it off in person to a postal employee (not a comforting thought in COVID times!), and it cannot travel on airplanes, only ground transport, and thus wouldn't be eligible for Priority Mail and wouldn't arrive in time.

While looking up these various inks, I kept getting ads for invisible ink pens, which I just reflectively pooh-poohed and barrelled past. After my reagent dreams went up in smoke, though, I revisited it, and ended up deciding that was the way to go. You can get them for really cheap; they're sold out in many places but I found a seller on eBay who was nearby and offered fast delivery. As a nice bonus, the invisible ink pen let me write much more compactly than I would have been able to with homemade ink, which would need a paintbrush or similar wider applicator.

And, at the end of all this, my guests each got an invisible ink pen as a party favor, so that's pretty fun!

That final web site came up with an encouraging note progressing the fiction, and a final "puzzle" to solve, which was really my final content gate: asking people to enter information from various clues along the way. Again, this was just mild paranoia on my part. I'd configured robots.txt and noindex, nofollow and all sorts of stuff to make sure these sites wouldn't be crawled or show up in search results, and the odds of someone randomly typing in these characters during the few hours the content was live were infinitesimal, but out of an abundance of caution I wanted to make sure that only folks on Official Party Business would make it through to the end.

The very last page was a cornucopia, a joyful explosion of animated gifs of the TMNT. I think there were around 40 altogether, mostly drawn from the original 80s cartoon but some from later incarnations. It was all very silly and fun. You could click a button at the top of the page, which would play the theme to the Teenage Mutant Ninja Turtles: Turtles In Time arcade game.

And at the bottom I had a sincere and heartfelt "thank you" to everyone for participating, along with a link to what everyone expected all along: a Zoom call! I actually sprang for one month of a Zoom membership to get this; again, it was cheaper than renting a place or something would have been, so I was able to justify some expense.

Continuing the theme of "overthinking everything", I was worried that the call would feel chaotic with more than a dozen people on at a time. I'd initially thought of having different "rooms" linked from that page, again emulating something like a traditional party feel: I would hang out in the "Kitchen" room, but you could also pop into the "Living room" or the "Balcony" or the "Front door" to see who else was there and have little side-conversations. But, it turns out that you need to purchase a separate Zoom subscription for every simultaneous call you want to have, and, uh, no thank you!

The first person to pop in was my youngest brother, who had endured a biblical flood which had destroyed his parcel, but showed resilience and pressed on through the digital realm into the Zoom call. It was just the two of us for a little while, and he was good-natured about my constant state of distraction as I monitored the Discord and my text messages to field technical inquiries with various levels of franticness.

The next person to pop in was Josh, who had been the first one into the Discord and thus won some sort of prize. Josh had received some help from his daughter, and it was really fun to see her.

And, to see kids in general. As more folks hopped in I enjoyed hearing about how different folks had responded to the situation, from the gleeful destruction of Young Ben to the grave concern of Silas ("Oh, no! Chris is missing!!").

The whole in-person (well, "in-person") thing ended up being really wonderful and lovely. My concerns about it feeling too crowded or chaotic faded away: there was a really great conversational flow, great mixing between people from different stages of my life who hadn't met before, and tons of good vibes. I realized after the fact that we'd had a conversation that lasted for nearly two hours without ever once talking about Donald Trump or COVID-19. I don't think I've matched that record before or since, and it was one of the many highlights of my birthday.

So, yeah! The whole project was really stupid and I never would have done it if I'd known how long it would take to prepare, but as the same time it's probably the most fun I've had all year and I'm delighted by how it turned out. I got lots of really great and kind messages after the event, too, and it felt really gratifying to hear that I'd provided a little bit of lightness into folks' lives. Even if it was a blacklight!