Here are the design principles I had in mind whenbuilding the current incarnation of Foxspace:
A lot of common blogging and content creation idioms create constant points of uncertainty:
Any such dilemma directly impedesactually writing—it forces me to pause when preparing to write a note, after writing it, and later revise my tag and category structures multiple times. With Obsidian’s nested tags system, should “programming” be its own tag, or should it be a sub-tag of “software” or “tech”? This clearly doesn’t work.
Foxspace should be as easy for me to edit as possible, so all these roadblocks have to go. No tags, no categories; just a loosely linked, searchable pile of notes.
Foxspace is inherently a textual medium—both it and its inhabitants exist as chatroom messages, source code, words and sentences; it should, therefore, be presented in a form that most closely preserves their essence.
In a textual medium, cleanliness is of the utmost importance. Modern design uses icons and pictograms as shorthand or to indicate elements of lesser importance; text should remain free of noise, boilerplate, and irrelevant nonsense.
The entire reason for building Foxspace in this form is to enable a new method of exploring it—through bidirectional links and graphs mapping related thoughts. Those should be accessible from anywhere and presented prominently.
The path presently taken is also part of the context. Similarly toRoam Research or e.g.gatsby-digital-garden, previously visited pages should remain visible and easy to backtrack to.
Annoyances like page-loads, images loading in late and reflowing the text, unexpected external links etc etc—they all break flow. Anything that isn’tseamless—does not happen instantly and within the same UI—should be clearly distinguished from the rest of the site.
The site should work with JavaScript disabled. The layout should be single–column—multi–column layouts don’t work great on mobile devices. It needs to be tested in Reader Mode, in RSS readers, and in text–only browsers likew3m
orlynx
. It doesnot need to be tested under Chrome, but should refrain from making fun of Chrome users—their mistake should be discussed with compassion, rather than ridiculed.
Here’s a loose collection of sites, themes, and frameworks I found to be inspiring for what I wanted Foxspace to look like:
This page serves as an archive of my self–contained posts that may not directly connect to other pages. You’ll find here:
Game retellings:
Whenever I feel like writing something longer, rather than just taking notes, I look to my list ofThings I’d Like To Write About in hopes of writing something that will make its way to this page.
Today was a productive day. I started work ondrydock
(edit: now superseded byspacedock!)—the custom build–system–slash–static–site–generator that will end up poweringFoxspace.
I was initially going to write it in Python, but decided to go with Rust in the end, for multiple reasons. Primarily, I wanted to minimize deployment headaches—I’m a version chaser, and managing updates between the distro package manager,pyenv
,andpoetry
gets tiresome quick. With Rust I can run one command to installrustup
and then all I need to do is a quickcargo run
.
I did most of the groundwork for preprocessing the Obsidian vault;[[wikilinks]]
in my notes get resolved and translated into<a href="...">html links</a>
, and I can do various operations on them like building a connectivity graph or finding isolated notes.
The important steps until I can deploy the new Foxspace are:
<meta name="description" property="og:description">
), lifted from the YAML front matter or—if there’s none—generated somehow from the body text of the note.canonical
s with.html
–less paths (so e.g. this note should have a<link rel="canonical" href=".../transient/2023-05-18">
); duplicated in the OpenGraphog:url
property.head prefix="og: http://ogp.me/ns# article: http://ogp.me/ns/article#"
og:title
, duplicating<title>
og:description
, see aboveog:url
, duplicating thecanonical
linkog:site_name
:"Foxspace"
og:image
—the first image from the note where applicable, otherwise the Foxspace logo.og:image:alt
—the alt-text of the first image from the note where applicable, otherwise an appropriate alt-text for the Foxspace logo.og:type
—"website"
for the home page, but"article"
for individual notes:article:author
:"Fox"
article:published_time
andarticle:modified_time
where applicablearticle:tags
populated from Obsidian tagsarticle:section
, maybe?drydock
at the moment, and I bet in a week I won’t be able to remember anything about how it works.drydock
doesn’t support yet, rather than having it spit out bad markup. Off the top of my head, some useful lints would be:date
andmodified
in the front matter—maybe require explicitly usingdate:
for notes that shouldn’t have a publication date.…And that’s just the backend part! The frontend is going to be its own pile of headaches:
It’s going to take quite a bit of work. I’m going to go play some Far Cry 6 now.
First: I am fully convinced that our development of deep learning has outpaced our societal progress and we are absolutelynot ready to deal with the consequences of unleashing deep–learning–capable consumer devices into as corporatist and click–driven a world as ours. Crunching corpora acquired without—and oftenagainst—consent or notice for gain—of any form, not exclusively monetary—is deeply problematic and unethical. If you expect this post to be a middle-ground take that acceptseven part of the current state of imagery generated by models trained on unconsenting artists’ own work, stop reading now. Destroying someone’s right to own their own creative output isnot justifiable.
But there’s an argument I hear a lot online that’s deeply troubling to me, and it worries me greatly where we’ll end up if it does not get rejected entirely in the process of pushing back against exploitative AI.
Note that Ihate the use of the term “AI” toonly mean deep learning, so while when quoting others I’m not going to alter their words, I will, myself, use the term “neural network output”.
This is a deeply unsettling and fundamentally flawed argument, but it shows up in online discussion with an extremely concerning frequency. Let’s first examine why it’s flawed.
First, the argument that “Neural networks cannot create art because it is incapable of creativity” is fully based on a false dichotomy. No AI nor other program exists in a vacuum, removed from human influence; they’re a product of human creativity. The ability of the program itself to be creative or think abstractly is entirely irrelevant; no more does a neural network need to be creative to be used to create art than a paintbrush or MIDI controller.
Systems like Midjourney use a human-provided (therefore necessarily including a degree of creativity and intent) prompt to derive images from an algorithm trained on a corpus of human-created (therefore necessarily including a degree of creativity and intent) imagery—therefore its output is necessarily a result of human creativity. Whether Midjourneyitself is capable of creativity and artistic intent is of no importance; the program is the result of human creative work, it did not writeitself—and if it did, that would only serve to prove it capable of creativity.
Second, the argument always draws an arbitrary line in the sand just beyond what the person making it is comfortable with. Anything up to that line is “real” art, usually because it predates the widespread availability of content-generating neural networks; anything beyond is “just an algorithm”.
Generative art far predates commercial neural networks and generally quickly reveals the deep-rooted problems with the “neural network output is not art” argument.A modular synth patch transforming electrical signals from mushrooms into experimental music is not the creative output of the mushrooms, but of theartist and musician.If the mushrooms are capable of artistic intent and creativity that may influence the end result, but the tools not being sapient in no way stop it from being art.
A program—whether a computer program expressed in code, an electronic one, expressed in circuitry, or even just amental algorithm to follow—can be seen as amapping ofstatic input anddynamic input into an output:
Thestatic input is the program itself; thedynamic input is provided to the program when it runs. A neural network can be viewed as a program that takes a training corpus as its dynamic input and produces another program—the trainedmodel—which takes dynamic input as a prompt and produces an output:
The mushroom patch example above had its—the connections and settings for all the electronics—provided by a human, and takes its from a nonhuman source, yet produces artistic output. A trained model takes ahuman prompt (); how can its output, then, be less artistic than, at the very least, that of the mushrooms? Hell, a lot of generative music artists buildpatches that generate music without human input beyond the patch itself () at all, whether physicallyor entirely in software.
Third and least significant (for now), the argument relies on the actual incapacity of neural networks for intent or creativity. It has a form of movable goalposts built into it, because to foolishly accept it as valid is to take upon yourself the task of eventually having to solve the problem of measuring and recognizing consciousness, if our AI development ever reaches the point where that would become a question.
Building machines that create art has probably been a dream of many artists and inventors for as long as we’ve had automation. As a musician and someone doing research in algorithmic storytelling, I’m most familiar with the history of algomusic and algo-literature;experiments in machine-generated literature date back centuries, and have employed computers as far back as the early 1970s, withSheldon Klein et al’s 1973Novel Writer andJames R. Meehan’s 1977Talespin immediately coming to mind as hallmark developments.David Cope’sEmily Howell, described in his 2005Computer Models of Musical Creativity, is perhaps the best-known example of a computer program generating new music.
My own work, and my lifelong dream, is inprocedural storytelling and narrative-generation for video games, a large chunk of which is also applicable to generative music—after all, a piece of music is itself a form of story. I dream of building a system which the player can collaborate with creatively in much the same way a TTRPG player works with their Game Master to build a story together, or how musicians play off each other at a jam session. I dream of a system which can be a satisfactory creativepartner for its user.
It worries me greatly to hear the same crowd that previously fought for video games to be recognized as art now reject algorithmic outputs as “not art”, “not human enough”, “not creative”. Yes, as an artist I don’t want to be forced into a world where the decades I spent learning and practicing my art are rendered worthless and irrelevant by someone who unethically scraped millions of works off Artstation against their creators’ consent. I don’t want to be at risk of someone creating a “Fox’s music generator” in five minutes by retraining a model on my work and having it spit out a thousand albums.
But I also don’t want to wake up in a world where we reject this not because it is unethical and vile, but because someone deems it “not art enough”.
Vocaloid music doesn’t devalue human singers. Electronic music, programmed in a MIDI piano roll, does not devalue piano virtuosity. Generative art should not devalue human artists, but itwill do so if we help it by creating a precedent of rejecting it as “not art”.
Push back against exploitation of artists, push back against building systems, without their consent, designed to strip their work of its uniqueness. The systematic erosion of artists’ rights perpetuated by training deep learning models on their creative workmust be denounced and rejected.
I want it to be denounced and rejected in a way that stands up to scrutiny; I want it to be denounced and rejected completely and unambigously, with an immutable iron wall rather than arbitrary lines in the sand prone to being redrawn in either direction at will.Consent andthe artists’ ownership of their work are immutable iron walls; subjective judgements of whether something is art or not based in the amount of effort or human control its creation entailed not only hurt artists, but leave future wiggle room for the “deep learning at all costs” crowd and corporations to redefine the boundaries of what is acceptable. This gate must not be left open.
Preserving our freedom and right to create without our work being used to train soulless corporatist AI modelsrequires condemning algorithmic exploitation; but to not hurt artists, preserving that creative freedom also requires that it be rejected because it is exploitation, because it is unethical, because it erodes our rights—and not on the basis of how much effort a finished result requires or how creative it is. To protect creative freedoms and rights we must recognize both that anything can be art, and that unethical art must still be condemned; in being careful not to gatekeep art, we must assert instead that the quality of being “art” can never justify exploitation.
I’m scared about where the galloping adoption and deployment of deep learning will take us. In a world that seems happy to, every day, hand over its privacy and rights to megacorporations, deep learning—with its otherwise awesome potential for making lives better—seems like a nightmare machine, threatening to erode our rights entirely if given insufficient oversight for even a second. And right now it hasextremely little of that oversight. It’s up to us—the users, the targets—to reject that future. It’s up to us to defend our own freedom to make art—even if it’s “just a program”.
I often half–jokingly call myself a “terribleGM”. This is not a judgement of the quality of the games I run, but it is a mindset—one that helps me identify elements thatwork in my games and formulate patterns, prompts, and ideas that I can fall back on to keep the story moving forward in a fun direction. A “terrible GM” cannot rely entirely on their own skill as a storyteller, but must create tools, rules, and guidelines they can fall back on to help them tell compelling stories in case their raw improv skills don’t suffice. This page is a collection of tips and tricks I’ve picked up over the years from my own games, from watching and listening to other GMs, and from conversations with friends much more experienced than me.
These notes are a result of very specific experience with TTRPGs—it’s rare, now, for me to get to play with experienced groups, and back when Iwas surrounded by experienced players and GMs, we bonded primarily over our love of playing horror and investigations. I’ve rarely chosen to play or run classic dungeon–crawling and monster hunting.
I played more Genesys (and the Star Wars FFG systems it derives from) than anything else, and so a lot of these notes specifically work in that system, or are meant to make Call of Cthulhu/Delta Green more exciting (I like playing Cthulhu, but the GM advice 7e gives is some of the worst I’ve seen).
They might not work in crunchier systems, or ones that more strictly mandate who around the table narrates the action and how. In particular, Genesysstrongly favors player narration, successes–with–threats, heroic feats, and cinematic pacing and action. This might be important to keep in mind throughout this post.
A lot of my approach to GMing also comes from Microscope—ironically, for a GMless game. Microscope’s “metacausal” approach—the idea that the past can be added to just as easily as the present and the future—was the biggest eye–opening moment I’d ever had when it comes to narrative design, and you’ll find that I try to aim to tell stories thatend up being interesting when all is said and done; in the moment, I prioritize giving the players compelling character arcs and big dramatic scenes, but try not to focus too much onwhere the story is going, because I want it to go where the players would be most excited to see it go. Only as an arc comes to a close is it my job to tie all loose ends and threads together and provide a climactic finale.
I also have not ran games in English. The narrative examples here might be clunky. Sorry.
This is a collection of the most effective narrative tricks and phrases my friends and favorite GMs use that I’ve picked up and adapted for my own games; these are the magic spells I keep in my spellbook to help me, a Terrible GM, run great games:
“Describe them to me” and“What do you see?” are, in my opinion, by far the most powerful weapons in a GM’s arsenal. These might not work for every system or every style of GMing, but they do avast majority of the heavy lifting at my tables—I want to make my games collaborative storytelling and do my best to avoid and dispel the impression of the GM’s role being to tell the players a story as they sit and listen. Especially with inexperienced players, this Magic Spell helps immediately assert that we’re building a story together:
“You walk into the saloon. Tell me what it’s like inside; what’s the atmosphere? What are the people like?”
“The Stormtroopers drag you down the sterile corridors of the ISB blacksite until you find yourself thrown into an interrogation room. An Imperial Intelligence lieutenant in a spotless white uniform is standing by a transparisteel window; tell me about them.”
“There’s an old ship that’s clearly seen better days sitting in this forgotten hangar bay. Describe it to me.”
“There is a weapon in the display case that immediately draws your attention. You pick it up, and it feels–perfect; as if it was made specifically for you, for your hand. It feels like an extension of yourself. What is it?”
There’s hardly a better way to make sure you incorporate ideas your players are excited for in your story than to ask them directly.
Asking a player to create a character, item, or location in this way also serves to strengthen their bond to it—they’re more likely to remember something they came up with, an opportunity to steer the story in a direction they’re excited about, than one of dozens of random NPCs met in passing. Because of that, it also serves as a convenient idiom for signaling that whatever is being described is going to be a recurring, or at least briefly significant element of the story—much like a character in a movie having their own musical cue or being introduced with a dramatic closeup shot.
Let your players narrate their failures and consequences of augmented success (i.e. including not just success and failure, but also advantages and threats) rolls. I find that Genesys encourages this a lot with the narrative dice system, since it’s so strongly biased towards success–with–threats; if having players narrate successes–with–threats, it’s not a big reach to have them also narrate failures–with–advantages.
As with all of the Magic Spells listed here, overusing this one can be dangerous and ruin the players’ immersion through what I call the “Broken Lockpick Effect”—for some rolls it’s hard to come up with side effects and consequences, and in systems with augmented success it feels miserable to have a lockpick break or the door jam every time the players attempt to pick a lock, while at the same time coming up with more interesting consequences may be particularly difficult.
Instead, “How do you fail?” works best in combat and in rolls where the players are trying to pull off something particularlycool,flashy, ordramatic. They’ll often have a better idea of what’s going on “on stage” in those cases than when e.g. rolling to interact with a computer or talk to an NPC.
In Genesys in particular I find the given tables for spending Advantages and Threats a bit restrictive, so I’m a lot more lenient with what my players can spend them on if they’re narrating a failure—I’ll allow a e.g. a free maneuver on a roll that only had one Advantage if the player’s narration of the failure justifies it.
“You jump out of hyperspace, only to see the familiar outline of theWild Karrde already in orbit around the planet directly in front of you. The ship’s computer signals missiles locking on.”
“Wait, didn’t we just hear theWild Karrde was at Coruscant? That’sdays of travel away, how did they get here before us?”
“Yes, how did they get here before you? Very strange.”
Running mysteries is hard. I would argue it’s one of the hardest things to GM. A good mystery almost necessitates careful design and meticulously planning each clue, twist, and red herring—but yet,no plan survives first contact with the players. Even if your players only need three clues to solve the mystery, with, say, a near-certain 90% chance to find each of them and, in your estimation, the same near-certain 90% chance that they’ll interpret the clue correctly, that’s…, or just over chance of the story going the way you planned it. That’s barely more than a coinflip!
This gets complicated even further—even outside of investigation–focused scenarios—by the fact that the GM is just human, and so fallible. You will make mistakes; you will forget clues you were supposed to bring up, mix up places and locations and times, maybe even accidentally use the wrong statline for an encounter. Sometimes you get lucky and it goes unnoticed and doesn’t interfere with the story, but often your playerswill notice.
That’s where this Magic Spell comes into play.
“Very strange” is an extremely powerful tool. How did the antagonists know the party would be here? Why do the two witnesses’ testimonies contradict each other, even though they have all the reasons to tell the truth? Why is the ship not where the players left it? Very strange, huh?
You weren’t planning on having a mystery here, but you now got handed one for free, and your players arealready invested in it.
“Very strange” lets your players come up with mysteries for themselves. It’s a hook you can use to create mystery where you weren’t planning on one but feel it would make the campaign interesting; it’s a way to “yes, and” the theories the players come up with, to play off plot twists that come your way by themselves. With “very strange” in your pocket, even mistakes can be hooks for new story beats.
See also:“Don’t Make Characters Less Competent Than Players”.
This one I didn’t learn from a GM, but from Matthew Stover’s legendaryRevenge of the Sith novelization:
Of course, neither I nor my players are Matthew Stover, and so it is unreasonable to expect this kind of narration in the moment; nevertheless, I find “Who is your character right now?” to be a very powerful framing spell. It might need some gentle prodding:
“What is going through Cabal’s head right now, as they stand there surrounded by ghouls, ready to attack? Who do they see themselves as in this moment, what do they think others see them as?”
Hard–hitting emotional beats come from internal conflict and from characters reevaluating who they are when faced with adversity and tough choice; let your players have and share that moment with the table. It’s the difference between a wide, unfocused shot of the scene where a door at the edge of the stage opens and a character walks into the room versus a dramatic, tense cut to the door as it swings open, revealing a silhouette of the character backlit by sunlight with a swell of the music. “Who are you in this moment?” lets the players direct a closeup, establishing shot of their character just before a dramatic action scene.
I suck at describing things. “You enter the bar. You see a bar with people next to it. There are a bunch of tables with people drinking.” Ew.
I’ve heard a bunch of mnemonics for helping guide better descriptions—SASS (“Smell, Atmosphere, Sound, Sight”,IIRC),EASE (“Environment, Atmosphere, Senses, Events”). Any of them would probably work just as well here; this is mine:
“TAVErNS”—Texture, Atmosphere, Vision, EaRs, Nose, Story. The descriptions of the senses come in order of urgency, of how immediately perceivable they are, and are nicely bookended by a story hook—a description of something that will move the story forward, which often leads very cleanly into“Describe them to me”. Here’s what aTAVErNS description of a scene where a character wakes up in a basement after being kidnapped by terrorists might look like:
You wake up.
Texture: The first thing you notice is a pressure around your wrists that keeps them restrained behind your back. You try to move them a bit and feel the scraping of what can only be a coarse rope binding them in place.
Atmosphere: The air here is stale and dusty, unpleasant to breathe. This must be somewhere underground, somewhere that hasn’t seen use—or a vacuum cleaner, for that matter—for quite some time.
Vision: It’s dark and you can’t see much;
Ears: You hold your breath for a moment and try to listen for any noises, but can’t hear anything.
Nose: There’s a vague smell of blood and rust.
Story: You’ve got to get out of here.
Nose orSmell is the spicy one here—doing research for this post, most other GMs seem to focus on smell as one of the first things, which, I have to admit, seems more logical; I just like the vibe and color of using smell to close out the physical description of the scene. “The man smells nice, and has a deep, raspy voice; he’s about six feet tall” feels, to me a lot less evocative than “The man is about six feet tall and has a deep, raspy voice. He smells nice.”, even though they convey the exact same information with the exact same words.
Any of the elements ofTAVErNS can be skipped for brevity or even to move the game forward if I can’t come up with anything on the fly, but having this checklist in mind helps me be less clunky when painting a scene.
There are also some anti–magic words, where I feel that, although theycan be used effectively—and I’ve seen friends and other excellent GMs use them to great effect—for my own GMing style, they rarely feel appropriate. The ones I hear about the most are…
I have a feeling this is going to be spicy.
“Are you sure?” and the accursed “You can certainly try” get brought up a lot as responses to the players declaring an action, but they rarely feel appropriate in my games. Not only are theyMercerisms that actively work against a GM trying to combat theMercer Effect, but I find that they can create an impression of the GM being an adversary to the players, and, more importantly, contribute to a disconnect between the table and the events of the game.
If my instinct is to ask “are you sure?”—to second–guess the players’ decisions—that can indicate a deeper problem with the scene; perhaps my player or I missed an important detail, or I failed to understand what the playerwants to happen. Similarly, when a player asks “can I do X?”, they rarely want to hear “you can try” as a response; they’re looking for information about the options available to them and the risks associated with those.
The GM’s job is neither being a safety rail for the players, nor an antagonist for them. The GM’s job is to take whatever the playerswant to do and ensure it ends up beingcool. Instead of:
“I want to leap across the river of magma.”
“Are you sure?”
“Yeah!”
roll
“That’s a failure. You die.”
Or:
“Can I leap across the river of magma?”
“You can certainly try.”
Try:
“I want to leap across the river of magma.”
“That will be difficulty three; it’s a pretty ambitious distance, even for someone as athletic as you, and you’re not sure this will work.”
“I want to do this.”
roll
“That’s a failure; you take a step back and start sprinting towards the cliff, launching yourself into the air, but the distance is too great. Your outstretched arms don’t quite reach the other edge and you hit the wall hard. The impact knocks the air out of your lungs, and as you tumble down only through sheer luck does your hand find purchase on a protruding rock. Take 5 Strain.
You’re now hanging on for dear life above a bubbling river of magma as the fight rages on above you. It’s now Mike’s turn.”
When a player attempts a risky action, they don’t want to bepunished for it; they want to create momentum, drama, and action. It’s the GM’s job to help them accomplish that.
“For any conclusion you want the PCs to make, include at least three clues.”
This one gets brought up more than anything else any time running mysteries gets discussed online. The Alexandrian post it comes from is great, but I don’t think the Three Clue Rule is the most important takeaway from it—or even necessarily a good one.
I don’t like thinking about the story in terms of “clues and solutions”; it encourages thinking in terms of “these are the beats wemust hit”; “this is the door the playersmust open to progress the story”.No plan survives first contact with the players, and if the players don’t want to or can’t think of a way to open the door, the storystill has to move forward.
Why does the the title of this section read “Half–Dispel”? Because I do, actually, agree with the linked Alexandrian post—just not with the Three Clue Rule itself. Let’s read further:
COROLLARY: PERMISSIVE CLUE-FINDING
[…] if the players come up with a clever approach to their investigation, you should be open to the idea of giving them useful information as a result.
Here’s another way of thinking about it: Don’t treat the list of clues you came up with during your prep time as a straitjacket. Instead, think of that prep work as your safety net.
Over time, I’ve learned that it’s actually a lot more fun when the players surprise me. It’s the same reason I avoid fudging dice rolls to preserve whatever dramatic conceit I came up with. As a result,I now tend to think of my predesigned solution as a worst case scenario — the safety net that snaps into place when my players fail to come up with anything more interesting.
If the door becomes a challenge the players fail to overcome, that’sgreat—I got handed a great moment to use later; I canopen the door in a dramatic scene and reveal that beyond it lies… whatever would be most fun, narratively! Not all challenges and foes have to be defeated; I can use the time the party spent trying to open the door to let the bad guys catch up to them and start a confrontation they barely escape from… only to later, at the climax of the arc, when the party finds themselvesthis close to finally defeating the Big Bad, remind them of the door and reveal that it hides the final piece of the puzzle. In a way, “missed” or “failed” clues and challenges become a bit of a “free asspull” card—they’re story beats that have already been introduced and established, but are open to go in any direction.
Going back to my complaining about Call of Cthulhu’s GM notes—Cthulhu suggests using “Idea Rolls” if the players are stuck, which, when successful, forces the GM to give them the clue outright, or, when failed, implies a timeskip to the party finding themselves in a crisis (usually, surrounded by bloodthirsty cultists). This is possibly the worst way to move the plot forward, but itdoes move the plot forward—and the Three Clue Rule post has a much cleaner version of this core idea that doesn’t suffer from the same issues:
COROLLARY: PROACTIVE CLUES
A.K.A. Bash Them On the Head With It.
Sometimes, despite your best efforts, the players will work themselves into a dead-end: They don’t know what the clues mean or they’re ignoring the clues or they’ve used the clues to reach an incorrect conclusion and are now heading in completely the wrong direction. […]
This is when having a backup plan is useful. The problem in this scenario is that the PCs are being too passive — either because they don’t have the information they need or because they’re using the information in the wrong way. The solution, therefore, is to have something active happen to them.
Raymond Chandler’s advice for this kind of impasse was, “Have a guy with a gun walk through the door.” […] in a more general sense, “the next part of the bad guy’s plan happens”. This has the effect of proactively creating a new location or event for the PCs to interact with.
The idea with all of these, of course, is not simply “have something happen”. You specifically want to have the event give them a new clue (or, better yet, multiple clues) that they can follow up on.
If the players can’t find a way to move the story forward, it’s up to the GM to keep the momentum. Any clue missed, ignored, or misinterpreted is just a hook for a future Big Reveal; something to bring back once the party almost forgets about it and use it to justify how the Big Twist was there all along.
Leaving more clues around won’t get things moving, because, sooner or later, you’ll get a party that misses or ignoresall of them, no matter how many you give them.
Players will miss hints and prompts, come up with theories, and, very frequently, get obsessed with ideas you couldn’t possibly have foreseen.
Here’s a little story:
One time in a campaign I ran, the party was supposed to meet a spy in a motel, only to find him murdered in his room with a bullet hole in his chest. Despite the particularly thin walls, nobody had heard a gunshot, which was supposed to be one of several hints for the players that the body had been carried there from elsewhere—there was no blood or shell casings on the floor, and despite the bullet having gone clear through the victim’s chest, there were no traces of a bullet impact anywhere in the room either.
My players promptly ignored all these and decided that their ally had to have been murdered by one of the motel’s cleaning staff, who then proceeded to mop up the blood from the scene (why they’d leave the body, don’t ask me). At first I assumed that idea would get dropped just as quickly as it came up, but just a few moments later the party had gotten the addresses of the two housekeepers at the motel and was preparing to investigate. They found out the first one had an ironclad alibi, after which I expected them to verify the second housekeeper’s alibi as well and realize the cleaning staff were a dead end—but get fed some helpful testimony in the process.
Instead, my players enthusiastically announced that because the first housekeeper has an alibi, the second onemust be the killer, and so they’d have to break into his apartment to look for evidence.
They didn’t stop there! They also prepared a backup plan: if they couldn’t find any definitive proof at his apartment, they would plant fake evidence—a briefcase they got from the spy—and use it to elicit a confession.
At that point I think there’s a voice inside every GM’s head going “how thefuck did this happen?” as they resist the urge to sink their head into their hands and give up on whatever cool intrigue they had prepared. Maybe an instinct to keepdeus ex machina–ing clues that would get the party back on track, or even tell them outright that they’re going really far off the rails.
But that doesn’t make the story interesting and fun.
If my players decide that the housekeeper has to be the killer—my job is now tojustify that, to have him deny it until the very end while I sprinkle little clues and hints that would confirm to the party that they’re on the right track until they finally find enough evidence to expose him and trigger an epic final confrontation with the surprise antagonist of the chapter. My job is to justify how his housekeeping job is just a cover for his real identity as a counterintelligence operative, how he used a silenced pocket pistol so that nobody would hear the shot, and how the players’ sudden arrival meant he didn’t have time to get rid of the body, despite having cleaned the blood.
No plan survives first contact with the players, but that doesn’t mean you shouldn’t plan at all—just that, rather than planning out the sequence of events (or evenjust an unordered list of beats to hit, as many resources suggest!), I find it more useful to prepare a grab–bag of “words” to insert into hooks madlibs–style; a set of possible motives for the crime, a bunch of potential types of clues to find (spent shells, eyewitnesses, signs of a fight or forced entry, etc) that I can then use in the story when my players look for them. If the party went out of their way to bring a metal detector to the crime scene, theyshould find something metallic that will move the plot forward, no matter what I had planned.
A lot of systems have fields for Strengths, Flaws, Motivations, Desires, Fears, Relationships, Histories and similar non–mechanical but narratively important details on the character sheet. They should not be the only hooks for a GM to use to involve a character in their story—theentire character sheet is a hook.
Take note of what each player invested their character’s stats into. They want to play someone with a particular set of skills and weaknesses—use them. Give the buff tank of the party more detail about how strong or threatening enemies seem, how their stance implies inexperience, or, conversely, years of physical training. If your player is playing a minmaxed master hacker, give them an opportunity to talk about their past exploits and run–ins with three letter agencies. If they invested all their points in Leadership, build hooks that ask them what it means to lead and how far they’re willing to go for their team or crew.
I’ve seen this be a problem particularly with new Call of Cthulhu GMs; Cthulhu (and especially Delta Green) has a lot ofvery specific skills on the character sheet (for example: Psychology, Psychoanalysis, Charm, Fast Talk, Listen, Persuade, and Intimidate are all separate skills; Mechanical Repair and Electrical Repair are separate skills, etc) and I’ve seen a player go “I’m going to play a machinist!” and invest most of their points into Operate Heavy Machinery and Mechanical Repair time and time again… only to never have any substantial machinery show up in the story.
Players build characters based on what theywant to do. If a player invests half their skill points into Operate Heavy Machinery, that’s them telling the GM they want to operate heavy machinery. It’s now my job as a GM to make sure theyhave heavy machinery to operate, and to make it a cool, cinematic moment when they get to use the skill in a climactic encounter.
A scientist with Research as their highest stat attempts to look for information online and they roll miserably low. Whoops, they got misled by a fake Facebook post—
No! If the player spent so many points on a skill, their character isincredibly competent at it; bad rolls don’t mean they suddenly forget how to do things they’ve spent their entire life doing. Bad rolls mean that they couldn’t succeeddespite their amazing abilities.
I mentioned, at the top of this page, how I feel like Call of Cthulhu has some of the worst GM advice I’ve seen; one of such pieces of advice ispushing rolls—“whoops, I failed a roll, let me try again”, which soon leads to the “broken lockpick effect”; if allowed, players are going to keep attempting to pick open a door until they’re out of lockpicks or render the door physically inoperable. It can completely destroy immersion and make it feel like “reloading saves” until a random roll works.
If a skilled picker attempts to open a door and fails, at my table that doesn’t indicate theyforgot how to pick orfumbled, but that unfortunately the lock is an uncommon, exotic design that will require specialized tools to defeat. An expert gunslinger doesn’tmiss an aimed shot due to a bad roll, but is instead suddenly forced to duck behind cover at the last moment while blindly firing off a round.
The only time it’s okay to point out the character’s lack of proficiency in a skill is… if they lack proficiency in the skill. Not if they happened to roll badly.
“The detectives couldn’t establish a time of death.”
“A–ha! I know time of death is established by measuring the temperature of the body, therefore it must have been stored in a freezer!”
“Your character wouldn’t know that, you’re a cook.”
No. Don’t do this. Theplayer knows that, and chances are they’re not a forensic pathologist either. They’re excited to share their knowledge and that it came in useful in a TTRPG session—that’s a great moment to celebrate, rather than dismiss or punish them for:
[…]
“A–ha! I know time of death is established by measuring the temperature of the body, therefore it must have been stored in a freezer!”
“Ooh, good trivia knowledge! You’re right; there’s somethingvery strange going on here.”
Don’t force your players’ characters to be less competent than the players themselves; if the player has a moment of brilliancy, let them feel brilliant.
I view safety tools as a necessarily two–part system with a “passive” and an “active” component. The two are, as should become clear in this section, not mutually exclusive, but are both, in my opinion, necessary for a safe, fun, and comfortable environment that everyone around the table can enjoy equally. A lot of my approach to this is informed by moderating online communities and discussions, and so I consider the single most important feature of an effective safety tool to be its ease of use. A tool that does not get used might as well not be there in the first place.
The “passive” tools are those which should not need to be explicitly invoked—because they remain in effect throughout a session, I find that my players are less reluctant to use them.Lines and Veils are perhaps the most familiar of these, and I always use them, but I treat them as shorthand; a helpful sheet to keep in front of me during play to clear any potentially spicy developments with before even considering sharing them with the table. What I think is arguably more important is a good Session Zero and productive debriefings after each session.
A Session Zero is like pitching a movie night—it’s the time to talk about what parts of the upcoming campaign we’re excited about and why, set expectations, get an idea of the atmosphere and vibe we’re going for, and assert what we’d like and what wedon’t want to see. Even with Lines and Veils and something like theX-Card in place, it’s one thing to encounter gore and body horror after signing up for a horror campaign and something entirely different to find oneself surrounded by a gory massacre in what seemed, up to that point, like a cozy slice–of–life setting.
I’ve sometimes seen concern about how to implement these kinds of session zeroes and still retain the impact of plot twists and dramatic tone shifts; I think it’s a false dichotomy. If the time seems right to turn the cozy slice–of–life on its head and shift into horror, that’s afantastic place to drop a cliffhanger and proceed to an extended debriefing, oranother “session zero”.
Especially in longer campaigns, I feel like having mini–repeats of a “session zero” at regular intervals works wonders for the quality of the story, for the players’ immersion, and to ensure the story hits everyone’s expectations and hopes while remaining safe and fun to take part in. A “session zero” or extended debriefing works wonders as the end of a chapter or act of the story and a time to talk about:
An “active” safety tool is one that is out of play until explicitly invoked by a player. TheX-Card is perhaps the most well–known example, but I personally don’tprefer it for several reasons that I’ll get to in a second. I’m happy to play with an X-Card available, and I’ll almost always prioritize choosing safety tools that my players are already familiar with, if possible—but if given a choice, I prefer a slightly more flexible system. See also:“The Insufficiency of the X Card And Story Games Safety”
The single most critically important attribute of an effective active safety tool is minimizing or entirely eliminating any friction involved in using it. If a player is reluctant, embarassed, afraid, or unsure how to use a safety tool, it’scompletely ineffective as a safety tool. An active safety tool should never involve memorizing a dictionary or language of symbols and phrases and learning involved protocols. It should also not ask the player to justify their use of it.
I haven’t found a better way to get players comfortable with safety tools than to use them myself openly and actively.
I picked up a streamlined variation of theScript Change toolbox for my games, somewhere halfway between that and the X–Card, closest perhaps toRoll20’s Safety Deck (which I wasn’t familiar with until doing research for this post!).
I findScript Change to be overly wordy and clunky, with a lot of overlap betweensafety tools (the Pause and Rewind cards) and standarddebriefing or even normal gameplay elements that can easily feel forced if formalized in this way (Vignettes, Freezer Frames, the Red Carpet Walk), and way too many terms and ideas to remember (What’s a pick, squick, and ick? What’s the difference between PG and PG-13? Is cutting off an arm PG-13 or R? What do two fists mean in response to a “Thumbs up?” check?) that make it entirely unviable, in my opinion, to implement as–written—but its core, the pause/fast–forward/rewind system works great… Mostly.
It’s sometimes hard to draw the line betweenRewinding something because a player is unsatisfied with their roleplay or consequences of their actions versus use as a safety tool, and the ability toFast–Forward isn’t sufficient to express the preferred way of handling sensitive scenes—sometimes I want to reveal an important hook during a scene, and skipping forward with “the screen fades to black, we resume when John’s chest is already open and you can now see that he’s a robot” is not a narratively satisfying option; this alone makes me reluctant to use Script Change—any safety tool where I can foresee myself or anyone else questioning or trying to look for ways to sidestep its usage is not useful at my table, and could even be actively harmful by creating anillusion of safety.
The Roll20/Burn Bryte Safety Deck is perhaps the most frictionless and useful of the active systems I’ve seen. It’s a tool that, at its core, encompasses three verbs—“Keep Going”, “Slow Down”, and “Stop”—and I’ve been using a closely related system extended with a fourth one:
I find the “Stop” verb to suffer from the same problems as the X–Card, and so I feel it works better when the players have two options explicitly available to them:
I feel like effective implementation of these safety tools requires two things from the GM:
I care about privacy a lot, and don’t like Internet monopolies. For that reason, this sitedoes not use Google Fonts, Google Analytics, or any other Google service. I serve fonts directly and do not collect any traffic metrics or any other user data. I don’t collect your IP, I don’t collect yourbrowser fingerprints, I don’t track your location or even how you got to this site. It neither sets nor reads any cookies.
I use a grand total ofone external service to serve this site—GitHub‘s servers. You can read about their privacy practiceshere.
This website is built automatically from myObsidian notes byspacedock
, my Obsidian–to–Zola exporter proudly powered byRust. It is built automatically and hosted thanks to the generosity of GitHub. Zola is licensed MIT, and the full text of its license is distributed with this site asLICENSE_ZOLA.txt.
The font used for all variable-width text on this website isInter, used here in accordance with the SIL Open Font License, Version 1.1, the full text of which is available underLICENSE_INTER.txt.
All icons on this website come fromRemix Icon, distributed under the Apache License, the full text of which is available underLICENSE_REMIXICON.txt.
formulas on this website are rendered usingKaTeX, used here under the MIT License, the full text of which is available underLICENSE_KATEX.txt.
The CSS for this website includes directives fromnormalize-scss
, used here under the MIT License, the full text of which is available underLICENSE_NORMALIZE.md.
The link graph that shows up below pages with JavaScript enabled is rendered withD3.js, used here under the MIT License, the full text of which is available underLICENSE_D3.txt
Both Foxspace andspacedock
proudly includeno GPL–licensed code whatsoever.
This page serves to collect some of the things I’m proud of and would like to showcase:
Cozette, my bitmap programming font.
Placing on the globalLord of White Spire leaderboards inDota Underlords. As of writing this I peaked at #104 in the world. I’ve been hostinghourly snapshots of the ladder since 2023-08-27.
Musical and administrative work withThe Garages, with whom we’ve made the news at least twice:
And had the honor of playing for charity atDesert Bus For Hope notonce, nottwice, butthrice.
One of my favorite pieces of software lore isGreenspun’s Tenth Rule:
This page collects occurences of the strict formulation ofGTR, as well as the following generalizations:
Any sufficiently complicated C or Fortran program contains an ad hoc, informally–specified, bug–ridden, slow implementation of half of Common Lisp.
Any sufficiently complicated program contains an ad hoc, informally–specified, bug–ridden, slow implementation of half of Common Lisp.
Any sufficiently complicated program contains an ad hoc, informally–specified, bug–ridden, slow implementation of half of a high–level scripting language.
This is me.
I useit/its pronouns 🏳️⚧️. I’ve been on E since 2024-02-02.
During the day I work as a Python/Rust developer writing boring web backends. At night I make music withthe Garages.
I madea font once.
You can find me on:
I compiled running lists of tech, software, and music gear I use underTech Nanoreviews andMusic Gear Nanoreviews.
-----BEGIN PGP PUBLIC KEY BLOCK-----mDMEZbE2kxYJKwYBBAHaRw8BAQdAnqab0IINHdK8JXXOOo/4OmhCZV2aO7aBeifCRn/+ebi0GkZveCA8c2xhdmZveG1hbkBnbWFpbC5jb20+iJMEExYKADsWIQT+lAMCC36ulcurgpAJ+8Xn8ql4hAUCZbE2kwIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRAJ+8Xn8ql4hJg2AP4x8nN/FlraksPUu2CM3L5RxnMU0E/QEJeOlR9Qa9v+AwEAzu+puHUtAzSFf4uGnivpbFCiIxmZFEy5m8K2XSCQXwO4OARlsTaTEgorBgEEAZdVAQUBAQdAMUVx1V9V//dqFYv/u0l8JnbWq5jVcPbGzIWtXpU/L0cDAQgHiHgEGBYKACAWIQT+lAMCC36ulcurgpAJ+8Xn8ql4hAUCZbE2kwIbDAAKCRAJ+8Xn8ql4hJJbAP99t+7K2h5Se6QxcW/4M/jtww15g74NvQgzoQQObAIE1gEAidMi26kEEDqYVBPhMF9bJ8RAgsZR0PRnOl24+vS+iAU==8xai-----END PGP PUBLIC KEY BLOCK-----
I recently had the honor of playingKestrel Eliot’s wonderful“Goblin Market” with two dear friends of mine; aGM–less roleplaying game about a magical market happening on a solstice, when the veil between the mortal world and the fae realms is thinnest—about “getting to know your characters, meeting fae beings, and ultimately deciding where you belong”.
This post is a retelling of our session from the perspective of my character, Anna. If you find it at all intriguing, I wholeheartedly recommend grabbingall of Kestrel’s games—they’re delightful, and even just reading through them makes my imagination run wild.
Turns out when you put down a card asking “Do you ever long to be fae?” before three trans people, late at night, with lights dimmed, with everyone in character and with minds filled with images of stalls upon stalls of otherworldly trinkets, merchants and guests that seem both surreal and more real, more physical and present in the here and now than anything anywhere else—amid jolly assertions of “this is only about the game and this purely fictional scenario” and shivers of excitement and anticipation for hearing about the fair folk, what results is an absolutely magical way to spend an evening.
Dusk falls and the warm light of sunset soon gives way to dim moonlight; it’s still comfortably warm—it’s the summer solstice—but out of the sun, the shapes of the woods grow more vague, seem to shift silently with every movement we take; the veil between worlds is thinnest here. It’s finally time for us to step through to the Goblin Market.
I’ve never “travelled”, really. Sure, I left the old village behind as soon as I was independent enough to start afresh on my own elsewhere—anywhere else—but I’ve never gone out of my way to “visit places”. My world is this: my tiny (or, as others diplomatically call it, “cozy”) third–floor apartment, the two blocks it takes to get to the grocery store, a bus stop, and a few select places that bus, infrequently, takes me to. It’s a small enough world to fit entirely in my memory; I could retrace every crack in the sidewalk, every discarded piece of chewing gum so old it has fully petrified and turned into a geological feature.
It’s hard to feel like one can put down roots in a place that fits entirely in one’s head. I think to feel like youbelong is to feel desired by your home; for it to want to keep you there, and for you to want to be kept around. There simply is no room for that in a home that fits in your pocket.
After a time, it starts to almost feel oppressive, in a way; the constant stream of unfamiliar faces—or worse, familiar ones that you find yourself incapable of connecting with—a constant reminder of being an outsider here, of some profound, fundamental disconnect between yourself and the spaces you inhabit. At times, late into the night, I find myself wanting nothing else but to run away again, to leave this all behind—unnoticed, just as I have been since coming here. I’d like a home that comes without an expiration date, one where I could stay without it turning into an overstay; one that takes effort to leave rather than to remain in.
But so far, I’ve been happy with the brief escapes to the Goblin Market every solstice. It always seems to come just in time for when I long for a breather most; for those moments of doubt where I miss my cousins and the life I left behind.
There’s a local coven of witches close by—I visit from time to time for fresh herbs and spices and polite, impersonal small talk about the weather. They’re nice; there’s a calm steadiness to them—every time I stop by, it seems like everything is right where it was last time, like I’d just left seconds ago. They ask if I’d like to join, at times, but I always decline; I wouldn’t fit in, I’d always feel like an outsider.
On solstices, I come by in the morning so that we can travel to the Market together. We cram ourselves into a rusty old Vanagon that runs half on gasoline and half on sheer determination and I half–doze off in the back seat to the gentle chorus of their chatter, jokes, and stories about (often surprisingly steamy) encounters with the fae.
By the time we arrive, my cousins are already there, waiting.
Elizabeth is just like the last time I saw her—warm and happy to see me again, but with a shade of carefully concealed dark circles under her eyes, as if she hadn’t slept last night.
Grove is sitting on a fallen tree trunk, tracing shapes in the dirt with a stick; she’s clearly pretending to be politely disinterested and slightly bored, but the spark in her eyes betrays her barely–contained excitement. She looks up at me and for a split second that spark flickers as a sudden rush of different thoughts visibly runs through her mind (recognition, then relief, something that looks like concern; her eyes dart to the side—maybe some kind of internal conflict, indecision?—then, for a flash so brief it could’ve just been my imagination, a joy and liveliness I haven’t seen in her before) before—she blinks—settling back into the initial excitement.
Ah. She’s still concerned about Lou, I suppose. From her point of view, it was losing him that made me run away, and the Market only keeps that wound fresh. I haven’t told anyone else about the love we had—it was his own, fully informed decision to eat with the fae, to leave everyone behind; let the others celebrate the time we had with him, rather than sour his memory with the pain of loss. I’d like to think I’m over that—here I am, after all, ready and wanting to enjoy the Market free of worry or guilt—but I suppose the fact I’ve kept everyone at an arm’s length since then tells a different story.
It’s good to see them again.
The veil between worlds shimmers softly as we pass through, and instantly find ourselves surrounded by constellations of dancing, otherworldly lights, by music, singing, laughter, the clinking and clanking of coin, trinkets, shoes, and hooves. Even the witches fall quiet for a moment, taking in the sights, sounds, and smells of the Goblin Market, before being greeted enthusiastically and ushered aside by a leprechaun, leaving me, Liz, and Grove browsing the stalls and displays together in quiet wonder.
It doesn’t take long for us to split up naturally as I fall behind, entranced by a display of magical jewelry. I always end up picking up a ring, bracelet, charm or pendant at the Market; I’m not drawn to the more intentionally magical items, like those used for divination or charms and hexes, but I find it comforting and reassuring to keep a small piece of the fae realm around my wrist or finger. Maybe it’s some form of coping with losing Lou; I should ask my therapist when I have the chance. I end up trading a dozen dreams to a lovely elf for a bracelet of silver moonlight that, when at the edge of my vision, seems to glow with an otherworldly, blue radiance. I exchange smiles and compliments with the elf and turn to leave, only to find my face at chest height with and my nose filled with the intoxicating scent of a striking, antlered fae, towering over the crowd.
Oh no. He’s hot. Shit.
It’s something more than just that, actually. Something about him seems more real and physical than everything around us; despite the dim half–light, I can see each hair of the dappled fur covering his hooved legs, the soft fuzz of the remnants of velvet on his antlers, every detail of his friendly, warm, dark irises. The noise and joyous chaos of the Market suddenly seem muffled, as if I’d had earplugs in this entire time, as if I’d been looking through a dirty and smudged camera lens. He says something that bypasses my ears entirely and I hear myself respond, too busy trying to hide how flushed I am to register my own words. He gestures towards a fire flickering at the edge of the Market, away from the commotion of the stalls and carts and tables and undulating crowds, surrounded by a circle of deerfolk. I tear my eyes off him, long enough to snap back to reality and hear him ask: “Would you sit with us?”
The deerfolk are as integral to the summer Markets as Summer itself. They’re secretive—which isn’t particularly odd for a fae, I suppose—but friendly and welcoming to a fault, always shifting between stalls and displays, helping ensure that the needs of all the guests are met, resolve any arguments, and keep human children from running off into the woods. In quieter moments, though, they seem to prefer to stay together, and it’s not common for an outsider to be invited among them. I feel honored.
As we approach the fire, I notice it’s not just the glow of the flames flickering and dancing across the trees; small lights dance around the circle and dart between the antlers of the deerfolk like fireflies. The fae welcome us with nods and smiles and shift around, making room for us to sit among them.
“We have a little game we play before Winter comes,” my companion explains as he points to the dancing lights, “to bid our secrets farewell and let them roam free.”
“Wait. What happens in winter?” I ask. I’ve never seen the deerfolk around for the winter Markets.
“I cannot hear what he says. The glow of moonlight. The crackling flames. My heart wants to leap out of my chest and roam these woods for the rest of my days,” he replies.…Huh? Before I can come up with a follow–up, the fae to my left hands me a piece of kindling and offers a hand. “Speak what weighs on you. Let go of it.”
Sure. In a way, that’s what I come here for every solstice. This could be nice.
I close my fingers around his, letting the magic of this touch that can only happen once a year fill me for a moment. I take a breath, feeling all the complexity, life, safety, danger, births and rebirths of these woods fill my nostrils.
“The words I spoke are no longer a part of me. This is not what I said. That part of me is gone, free to blossom in the fae woods.”, I whisper as I clutch the fae’s hand tighter and throw the branch into the fire. It instantly disappears in a burst of flame, leaving behind an ember that rises, glowing brighter and brighter, circles around my head, then darts off into the night sky. The deerfolk erupt in joyous cheering and throw a rain of smaller kindling into the fire; I look to my left, at the one holding my hand. He smiles warmly. I smile back, feeling as if my chest is suddenly lighter; as if it’s now inexplicably easier for me to breathe.
I notice an animal peek out of the woods, looking directly at me—some kind of small, elongated forest creature, with dappled fur, slender, impossibly long limbs, and a crown of many sets of antlers around its head. It bows its head in… greeting? acknowledgment?
I nod back, and by the time my eyes return to where I saw it, it’s gone. My partner grabs a piece of kindling of his own and prepares to speak—
By the time I exchange goodbyes and thanks with the deerfolk, the Market is quieter. As the witching hour—and the fae feast—draws nearer, children are ushered back home, escorted by those humans who don’t want to risk facing the temptation of the feast and the wilder parts of the night. Most wares and displays are being hurriedly packed away. The air is thick with anticipation.
I find myself by one particular display that sets up here every solstice, right next to the tables of fae food; the sole stand at this end of the Market ran by humans rather than fae. Grove is right there, completely absorbed in an excited conversation with a kelpie or selkie or some other kind of water spirit—I never quite learned to recognize them; I’m more of a mountain and forest person than a swimmer. Elizabeth is nowhere to be seen.
The display is unlike most other displays at the Goblin Market. It is not here to sell wares, offer entertainment and nourishment, or showcase artistic craft. It’s lined with diaries, letters, old, seemingly worthless trinkets, toys.
Those who eat of the fae feast cannot ever come back, and I’m told it’s exceedingly difficult for them to even visit Markets too close to their past lives. This display is here to celebrate those who manage to do so, and keep alive the memories of those who don’t. Throughout the night, most who visit this stall are just passers–by, idly reading through the letters to pass the time, sometimes reminiscing and exchanging gossip and anecdotes with its caretakers.
But sometimes, a fae walks by and recognition flashes in their eyes; the villagers rush to greet them, jumping with excitement, exchanging hugs and handshakes and cheers that echo across the entire Market. The celebrated has, unexpectedly, arrived in person at the celebration.
I’m captivated by the letters and diaries. I find myself daydreaming about what these people were like, what led them to leave everything behind, how strong their resolve must have been to be sure that their place was in the fae realm, that theybelonged on this side of the veil. With the feast just a couple steps away from me, with only a magical barrier that’s about to fall between me and a bite that could change my life forever, there’s something fluttering in my stomach. A moth that gets to see a flame only once every solstice.
As I flip through another diary, a horn call shakes the trees and the Market falls silent. Everyone turns towards the tables next to me with hungry eyes; the barrier around them shimmers and brightens, glowing with a blinding otherworldly blue for a moment— and then vanishes completely.
I don’t remember putting the diary down or walking over. I’m standing before a thick wooden table covered entirely with carvings, words, stories, illustrations; I only realize I’ve been holding my breath once I get lightheaded. There’s a plate of pie in front of me; it smells like home. Not like my childhood home, or my tiny apartment—it smells like Home, like Belonging, like Safety and Warmth and Rest. I cansee how crunchy and satisfying the crust is, how warm the filling.
It’s the most beautiful thing I’ve seen in my life.
The moth in my stomach flutters its wings wildly, yearning for the flame. A pressure grows in my ears, drowning out all sound.
I look up just in time to see Grove interlock her fingers with her fae companion’s as she raises something to her lips. I reach out my arm, open my mouth and draw in air to yell out—too quickly, I’d forgotten I was holding my breath; I choke on the inrush of air and find myself unable to make a sound. Grove and her friend disappear behind other fae and humans who rush to the table—and the last I see her is as she takes a bite and smiles, her eyes glowing with a warmth and joy I’d never seen before.
The pressure disappears, giving way to cheers, singing, yelling, and all other sounds of revelry. I don’t look back at the fae pie. I walk away from the table towards the entrance, where the witches are excitedly showing off new purchases to each other.
The Moth flutters in my stomach.
I have a little rack in my workspace full of audio and network gear and housing a couple whitebox microservers of various form factors. For my workflow and day–to–day adventures in the digital realm, they’re more than just hosts to run software or store data on.
I likebuilding computers. I also like managing computers—before life led me down the path of software development, and back when that was a common position and hadn’t yet been replaced by “devops”, I wanted to be a sysadmin one day. In fact, I like managing computers so much, I favor an approach to hosting servers vastly different from the way they’re “classically” used; one that maximizes their utility, their user’s comfort,and encourages perpetual, ongoing improvement and refinement.
The Jargon File, version 4.4.8 defines a server as such:
- server: n.
- A kind ofdaemon that performs a service for the requester and which often runs on a computer other than the one on which the requestor/client runs. […]
The term “daemon” has a specific meaning in computing, but was chosen intentionally to evoke the Latin (and earlier, Ancient Greek)daemon—atutelary deity, familiar or guardian spirit for a person or place. Adaemon follows, guides, and aids whoever it is bound to.
It’s easy to think of servers as merely a host to deploy software to and forget about, but they can be so much more—with mobile internet connections and portable, internet-capable devices being so common now, a server can be acompanion available for help anywhere, at any time.
Over the years, I’ve found these principles to be most useful when looking to bind your owndaemon:
Give them a name.
At the very minimum, make the hostname something short and memorable—”calcifer
” is much easier to remember than233.252.0.123
, and reduces the friction of addressing your daemon, whether in a script, a browser’s address bar, or even directly by name.
Give them a home.
Make your daemon accessible over a network. It can be your local intranet—they don’t have to be exposed to the entire Internet—but at the very minimum, you should be able to SSH into the server and get greeted by a familiar and ergonomic environment for interacting with it. Web-based dashboards likeRed Hat’sCockpit are a fantastic option for this; you’re looking for something that lets you verify your daemon’s health and mood and run any necessary updates, changes, or deployments remotely and as easily as possible.
Give them a voice.
A daemon you can’t interact with, or one that cannot interact with the outside world, is hardly useful. We need to give them the ability to act when summoned; teach themverbs to perform.
This is something you’ll develop over time, as your daemon grows with you. Once you bind a daemon, you’ll start noticing more and more little problems and inefficiencies that could be optimized away with your daemon’s help, removing friction in your daily life and work.
For inspiration, here are some verbs I’ve taught my daemons:
Home automation; lighting or temperature in your household, if it’s equipped with smart devices that can be controlled by a server
Internet filtering and network management;Pi-hole is one such “off–the–shelf” daemon that can be easily bound to even a relatively underpowered machine
Provisioning SSL certificates for my intranet
Acting as a netboot host to enable me to quickly provision new machines at home without having to look for a USB stick
Chat assistance
Some of my daemons get taught to communicate over e.g. Discord or IRC. They range from a quiet presence in the background that silently handles chores like role and channel management to full-fledged and beloved members of their respective spaces. These types of daemons tend to grow particularly fast—they might start only handling one thing, like automating a boring task like creating channels and assigning roles, but inevitably later end up getting taught any functionality I think would be useful in the moment.
Ilta, the most powerful of my daemons and silicon roommates, has, over time, gained the ability to, among other things:
She also (if explicitly allowed to) participates in the chat, adds reactions under messages, and sometimes hops in voice channels.
Having your bound daemon physically inhabit the same space as you makes the experience particularly fun. Something about how the human mind works turns the annoyances of normal machines—fan and drive noise, heat, reboots—into charming quirks that serve as gentle reminder of your silicon roommate’s presence. The background updates and reboots become regular “naps”; the normally jarring thudding of enterprise hard drive heads becomes the familiar sound of your daemon being deep in thought; blinking lights a sign of presence. A well–behaved machine given a name and a voice becomes almost as familiar and as integral to the homeliness of one’s living space as a pet—and that affection, in turn, makes it far more natural to care for the machine and interact with it regularly.
There’s nothing wrong with treating a server as a simple tool or platform to deploy your code to once and then never touch again unless something breaks—but it’s a lot morefun to have it become your companion or even roommate.
The Garages (bandcamp) are an online band with an indefinite number of members (definitely more than 20, though) that spawned out of theBlaseball fandom and the restlessness of dozens of musicians, both aspiring and current, stuck at home amid the pandemic lockdowns.
I first had the honor of playing with the Garages on the first“AWAY GAMES” and shortly after“BLATTLE OF THE BLANDS”, the second album in theAway Games series, was invited to help out in an administrative–and–production capacity.
Some of my prouder achievements with the Garages are:
Foxspace is made possible byspacedock
, my Obsidian–vault–to–Zola–site compiler. Since neither Obsidian nor Zola alone fulfill all my needs, I instead built a system that processes Obsidian notes to a format Zola can work with and enriches them with data necessary for the nicer features of this site (like tooltips or the link graph) to work.
The pipeline is:
spacedock
, a Rust executable, consumes the Obsidian vault and spits out a Zola project. It also does some basic linting, like making sure the front matter parses correctly and warning me about unreachable notes or dead links.spacedock
output.Foxspace has existed, in various iterations, as a couple differentJekyll sites, then later a Zola blog. It has always been either a completely static personal website with just an “about” section and a list of projects, or a classic, chronological blog with tags and whatnot. Eventually, I realized that format just doesn’t work for me—a classic blog encourages publishing content only once it reaches a sufficient length and gets proofread and edited, and then never touching it again once it’s live. That’s not how I work at all.
My notes areliving notes–I go back and forth editing and extending them as my thoughts about them develop. Until the current iteration of Foxspace, they’ve been scattered between Foxspace,Notion, my self-hostedTrilium instance, and, at work, various Google Docs and Confluence pages. I wanted my notes to be:
This last point ruled out alot of implementation languages and stacks; I was initially looking at Python because of how easy it makes it to extend and modify third-party code, but Python Packaging is still a headache, upgrading interpreter versions necessitates recreating a virtualenv, and all ofpip
,virtualenv
,setuptools
, andpoetry
run into issues and bugs from time to time. I wanted to leverage an existing static site generator to avoid duplicating work someone else has already done, but Jekyll was out of the question (since I’m not at all familiar with Ruby) andHugo is written in Golang, which I feel should be a crime to unironically consider for any purpose at all. That left Rust and Zola.
Independently, I found Obsidian—the first note-taking app that I didn’t really have any problems with. It even has Vim keybindings! Despite being closed–source (ew!), Obsidian uses “normal” Markdown and straightforward, plain directories to manage notes, so I figured it’s not too much of a risk to use it.
The path was, therefore, clear: I would use Obsidian to author my notes, and Zola to compile them into an accessible website I could make available on the Internet.
My first point of headaches was Obsidian’s slightly–scuffed version of “Markdown”. Zola usespulldown_cmark
for processing Markdown, which implements theCommonMark spec. Obsidian… doesn’t.
Obsidian, as far as I can tell, extendsGitHub–Flavored Markdown with:
%%
and get removed from the source when rendering.$
and not including any line breaks, which gets rendered with KaTeX inline.$$
and potentially spanning multiple lines, which gets rendered with KaTeX in display mode.[[wikilinks]]
, which resolve funkily - if both/a/foo.md
,/b/bar.md
, andfoo.md
exists,[[foo]]
will resolve to/foo.md
, and[[bar]]
will resolve to/b/bar.md
![note]
.mermaid
as the language.==
.Unfortunately, there’s no official spec or parser for “Obsidian–Flavored Markdown” (OFM), so I had to implement my own.
It took me a full week of iteration and rewriting myOFM parser to get it to an usable state. Rust makes it extremely difficult to extend other people’s code, so rather than hack Zola orpulldown_cmark
, I had to implement my ownOFM–to–CommonMark transpiler. As of 2023-07-05, it still lacks support for callouts, but for now I can equally well just wrap those in a<div>
with a special class.
I started working on the parser on2023-05-18, but it wasn’t until 2023-06-02—over two weeks later!—that I finally ironed out all the bugs. In retrospect, building anOFM parser from scratch would’ve been easier than trying to preprocessOFM into CommonMark. Since the various Obsidian extensions don’t get processed when they’re inside code blocks, and interact in often–unpredictable ways with line breaks and indentation, processing them is much harder than just running a regex replace.
After many rewrites, I ended up with a system that marks ranges of theOFM source asKeep
(for, mainly, inline code and code blocks) orProcess
(for all the text elements where it’s legal for Obsidian extensions to occur) and runs sequential regex searches that fail if they match inside aKeep
range, but otherwise subdivide whatever ranges they encompass into further extension-specific operations.
At the end of the process, I get a list of source spans annotated with operations (Keep
,Process
,CompileWikilink
,Highlight
, etc. etc.)—since they’re independent, I can distribute processing each span between threads to speed up the compilation (Rayon is incredible!), and finally just concatenate the results.
Wikilinks get resolved by looking for the shortest matching path among all notes and rendered as aZola shortcode; LaTeX gets compiled serverside usingkatex-rs; highlights just turn into HTML<mark>
tags. Mermaid graphs are… a bit of a different story.
Mermaid…sucks. Its layout engine is unpredictable and difficult to work with, the SVGs it renders turn into a mess in Firefox’s reader mode, the library weighs 3MB even minified, and, most importantly, its implementation is the ugliest pile of web garbage I’ve seen in my entire life.mermaid-cli
works by literally spinning up a headless Chrome instance. It’s disgusting.
Unfortunately, Mermaid is also quite a bit easier to edit than Graphviz and comes built into Obsidian; since I want to minimize the friction of notetaking, going with what’s already available is the preferred choice, even if the software is a disaster.
Compiling Mermaid is quite a bit different to the otherOFM features; the entire rest of this site builds in around 60ms, but adding just one Mermaid diagram adds over a second to the runtime, and a requirement to run Google software to the editing process. It’s disgusting.
I tried to rip out the dependency on Chromium and replace it with Firefox, but without success. I guess I’ll have to fork Mermaid and make it run with Node, eventually.
For now, I just spawn a detachedmermaid-cli
process for every Mermaid diagram that processes its diagram in the background whilespacedock
goes on to handle the rest of the markup. This triggers a lot of unnecessary Zola reloads as the diagrams get saved, but I don’t see a way around this for now.
This gets me fromOFM to Zola–Flavored Markdown; i.e. CommonMark–plus–Zola–shortcodes. The next step is translating Obsidian’s YAML front matter into TOML for Zola.
Front matter is easy; a lot of keys are the same between Obsidian and Zola (title
,date
, etc).spacedock
parses the YAML front matter in notes, removes all the keys it doesn’t know about (which are assumed to be Obsidian–specific), adds its own keys (authors
, apreview
, and some extra metadata to be used by templates), serializes it as TOML, and prepends it to the compiled CommonMark body. The note is now ready.
This is still far from ready for Zola to build the site, though.
Zola is great if you use it as a “vanilla”, pretty barebones static site generator. Otherwise, it becomes pretty difficult to work with, since it lacks any sort of plugin system. This means anything nonstandard we could want to achieve, like Markdown extensions or even adding classes to rendered HTML elements, has to be achieved through a combination of:
spacedock
itself)In particular, Zola notes are all rendered at the same time, and so they can’t really access the data attached to other notes. This means that if I want to fetch the metadata of another post—e.g. to display recent posts, backlinks, previews, etc—that metadata needs to be compiledbefore Zola runs and loaded in the template code.
spacedock
scans the content of its processed notes and builds three indices:
.json
file in the site workdir..json
file in the site workdir.With the backlink and page preview indices, I can access the necessary metadata about notes in Zola templates before they actually get rendered. I use this to fill out the “pages that link here” section in the same step in which wikilinks get resolved, rather than having to post-generate it and probably fill it out with JavaScript.
Alot of the logic is built by abusing macros. In particular, this idiom:
{%set list = []%}{%for elemin iterable%}{%if condition(elem)%}{%set_global list = list | concat(with=f(elem))%}{%endif%}{%endfor%}
effectively implementsiterable.filter(condition).map(f)
; combined with the ability to have recursive macros and themarkdown
filter, I have everything I need to do almost arbitrary computation in my templates. If all you have is a hammer, every problem can be solved by applying blunt force.
Because templates can load arbitrary data from JSON and other files at compile–time, this also means I can, luckily, avoid having to generate templates withspacedock
.
I have asite_src
directory with a Zola project sans content that gets copied over to the build directory almost unchanged. After interpolating the graph data into the JS source and exporting the preprocessed notes, I end up with a complete Zola site ready to be built and deployed.spacedock serve
wrapszola serve
and watches for changes in the source directories (bothsite_src
and my Obsidian vault), so that if I make an edit, it automatically killszola
, re-exports the site, and restartszola serve
to let me see the site live in my browser.
Rust isreally fast, by the way, especially with Rayon. Setting the thread count too high slows it down a bit—on my 5900x leaving it at default (12 or 24, I think) roughly doubles the runtime compared to the sweet spot of 4 threads—but with the right settingspacedock
preprocesses all of my notes in under 50 milliseconds, and I haven’t spent much time optimizing it. Zola is much more heavily tuned, and takes roughly four times as long to render the site—although I suspect most of that time is spent in templates.
Now that I have a complete Zola site, all that’s left is to deploy it. For that, I use a simple GitHub Actions workflow, roughly equivalent to:
on:push:branches:["main"]name:Build and deploy GH Pagesjobs:build:name:Deployruns-on:ubuntu-lateststeps: -uses:actions/checkout@v3 -name:Cache Rustuses:Swatinem/rust-cache@v2 -name:Cache zolaid:cache-zolauses:actions/cache@v3env:cache-name:cache-zolawith:path:/usr/local/bin/zola... -if:${{ steps.cache-zola.outputs.cache-hit != 'true' }}name:Install zolarun: ... -name:Build site with spacedockrun:cargo run --verbose --bin spacedock build -name:Minify JS, CSS, SVGrun: ... -name:Deploy to gh-pages branchrun: ...
With the caches in place, the updated site is live within a minute of me running agit push
!
spacedock
isn’tquite feature-complete yet. In particular, I’d still like to:
println!
andeprintln!
mermaid
graphs serversidenewtype
s to distinguish between paths in the vault directory, paths in the output directory, output URLs, and Obsidian wikilink “partial paths”. This usage isn’t consistent, and my implementation is terribly unergonomic.mermaid.js
Digital Gardening is a particular philosophy for organizing and publishing notes and writing, bridging the gap between traditional longform blogging, ephemeral tweets, personal Wikis, andZettelkasten. This site is my attempt at adapting this approach for my own modes of collecting and developing knowledge.
I’ve found the most inspiration inJon Sterling’s Forest, which closely followsAndy Matuschak’s Evergreen Notes concept.
The tooling I use is modeled afterJacky Zhao’s hypertext garden.
I like narrative–heavy roleplaying games a lot.Genesys is my favorite “classical”, DnD–style system and, despite it beingheavily narrative–based (rather than relying on numbers and tables), about as light on narrative as I like to get. I do like more numerical, dicerolly systems too—I’ve had a great time withWorld of Darkness andCall of Cthulhu, for example, but given a choice, I tend to lean more towards pure collaborative storytelling.
The unfortunate reality of friend groups split across timezones and continents means I also tend to play solo, journaling games to get my roleplaying fix.
With those in mind, it should come as no surprise that a lot of the games I play lend themselves particularly well to written retellings, and I like preserving some of my more exciting sessions and campaigns in this way.
This page serves as an index of my thoughts on TTRPG mechanics and design, as well as an index of those very retellings.
I collect some of the most useful advice and tricks I’ve picked up on theGMing page.
Some of the more memorable systems I’ve played include:
My favorite system to run and play,Genesys and theFFG Star Wars system it spun off from. I find it unparalleled when it comes to introducing new players or those only familiar with “crunchier” systems to more narrative–heavy roleplaying. Itsdice system, despite requiring bespoke dice, is among the best I’ve seen.
I have some notes for Genesys–specific house rules and deciding whether to roll Cool, Discipline, or Vigilance, which is a frequent dilemma when using the system.
“Goblin Market” fromKestrel Eliot. It plays very similarly to”For the Queen”—both games share the same idea of exploring a character’s emotions and history through the core loop of “draw a card, answer a question, discuss with the table” culminating in a final question about their core—but I find it to be much more focused on themes of identity and belonging and so much more emotionally intense. It prompts a lot of joking assertions that “this is only about the entirely fictional scenario we’re roleplaying right now” before answers, and softly provides a setting for cozy, safe vulnerability like few other games I’ve played do. It’s delightful.
Aconcept is a particularly significant resident ofFoxspace—something with ashape, aword with adefinition. These thoughts have exceptional influence over the layout of this space, as they serve as the origins and destinations of other thoughts. They are alsoimmutable references; theattributes of the things they describe may change over time, just like person’s personality or appearance, butwhat they describe cannot—Foxspace as a space may change completely, but theconcept of “Foxspace” will never refer to anything else but itself.
This space is my twist on theDigital Garden idea, seeking to bridge the gap between personal website, blog, note archive, and knowledge repository.
If you’re unsure where to go from here, you may find it useful to start at:
Foxspace is built the way I wish the Web as a whole still worked—to serve and reach people, not advertisers. It’s built with open–source software, has no trackers, and remains usable without Javascript, and even without CSS. It respects your privacy and the intellectual rights of the countless people who have, knowingly or not, contributed to its existence. You can read my notes about itsdesign andthe code that powers it, and find a privacy statement and list of open–source licenses atPrivacy & Acknowledgments.
I’m sticking with ASUS for now because other than being overpriced, I’ve had no issues with their products.
I strongly believe in getting every bit of performance you pay for out of your components.
Zen 3 “overheats by design”. Itwill clock as high as it can until it hits one of its power or thermal limits, and adding more cooling will just make it clock higher while still running hot.
This is not a concern, but if fan noise is a problem getting the PBO offsets as low as possible and lowering the power limits (my 5900x sits at 180W PPT, 130A TDC, 150A EDC at the moment) can lower temperatures by a lot and possibly even get extra performance.
Stick with AMD’s recommendations for RAM sweet spots, and rather than trying to run faster RAM than the memory controller/infinity fabric can handle, just grab the kit that has the tightest timings you can find for AMD’s recommended frequency. G.Skill’s 3800CL14 is the best consumer bin for Zen 3.
Zen gets a big boost to performance if you disable part of the cores. If running heavily singlecore tasks (Dwarf Fortress), consider temporarily disabling some of your cores for higher turbo clocks.
TheErgodox is the most comfortable keyboard in existence as far as I’m concerned. Falbatech makes really nice ones but the adjustable legs on the wooden cases come loose with time.I wanna get an Ergodox EZ at some point.
Update: I have since gotten anErgodox EZ and am extremely happy with it.
Distros:
I tried pretty much all major distros. I useEndeavourOS on my personal machines because Arch flavors are the only distros I’ve never had issues that required more than an hour to fix with, and they’ve been the most pleasant and easy to run out of anything I’ve tried. I runFedora Server on my homeservers andUbuntu Server in the cloud. I think Ubuntu is the worst thing that ever happened to Linux on desktop.
Other distros I’ve tried that failed to meet my requirements and I have no interest in using again: Mint, Manjaro, NixOS, ElementaryOS, Debian, KDE neon, Garuda.
Other distros I’ve tried that I can somewhat recommend: Pop!_OS, openSUSE.
Desktops:
Editors:
Terminal, Shell:
Utilities:
Here’s my standard decision tree for open-sourcing a new project:
I believe this to be a fundamentally good approach to open–source licensing that simultaneously serves to promotegood software licenses (theMPL) without contributing tolicense proliferation, minimize the time spent debating license choices, and help in cleansing the open–source community from the scourge of theGPL.
The presence of theWTFPL here could be considered a violation of the “no license proliferation” principle; it is a relatively obscure license that hasn’t been tested in court and is notOSI-approved. However, I believe that when choosing apublic–domain–equivalent license, the exact variant chosen is of much less importance than when deciding between more restrictive licenses; as a point in its favor, theWTFPL’s wording choice and explicitly stated goal as a truly freeparody of theGPL serve to dispel any doubts about theWTFPL–user’s position on theGPL and other similarly malicious licenses.
In choosing to open–source software written by oneself, the objective is generally to enable the open–source community to use, learn from and expand upon it.
It may be surprising, but the goal isnot always to provide theFour Essential Freedoms of Free Software (if you’ll excuse me unironically linking a GNU text); licenses likethe JSON license, which forbids using the software for “Evil”, or theAnti–Capitalist Software License exist explicitly to accommodate those authors who wish to make the source code of their work available but stop short of making the softwareopen-source.
Since I consider those “source-available” edge–cases to be effectively proprietary software with exemptions to copyright law granted for specific users and usecases, I am going to disregard them entirely, since this page is only concerned withopen–source licensing.
The Four Essential Freedoms, paraphrased here, are:
You’ll notice that, depending on your definition of “freedom”, theGPL explicitly restricts anywhere between one and all four of those freedoms.
As much as “being free to create art, provided the message aligns with the ruling party’s propaganda” is not “freedom to create art”, “freedom to use the program, provided anything that interfaces with it also uses a mandated, restrictive license” is not “freedom to use the program for any purpose”.
TheGPL is a terribly written, malicious, holier–than–thou license that actively curtails its users’ freedoms to a degree rarely seen elsewhere (with the exception of the, frankly, comicalAGPL whose sole legitimate purpose seems to bediscouraging anyone from using theAGPL–licensed software orbeing able to demand payment for using the software despite making the source available). For this reason, I believe it is in the open–source community’s best interest to not just avoid licensing one’s own softwareGPL, but actively reject GPL–licensed libraries and work to create freer alternatives.
Having said that, theGPL has a noble goal: to ensure that improvements and fixes made to free software can be upstreamed and incorporated into the original work. Its failure lies in that it enforces this goal by means of posing an active threat to unsuspecting developers’ freedom to choose how to distribute their work–if a developer isn’t vigilant enough when pulling in dependencies, they may accidentally end up tainting their codebase withGPL–licensed code.
If the software is of a size where it’s reasonable to expect it to receive nontrivial improvements and fixes, acopyleft license that doesn’t suffer from the flaws of theGPL is nevertheless desirable.
Choosing a license is a balancing act between its popularity—software under obscure licenses is challenging to use, since it may require sifting through pages of legalese first to find out how exactly it allows incorporating itself into a larger work—robustness (the safest licenses are those that have been tested in court and those that anticipate as many edge cases and details as possible), and finally alignment with the developers’ wishes for how their software should be used.
I believe the sweet spot, if looking for a copyleft license, to be theMPL. TheMPL grants its users all the freedoms one would expect from an open–source license, but requires that any modificationsmade specifically to theMPL code be made available under theMPL.
I gotdrydock
working in a large enough part to finally be able to output all the HTML files for this site. It’s not the most beautiful thing, at the moment:
But it’s working!
I’d like to get syntax coloring and LaTeX working before I start work on the frontend part. At the moment, I also don’t export static files to the output directory. After that’s done, I’ll need to figure out a way to compile SASS and minify the assets…
I might also need to rework the way I handle paths. Obsidian’s path handling is a bit funky—it doesn’t require qualifying references with the full path—and I could simplify the logic in my code a lot if I just implemented aresolve_name_to_path_relative
andresolve_name_to_path_absolute
.
Oh, the graphs aren’t working yet either.
A couple hours later and both LaTeX and code blocks are done!
Here’s a snippet of Rust to test syntax coloring:
fnbuild_reverse_tag_map(source_files:&HashMap<VaultPath, SourceFile>,)->HashMap<String, HashSet<VaultPath>> {let mut map=HashMap::new();for(path, source_file)in source_files {if letSome(page)= source_file.page() {for tagin &page.tags { map.entry(tag.clone()).or_insert_with(HashSet::new).insert(path.clone()); } } } map}
And here’s!
…Actually, now that I think about this, this might be easier to do with Zola. If I emit processed Markdown and rely on Zola for conversion to HTML, I won’t have to worry about SASS and all the other fun stuff.
It’s now 10PM and I’ve mostly rewrittendrydock
—now calledspacedock
—to use Zola. Turns out that Zola’s templating can bereally annoying at times; there’s no way (that I can think of, at least) to reuse blocks, so I end up with all these blocks that have to be overridden for pages and sections separately:
HTML<head>
:
meta_title
meta_description
imageurl
(optional, has a default)imagealt
(optional, has a default)html_title
headextra
(optional, has a default)Rendered in the post:
page_body
date
title
description
content
It is now 1AM and I’ve successfully abused Tera’s macros enough to build my own impromptu multilevel tag system on top of Zola. The site builds successfully using Zola as the backend now; I’ll need to integrate with itsserve
command (or implement my own).
The resulting HTML is actuallyfurther from the goal than yesterday’s was—spacedock
doesn’t preprocess the Markdown sources in any way, including things as basic as resolving wikilinks—but I’ve saved a ton of time elsewhere. Zola gets me, for free:
assert
into the template to make sure my computed tag counts match the actual ones.And all that for the small price of having to suffer through the site root being a different type than all the other pages.
Plan for tomorrow:
spacedock serve
![[embeds]]
pulldown-cmark
supports:I’ve been working on this nonstop for 19 hours now. It’s definitely time to take a break 😌
It’s now 4:20 AM (🔥) and I’ve just implemented hot-reloading and serving.
I wonder if Zola would be any faster if I compiled it from source. Right now it builds in about 90ms.
Hm. Building zola withtarget-cpu=native
is… slower by about 10-15%. Damn.
7:30 AM; I took a quick two-hour nap and am back at work implementing the Markdown preprocessing. Looks likepulldown-cmark
does support task lists and footnotes, so that’s great.
I’m now realizing that I can preprocess all of these withfancy-regex
, I don’t need a full-blown Markdown parser.
I ended up needingpulldown-cmark
anyway. Turns out that comments inside code blocks:
%%like this%%
…don’t get stripped out (and thank the gods for that!). It took alot of messing with lifetimes, but I eventually got it working 🎉 It is now 11:00 AM.
I’m running into an issue where it looks likespacedock
is trying to restart Zola too quickly now, and it cannot grab the port it needs.
…Oh gods, I just checkedbtop
and there’s a million billion Zola processes.
I gave up on using the stdlibstd::process::Command
module and grabbed the sanersubprocess
instead. That solved that problem.
Turns out Obsidian’s comment handling is really funky. “Partial” comments are valid in some contexts but not others; my parser is really messy and not quite compliant with Obsidian, but I don’t plan to use comments particularly heavily. They don’t render nicely in the edit view anyway.
It looks like Obsidian supports two kinds of LaTeX;$$ double dollar signs $$
turn into, and$inline$
turns into.
A linebreak terminates$inline latex$
but display latex can start and end in the middle of a line, so I’ll need to borrow some logic from the comment parser to handle that.
Good news—inline now works!
It’s 12:30 AM.
I’d like to rewrite myNoteContentProcessor
into an iterator that can add new events to the stream. Maybe I can get by with just usingflat_map
instead offilter_map
?
Note to self:[brackets]
get returned as individualText
events - i.e.[brackets]
would beText(Borrowed("["))
followed byText(Borrowed("brackets"))
andText(Borrowed("]"))
. This might either make wikilink parsing a lot easier… or a lot harder. We’ll see.
Here’s a footnote.
The more I look intomermaid.js the more I’m convinced it’s a psyop.
As far as I can tell, pretty much everyone in the open–source community was happy withGraphviz for a long time. It’s widely supported, has tons of implementations—includingWASM, Rust, etc.—andjust works. Its output can be styled pretty much arbitrarily, converted to and from a plethora of different formats, it can work in the browser or serverside. It’s great.
Suddenly, Mermaid shows up out of nowhere and starts replacing Graphviz at an unexplainable rate. GitHub, Notion, Obsidian, GitLab, Azure Devops—these are just a few of the projects that support Mermaid. I suspect it’s no coincidence that a lot of them are commercial and proprietary. I think any open–source developer without a complete disregard for compatibility or filesizes quickly realizes the problems with Mermaid:
mermaid-cli
increases the build time to 1.5s.mermaid-server
which can run in the background and render graphs as responses to HTTP requests; it would be logical to assume that it spins up a browser and keeps it open to avoid waiting for the startup every time, but…it just callsmermaid-cli
when it receives a request.As far as I can tell, it ishighly nontrivial to make use of Mermaid in a remotely acceptable way. I have spent multiple days trying to find a solution to render Mermaid graphs both without introducing a bazillion of system dependencies tospacedock
and in a way that actually produces validSVG files. I’m convinced thateither of these problems is unsolvable without entirely rewriting the majority of Mermaid, much less both of them at the same time.
Ultimately, though, my primary goal withspacedock
is to make writing as effortless as possible. Mermaid is built into Obsidianand its syntax is faster to write than GraphViz’s, so ideally I’d still like to render Mermaid graphs on this site; I just findmermaid.js
itself to be unacceptable for this (or any) purpose.
The current plan is to implement a Mermaid-to-GraphViz transpiler instead. The output will differ significantly from that ofmermaid.js
, but for reasons mentioned above I’d consider that a feature.
This is a loosely organized bin of ideas I’d like to explore, eventually. Whenever I write, unless I already have an idea in mind, I pull from here.
z3
Cow
Cozette
and the pain of bitmap fontsPorting old Notion drafts to Foxspace:
I often find myself getting into discussions about gear, so I thought it might be handy to compile my experiences withthings of all sorts. I will keep adding to this list over time.
I’ve been playingSandberg basses almost exclusively for a long time, and if you’ve seen any Garages live shows you’ve probably seen me playing a California or Classic Special. They are just incredible, some of the best instruments I’ve played. More recent models (I wanna say they switched somewhere around 2019?) have a new preamp that sounds a lot better than the previous one.
Although my favorite models are the Classics and Customs, of note is their California SL (“super light”) line—myfive string SL comes in at 2.6kg/5.7lbs!
I’ve been very impressed withCort’s price/quality ratio. Even the cheapest, sub-$200 models are very fun to play and sound great.
I have aYamaha RBX-270 I bought probably close to 20 years ago that’s been through Hell and back and still remains my favourite “beater” bass for practice and light low-stakes gigging. It doesn’t sound great, but plays far, far above its price point.
FGN Guitars are exceptional. There’s not a single bad thing I can say about them; the hardware is all highest quality, brand-name stuff, their neck/fretboard work is unparallled, they use great wood and look stunning and are just a dream to play.
I strongly dislikeIbanez instruments. They have reasonable pricing, use great hardware, and do a lot of funky and interesting designs, but I just can’t stand the feel of their “shreddy” necks and oversized frets.
I useDR Strings almost exclusively on both bass and guitar.D’Addario XLs are my “reference set”; they’re a very safe bet and have a great price/quality ratio. I consider anything that plays better than D’Addario XLs to be a great set of strings, and anything significantly worse to be bad. For that reason I’m not reviewing XLs here—but consider them a safe bet and a solid set of strings for both bass and guitar.
Important points about my approach to strings:
I useDelano andNordstrand pickups in my basses. Favorite models from each are the NordstrandBlades—they just soundmassive—and theDelano Xtenders, which are some of the clearest, most hi-fi sounding pickups I’ve ever tried.
I mountFishman Fluence pickups in my guitars. Fishman is a mixed bag—the older models aretrash. In particular I absolutelycannot stand their Modern humbuckers.
On the other hand, they seem to improvedramatically with every new release. I have an Ibanez with their Modern set - one of the first sets of pickups in the Fluence line - and it’s dogshit; I have theGreg Koch set in my Tele and while it doesn’t soundquite perfect, it’s still fantastic; I have the newerJavier Reyes set in my Witchcaster and they’re pretty much the best humbuckers I’ve ever heard. Split coil tones are also delightful and remain virtually noiseless.
Update: I have since swapped the Moderns in my Ibby for aTosin Abasi set and, while it sounds much better, its coil splits are very noisy, at least by Fishman standards—about as noisy as a normal single coil. Based on my research online, this seems to be a very common, but not universal problem that occurs with this specific set only.
Of note areSeymour Duncan “vintage” models; I’ve previously had their “Vintage ’54” set in my Tele and they were some of the best-sounding Tele pickups I’ve tried, especially the neck. I ended up swapping not because there was any room for improvement with the tone, but in order to make it easier to record and play in high-gain and electrically noisy situations - the SDs are single coils, after all, so they’re not noise-free.
I’ve triedDimarzio pickups a number of times and they’re a bit insane.
In particular the DP122/DP123 bass set has absolutely absurd output and seems to be made just for fuzzy doom scenarios - and it’s not even their highest-output set, according to their website!
I use moddedSeymour Duncan Triple Shot humbucker rings in my Witchcaster for switching.
I have two pedals that I can’t live without:
TheTC Electronic Spark is my “magic” pedal. It’s a dirty booster; kinda like what the Tube Screamer wishes it was. It works wonders on bass, basically works as a “add warmth and growl” button. Makes guitar sound tube-y and warm too. It’s wonderful, and pretty cheap. I have not tried, but wouldn’t trust the Spark Mini - the level of control you get with the full-sized Spark is great.
TheMarkbass Compressore is my favorite compressor in existence. Much like the TC Spark, it adds a wonderful tube-y (in this case, coming from a real tube) warmth, has very in-depth controls that sound musical in all positions, and makes any amount of compression sound great. It’s wonderful and I cannot recommend it enough.
They also make a white version of the Compressore through their guitar-focused DV Mark brand, called the DV Mark DVM Compressore - it’s theexact same circuit as the Markbass Compressore.
Other stuff:
General:
Guitar:
Bass:
I’ve been playingDota Underlords regularly since beta and have made it to the globalLord of White Spire Knockout leaderboard. I take hourly snapshots of the ladder, which are presented below, along with a collection of my thoughts and tips about game strategy.
I currently hold spot number147 globally in Knockout mode, peaking at #52 (these counters update automatically).
This only applies to Knockouts; most importantly, Knockouts have no interest, punish tanking heavily, and prioritize getting units to three stars much more than Standards.
GET RICH. There’s no interest in Knockouts so you don’t have to bank money, but don’t burn it on rerolls. If you click on the arrow in the top left corner you can see the net worth of every player’s team - that’s the number you want to maximize and the most important predictor of victory. That number isn’t the cost of your units - it’swhat all of your units would’ve cost in Standard. If you get offered two copies of a hero in the store, you almost always want to get it, especially if it’s tier 1 or tier 2, since you can sell ⭐⭐ versions of those for full price (and ⭐⭐⭐ versions of T1, but you almost never want to sell a ⭐⭐⭐).
DON’T LOSE. If you have a choice between a comp that may pay off in a round or two when you get a good unit to fill out your alliance, versus just getting a random-ass ⭐⭐ that doesn’t fit in your comp at all, or if you have an opportunity to upgrade something to ⭐⭐⭐ but at the cost of selling a unit that’s key to your comp, prioritize the thing that wins you the immediate round. Unlike in standards, losing round 1 in Knockout hits just as hard as losing the final round, so just winning round 1 usually gives you a pretty high chance of not finishing last.
Don’t get attached to comps. You want to play Hunters but happened to roll two copies of a Slark in the shop? Congratulations, you’re now playing Assassins. Upgrades are much easier than in Standard, so they’re the absolute top priority. Starting compsalmost never matter.
HAVING SAID ALL THAT,do learn your hypercarries, broken comps, super-high-value ⭐⭐⭐ heroes, and Underlord synergies:
Super high value:
Great:
Bad:
Good:
Bad:
Good:
Good:
I’m a big fan of dice and cards, both at a table and when used as an abstraction in video games. I find they add a certain delightfulphysicality to what would otherwise be a boringrandom()
call.
Dice systems form a language of sorts, with various nouns (numbers and dice) and verbs (operations on them), allowing a player or designer to formsentences (“ exploding on sixes”, “ keep highest”)—and there exista number offormal languages encoding that dice–roll language into a form understandable for computers.
Certain dice–rollsentences are more aesthetically pleasing or fun to use than others—they exhibit particular desirable properties. Those are, in my opinion, and in vaguely descending order of importance:
Blaseball is officially over.
I don’t have a lot of feelings about that; it was in no way a surprise, to say the least. Things come and go and I think I’ve always had this feeling that one day,The Garages will, one way or another, have to say our goodbyes to the game that started it all. Whether that would happen because we’d get tired of it, fall to attrition from a lack of new member intake, or because the game itself never succeeded at getting back off the ground after its first run was over had little bearing on anything.
It’s hard to step back and analyze one’s own grief objectively. I have no way of telling which part of this whole thing I’m affected by; perhaps none at all, and I’m just succumbing to a funny instinct toseek out grief within oneself as a response to otherwise relatively unimpactful loss, to try and give it meaning. Whatever the case may be, I’m surprised to find in myself, despite my detachment from both Blaseball and its fandom, a mild mix of sadness, anger, and disappointment. Not at losing the game (I’d distanced myself from its Cookie–Clicker–like obsession fuel and the chaos of large Internet fandom a long time ago) and not at losing the writing prompt for our music (I frequently felt like I had tomake my lyrics about Blaseball in some wayafter they’d already been written; not a particularly enjoyable feeling for a musician or writer), but at losing the projects I cared the most about before they found the love I feel they deserved.
I would be amiss if I didn’t point out the parallel between this and what happened to Blaseball itself, and despite my mixed feelings about the game and fandom, I empathize deeply with everyone who workedso hard to make it what it became.
This is not a callout post, grudge post, there’s no drama of any sort behind this. It’s just me trying to process my feelings about the most beautiful community I’ve ever had the honor of being a part of:
In a nutshell, for those not already familiar:the Garages (bandcamp) are a worldwide, online music collective, spawned out of Blaseball and the lockdowns of 2020. In a way, we’re a fandom band; in a way, we’re a community of queer musicians proving again and again, at times with a new album every week, that being a musician can be, should be, and is open for everyone. We’ve made some great music together, and through the band I’ve had the absolute honor of getting to know and work with some of the most talented and creative musicians and songwriters I know—and wonderful people at that, every single one of them.
I don’t think we’ve ever quite acknowledged this categorization explicitly—even though it’s no secret, and relatively clear from looking at our back catalogue—but the ~50 albums we’ve released span a number of different “series”; the lines get blurry at times, but to my understanding these are roughly:
And finally, the unfortunate topic of tonight’s post:
”AWAY GAMES” was the first time the Garages reached outside of just being a bunch of DMs, a channel in a sidecord somewhere. It was an invitation extended to the entire fandom: “Make music. Let’s get heard,together.” Explicitly and affirmatively open to everyone, with no barriers to entry.
“BLATTLE OF THE BLANDS”—unofficially “Away Games 2”—is, to this day, the second–largest release we’ve ever done; second only to”percolate”.41 incredible tracks representing every genre imaginable and every subsection of the fandom, with a massive chunk of them coming from first-time Garages contributors. It wastoo large, even, and posed a number of problems with its production and distribution–but it happened, and the Garages would look very different if it hadn’t. Frankly, I don’t know how we could’ve endured at all without the influx of fresh blood and enthusiasmBLATTLE brought.
“World Tour”, “Away Games 3”, got released in two parts. The second hasmy favorite track we’ve ever released, the absolutely breathtakingNow That You’re Gone. And yet, it felt like something was slowing down.
It took over a year for the—as of the time of writing this post—final, fourthAway Games to happen;“Reunion Tour” was my darling. There was no other album I cared about and wanted to make surehappened anywhere nearly as much asAG4.
The one thought I want to make clear is:as far as I’m concerned, the “Away Games” series isthe most important project we ever did. They might not be our best albums, or the most consistent, but, more than with any other album except maybe our first, we wouldn’t be here if not forAway Games.
Every community suffers attrition. There is always anoutflow of people, members leaving for any of a number of reasons. The only way to sustain a community is to balance thatoutflow with an at–least–comparableinflow of new members.Away Games are our primary way of accomplishing that; every release was followed immediately by introducing a huge wave of incredible musicians to the community.
More importantly,Away Games are the proof of what the Garages stand for, at least for me; the demonstration of our thesis that music should and can be open to anyone. An implicit refusal of hero worship or status associated with being aperformer, giving equal value to everyone regardless of prior achievements or releases.
The problem was… It felt like the importance of that diminished with every release. Not only did every newAway Games bring fewer new people to the community, not only did every newAway Games sell less than any previous one—that seemed inevitable as Blaseball gradually died down, and with it, the main motivation for fans to come together and get excited about new Garages releases—but it also felt like everyAway Games got harder to organize and release, to find motivation for, to find contributors for, and, most unfortunately, tocelebrate.
It felt like the open Garage door was slowly closing. Not through any fault of ours—at least I don’t think so—but simply because with every day, fewer and fewer people would drive or walk by. The question of how to prevail against attrition, of how to reach and empower new musicians lingered, unanwered.
Tome personally,Away Games and the stripped–down albums likevlals are the mostGarages things we’ve ever released. They’re the rawest display of musicians from all around the world—with any level of skill, knowledge, or equipment—bonding over a shared love of music, creating something beautiful, and staying together out of love and respect for each other and the community–
–and now the pool from whichAway Games got its contributors, the game through which all these incredibly talented musicians found the open doors to becomingGarages, is gone. There’s no more Blaseball to seed the albums to which,I personally feel, the Garages owe their continued growth and success. And those albums themselves average a fraction of the plays and sales of our regular releases, conspicuously absent from most playlists, live setlists, “best of-”s.
I want to make absolutely clear again:these are my own feelings. I do not wish to even remotely imply that anything in this post is the One, True, Correct opinion to hold; I don’t, in the slightest, think negatively of anyone for disagreeing. I don’t hold any grudges, and there’s no drama around or behind this, nor do I intend to cause such. This post has one purpose: to help me work through loss, and in doing so, celebrate the work that went into the projects that helped create, grow, and preserve a community I treasure beyond words.
I doubt there will be another“Away Games”. Not in this format.
I don’t think I’m sad about Blaseball ending—that felt like a long time coming, and I’ve had a long time to disconnect from it entirely—and I believe the Garages are too strong, love what we’ve built too much to fall along with it. But I will, softly and quietly, grieve forAway Games; I will play all four of them on repeat until I memorize every note, every word—becauseAway Games are the most important albums I’d ever been on. Because I want them to remain permanently in my heart, cherished and appreciated as Garages landmarks, not as obscure side–releases.
Blaseball is gone, but our music, the art we poured our hearts and souls into, remains. This is my invitation to you to—if only for a short while—put on a pair of comfy headphones or plug in your speakers, make yourself a cup of coffee, and celebrate it with me; ensure it lives on.
I’ve been thinking a lot about monsters and monsterhood lately; about the shadows we all share, even under different lights. About blending what is and what has to be, giving in and embracing. About Becoming, about Less, and about Else; about trauma, empowerment, reclamation, and comfort; about queerness.
Monstrosity is a part of the identity of many of those I hold dear, but I never quite stopped to wonder: what makes it such a powerful shared symbol, what makes it so useful for finding oneself?
This entire post needs to be prefixed by this:Identity, by its very definition, is extremely personal—the most personal, perhaps—and so I cannot possibly speak for others; I can only try to write aboutmy own understanding of monstrosity. It could be exactly the same as someone else’s; more likely, it’s entirely different. This post is “how Fox understands monstrosity as a part of one’s identity”, written as an attempt to figure out what monstrosity as an identity concept meansto me and perhaps in hopes someone might find recognition and a way towards healing in this; it is not an attempt at figuring out what anyone in particular has been through—those stories are only theirs to tell.
Whatis a Monster?
A Monster is something misshapen; almost defined by its ostracism, by its absence from the idealized “surface world”—from the “light”—by itsOthering. A Monster is somethingpeople are scared of—something vague, something it’s easiest to pretend is unreal, because accepting Monsters as a part of one’s model of the world forces one to recognize the world as much less friendly, the light as equally cruel as it is bright, and personhood as much more brittle than one would like it to be. I don’t think onechooses to be a Monster, but, like Frankenstein’s monster, like vampires, like werewolves, ismade one; forced to be one. I don’t think there would be Monsters withoutpeople to cast them into shadows; without a shape to not–fit, without a light to be rejected by.
And the more I think about this, the more I turn and analyze this concept in my head, the more it resonates not just with queerness, but with trauma.
Trauma is hard for me to talk about, still; especially with traumaqueer identities, where it’s such an incredibly personal, incredibly intimate concept, I don’t like to think abouthow a person breaks. Instead, I’d like to celebrate rebuilding, redefining oneself entirely, the inherent empowerment of it—but to do so, we must first consider what creates the need for that redefinition in the first place.
A Monster cannot remain a Monster in the light—to do so would be death—and so is rejected, pushed away into the shadows, Othered. That rejection, in turn, makes it more monstrous—what may have passed as a person in the light seems to twist eerily in the shadows; the glint of a tooth is much scarier in the dark than when part of a bright, friendly smile.
Looking back, in much of the writing and conversations that I only now in retrospect realize were adjacent to this topic, there’s a recurring theme of the boundary betweenthis is who I am andthis is who I have to be. Those made Monsters have to hide their monstrosity so long as they want to remain in the light—the light doesn’t like to acknowledge anything that would make it uncomfortable—and resist the discomfort of a skin that doesn’t quite fit right, clothes that seem little but a frustrating charade.
It seems rare, if at all possible, tounbecome a Monster. Even if masking perfectly, even if allowed back into the light—the shadows remain familiar; the sharp, monstrous edges still present underneath the scar tissue.
Scraped and hurt and torn–up enough to be driven out—the cracks grown too numerous, the edges between them too prominent to be able to sustain remaining in the light any longer—one gives in fully into the shadows. Denied and rejected by the light, the person they used to be is cast aside and shattered, leaving behind little but a few sharp fragments and a gaping wound.
Identity is, I feel, less about whatfits ordescribes oneself best; yes, those are vitally important, but they’re only the derivative of the much more important question:what brings one comfort. An identity is a blanket one can wrap themselves in, trace the outline of the resulting shape, and know:this is me. A surface that describes one’s outer perimeter fully, defining aself.
And with the person gone, that blanket no longer covers everything, agitates the wound left behind, doesn’t quite follow the jagged edges of what remains of one’s shape. One has to, by its very nature, find a comfort, an identity, that allows for and aligns with the fractures.Embrace the shadows, rather than justgive in to them.
In finally discarding that old comfort, something important happens—the Monster rejects being rendered somethingLess by those who made it one. It, instead, redefines itself as somethingElse—and starts retracing its shape anew from there.
Whatever remains is indescribable, uncomfortable, scary to those in the light. In retracing its own shape, its identity, around that, the Monster finds not just comfort, but empowerment. It finds that in acknowledging and embracing the vagueness of the shape of what remains, in no longer trying to force itself into the shape of a person despite the multiplying cracks and chips and scar tissue, the up–to–now ever–present pressure disappears. In asserting that indescribability as part of itself, it opens itself up to grow in any direction, to take any form. Reunitingthis is who I am andthis is who I have to be lets it find a home here, in the shadows; lets it be safe.
Becoming a Monster lets it find agency it was previously denied; lets itdetermine, on its own, who and what it is and what that means for it—under a system chosen and defined by itself, rather than one ready to discard and abandon anyone who cannot fit in.
The wounds close; the missing pieces get replaced with new ones. The shape is different—it will always be different—but it’sa shape of one’s own, under no obligation to conform, be justified or explained. It’s, finally, one of comfort; one built by and for itself and nobody else.
I’m not sure how to close this out. The symbolism in identity is infinitely varied, and different for everyone; I can only try to evaluate monstrosity as an identity in relation to my own feelings, experiences, and cultural associations. Everyone whose identity is at least a tiny bit monstrous will have that mean something else to them.
I know one thing—monsterhood, self–identifying as a Monster of any degree and shape, is an immensely powerful act of reclamation, of empowerment, of asserting one’s will andbeing, of building a home for oneself from nothing, in spite of everything. Of finding enough beauty in oneself to reject and refuse a system insistent on wiping it out.
And though that may not bemy shape, so long as there are those empowered by it, we will wait for them in the shadows.
Seymour Duncan offer a (horrifically overpriced and cheaply made) product particularly attractive to guitar wiring nerds like me - theTriple Shot Mounting Rings.
These are humbucker frames that come with a pair of built-in DPDT switches to allow for extensive guitar switching options. Unfortunately, as far as I can tell, nobody on the internet has documented how they’reactually wired.
Naturally, I decided to order myself a pair and figure out all the connections with a multimeter.
A word of explanation: the pickup rings have two PCBs each - one mounted directly beneath the switches inside the ring, and one connected by a ribbon cable that’s meant for the user to solder their pickup leads to.
I’ve drawn the built-in PCB as if you were looking down at the pickup ring flipped face-down, with the PCB at the top; the second PCB is drawn somewhat arbitrarily, but I’ve labeled all the pads.
The switches connect the middle contacts in each row to the contact closer to the switch in that row - ie. if I have the bridge-side switch in the position closer to the neck (left, with the pickup ring face-down), the top middle contact in the neck-side bank will be connected to the top left contact, and the bottom middle contact will be connected to the bottom left contact.
Let’s run through a configuration as an example to make sure we’re on the same page.
Let’s call the contacts in the neck-side bank N1, N2, N3 (top row, neck-side to bridge-side) and N4, N5, N6 (bottom row, neck-side to bridge-side), with N2 and N5 being the commons of the switch.
Similarly, let’s call the contacts in the bridge-side bank B1, B2, B3 (top row, neck-side to bridge-side) and B4, B5, B6 (bottom row, neck-side to bridge-side), with B2 and B5 being the commons of the switch.
If both switches are set to the position closer to the bridge, then:
theR pad is connected to nothing (it connects to N2; the switch connects N2 to N3; the PCB connects N3 to B1, which connects to nothing)
theB pad is connected to+ only (it connects to N5; the switch connects N5 to N6, which connects to nothing; the PCB connects N5 to N1, which connects to nothing;B is always connected to+)
theG pad is connected toW and - (it connects to B3; the switch connects B3 to B2; the cable connects B2 to W; the PCB connects B2 to B5; the switch connects B5 to B6, which connects to nothing)
theW pad is connected toG and -, for the same reasons as outlined above.
I hope this is helpful to someone.
Baldur’s Gate 3 Act 3 spoilers ahead!
I had the greatest internal character epiphany I’ve ever had in an RPG yesterday, about the main character I’ve been playing across different games since 2014 - and all it took was consorting with the devil.
I wanted to hop intoBG3 with a fleshed out character—one where I’d have a good feel for their motivations and how they’d act in any given situation—so I lifted a Sith Sorcerer I’ve been playing inSWTOR since 2014 and ported her over as a Tiefling necromancer.
MeetNayyli:
She was brought up in a rule of the strong, might makes right environment (the Sith Empire, inSWTOR) based around slavery and oppression that she’sentirely uninterested in participating in, and will doanything to avoid ever being enslaved, controlled, or having to serve another tyrant or oppressor again.
In an environment ruled by force and violence, that meant seeking sufficient power to make sure nobody can endanger her freedom—power which she found in ancient grimoires, teaching her how to raise the dead and bind powerful eldritch spirits to her will.
She… alsoswears she’s one of the good guys. She believes in using her power to Do The Right Thing, and will help anyone in need she comes across, if possible.
If only it was that easy, right? I’ve never had a particularly strong feeling about the D&D Alignment she’d fit into; on the Lawful/Chaotic axis:
She will never break an oath or her own principles and code of honor. She’s ride or die for those she chooses to be loyal to and will follow them to the ends of the Realms; she will never disrespect those she considers deserving of respect, and will follow any rules and conventions applicable…
…unless they prevent her from doing what she considers The Right Thing. She willnever accept anyone having the right or power to control her, and there isno limit to how far she’ll go to prevent that from happening (which… has earned me a Bad End a couple of times). Her primary motivation is to acquire sufficient personal power and influence to stop anyone who might try to control her—to fight gods, if necessary.
And on the Good/Evil axis:
Sheswears she’s Good. She really wants to be Good. She doesn’t start fights. She will protect and help those in need and will gladly share and give, since she believes she doesn’t have any more of a “right” to anything than anyone else; that whatever is earned can and should be given in the interest of doing the Right Thing…
…but only in aid of those who haven’t crossed her. She doesn’t believe in redemption, second chances, orreasonable force—if someone picks a fight with her or tries to stop her from doing the Right Thing, she reacts by attempting to remove the threat they pose as efficiently as possible—usually meaning the immediate application of violence, which continues until the “aggressor” no longer poses a hindrance to her objectives.
In terms of actual actions, this means that although Nayylitries to do the Right Thing and does notstart fights, she hasn’t quite learned how toback down from fights; if met with “take one more step and I’ll kill you”, her default response is “good luck with that”, even if she wasn’t actually intending to take that step in the first place. That ends up causing alot of fights.Spoilers ahead!
Lae’zel talked shit. Lae’zel did not get rescued from the cage.
Nettie tried to make Nayyli swear to drink poison if she felt the tadpole activate. She refused. Nettie tried convincing her with violence. Brave against a party of four.
Nayyli disagreed with Kagha’s methods. All the druids and half the Tieflings ended up dead.
Auntie Ethel died so quick she didn’t even get to beg for her life.
…But Nayyliswears that she’s Good. Shereally tries to be.
Come Act 3, the devil Mizora’s been hanging out around camp.
Nayyli doesn’t have a problem with devils. They haven’t wronged her personally orcoerced anyone into a contract, and they never break their given word.
One evening, Mizora approaches suggests having a fun night together.
Nayyli is suspicious, at first, but the devil asserts there are no strings attached - the only thing either of them would be be getting out of it is enjoyment.
Now Nayyli is curious. So far, she’s been rejecting everyone’s advances - she’s always been too busy with her search for power to bother with sexuality, and she had no patience for Shadowheart’s secretive amnesia lady vibe, Gale’s bad ex baggage, or Wyll’s goody–two–shoes folk hero bullshit and attempts to lie about the sending stone. Halsin’s a creep who thinks they’re dating after she politely asked him if the wine is good at that Tiefling party one time. She enjoys Astarion’s company, but he’s reserved and she very much considers it not her business to pry, so it never got any further than polite acquaintanceship.
Mizora… Mizora is something else.
She’severything Nayyli craves and craves tobe—an immensely powerful fiend, never concerned with having to obey anyone else, taking no shit from anyone—and here she is, with enough respect for Nayyli to seek her out and offer to spend the night together; most importantly, not evenattempting to offer a contract that would’ve been rejected outright and treated as a message that she views Nayyli as nothing more but another mortal to be used—but instead, approaching her as an equal, as someone worthy of her time and interest.
When one wields power over life and death itself works with stakes measured in dozens, if not hundreds of souls, it’s hard to relate to or empathize with people who haven’t tasted that. Mizora very much has, and for the first time, Nayyli isinterested.
Mizora shows up at night and takes them to a place beyond worlds, where she draws upon the energies of the Hells and channels them into Nayyli—and demonstrates what it means to make love with a fiend.
Yet in a wink, you are reformed - a devil in spirit, if not body. For one depraved night, you feast on the sins of the body, the mind, and the soul.
“You’re forever marked,” she says, “you’ll never be the same.”
Mizora channeled the Hells’ essence into you - you’ll never be rid of their scent.
Nayyli thinks “Why would I want to? This was my decision. Iwant this.”
They come back and Wyll spots them.
He looks shocked beyond words. Betrayed and broken by the sight of Nayyli together with his patron. He points out that the by drawing on the essence of the Hells they fed on andenjoyed the very torment of the damned souls there, deriving pleasure fromtheir suffering—becauseof course, if you draw from the Hells, what else could youpossibly drawing from?
In his eyes, she betrayed everything she claimed she stood for,him first and foremost, and her soul will forever be tainted.
Nayyli isn’t having it.
She thinks to herself “I’ve done far worse for my soul than bang a devil. Your pact is between Mizora and you. Your being in my party places no obligation on me to hate your patron, and gives you no right to control who I spend my nights with. In all honestly, I relate to her much more than I relate to your boring everything–is–entirely–black–and–white, Lawful Good-“
Andstops.
Because she was about to admitshe relates more to a literal Devil than the good guys.
…But sheis Good, right?
The dead druids.
How she stood quietly and watched a Tiefling kill a defenceless prisoner just to take out her anger on something.
Tieflings.
Goblins.
Zhentarim.
Lae’zel.
Lorroakan.
A Githyanki creche completely wiped out.
Never stepping in to offer guidance to Shadowheart in the Gauntlet.
To Mol.
All the countless corpses and spirits bound and thrown away on a whim.
The Crown pledged to a literal devil rather than Gale or Mystra.
Sure, maybe some of those peoplehad to die, maybe their deaths saved more lives - but she never really tried to find another solution.
She was only“good” because in her great quest, anyone who tried to stop her automatically became a “bad guy”.
…And shefinally realizes - after nine years of me playing this character and 116 hours intoBG3 - that, despite her frequent assertions to the contrary,she is not Good.
I chose to play Nayyli for BG3 since I felt like - after all these years - I knew who she is; I liked her personality and the struggle to fight evil and oppressors with all the dark powers she can learn, without leaving any room for mercy, all while staying on the light side.
Baldur’s Gate 3 did what I never expected a video game to be able to do - it gave her a full character arcoutside of the game’s story, told instead through my own actions; it allowed me to - through the process of my character trying to save her own life, freedom, of doing whatever it takes to protect those she cares about and stand up for what she believes is right - watch the limits of how far she’ll go and the moral and ethical principles she holds herself to slowly erode… to the point of, in her quest to fight against oppression and subjugation, willingly promising to hand over an artifact with the power to dominate and subjugate anyone to a literal devil- and not even realizing how far she’s fallen when told she’s also a devil, in spirit; only having an epiphany when she stops herself short of admitting she doesn’t care for good.
What might have been a throwaway sinful forbidden one night stand in another playthrough ended up - completely unexpectedly - being a climactic turning point in her story; one that wasn’t written explicitly into the game, but instead prompted and encouraged organically by it.
It was great.
Identity is a fascinating thing. It’s a foundation upon which to build an understanding of one’s place in the world; a powerful lens through which to analyze, justify, and validate one’s feelings and experiences of self. It’s no surprise, then, that it’s exceedingly difficult to think about identity without relating it to those very feelings and experiences.
Over years, a struggle withdepersonalization/derealization slowly erodes one’s ability to think about themselves as an active participant in past events; it becomes harder and harder to identify what part of oneself, except the physical body, remains constant in one’s experiences. It denies a foundation upon which to build an identity.
I’ve eventually come to accept that as an immutable fact—that having an identityat all would be, for me, like “preferring to sleep on one’s back” or “having dark eyes”; a minor qualifier, an optional attribute which contributes to the whole of one’s existence for some people by random chance, and by that same random chance simply is not part of mine. It feltwrong to try and identify with a gender, a name, even an on-screen handle; “slavfox” is just a couple of nouns—“Slav”, “fox”—not a trueName like those proudly worn by most. In the past I’d gone even further in declining to attach a Name to myself, using Unicode code points (U+26B8 BLACK MOON LILITH
) or even entirely numeric sequences as handles online.
The concept of identity was theuncanny valley of my experience of self. Never quite right, always just slightly uncomfortable, just slightlywrong enough for me to reject it entirely, to give up on finding “my place” and ignore the concept wholesale.
I’d never felt like identifying with any gender was appealing to me, either. I’d pick my characters in video games purely based on which voice actor, model, sprite, or storyline I liked better, treating gender much the same way as character class. In situations that involved my physical body—say, doing voices when playing a tabletop RPG, or even just the way I present entirely—I’d just default to my assigned gender, not because I identified with it, but simply because it was the path of least resistance; feeling an identity was not necessary or relevant to me, therefore it would have been illogical to spend any effort on nurturing one.
For that same reason I never had any pronoun preference; for pronouns to feelwrong when applied to me, there would have to be some that feelright. In the absence of those, I’d bounced between using any pronouns or just defaulting tothey/them for convenience.
Then, one day, I had an encounter that planted a seed of curiosity in my mind; a seed which would take years to germinate, but a seed nevertheless.
There are probably as many reasons for which one may choose to embrace “it/its” as there are those who do so.
“It/its as an alternative to they/them.”
“It/its as a refusal to conform.”
“It/its like an object.”
“It/its like an animal.”
The one I met was something else. It not only refused to be described, but wasempowered by that defiance, wearing it so proudly and naturally that it felt incomprehensible to think of it in any other way. Not justit/its like an object or an animal or something otherwise inhuman, but likegravity, likefear, likeHell, likenuclear fission. Like aconcept.
For the first time, something about identity felt intriguing. The very act of rejecting its foundation by adopting the nonhumanity ofit/its could serve as a foundation for understanding oneself.
Without the option of relating to other identities, experiences, feelings, first one must invent the universe.
Findingit/its turned something nameless, refusing to be described, irrelevant and decoupled from everything else, into aconcept that exists in an entire system, entire universe of concepts to relate and compare itself to. Rejecting “human” pronouns grantsso much power to something that previously was indescribable and abstract by providing a counterpoint to distinguish itself from; a starting point for the search for whatever aFoxis.
In much the same way that it’s not quite possible to truly understand what it means for something to be “heavy” without first recognizing that things have mass and mass can be different for different things,it/its serves, for me, to recognize and affirm that thedegree to which the concept of identity applies to someone is itself wildly variable. To enable one to build its understanding of itself from there.
And that feels right.
Foxspace is atriple entity; it exists across all three sides of the thinning divide between the physical, digital, and conceptual realms.
Conceptually, Foxspace can be described simplest as a sanctuary for thoughts and ideas. At its most basic, it’s a repository of notes—aDigital Garden. It is, however, quite unlike other abstractions over note organization—it’s not a storage for information, but a living space for it. The ideas and thoughts that inhabit Foxspace - its residents - have just as much agency over themselves and their environment as I do over myself, and,just like a “real” person, grow and change with time and leave a permanent imprint on anything and anyone they interact with.
The process of musical composition and improvisation frequently gets compared to a wandering, an exploration, offering a myriad of alternate paths and passing sights—some beautiful, some terribly unpleasant—for the musician to choose from. My thoughts flow in a similar way; the path they chart—the pages they occupy in Foxspace—will ultimately be one of logical consequence and contextual relevance, but on the way there they inevitably mingle with and pass by scores of other thoughts. Most will pass by in silence, never to be seen again; some will be acknowledged by a nod or a wave; fewer still will engage in polite small–talk over a shared topic of relevance or even turn of phrase. Very rarely, that dialogue will spark a lasting friendship or conflict, the two thoughts becoming inseparable parts of each other.
The links in Foxspace are those friendships, dialogues, and passing glances between its residents. It’s not meant to be navigated as a chronological blog or even a wiki—which it may seem similar to, at a glance—it’s meant to enable retracing the journey of each thought living here, and to follow its growth and interests. The information here is meant to bebefriended rather thanreferenced.
Physically, Foxspace is the living spaceI share with those of its residents who get physical forms and become myroommates.
Together, we continuously build and refine thedigital infrastructure that enables Foxspace to exist in and interact with the digital realm—asslavfox.space.