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 USPS.com, 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!


  1. It was the single finest birthday extravaganza I have attended that did not involve a ball pit. Seeing the back-end effort makes it even cooler.

  2. We have enjoyed trying to describe your party to friends. Now we can let YOU 'splain it! (Excuse me now, I have to get back to Lexencrypt!)

    1. Stay tuned, I'm hoping to get out an update to Lexencrypt later this week!