blogs by Gio

Atom feed Recent posts

⚖ Twitter Blue is a late-stage symptom

Twitter Blue! $5/mo for Premium Twitter. It’s the latest thing that simply everyone.

I have an issue with it, but over a very fundamental point, and one Twitter shares with a lot of other platforms. So here’s why it’s bad that Twitter decided to put accessibility features behind a paywall, and it isn’t the obvious.

Client/Server architecture in 5 seconds

All web services, Twitter included, aren’t just one big magic thing. You can model how web apps work as two broad categories: the client and the server. The client handles all your input and output: posts you make, posts you see, things you can do. The server handles most of the real logic: what information gets sent to the client, how posts are stored, who is allowed to log in as what accounts, etc.

📣 Trouble a-brewin’ at Redbubble

  • Posted in fandom

Homestuck is once again lit up over fan merch. Homestuck and fan merch have a long and troubled history, but this latest incident is between artists, Redbubble, and Viz media. Here are my thoughts on that!

In late May 2021, artists who sold Homestuck merch on Redbubble got this email:

Dear [name],

Thank you for submitting your fan art for Homestuck and/or Hiveswap as part of Redbubble’s Fan Art Partner Program.

At this time, our partnership with the rights holder VIZ Media has come to an end. When a partnership expires, we are required to remove officially approved artworks from the marketplace. This means that your Homestuck and/or Hiveswap designs will be removed from Redbubble soon.

Here are a couple of things to keep in mind:

  • It is important to know that licensors do not allow previously approved designs once sold on Redbubble to be sold on any other platform, even after the program ends.
  • Because this removal is not in response to a complaint, your account will not be negatively impacted.

Partnerships come and go, but don’t worry. We’re looking forward to partnering with more awesome brands in the future.

Check out our Current Brand Partnerships list to see all the properties that are actively accepting submissions. For additional information, we recommend checking out the Fan Art Partner Program FAQ.

Thank you, Redbubble

This hit a lot of people, and hit them hard:


Unfortunately for Twitter and brevity this is actually the intersection of a couple different complicated issues, which I’ll try to summarize here.

Redbubble forcing predatory licensing on people

Now, copyright law sucks for fanartists, but that doesn’t explain what happened here.

⚙ Positioning things in Ren’py

  • Posted in dev

As is common in Python, the mechanical process of displaying something on screen in Ren’py is at once easy to execute and deceptively complicated to execute correctly.

The Ren’py documentation does a fine job of defining the specifications of position properties, but intuitively understanding how to use those properties can still be hard because it doesn’t include much in the way of examples or elaboration, so here are some of those.

Your basic properties

These names come directly from atl transform on the documentation. Note that these are generally parallel with the style properties of the same names.

📣 W.D. Gaster and fake depth

  • Posted in fandom

or, “W.D. Gaster undercuts Undertale’s cohesiveness as a work”

When I wrote The Raphael Parable, I updated it with a little ARG. “The ARG Update”, I called it. There were scattered clues, and a puzzle, and secret notes so the diligent scavenger could piece together what really happened. Except nothing did really happen. There wasn’t a story I wanted to tell, there wasn’t an interesting mystery to solve, there were just clues tied to more clues tied to an arbitrary ending. It was the trappings of mystery without any of the meaning.

Petscop, on the other hand, has a substantial depth to it because it keeps tying itself to reality. The viewer is given a real person recording themselves playing a game. It’s set in our world. The game itself seems to be intricately tied to real-world events; too. Disappearances, the player’s family, even the YouTube account managing the videos. Petscop tells a deep mystery story because the mystery is backed by a story: a death, an abuse, a revenge. There’s meat to the mystery.

Sans (Undertale) is a fun character. He’s spooky. He breaks an unbreakable log, he teleports, he’s figured out something about the timelines. Then there’s a fight with Sans, where he’s very tough and has a gun. Then he needed a backstory for his gun and science, and we got Gaster, who is almost those things. Gaster was a fun idea, though, so he got some extra Easter eggs. We get room_gaster, the gaster followers, Mysteryman, the wrong number song, and the sound test. He’s fun, and mysterious, and ended up carrying most of the mysterious lore bits of Undertale that were never quite explained.

So, who is W.D. Gaster? Who is the big backstory, the Secret, the man behind the True Lab? Nothing. He’s the previous royal scientist, but through some unknowable horror he got deleted from reality. “Shattered across time and space”, according to another character who doesn’t seem to exist. He’s cut content who was conceived of as cut content. He’s a mystery by definition. The only story he gets is one of omission, the vague cosmic horror of not existing:

Have you ever thought about a world where everything is exactly the same… Except you don’t exist? Everything functions perfectly without you… Ha, ha… The thought terrifies me.

-still not Gaster, because he isn’t there

Of course, the story I’m describing here is emergent, not one he was crafted around. This is the narrative that arises out of Gaster’s mechanical function of… well, not being there.

Treating Gaster as a solvable mystery is an explicitly absurd quest in futility. He is unfixable. The answer is missing.

But Undertale isn’t about mysteries, not really. Undertale wants you to move on from Undertale. Undertale shames the genocide completionist and teases the pacifist stickler.

Don't you have something better to do?

Undertale doesn’t want you to sit down at a corkboard and “solve” it. W.D. Gaster refuses to be solved. His whole character is defined by being missing, by not being in the game or even in the universe at all.

And yet.

And yet Gaster demands solution. There’s just too much riding on it. With every ounce of weight Undertale gives to its plot, with every secret detail it includes about Gaster, it demands you care about him. He designed the SOUL machine that kickstarts the whole plot of the game. He gives Sans the knowledge he needs to nudge the timelines toward safety. He is all the loose ends and plot holes wrapped up into one character who isn’t available to be interrogated.

This isn’t like with the genocide route, where the player is shamed for starting a rampage for the sake of it. This is a mystery the game created, a mystery the story revolves around. The player is demanded to consider it, to solve it, to work towards solutions. But in the end they’re denied a solution. There’s a missing piece, and there always will be.

