Nat Knight

Reflections, diversions, and opinions from a progressive ex-physicist programmer dad with a sore back.

#aprilcools #ttrpgs #community

It’s April Cools! It’s like April Fools, except instead of cringe comedy you make genuine content that’s different from what you usually do. This is my very first April Cools post. 🥶

I attend (and marginally help organize) a local in-person monthly tabletop role-play game meetup. It's consistently the extracurricular highlight of my month. Whether you've been playing for years, are just getting into the hobby, or (like me) have had to dramatically cut back the time you spend at the table because you're a parent, it's a great way to scratch the TTRPG itch without the considerable labour and time commitment of a long-term campaign.

Running games at a public meet up on a monthly basis is very different from running a home game. This article talks about some of the challenges you might have and gives some advice on how you might successfully run a meetup of your very own.

What you Need

  1. Players: Before you can do anything you need folks to play with. Maybe you can get started by dragging some friends along, but you should think about how you're going to get the word out, especially if you're trying to include people who aren't already in the hobby.

    Do you or some of your friends have network you can tap? Can you try to grow by word of mouth? Do you want to advertise at local game stores if those exist? You don't need to grow exponentially or anything, but you should think about how to keep your project sustainable and that's hard to do if nobody's attending.

  2. Venue: Next you need somewhere to play. This could be a local game store or pub or café, but these all come with costs either directly to your players (as they buy pints and fries) or to you (as you pay rental fees). If you're lucky perhaps one of your players has a space that could host the meetup. Otherwise, venues like churches or community centres might have space you can use for free or for cheap, especially if you emphasize the community building aspect of your project.

  3. Games: You might be happy to play D&D on a one-off basis for a few hours a month, but I certainly don't. When I'm looking for a good meetup game I try to find something that is:

    • quick and light, so you're spending your time playing instead of learning rules,
    • contained so that you can have a satisfying experience in one session of play, and
    • different, because I like variety in my gaming life, and because it makes for a more welcoming meetup if there are lots of different options for folks to choose from.

The Agenda (or at least the one we use)

Once you've got your players, your venue, and your games, what do you actually do at games night? Here's the agenda we use.

  1. Arrival: Meet at the appointed time, welcome folks in, do a bit of idle chit-chat, and eventually gather into a big circle.
  2. Intros: The facilitators introduce themselves, tell folks about the venue (e.g. where the bathrooms are). Then we go around and have folks give their names and pronouns. Then anyone who has brought a game they'd like to run gives quick pitch describing its premise, tone, play time and player count.
  3. Make groups: If we have enough players we divide into smaller groups based on interest. We usually do a quick straw poll to see which games have critical mass and then sort of Vornoi ourselves into groups by putting those games in different corners and having folks position themselves in space according to their relative interest.
  4. Play! Most games go for 2-3 hours with a short break. Your mileage may, of course, vary.
  5. Debrief: About twenty minutes before we need to close down the venue we re-convene and share something that we appreciated about our game that night.

Then we clean up and close down the venue and wait eagerly to do it again next month.

Games to Play Occasionally and with Strangers

Here are some games that I can personally recommend in a meetup setting:

  • For the Queen by Alex Roberts

    You are accompanying a powerful and mysterious queen on a perilous journey to end a generations-long war. She has chosen you as her retinue because she knows you love her.

    For the Queen is a card-based story-building game that you and up to five other players can begin playing in minutes.

    Play For the Queen to tell the story of an awesome/awful Queen and kingdom and her complicated, unequal relationships.

  • The Quiet Year by Avery Alder

    The Quiet Year is a map game. You define the struggles of a community living after the collapse of civilization, and attempt to build something good within their quiet year. Every decision and every action is set against a backdrop of dwindling time and rising concern.

    Play the The Quiet Year to tell a zoomed-out story about a community building in the midst of adversity.

  • Fiasco by Bully Pulpit Games

    Fiasco is an award-winning, GM-less game for 3-5 players, designed to be played in a few hours with no preparation. During a game you engineer and play out stupid, disastrous situations, usually at the intersection of greed, fear, and lust. It’s like making your own Coen brothers movie, in about the same amount of time it’d take to watch one.

    Play Fiasco to tell a story about people with big ambitions and poor impulse control.

  • Galactic 2e and its expansion Going Rogue 2e

    A game of relationships, rebellion, and war among the stars.

    Play Galactic or Going Rogue to tell a Star Wars story with no dice and no game master.

  • Blood Feud by Blackfisk Publishing

    Blood Feud is a game about toxic masculinity: certain common attitudes and behaviours among men, that cause great harm to them and to others around them. This is a game about people being nasty to each other and about figuring out why.

    It’s also a game about vikings of pre-christian Scandinavia; about honour and blood feuds, courage and brutality, corruption and consequences. Above all it is a game about what it means to be a man in such a world—and what consequences that has on the communities they live in.

    Play Blood Feud for a tragic story about men who can't help but hurt each other.

  • A Perfect Rock

    Your home planet was destroyed.

    You are aboard the last Generation Ship with the sole survivors of your people. You must find a perfect rock: a new planet to call home.

    Play A Perfect Rock for a sci-fi story about exploration, especially if you have a cool rock collection.

