Press "Enter" to skip to content

Month: December 2020


I had a great weekend of gaming at a virtual mini-con ran by Paul Beakley as part of the Indie Game Reading Club. (Patreon him up, yo!) I have a couple of general thoughts, then I’ll do a quick recap of the games I played in.

In order to deal with the usual “people who are around when registration opens get into all the games” problem, Paul asked people to hold their registrations to one or two games in the first day, and then opened the floodgates a bit wider. That worked really well. He also highlighted games that needed more people, which was cool. The latter probably only works if you have a relatively small population of players/games, but that’s maybe a good idea anyhow. Or you could automate it if there was good free event registration software out there? Alas.

Over the course of the weekend, we sort of evolved a practice of posting a thread for each completed game in the Slack. I really dug this because I liked learning a bit about games I wasn’t playing, and I liked seeing what else people I’d played with had been up to. It was great for connections.

I played in four games, which was just about right. By coincidence I had Friday off, so I was able to double up on games there, which was a bit tiring but ultimately fine. I booked myself into evening games on Saturday and Sunday, leaving days free to relax and play World of Warcraft and so on.

The Gathering Stones

I played a game of i’m sorry did you say street magic last night with Rye, Nicholas, and Joe, and it was awesome.

Quick description: it’s technically a map building game, but really it’s a game in which you build the relationships between places on a map which never actually gets drawn. Unlike The Quiet Year, there are no random elements. I’d wondered if that would result in overly still metaphorical waters, but as it turned out, the game forces interaction between the setting elements you create with just enough strength to prevent stagnation. Also, every time around the table, there’s an Event which must alter at least one element, so that keeps things moving as well.

If this sounds interesting, note that the game was in the Racial Justice bundle in the summer of 2020, so you may already have it.

Our city was boastful, vast, ageless, and magnetic: four adjectives chosen from a list at the start of play. It wound up being a place where cultures and people met and mixed and fought over the millennia. I defined an early Neighborhood as “An ancient waterfall, tamed by technologists long gone, filtering through man-made gates.” That sense of ebbing and flowing knowledge stuck throughout the game, for me. (I always wish I could see the city we created through the eyes of another player, though.)

The facilitator, Rye, added a whole new kind of people made of light as our second Compass: the theme for a round of play. After he declared the Compass, he established a new Landmark, the Painted Passageway. “Painting that was the origin of the Bright Ones. They first came unnoticed as the artists were in a frenzy. Now they are observed passing in and out of this painting.” The game almost immediately grounded itself in the way the existing residents reacted to the Bright Ones and the changes they brought. It became evident over the next two rounds that they were going to draw on the water of the city for their own purposes.

The sense of beings beyond our control taking advantage of our resources was interesting; the way the merchants of Main Street (“True Name: Political power, wealth, commerce.”) mirrored those actions was interesting. Lots of layers. As we came towards a close, I took a Resident I’d already established and asked the rest of the table if I could re-establish him 50 years in the future, making an abrupt time jump, and they said sure! So the hot-headed, conspiracy-minded Kevin Young became a chubby, relaxed bartender collecting the stories of travelers. “I’ll tell you my story,” he said, “But first I want to hear what you know of the time the Bright Ones came and left.” And he wrote it all down, in hopes that a century from now the Bright Ones would be remembered, and less feared.

I do in fact want to play this again. I also want to use it as a base for the next urban fantasy game I run; run it as the first session, and build characters from there.

Simplified Unsplash Widget

My old boss Steve Makosfky was singing the praises of Scriptable the other day — it’s an iOS app that allows you to run Javascript in a number of ways, including as a widget. It’s also free (but tip the developer if you like and use it). So I modified an existing script that displays random photos from Flickr to replace my clunky Unsplash photo widget.

It’s way better than my previous solution. It doesn’t clog up my photo library, plus it’s mildly configurable. (Could be more so, but I’ll leave that as an exercise to the reader.) I’ve set mine up such that it only pulls down nature photos, which means I’m no longer seeing people I don’t know on my iOS home screen.

I stuck my code in a gist in case anyone finds this useful.

Weird Instagram Bot Traces

So far this month I’ve received a couple hundred email messages from Instagram notifying me that their Terms of Use have been updated. They’re legitimate emails; it looks like someone signed up hundreds of Instagram accounts using randomized email addresses. Since I moved my mail to Fastmail, I’m now seeing them all. I poked around a couple of the accounts (hi, kurt.clemons78446!) and the ones I spot checked have all been deleted.

I imagine someone used as a domain for non-existent email addresses, and these either date back to before Instagram added a confirmation step (and were later removed for spamming) or they just never confirmed the accounts. You’d think that deleted accounts would be removed from whatever list of email addresses Facebook is using to generate these emails. Unconfirmed accounts… I guess those should still see the Terms of Use changes.

Good times. Finally added a filtering rule for the emails, anyhow.

Auto-Pause for Zoom

I don’t like wearing headphones all day and since I’m lucky enough to have a spare room for an office, I can play music through my Bluetooth speaker. However, I’m lazy, and I don’t want to fiddle around with my music player just cause I’m starting a Zoom meeting. Thus, automation.

Zoom provides callbacks when meetings start, but that’s aimed at people writing plugin modules. OK, we can go a bit lower level. I can’t just watch for a process, cause Zoom is always running on my laptop. But I can watch for open UDP sockets!

$ lsof -i 4UDP | grep zoom 88028 bryantd 83u IPv4 0xa90f1ce03eca5d5 0t0 UDP xx.xx.xx.xx:57275 88028 bryantd 84u IPv4 0xa90f1ce03eca2ed 0t0 UDP xx.xx.xx.xx:52612 88028 bryantd 90u IPv4 0xa90f1ce09340175 0t0 UDP *:65048 88028 bryantd 91u IPv4 0xa90f1ce0939ce8d 0t0 UDP *:60088 88028 bryantd 95u IPv4 0xa90f1ce0939c8bd 0t0 UDP *:50594

That’ll do, pig. That’ll do.


trap ctrl_c INT

function ctrl_c() {

function stop_music() {
        /usr/bin/osascript -e 'tell application "Music" to pause'

while true; do
        zoom_status=$( /usr/sbin/lsof -i UDP | /usr/bin/grep zoom | wc -l )

        if (( $zoom_status > 0 )); then

        sleep 30

I’m catching interrupts because I want a quick keyboard method to stop the music just in case. Right now I don’t think I want it to restart music when I leave a Zoom call, but easy enough to add that if I do.