In a parallel to the way Asriel wants you to keep playing the game to the point of self-destruction, Undertale wants you to keep solving its story to that same end. It’s perverted, sure, but when it comes to Gaster it’s something Undertale deliberately hooks you into doing, not an expectation the player unfairly imposes on the work.

I’m forcefully reminded at this point about Folding Ideas’ excellent video The Stanley Parable, Dark Souls, and Intended Play, which makes this argument:

If there is crafted content on the other side of your misbehaviour, then it’s not actually misbehaviour.

If there is something that the game’s author simply flat-out, 100% did not want you to experience, did not want you to engage in, then it wouldn’t be there. Even when it comes to potential misbehavior using the rules of the system you’re placed within, externalities that they didn’t or couldn’t account for, like throwing garbage at NPCs, the only truly accurate sign that the authors don’t want you doing that is that nothing happens at all. This is because even a negative reaction, even the game pushing back against misbehaviour, is content.

The obvious example of subversively intended play is the genocide route — a joke he makes in the video — but I can’t help but think of the contrapositive alluded to in the quote above: if there is nothing, no content behind a path, then the game is making the strong, deliberate statement that it does not want you following that path. Gaster, a character defined by a lack of content, is then a whole degree of judgement further than the genocide route — maybe even the harshest a game can possibly discourage something. How viciously then must Undertale not want you to think about this?

But — for me, at least — this paradoxically creates a weird illusion of depth. The mystery being intricate, having scattered clues throughout the game, being tied to characters and mechanics I’ve learned to love through playing it… it all makes it feel important. Fun values and random events make the game feel “deeper”, like there’s a vast world you’re getting inconsistent glimpses into, and Gaster seems to be presented explicitly as a secret that takes digging to discover. Digging is explicitly encouraged with more content and tidbits and clues

And as you learn the puzzle is harder and harder to solve, as the clues become scattered so far throughout the game world and tied so deeply to the plot and characters, the “answer” feels more and more important. It’s an illusion. A trick. A sleight-of-hand. There’s no depth, no substance to it. Just signs and symbols of depth around an answer that isn’t. We know the answer isn’t deep or important because — by definition — there is not an answer at all.

I say it “undercuts Undertale’s cohesiveness as a work” because again, I think Undertale wants to be set down and for the player to be finished with it. But Gaster simultaneously hooks the dedicated player into an unfinishable puzzle.

The Gaster mystery is the kind of thing you have to seal away in a glass box, or else it doesn’t work. It’s a mystery you can’t treat as a mystery. It’s an ouroborus. Despite the act of eating and the concept of body length being things that demand concrete resolution, it’s not a resolvable thing. You can’t finish it, you can’t resolve it. You can only abstract it and understand it for what it is.

I love W.D. Gaster. The mystery of omission is incredibly tantalizing to me, on a deep level. I want to dive in, I want to solve this character. I want to look at the science, and find all the secret grey kids, and piece together every last crumb of the universe. I stayed up until midnight to get the survey program that turned out to be Deltarune, and I was disappointed when it did. I wanted more pieces of the puzzle, not more puzzle. W.D. Gaster is always the promise of more puzzle, but without the solution. The solution isn’t just missing, it’s impossible. The mystery itself is predicated on it not itself being solvable. I hate W.D. Gaster.

⚙ How we made Befriendus ludicrously accessible

  • Posted in dev

Befriendus; everybody’s favorite visual novel about making alien friends. It’s got trolls, yes, but it also has a slew of accessibility options. You can adjust everything: color, font, motion, even spelling. It’s clean, it’s easy, and it works. Here’s how we did it.

Befriendus in-game menu, with accessibility options

When I was designing the basic accessibility framework I had these principles in mind:

  • Accessible scripts must be easy to write; work should never be duplicated
    • Demanding people write multiple versions of work is bad design and encourages accessibility to eventually be dropped in favour of efficient production
  • Humans should never do postprocessing tasks
    • We’re writing software; a computer should do any and all mechanical work, not writers
  • Accessibility options should have as granular control as possible
    • Whenever possible, players should be able to select exactly what they need, not be forced to use something that doesn’t match their needs.
    • Options should be compatible with each other whenever possible
    • Just pushing out transcripts is not accessible design.

The best way to explain these is probably to explain what we ended up doing, and how each design choice was made carefully in accordance with those principles.


We knew from the moment we started putting together logic for character colours that we wanted an optional high-contrast mode. One of the first characters written was Mituna, whose light yellow text doesn’t show up super well against our grey textbox:

Mituna dialogue; yellow text with normal spelling

This is good enough for most cases, but we definitely need a way to turn colors off. Black-on-grey has much more contrast and pops nicely for the high-contrast folks:

Mituna dialogue; black text with normal spelling

This is handled by the Hemospectrum subsystem, a part of FSE.

Characters’ colours are defined with their characters are (mituna, name=Mituna, hemocolor=gold) and processed by the dialogue system when characters speak. Colours are defined semantically and handled correctly at the appropriate stage in the pipeline. (As opposed to some horrible hack, like binding a listener to the option and manually editing every character’s colour in storage every time it’s changed.)