#link #ai

Laurie Voss hypothesizes that rather than driving all software developers out of a job, the rise of generative LLMs and “vibe coding” will result in more overall software development jobs, but that they will look different than the ones that currently exist.

The argument goes roughly:

  • LLMs are a new layer of abstraction for writing programs
  • New layers of abstraction create new kinds of programmers who don't think as much about layers lower on the stack
  • There's lots of unmet demand for software development
  • Developers who can “vibe code” to meet this need will be numerous, productive, and decently paid (though perhaps not well compensated as developers in 2025).

He also argues that overall demand for software development will go up as it gets cheaper, so salaries for current developers won't really be impacted.

While I have a couple of quibbles, I like this a lot! I think “AI is a new level of abstraction” is a much more useful take than “all code will be written by AI” or “AI is useless and will go away”. The idea of a software engineer who doesn't really know how to code is very strange, but I can sort of see how it would work with the right tools. You would need a bunch of knowledge about protocols, databases, architecture, etc. that previously would have been inaccessible to someone who doesn't code, but that's changed now.

I'm not sure I buy the “salaries won't go down” component. We've witnessed fifty years of capital rapaciously sucking up every grain of surplus profit it can, so if there's a way that LLMs could be used to undermine software developers' bargaining power re: the cost of their labour I bet someone will find it, or at least try hard enough that it will be a bad time, at least in the short term.

With all the AI hype flying around leaders who (for example)

  • replace their staff with AI agents
  • create a class of “vibe coders” whose salaries are anchored lower
  • buy AI licenses for their favourite half of the engineering team and lay off the other half

will be lionized as bold and forward thinking, at least until the negative consequences of these actions start to crop up. I think they will crop up, because more code means more tech debt, and with fewer people building theories you're going to hit that wall sooner or later, but the owning class and their lackeys can remain irrational way longer than it takes to erode your salary.

#til #webdev #javascript #clipboard

I remember a time when there were whole libraries dedicated to clipboard management.

Turns out in browsers released after ~2020 you can do it with one line:

navigator.clipboard.writeText(text).then(console.log).catch(console.error);
Read more...

#til #javascript #webdev #customelements

I was working on a custom element today that replaces a textarea with CodeMirror in the UI while still updating the textarea in the background so that it can be submitted in a form. I ran across a wild footgun in custom elements.

StackOverflow eventually provided the solution. There's a solution on stack overflow, but Danny Engleman wrote up a more thorough explanation.

Read more...

#uv #python #til #scripting

I've known for a while that uv can run Python scripts that declare inline dependencies.

I learned today that you can also use uv to manage those dependencies.

Read more...

#release #sqlite3

I wrote a spec for a SQLite-based todo database and just release version 0.1.

Read more...

#llm #mlx #huggingface

TL;DR: Create a directory to hold Hugging Face data and set the environment variable HF_HOME to that directory's path.

For example:

mkdir /Volumes/externaldrive/huggingface
export HF_HOME='/Volumes/externaldrive/huggingface' 

You'll also want to set it in your .profile or .bashrc or wherever you set these things.

Read more...

#web #hypertext

Or “how you can link to arbitrary text on a webpage”.

The syntax is a little weird, but you can add a specially formatted anchor to a URL to link to a snippet of text.

The syntax is:

https://example.com#:~:text=[prefix-,]textStart[,textEnd][,-suffix]

I find it particularly useful for linking to a quote in a longer article.

See MDN for the full documentation.

#til #python #uv

(via epistasis on HN)

Semantic versioning is difficult. Not everyone has the same idea of what “breaking change” means, and depending on your language and tooling “breaking” changes can sneak in despite your best efforts.

One possible mitigation is to record when you resolved your dependencies and ignore anything published after that date. It's crude, and relies on package dependencies not monkeying with stuff that's already been published, but it's easy to understand and you can do it with uv.

It's documented here.

Put a date in your pyproject.toml file and subsequent invocations of uv will ignore anything published after the cutoff:

[tool.uv]
exclude-newer = "2023-10-16T00:00:00Z"

You can also use it in the “inline metadata” format for scripting! From the uv docs:

# /// script
# dependencies = [
#   "requests",
# ]
# [tool.uv]
# exclude-newer = "2023-10-16T00:00:00Z"
# ///

import requests

print(requests.__version__)

This use case seems particularly valuable: if I write a quick script I probably care more about it not breaking than I care about it getting updated dependencies. It's nice that uv offers a way to keep code running rather than forcing me to update it or throw it out.

#links #languagemodels #art #writing

Jamie Brew of Botnik gave a talk at Strange Loop 2023 called Comedy Writing with Small Generative Models.

The talk itself was very entertaining, with musical interludes mashing up “the Beatles” and “Craigslist ads for vehicles”, and while the algorithms were (by Jamie's own admission) pretty straightforward, there was a lot of room for expression in finding good corpuses, mashing them up, and finding fun ways to apply them.

It was an excellent reminder to me that there's an entire world of stuff you can do with computers that isn't commercial, isn't “hard tech” or “cutting edge” but is nevertheless utterly delightful.