Anytime a color (gold, orange, #f00, #a20000, whatever) needs to be resolved (in the dialogue box, mainly), it’s passed to the hemospectrum function, which resolves colour names and colour codes to universal colour codes.

The logic there is for name resolution, but we also use this entry point to handle contrast logic. Whenever this lookup is made we check if the high contrast user setting is enabled. If it is, we return either black or white, depending on the tone of the colour requested. Since all the colour logic was in one place already, it was easy to add extra logic here. This also gives us the tools to make contextual decisions further down the line — a very light color might pop better as light grey or white, for instance.

Typing Quirks

Characters in the source material, Homestuck, have what are called “typing quirks”. Typing styles, basically. Characters type in different styles, ranging from semi-mundane style choices (lowercase, all caps) to incredibly elaborate (elaborate puns, ending every line with an emote, alphanumeric replacement). I could write a lot about how interesting these are and how they give characters a feeling of tone that the written word rarely conveys, but I’ll save that for another discussion. Brass tacks, we want our characters to do this, and that requires some work.

Now, to my eye, this looks like a build artifact. The “source code” is the script, and once the script is written there’s postprocessing replacement step that has to get done before we publish.

The alternative is for writers to write with quirks to begin with (WH1CH 1N 50M3 C4535 15 UNT3N4BL3) or to run a search-and-replace over the script every time they changed the script. From what I can tell, this is how Homestuck and pretty much every fanfic operate.

Fortunately for us, though, we’re running on a software engine! We can do better.

First, some groundwork. The main gameplay in Ren’py consists of dialogue in script files. Script text looks like this:

show !mituna at speaking

!mituna confused talk "she wouldnt leave without an ip adaptor that was the ONE thing i told her to bring"

!mituna idle frown talk "unless she was an idiot and just didnt. which i guess is unfortunately possible" (show_hashtags="#name of my autobiography: #\"unfortunately possible\"")

show !mituna idle

We don’t care about the stage directions here, let’s look at that dialogue:

On the first line of dialogue mituna is the character speaking, confused talk is his “pose” (the sprite displayed, if omitted it just uses the previous one), and the rest is the text that shows up in the dialogue box. When the story gets to this line, the character mituna says his line with a pose. (Remember that the character does the saying, this will come up later.)

The second line is pretty much the same thing, except you can see there’s some extra data called “show_hashtags” at the end. In Befriendus, the character dialogue boxes have an optional second line of text called hashtags, and this just tells the engine about that.

Here’s what that should look like:

Mituna dialogue; yellow text with normal spelling

But if you get Befriendus and play with all the default settings, here’s what you actually get:

Mituna dialogue; yellow text with quirky spelling

There’s some trickery going on here! Mituna’s text has its alphanumeric substitutions. Where did this happen?

Here’s the trick: all befriendus characters automatically modify their dialogue based on the currently set options. When the mituna character got the line, it changed the line to this:

"{quirk=mituna}unless she was an idiot and just didnt. which i guess is unfortunately possible{/quirk}"

That bit in brackets is a tag. Ren’py uses text tags as internal control commands for things like text speed or text style like boldness and italics, but it also lets you define your own tags to operate on the text. That’s what we’re doing here.

This notes that the quirk with the name mituna should be applied to the text if quirks are enabled, but it hasn’t actually done it yet. At the beginning of the route, when we first defined the mituna character in the first place, we added this line once:

init python:
    QuirkStore["mituna"] = [(c, "31073107"[i]) for i, c in enumerate("ELOTelot")]

The specifics of the right-hand side are the instructions for how to translate Mituna’s text and are black magic. What matters is we’ve told something called the QuirkStore how to apply the mituna quirk. Now every time text is rendered, as part of the engine’s default tag parsing (alongside bold, italics, links, etc…), the {quirk} tag checks whether quirks are enabled in options and applies them on-the-fly.

This lets us do some great stuff. We’re able to quirks anywhere we want (title screen tags, route titles, hashtags) without having to worry about extra cases: there’s no M*N problem since all the logic is handled in one place.

Keeping the semantic, pre-process copy of the text around has obvious benefits when it comes to translation or text-to-speech. Since the dialogue is stored correctly it’s easy for text-to-speech to read from the original text, rather than try to stumble through alphanumeric replacement or some other slurry.


I mentioned earlier that some quirks involve puns. While you could do this with regular expressions, (or write two copies of every script, yikes) we took a better approach and just piggybacked off the tags system again.

Here’s what Meenah’s dialogue looks like:

!meenah pissed "but HELLO we ended up getting busted {pun=halfwave}halfway{/pun} through and its only cuz of MY quick {pun=sinking}thinking{/pun} that we got here at all" (show_hashtags="#had to {pun=finprovise}improvise{/pun} like MAD")

!meenah snarky "{pun=betides}besides{/pun} i gave you my trolltag didnt i"

The {pun} tag is another Befriendus original. The text inside the tag is the original word, and the text after the = is the pun version. As with quirks, this lets the decision of what text to use be made at runtime, and globally. Tags hook into the global text system, so the pun and quirk systems are availible anc consistent anytime we display text.


I really can’t emphasize this enough: all the text features work together. You can toggle quirks independent of color, you can adjust puns independent of quirks, everything. Because everything is structured correctly, this is exceedingly easy to write for.


Unfortunately, “don’t duplicate work” has its limits, and animation is one of them. All our motion-intensive animations and flashing lights have to be written out twice; one full, one reduced. There’s a simple flag in the options menu that determines which one plays in the game.

While ATL has some support for conditionals, I haven’t found that to work consistently enough for our purposes, so we do have some icky logic mixed in with the script.

Here’s what Mituna’s flashing effect looks like:

You can see we tried to eliminate duplication as much as possible using subanimations here, and we even have a ConditionSwitch there at the end. But still, when we trigger the effect in-game, it looks like

if persistent.flash:
    show !psionicoverlay_flash #<- flash variant
    show !psionicoverlay_noflash
with dissolve
hide !mituna with easeouttop

Fortunately, there are only a few cases of this in the game.

Juicy Builtins

Ren’py has plenty of built-in accessibility features that we make sure to expose to the player:

Renpy accessibility menu

As shown you can replace the fonts, adjust text size and spacing, and even turn on automatic text-to-speech.

This didn’t require any real work on our part, except for communicating to the player that this menu exists, which we do at the bottom of the options menu:

Befriendus in-game menu, with accessibility options

As mentioned previously, it was also important for voicing that we kept the original english script around instead of preprocessing the whole thing into quirks.


Ren’py also makes it easy for fans to make and distribute dialogue translations. All our hashtags, menu text, and dialogue use the translation system to make this as easy as possible. Things like pun and quirk tags also make it easier to translate non-words by exposing the intent behind them.


I can’t take any credit for this one either; Alien and Robin maintain incredibly detailed transcripts for all the routes and features on the game page using a web of google docs. I wrote a utility to pull transcripts from Friendsim, but we don’t use that because we have access to all the original scripts. This makes making transcripts for Befriendus is much easier than fan transcripts for, say, Pesterquest.

Alien and Robin actually maintain two distinct sets of transcripts. Alien makes traditional text transcripts of the routes (with colours and quirks) that are as close to gameplay as possible, while Robin makes transcripts that are as accessible as possible, with quirks and colours removed and with added text descriptions of effects, poses, and animations.

Unlike other accessibility features, these aren’t mix-and-match; any changes need to be manually propagated through all the transcripts. Transcripts, though, aren’t part of the prototyping cycle; they’re put together at the very end, sometimes even after the route releases.


We have a warnings page with individually spoiled content warnings for each route. There’s a large button for this on the main menu, so players who are interested won’t miss it. We also try to include appropriate content warnings without spoiling the route, which can be a tricky balance.

This isn’t a traditional accessibility feature, but it does make the game more accessible.

Well, that’s what we’ve done so far. There’s more game yet to go, though; if we add some other major accessibility feature I’ll try to remember to come back to add it here.

I don’t have any groundbreaking takeaways here that I didn’t give away in the first paragraphs. Design your engine in a way to prevent humans doing duplicate work; let the data do the lifting for you. If humans have to do everything twice, no they won’t. Give players control; let them tweak their experience precisely to their liking. If done well, it doesn’t have to be all-or-nothing. Accessibility is necessary, and it doesn’t have to be hard if it’s designed properly.

pages Recommendations

  • 11 min read
  • Posted in pages

Recommendations for all sorts of things that don’t cleanly fit in a blog article or a Related Reading section.

In the spirit of trying to be useful, I won’t include extremely well-known items on this list. You don’t need me to tell you to play Half-Life or read GEB, but you might appreciate a nudge towards Superliminal or T.C. MITS. This is meant to be stuff you might not have heard of, not a drop-in replacement for top charts.

I’ll also try to avoid superlatives. Just know that if it made this page, I like it. In a similar spirit of concision, I’ll avoid recommending projects I’m personally involved in. Check the ol’ portfolio for that.

📚 means “I would also recommend extensive amounts of this person’s back catalogue, but in order to not totally clutter this page. I’m not listing all their good content. You should still check it all out, though!”

(Work in progress)


“Link In Bio” is a slow knife | Anil Dash, 2019
A really great opinion piece about how modern web “apps” try to maintain walled gardens at users’ expense.

Privacy and Power: Computer Databases and Metaphors for Information Privacy | Daniel J. Solove, GW Law, 2001
This is a relatively thick academic paper that essentially makes the argument that Kafka’s The Trial is a better metaphor for modern internet privacy issues than Big Brother.

Confessions of a Former Bastard Cop | Anonymous, 2020
This article written from the point of view of an ex-cop explains the systematic issues that encourage abusive behavior among police officers and how the structural corruption makes questions about the motives of individual officers less relevant than they would like you to believe.

Copyright is broken | Eevee, 2015
A very good article about copyright law in regards to fanart and derived works, and how the current legal and social paradigms have deviated so significantly from the original intent of copyright so as to be incredibly harmful to society and culture in general.

The App Store is broken because it wasn’t designed to work | David Hansson, April 2021
An concise explanation of how malicious apps get approved on the App Store and the problems with the current App Store review and moderation model.

How Corporate Tyranny Works | Chris Hedges, 2020
An in-depth article about Steven Donziger, an environmental attorney who has been harassed, demonized, and even criminally prosecuted at the demands of Chevron after he won a major against them in 2011. An incredible look at how wealthy corporations can make themselves unaccountable with legal thuggery.

Why it’s easier to move country than switch social media | Cory Doctorow 📚, 2021
An article about the importance of having social madia platforms that are interoperable — “Competitive Compatibility” — and how tech companies have strategically shut down compatibility after securing large monopolies over dedicated customer bases, relying on artificially inflated switching costs to deter competition.

listening and trust, part 1 | Aaron Turon, 2018
This article talks about some controversy over decisions about the internals of the Rust programming language. While the internals are dry, the controversy and especially the resulting No New Rationale rule, which I think is an incredibly important and correct principle.

Nintendo Conducted Invasive Surveillance Operation Against Homebrew Hacker | Andy Maxwell, 2020
A good overview on the shockingly dystopic Nintendo anti-modding campaign and the terrifying, personal war they waged on prominent researchers.

Yahoo, the Destroyer | Kaitlyn Tiffany, 2021
“How the historic company became known as a bumbling villain of internet culture”. A look at how Yahoo routinely purges legacy content focusing on Yahoo Answers (the most recent victim at the time.)


The Education of T.C. MITS: An truly unique book published in 1942. A treatise on the scientific and mathematical thinking written in something akin to free verse. It is a study in mathematics, an analysis of society, a defence of science, and a scaffolding of philosophy all at once. I own multiple copies of this to lend people.

The Jargon File: A collection of notes about capital-h Hacker culture and style, compiled circa 2003. Covers definitions, writing style, personalities, and even parables.


Video Essay-ish

Why Electronic Voting Is Still A Bad Idea | Tom Scott 📚, 2019
A short, simple video that clearly and effectively explains the basic reasons why electronic voting systems are inherently dangerous, despite whatever the latest technical innovation/fad might be.

YouTube’s Copyright System Isn’t Broken. The World’s Is. | Tom Scott 📚, 2020
A long, interesting, in-depth about the reality of modern copyright law and the strange and often counter-intuitive way it intersects with internet culture and modern entertainment.

CO-VIDs: the gandhi trap | Ian Danskin ( Innuendo Studios) 📚, 2020
A short video essay about the optics of brutal state violence against peaceful protesters — Bob Altemeyer’s “Gandhi trap” — and the use of intentional disinformation campaigns to manipulate them.

Tomatoes, or How Not To Define “Art” | Ian Danskin ( Innuendo Studios) 📚, 2017
A summary of the “what is art” conversation/argument and the difference between experiential definitions and axiomatic definitions. An argument about how to think about words and definitions in general.

The Death Penalty feat. PragerU | shaun 📚, 2020
A long video essay about the political debate over the death penalty, the various factions pushing on both the issue, and their arguments.

CTRL+ALT+DEL | SLA:3 | hbomberguy 📚, 2018
This is an exploration of CAD (and other weird gamer webcomics in general), but it also makes the key point that fiction can offer perspective into how the author sees the world, especially when seemingly distorted and out-of-touch with reality without meaning to invoke camp.

The Strange World of YouTube’s Corporate Propaganda | Big Joel, 2020
A video essay about YouTube and modern content platforms in general. Makes the excellent point that YouTube’s business model depends on it seeming like an invisible, natural force, when in fact it actively engages in relationships very similar to employer/employee, but with fewer protections.

Let’s go whaling: Tricks for monetising mobile game players with free-to-play | Torulf Jernström, 2016
A talk from a mobile game development conference that explores the “dark pattern” design techniques to make addictive video games that extract as much money from the public as possible. Dark stuff.

The Horror of Universal Paperclips and Space Engine | Jacob Geller 📚, 20XX
A contemplation on the web clicker game Universal Paperclips, the space simulator Space Engine, the topic of automation, and the cosmic horror of scale.

Games, Schools, and Worlds Designed for Violence | Jacob Geller 📚, 2019
Another video from Jacob Geller, but on a completely different topic. A video essay about how spaces are designed for expected use, and the potential psychological effects of the militarization of common spaces like schools. Starts with the design of video game environments, but quickly moves to apply those ideas elsewhere.

Don’t Be a Sucker | USA, 1947
Anti-fascist propaganda produced by the United States military in the wake of World War II. An explanation of the social engineering and rhetoric that pulls people to fascist ideologies, as well as how police forces with discretionary authority to arrest people are tools of evil. Honestly heartwarming.

Rise of The Doomer: Why So Many People Are Giving Up | Sarah Z, 2020
A look at the “doomer”; the disillusioned, hopeless generation. Where the name came from, some of the causes of modern existential despair, and ways of dealing with the burnout.

What You need to know about stalkerware | Eva Galperin, 2019
A brief Ted Talk about so-called “stalkerware”: commercial spyware commonly used by abusers to do in-depth reconnaissance on their victims, often deliberately allowed or ignored by commercial antivirus and other security systems.

Level Design | Joe Wintergreen 📚, 2016
A collection of short videos from Joe Wintergreen about geometrical level design tools and problems modern game development workflows have that old systems like Quake and Half Life didn’t. See also his twitter thread here about the design tools in Half Life: Alyx

The Austrian Wine Poisoning | Down the Rabbit Hole | Fredrik Knudsen 📚, 2020
The incredible story of the Austrian wine poisoning of the 1980s, and how it turned out the wine industries of entire countries relied on poisoning their supply with antifreeze.

The War on General-Purpose Computing | Cory Doctorow 📚, 2011- ongoing
A series of talks by Cory Doctorow on legal and corporate attacks against general purpose computers, and how those attacks are serious threats to liberty. Started as prescient prediction in 2011, has evolved into a summary of how that’s happening today.

Skits and bits

Sonic the Hedgehog (2006) | Real-Time Fandub Games | SnapCube, 2019
A group of voice actors ad-lib over the dialogue from Sonic 06 in one take with zero rehearsal.

🔞Adults React To PewDiePie | Retsupurae, 2012
PewDiePie is a YouTube sensation from 2010- who posted videos of himself reacting to video games. Here are some reactions to his videos.

Bowman skits
Starting around 2011, Michael Guy Bowman uploaded videos of skits and comedy routines.

Sesame Street: TV Repair


Infinity Train | 2018-2020 An animated series about people who find themselves on a mysterious train.

Daria | 1997
An adult animated satirical sitcom about a cynical highschooler in the disappointing, shallow reality of suburban life.

Person of Interest 2011-2016
A CBS “science fiction crime drama”. Starts as a semi-procedural but goes to some really interesting places about surveillance, privacy, artificial intelligence, and the ethics of ASIs. Fun fact: this series half predicted the Snowden leaks.

Elementary | 2012-2019
An adaptation of Sherlock Holmes set in modern-day New York. It’s the one with Lucy Liu as Watson, you know the one. It’s my favourite Holmes adaptation.

Psych | 2006-2014
A show about a detective who’s claimed to be psychic and has to constantly maintain the ruse while solving cases. Slapstick comedy.

Community | 2010-2015
A deconstructed sitcom about a study group at a lackluster community college. Dan Harmon’s show. Origin of that one danny glover pizza gif.

Infomercials | Adult Swim, 2013- Ongoing
Originally mock infomercials about fake products or services, though some of the later episodes evolved into more advanced unfiction. Some episodes on YouTube.

Unraveled | Brian David Gilbert, 2018-2020
YouTube video man Brian David Gilbert’s Polygon series on “unraveling” game lore and gaming culture

Petscop | Tony Domenico, 2017-2019
An unfiction series about a boy LPing a lost playstation game. Themes of child abuse and a murder mystery.

alantutorial | Alan Resnick, 2011-2014
An unfiction series about a man who makes video tutorials for the internet.

Gill & Gilbert | Patrick Gill and Brian David Gilbert, 2018
Also with Brian David Gilbert, a gaming streaming improv variety show. BDG describes it as a “nightmare public access show”.

A Measured Response | hbomberguy 📚, 2014- Ongoing
Well-researched videos responding hot-button topics that range from “quite a few people are wrong about this, actually” to straight-up lunatic conspiracy theories.

Audio series

Thrilling adventure hour 2011-2020: A stage show set in the style of old-time radio dramas. Previously a live show at Largo, now ended with occasional much-worse studio recordings. Distribution seems to be in a very odd place right now, but the full back-catalogue is available on their Patreon (as lousy as I find that practice to be.) (Edit: full backlog of the removed podcast available here)

The Magnus Archives 2016-2021: A horror/mystery audio drama podcast with a focused plot. Complete.


Vivaldi: A web browser based on Chromium. Extremely customizable with lots of quality-of-life features and full support for Chrome extensions. Akin to what Opera used to be.

Greenshot: Excellent screenshot software. Low overhead with hotkeys for capturing a window, screen, or arbitrary region. FOSS.

ScreenToGif: Speaking of screenshots, ScreenToGif is an casual screen recorder for capturing quick clips or interactions. Has a very nice built-in gif editor too. Not a replacement for OBS, but much better for quick jobs. FOSS.

PowerToys: Remember PowerToys from Windows XP? Microsoft brought the name back for a set of Windows 10 utilities. Includes a colour picker, SVG previewer, and power tools for renaming and managing files in explorer. FOSS.

Wiztree: A windows-optimized disk usage visualizer (in the vein of k4dirstat) with special optimizations for NTFS drives with a readable MFT. Freeware with a donate nag button (I paid for mine)

Wincompose: A compose key for windows. Allows you to type special characters directly from the keyboard, but using a true compose key instead of memorized codepoints. Fast and lightweight, with support for standard compose file formats and custom expansions. FOSS

Babelmap: A charmap alternative that allows you to browse through the entire Unicode codeset. Supports manual font settings (including composite fonts w/ fallbacks) and searching for characters by Unicode name or block. See also Babelpad, which is a lightweight notepad app with Babelmap functionality built-in. Freeware

Sublime Text: An emacs-like comparable to Atom, with a robust package library based on Python. My usual go-to text editor for programming projects. I have at least 4 Sublime Text windows open at any given time. See also Sublime Merge, $80 or an unlimited free trial with occasional nags. Developers, see also Sublime Merge, a git client (comparable to gitkracken) from the same company. A lightweight, high-quality image editor for Windows. Not a feature-complete suite like Photoshop, GIMP, or Clip Studio, but a very good replacement for paint if you working on something that doesn’t require highly advanced brush features. Has a robust plugin system for extra effects and filters. Freeware

wolfram|alpha: Technically a website. An advanced, contextual calculator that can solve complex equations and, more importantly, handle unit conversions.


(Links omitted, as games are often available on your platform of choice.)

OneShot, 2016: An RPG maker adventure game. Mixture of Undertale and OFF vibes. Great story, great characters, incredible gameplay mechanics.

Hack n’ Slash, 2014: A combination hacking/adventure game where you get in-game tools to modify aspects of the game’s actual code. From DoubleFine, the developer of Psychonauts.

The Stanley Parable demo, 2013: Did you know The Stanley Parable has a free demo? Did you know it’s completely original content? Go play that sucker.

Hypnospace Outlaw, 2019: 90s internet simulator in an alternate history. Explore a network of terrible geocities template sites and find out a plot along the way.

Glittermitten Grove, 2016: A game with secrets in.

2064: Read Only Memories, 2015: A Snatcher-like adventure game. It’s got a robot friend!

The Turing Test, 2016: A Portal-like from Square Enix. Talos Principle and Portal vibes.

The Beginner’s Guide, 2015: From Davey Wreden, the creator of The Stanley Parable. “The story of a person struggling to deal with something they do not understand.” An incredible experience.

Gunpoint, 2013: A break from all the high-concept stuff. A stealth puzzle platformer set in a noir conspiracy plot.

Superliminal, 2020: A 3D non-euclidean puzzle game that uses forced perspective and strange loops to explore dreamscapes. I remember seeing the first tech demos for this online!

Antichamber, 2013: A 3D non-euclidean puzzle game that uses an upgradable cube gun to solve a very wide array of lateral thinking puzzles.

Crosscode, 2018: A mock mmorpg with a pixel art top-down perspective. Really interesting combat, great characters, interesting story. Has a few rough spots difficulty-wise, but includes options to tweak that.

Factory Idle, 2016: A free “idle clicker” style game where you automate a factory workflow to make a profit. A combination between a clicker game and Factorio. Play with fimod.

Universal Paperclip, 2017: Another web clicker game, this time where you play as an AI whose job it is to make paperclips. An experiment in scale and AI objective optimization.

Megaman Christmas Carol, 20XX: A series of megaman fan games. Boss rushes against christmas themed enemies, with very nice feeling mechanics and easter eggs to explore.

Not Tetris (2), 2011: Tetris but with physics.

Rimworld, 2018: A dwarf fortress/gnomoria like scifi settlement simulation game.

What Remains of Edith Finch, 2017: A walking simulator that explores the strange house and lives of the Finch family tree.

Nier: Automata, 2017: Okay, I said I wouldn’t include the obvious stuff on this list, but Nier Automata is so incredibly good I can’t not recommend it. Possibly the best video game.


Device 6, 2013: Very interesting experimental storytelling that leverages the mobile platform. Good story, good puzzles, worth a buy. iPhone


pCloud: Cloud file hosting. Extremely feature-complete, with cross-platform file sync, selective folders, shared folders, and public file links. You can even send someone a link that lets them send you a file. Can be pricey though, unless you get the lifetime option on sale. Referral link, free month ($5) Recommendation suspended indefinitely until they fix major bugs with their software that result in all your files being deleted.

DigitalOcean: Good web hosting with very affordable plans for low-intensity use cases. Referral link, $100 credit


Michael Bowman: Indie rock(?), very good.

Metric: Alt-rock, wrote that one song from that one thing.

Cement City: Mostly fandom/club mix music.

Owl City: Electronic music project. Did Fireflies.

Casual Sunday: for my homestuck fans out there.

I dunno I’m really into electroswing lately


Homestuck 2009-2016: Homestuck! It’s a thing. A lot of archive content is unreadable on the public site right now, so I recommend using The Unofficial Homestuck Collection for the best reading experience.

MSPFA: Here are some fan adventures I like. (Or just mean to read someday, I guess)

gaming VR First Thoughts

  • Posted in gaming

I got myself an Oculus Quest 2 a couple weeks ago on a recommendation, and I have some thoughts! If you haven’t done VR before (like me, before I had my first thoughts) you might be wondering what you might notice besides the obvious. So, here are my observations, in no particular order.

Haptic feedback is really important

Haptic feedback is really important. Even though it’s just vibration, the difference between feeling something and feeling nothing when you touch things is worlds. The vibration does a decent job of simulating the feeling of resistance and letting you “feel out” the world, which is very important in games where the alternative is getting your prop stuck in a shelf.

You can actually stream games and it works

When I first saw that the recommended way to play PC games was over local wifi, I thought “no way. There’s no way you can get a high-quality video stream at that resolution with those latency requirements over wifi. I’m going to get a good USB cable and stream directly at 300 mbps and it’ll be excellent.” Turns out, no! With my (fairly normal) router, Virtual Desktop can stream a steady game at 1832x1920@60fps x2 over ~70 mbps with an imperceptible loss in quality. (Those numbers mean it’s good.) The connection is actually way more reliable than using the USB connection, and the Virtual Desktop app has a unified game launcher for both Rift and Steam which works great. If you look closely at dark areas you can see some artifacts, but in general I think this is a case where the video compression is extremely effective.

Facebook delenda est

I’m not going to write a whole essay about this here, but just after a few days of messing around with the device it was startling how vile Facebook’s integration with the system is. Facebook requires you to have an account to use the device at all. Facebook has a walled-garden store that permanently ties your purchases to your Facebook account (so you’re not able to delete Facebook without losing your property), and using the Oculus to play games that aren’t from Facebook requires you to sign up for a developer account in order to access the Android-standard developer options and transfer files.

Speaking of transferring files, there are a handful of ways to share Oculus content natively, and they’re all Facebook. As part of Zuckerberg’s ongoing campaign to monopolize and control all human interaction, if you want to share a screenshot from your Oculus, you can post it on Facebook, Facebook groups or Facebook messenger. If you have some technical skill, you can squeeze images and videos out of the device, but even that requires the at-will developer account mentioned above. It’s pretty disgusting.

It’s not all bad, though! This won’t just be me tearing into Facebook, I promise. People have done that well already. Okay, something fun…

Analogue triggers

That’s right, your favourite bit from the dreamcast controller is back and it’s actually used really effectively here! According to wikipedia triggers are usually analogue, but I’m struggling to think of a game that made good use of that. Aside from Super Mario Sunshine, which made… use of it.

Here’s a clip of me messing in The Lab, since that game has a robot hand that sorta shows you actuation pressure.

    ![Analogue trigger actuation in VR](

This turns out to be really cool in VR, because it lets you manipulate your virtual hands in a natural, continuous way, instead of jerky, unnatural movements. Since the “grip” trigger is commonly used for gripping and squeezing, this gives you a very natural way of conveying degrees of force in a virtual environment.

Taking the headset on and off is a pain

Putting on the headset and slipping on the controllers, even when you’re sitting down, is a whole process. That means switching between tasks is way harder than with a PC, handheld, or console.

This seems like a no-brainer, but during the Oculus setup process alone the wizard made me switch from headset to computer to headset to phone to headset, multiple times, for really very unnecessary things. It requires you to pair the headset with a mobile app to manage basic device settings, which it really shouldn’t need to do at all. Having the phone (and Facebook account) as a required step to manage the device is downright dangerous, especially since the app didn’t work at all on the first phone I tried.

There aren't many horses

My mom came over the other day for a visit and she wanted to try VR. She loves horses and wanted to try a horse game, so I spent a few days browsing around for something with a horse in it. The only thing I was able to come up with was Skyrim VR, which has a mere eight horses, none of which you can pet.

All that to say, there’s really not a huge selection of quality games right now. It’s a relatively new platform, and even out of the limited library available a lot of the early games were made before people understood how to design games for VR. There’s your Half-Life: Alyx, Superhot, and HAX (with some other semi-game experiences, like Accounting+ and Job Simulator), but there isn’t an enormous library outside that, from what I’ve seen so far.

Motion sickness is a real issue

Remember those early games that were made before people understood how to design games for VR, from a few sentences ago? Turns out one of the things you need to design for is motion sickness. Putting a first-person VR perspective character who controls with traditional analog-stick-to-run-around movement feels bad.

There are a couple ways games get around this. Some games (SuperHot, Job Simulator) don’t have the player move at all outside of their play space, which they move around in by physically walking around. This is the most comfortable possible, if the design allows for it. In games where the player does need to move around on a larger scale than a few meters, you can teleport the player. Most games have this option (“blink movement”), and it’s pretty comfortable. Probably the most interesting design I’ve seen is the translocator in Budget Cuts, which gives you this delightful portal overlay that lets you preview your jump location and comfortably jump through it in one continuous camera motion. Here’s a little clip of that:

    ![The Portal Locomotion of Budget Cuts](

There’s also a very nice write-up of this system written by one of the designers here. You also sometimes see a variation of teleport movement (Accounting+, Alcove) where you teleport to predefined spots on the map, rather than moving around at will. This is a nice way of making sure the player can always comfortably reach the relevant objects.

Finally, some games have continuous movement where your character moves around based on stick controls, but the game adds a vignette during movement, which helps with comfort.

There are some non-motion comfort issues too. I played Psychonauts in the Rhombus of Ruin (2018) and… oh, it’s bad. The story and gameplay are great psychonauts content, but the core gameplay loop is possessing people and doing things from their perspective (which is accomplished with a trippy, psychonauts-y spiral effect), after which you need to immediately re-orient yourself by spinning around in real life. The object selection mechanic uses, instead of the normal laser pointer, the headset orientation. Whatever object is most squarely centred in your viewport is the selected object, which means a lot of precision neck movement. It’s a fairly short game and it still took me multiple play sessions, just so I could stop when I felt ill. Design has improved a lot since then, but design really matters.

Non-VR games don't work well

Speaking of motion sickness, remember Skyrim VR, from horses? That is the usual pretty-much-just-a-direct-port-of-SE Skyrim port, but with a few UI elements tweaked for VR. It is miserable. Gameplay has you moving around quite quickly and athletically without requiring any real-world movement, which just isn’t comfortable at all. Again, design matters.

Two kinds of depth

VR (well, 3D in general) introduces an odd new polygon occlusion problem. In traditional 3D graphics projection onto a 2D canvas, depth is represented by size, occlusion, and visual cues. (z-buffers.) With stereoscopic 3D, though, you can represent the depth of an object directly, independent of its size and position.

The long and short of it is, things that should be behind 3D objects can be rendered anyway, “blocking” them. If you open your menu, for instance, it will appear “in front” of the game, so you can always see the whole menu, but it renders at a fixed depth. At large sizes it appears to “cut through” the 3D environment, and for small elements it can confuse your depth perception entirely.

This is just an odd design consideration I had really never thought of before, but it’s really very odd to experience.

Valve made a good hardware bet finally

Valve has been really excited about hardware for the last few years and made several bets that didn’t turn out that well. SteamOS, the Steam Controller, and Steam Machines (click that, it’s incredible) were all such commercial flops that just a few years later they’re off the market. Steam’s investment in VR tech, though, looks like it’s turning out great. The steam in-game VR overlay works great, and the way it lets custom overlays like Desktop+ work in arbitrary games is just wonderful. I still wouldn’t want to get an Index at the current price, but software-wise Steam seems to be way ahead of anyone else.

Give me the half-life lore please

i finished alyx and it hurts. i’m dying. valve i said nice things about you. please. i had my first few seconds in ten years and then it was over and i need another hit

⚙ Stanley and the Death of Sourcemods

  • Posted in dev

My first published, “successful” piece of game content was The Raphael Parable, a little exploration game about exploring an impossible office. I say “game content” here because The Raphael Parable isn’t a game per se, but a map. A mod for the Steam release of The Stanley Parable that bootstraps the assets and mechanics to create a totally different game.

A new version of The Stanley Parable is releasing soon: The Stanley Parable: Ultra Deluxe is slated to be a remake with improved graphics, new endings, and console support. When I first saw this, I thought it would be a fun opportunity to go back to The Raphael Parable and tighten up some of the work that didn’t age well (I slapped it together pretty quickly, in hindsight, and it shows in places) as a new mod for the new version of the game.

"I love my car, I just hate my engine" Unity logo mug “I love my car, I just hate my engine”

Unfortunately, I quickly realized this was a non-starter for one simple reason: Unity. Ultra Deluxe is made by crowscrowscrows in Unity, which unfortunately stops this iterative development in its tracks. Let me explain:

The Weird Genealogy of The Raphael Parable

The Stanley Parable itself started as a mod. The original published version is a Half-Life 2 mod from 2011, of which the 2013 Steam release is an HD remix. The Source Engine, which Half-Life 2 is built on, makes it easy to author a set of new maps and release it as a “sourcemod“. Davey Wreden did exactly this to make The Stanley Parable; he took the basic 3D engine and a few generic office-themed assets and made a completely new experience.

📣 More on the Hiveswap Odd Gentlemen Debacle

  • Posted in fandom

EDIT 2021-04-13:

As of Kickstarter Update #36, What Pumpkin made the following statement about the source in this article: (They didn’t tell you it was the source in this article, I’m telling you that)

As an addendum, WP has identified the primary source of a disclosure to a well-circulated document of the Hiveswap development process. WP has been aware of a pattern of false claims this former employee has made since the end of their employment at the beginning of 2014. As this individual was not present during the end of the development contract with GC, nor the WP NYC development period, all of the information they have shared is based on speculation and conjecture.

There is a detailed analysis of this update in The Hiveswap Fiasco, but to summarize:

According to What Pumpkin, this is a disgruntled ex-employee who left the team in early 2014, meaning anything they said later than that is speculation. In addition to the obvious — that a whistleblower doesn’t like the practices they’re whistleblowing — this would mean they were not privy to the events of 2014 or later, making anything they said about that only semi-informed speculation.

This makes sense. Many of the claims made here early in the timeline turned out to be correct, and even verified by What Pumpkin later on. Some of the later ones seem incorrect; semi-informed exaggerations to make a point. As with everything else, I will note which claims are dubious. It is entirely possible some of this information was provided in bad faith, but some of still holds up.

In the same Kickstarter update, though, they explicitly confirm a significant amount of the news I broke, including some in this very article! I have also noted those cases.

When I wrote the Hiveswap article, I left a note asking for people to contact me if there were any facts I got wrong or major events I missed. A number of people took me up on that, which I am thankful for.

However, there was one big report I got that was too significant to just edit into the article. Because these allegations were new, and from a credible source, I thought they warranted their own article and research.

For the rest of the story about Hiveswap, see The Hiveswap Fiasco, to which this is a kind of sequel.

By the request of the source (because Andrew is known to be aggressively litigious), I have edited our conversation into a synthetic document. This is a summary of the claims from the source to preserve their anonymity and ensure clarity. I am not yet asserting anything, just stating what the source said; I’ll hold my personal comments until after the whole thing. Here is that report:

What actually happened with The Odd Gentlemen

The biggest reason there’s an NDA in place about The Odd Gentlemen’s involvement is that Andrew wanted to cover up the fact that much of the blame is on Andrew’s failure to deliver a workable plan to the studio in the agreed-upon schedule.

While parts of the ipgd post are true, the post distorts what happened into a story designed to make Andrew look like he did no wrong. What actually happened is this:

⚖ Tweets about the attack on the Capitol

Twitter is an ephemeral medium. You scroll through tweets just fast enough for them to register in your head, and then they’re gone forever. If you want to find something again, you can go to somebody’s profile and scroll through, one tweet at a time, until you find what you wanted.

This is a lousy way of capturing history. That’s not great, because Twitter does such a good job of capturing important moments, as they happen. If you want to save that moment, though, what can you do? What do you do if you think a day’s tweets are important? Print them out?

Well, I did. Here is what I tweeted and retweeted, on a page. Tactile. To be read.