About The Hive Abroad

The Hive Abroad began as an experiment to see if I could write a short story consisting of discontinuous, kinda-“randomized” vignettes which nevertheless maintained a sense of emotional heightening despite their non-linearity. I wanted the reader to choose the order they read the passages, but I also wanted the experience to feel as if it had a proper beginning, middle, and end.

The challenge in writing this story was that although I had some knowledge of what the reader’s experience would be like, and some control over the order in which they read the passages, I did not have complete knowledge or complete control. Writing like this for a game is much easier and more comfortable, because in games we’re used to giving the player agency, used to urging them to take responsibility for and ownership of their actions. But when I write something where the reader has NO agency in the story’s events, I am used to being the one with all the responsibility and ownership. But this isn’t the case in The Hive Abroad.

So, this felt weird to write. It was sort of an exercise in psyching myself out.


Basically, the story is made up of around 25 short vignettes arranged in four major “tiers”. The later tiers contain more serious, sad, or frightening events than the earlier tiers. The later tiers also require you to have encountered certain setting information which is explained in the earlier tiers– for example, the nature of Marun’s morphing abilties, or the names of the three different planets on which Sam lived his life.

When I first began writing the story, I was using weird Twine passage setups to create “loops” that were otherwise impossible in Twine’s markup language. However, this became very tedious; every time I wanted to add a passage or move a passage from one tier to another, I’d have to make huge changes all over the project.

During Indiecade, however, Andi McClure graciously wrote a little piece of javascript which allowed me to make these changes much more quickly. The final version of the story would not have been possible without her help.


An earlier, appealingly-symmetrical version of the story. Andi’s macro allowed me to restructure this story many times before picking my favorite version.

The macro she wrote allows me to name all the passages that I wish to include in a timeline of sequential events, then allow the player to explore left and right along that timeline. I always start you off in the middle of the timeline, giving you options both forward and backward in time. If you read in one direction for a while, then “turn around,” the macro will skip you over the passages you’ve already read and take you beyond them to the next unread passage. If you reach one end of the tier, you will no longer have hands pointing in that direction because you won’t have the option to proceed any further that way.

Here’s a diagram of one way you could possibly read the second “tier” of events:


So, I know which passage in the timeline the player will read first: the middle passage. I also know which two passages they may read last: the earliest and latest passages. This means that I can put more “intense” events at the beginning and end of the timeline, and I know that the reader won’t encounter either of these until they’re at least halfway done with the “chapter.” This will result in gradual emotional heightening throughout the chapter, and allow the transitions between the tiers to feel stark and interesting.

However, this control is incomplete.  I have no idea how the player will explore the middle of the tier, how many times they will double-back, or even how many pointer-hands will be on screen for the second half of each tier. My control over your moment-to-moment experience is incomplete and uncertain. But– to take a step back– I have much more complete control over the emotional heightening of the entire story as it progresses from the beginning tier to the final tier.

For example, I can put more disastrous, intense, traumatic events in the later tiers. I can put events in the later tiers which play off the reader’s familiarity with the characters. I can do a lot of different things to ensure that the reader’s experience– although unpredictable– has the overall average emotional arc that I want it to have.

This is pretty amusing to me. Although I have no idea what any given minute of your reading experience will be like, or how jarring any individual transition may be, I do know what the “overall experience’ will be like. I have more control over the general than the specific. I’m usually all about specifics: in my current project, there are sections I’ve played close to fifty or sixty times, slowly changing the wording and the interaction sections bit by bit. The Hive Abroad forced me to take a step back and let things go.


Aside from Twine, I know no other tool that would have let me write something like this so easily. In the future, I’m interested in possibly using Twine for other non-“game” writing projects– projects which use randomization and non-linearity to expand their stories in ways that don’t necessarily involve game-like experiences.

Here’s an example of a project which actually accomplishes that: a fan-made web version of Cory Doctorow’s novel Someone Comes to Town, Someone Leaves Town which randomizes several characters’ names every time they appear. In the original version of the book, the characters’ names change every time they are used, keeping only the same first initial. Reading it as a text which actually changes the names randomly for each reader creates an experience which is more personal and, I think, better representative of the book’s core themes. If you’re going to have a story with themes of uncertainty and ambiguity, why not use digital tools to actually create that uncertainty in the text itself?

And, going forward– if I’m going to use nonlinearity in a story again, why not use it in a story where disorganization, randomness, uncertainty, or disjointed time are important themes?

If I ever had to write an “artist statement,” I’d probably say that I think the way in which a digital story is told should somehow reflect or enhance its themes. Swan Hill was about a guy buried in his own thoughts– so I used digital tools to actually bury his thoughts inside other thoughts. I’d love to write a nonlinear, non-game story where the core themes of the tale are more deeply expressed by the story’s non-linearity. I don’t think The Hive Abroad really does this, but for me it’s a good stepping-on point.


When it come to games, my favorite story-games all use unique story-delivery methods to further express their core themes, pulpy as those themes often are. Pulling the trigger in a Mass Effect interrupt feels as brazen and ballsy as an action-hero must feel when they step into the middle of a discussion and escalate shit with a gun. The thing the player does– the physical action of pulling the trigger during the NPC’s speech– mirrors the emotions in the scene and the overall escapist fantasy of the game itself.

The best recent example of this kind of wizardry is Pry, a mobile game nominated as a finalist for the Narrative award in the 2015 IGF. The player navigates the story with pinching and spreading gestures on the touchscreen. The text opens and closes like an accordion of folded paper, revealing or hiding details. These same gestures are also used to control video storytelling moments: sweeping your fingers apart will peel open the character’s eyes and play a video of the world around him. Pinching them closed will pull up the character’s “unconscious,” where rapidly-flashing images and text give you hints about the deeper meaning of exterior events.

The physical actions Pry forces you to perform while reading actually mirror the themes of the story. Eyes, wounds to the eyes, photographs, bright lights, moments of peeking voyeurism, and other vision-related themes and symbols are important to Pry’s plot. The protagonist spends most of his interior time agonizing over his motivations for the deeds he regrets, and the player slowly learns more and more about the degree to which he is culpable for the story’s central tragedy. You peel apart the text to open an eye, reveal a truth, expose a guilt– first-person video sequences are literally hidden between the lines of the story. If your finger slips on the screen, the pages may snap shut again, hiding the video behind a glut of evasive, frantic, stream-of-consciousness babble. This “prying” motion makes the story more than it would otherwise be. This is the kind of narrative magic I’m interested in. It doesn’t have to be about physical motions or touchscreen gestures or polished video sections, either: some Twine games have already accomplished stuff this dee using only text change macros.

Anyway, bottom line is that I’d love to write a non-linear short story that uses its non-linearity to create something big and resonant by uniting plot, themes, and narrative delivery. I’ll be thinking about this while I work on my other projects this year, that’s for sure.

The Hive Abroad

The Hive Abroad is an experimental, nonlinear sci-fi short story about friendship, community, and changing yourself.

You can read it here.

It is also available on itch.io, because that’s where the twines are at now, apparently

I began working on this story in 2013. I finished it in early 2015 with the help of Andi McClure (code) and Julie Fiveash (art).

Andi wrote a Twine macro for me which allowed me to queue up passages for the player to navigate as if they were a timeline. Having this code made designing and testing the story’s structure 10000x faster and easier. Take a look at Andi’s website.

Julie drew images used in the story’s navigation UI. Take a look at Julie’s website.

This story was written in Twine 1.4.2. You can find the story’s .tws file here. It contains all the javascript used to make the nonlinear navigation work.

Some cool shit with randomized text

Boromir Death Simulator


Boromir’s death was one of the great movie moments of my childhood. I knew Boromir was going to die. I’d read the books. I knew he was doomed from the start. But when he actually started taking arrows to the chest, I was overcome by the tragedy and the melodrama. I remember sitting so rigidly in my theater chair that my legs and neck started to ache.

Like many things Boromir has said and done (let’s be honest, Sean Bean himself is turning into a meme generator), this over-the-top death is not just a thing that happened in a movie; it’s now a kind of thing that could happen over and over again in the future. In this text toy, Boromir will die every time you refresh the page. His death will be a little different every time, but he will still die. And just like the movie, this toy will overwhelm you with the sheer melodramatic detail of his death. Boromir has 119 hit points! Did you know?

Someone Comes to Town, Someone Leaves Town (remix edition)

Cory Doctorow’s (mediocre) novel Someone Comes to Town, Someone Leaves Town has a number of weird characters whose names change almost every time they appear on-page. Someone created a web version of this story which randomizes those characters’ names automatically.

This is pretty cool. I think that randomizing the names more fully expresses the effect that Doctorow was trying to achieve in the dumb-paper version of the story. I didn’t much enjoy the book, but I love it when a digital text uses digital tools to enhance and expand upon its core themes.

This kind of stuff is very important to game storytelling. Can we use the way in which a player experiences a story to make the themes of the story deeper and more resonant? We can, and we should be doing it more often.

Who the fuck is my DnD character

This is simply an uncommonly good random character generator.

There are a lot of “useful” character/enemy/plot generators on the internet. Most are super old, and I hate nearly all of them. This one’s short and sweet, and it’s got a punch that a lot of random generators lack.

The characters each come with a personality adjective (critical, resentful, irritable, resourceful), an intriguing origin (from the wilds, from a brothel, from a theater company), and a really damn good quirk. Like, really damn good: “who adds a notch to their sword every night.” “who finds it impossible to speak to girls.” “who has serious body image issues.” “who realized the importance of literacy far too late in life.” “who was raised to work in a library.” The quirks suggest a whole range of possible secrets, backstories, and futures without locking the reader down to any single interpretation.

I’ve decided that the biggest quality indicator for any random generator of any kind is the degree to which it recognizes and addresses the inherent shittiness of randomization. Random output is generally worse than output created and curated by a skilled artist. To make random generators good, you either have to:

  1. sell the randomness itself as the aesthetic (see: fake academic paper generators, some kinds of twitter bots, or the Boromir simulator above)
  2. invite the user to curate for quality (what we did with Verified Facts)
  3. limit the entire system in such a way that its flaws are not often revealed.

What I mean by the third point is that, in my experience, short or small random generators are usually better than long, detailed ones which try to tell a whole story. It’s way easier to make a good short generator than a good long one, and robots who try to “tell the whole story” are usually worse than humans. Twitter bots, on the other hand, are short as hell, and some twitter bots are sublime.

This particular character generator accomplishes both point 2 and 3 above. Not only is it short in length, but the elements themselves are suggestive, not exhaustive. None contradict because none are particularly concrete. It tells just enough to interest you, then backs away. I love it.

Anyway, this page would make a great twitter bot. I would follow the shit out of it.

Some weird text-generation stuff I’ve enjoyed recently

Since working on Verified Facts, I’ve been paying a lot more attention to web projects that do similar things with text and text randomization. Here are a few projects that have entertained me lately.

Upworthy Headline Generator

upworthygeneratorAs we learned with Verified Facts, making a parody using randomized text is a great way to point out how meaningless, repetitive, or shallow something is. “This is so bad… it can be copied by brainless text robots!” is a pretty harsh burn. I’ve seen and enjoyed my fair share of Upworthy videos, but the over-the-top, teasing, and occasionally-exploitative titles can get pretty damn annoying. This Upworthy generator totally nails the textual style of those headlines, while the “youtube images” chosen for the body of the page also nail Upworthy’s tone and subject-matter.

I don’t really have a problem with Upworthy, but I admired the “accuracy” of this particular generator a lot.

What Would I Say?


What Would I Say? combs your Facebook posts and comments and comes up with a randomized utterance made up of various parts of sentences you’ve previously spoken. It’s amusing but a little repetitive. Here’s a full album of things it’s predicted I would say.

Headline Smasher


This one’s excellent. It allows users to draw sentence fragments from a wide range of news and opinion websites and to generate crazy-sounding article headlines. The cool thing is that when a user is generating headlines, they can select which sources they would like the program to draw from.

One of the biggest ways that users interact with any random-text-generation tool is through selecting or curating the results they would like to share with their friends. This goes for web toys, twitter bots– everything with randomization invites human curators. Most random text generators produce a mix of both excellent and boring output. When we made Verified Facts, we knew that it would be important to let users save results and share the ones that made them laugh the most.

Headline Smasher’s source selection improves on this by allowing users to an additional degree of curation. If I’m in the mood for, say, headlines about celebrities, I can choose to mix celebrity news sites with specific other types of sites. The results are still random, but I’m providing greater input, which allows me to see only the content that will make the laugh the most. And the fact that the funny results were based on my advice also strokes my ego, and makes me feel cleverer than if I were just an observer.

Twine without CSS or Javascript

I recently learned that an online Twine jam was going to be happening this weekend. It’s a “Naked Twine Jam”, where all submissions must avoid using any CSS or Javascript modifications whatsoever:

Twine is also very easy to customize. However, while visual modifications and external modifications can produce lots of interesting results, they aren’t at all necessary to tell compelling stories.

For this event, we’ll all work within the creative restriction of using only the basic Twine program with no CSS or Javascript modifications. If you don’t know what that means, then don’t worry about it! Just download the program here and start playing around with it.

I haven’t actually completed many Twine projects I’m proud of, but all of the ones I’m deeply invested in involve a LOT of javascript plugins and CSS modifications. My favorite thing about Twine is the versatility you can achieve through unusual text behaviors and page layouts. A lot of my favorite Twine games ever would be impossible without javascript plugins. Breakfast on a Wagon With your Partner, for example, could not exist without the cycling link macro. All I want is for all my friends to become insanely powerful would not have the same crescendo without the targeted CSS macro. Anhedonia has important audio and visual elements that would not be possible without javascript and CSS. Without those elements, it would be a completely different kind of art.

I have no problem with the idea of a “naked” Twine jam– in fact, I’m already participating– but it is making me realize how much I value customization and specialization in Twine projects.  I’m fascinated by words changing and behaving uniquely on-screen. I like cycling links, unfurling sentences, etc. Not all of my projects use these kinds of behaviors, but I really like them, both in my work and in others’. I like that Twine allows authors to add this functionality.

Fact is, when you add new behaviors to onscreen text, you can actually say new things. I recently met with another writer who’s interested in new ways of presenting nonlinear narratives, and during that conversation we talked a little bit about how the artistic possibilities of hypertext are unrealized by the tools and platforms people have been using to consume digital writing. When you add cycling text to a page, you can actually communicate in new ways that you could never could before. When you add “unfurling” text, the possibilities for communication expand again. To make an awkward analogy, when it comes to the communication of ideas, these features are less like fonts and more like entirely new words.

Twine is special because it’s accessible, but it’s also special because it can be incredibly complex. You can make Twine behave in extremely specific and unusual ways, which in turn allows you to say very specific and unusual things that can’t be quite said in any other way. If I’d been writing Swan Hill in linear form as a short story, I could have communicated the Chancellor’s inward-looking attitude in a number of different ways, but I couldn’t have possibly communicated it in exactly the way that I ended up doing so. And I have the replace and revise macros to thank for that. That’s the kind of thing that I value about Twine.

Nevertheless, I’m enjoying the challenge of making a game without CSS or javascript modifications of any kind. I’ll probably go back after the jam and spruce it up before hosting it on my own website, but until then, the story looks a little like this:


Verified Facts

EDIT: A lot of people who have seen this site on Reddit and Hacker News have assumed that we did something fancy to get the conspiracies flowing. We didn’t! There is no “Markov chain generation” in this project, just a LOT of writing and some clever sentence linking-rules. See Ian’s post about how he programmed this project to learn more.

Recently, my friends Ian Webster, Emily Snowman, and I made a website that generates conspiracy theories.

It’s essentially a very detailed mad-libs generator. It mixes and matches about 33 pages of content we wrote over the course of two weeks. Although the conspiracy theories it generates are not always very coherent, it does attempt to create an illusion of intent or coherency by getting the main sentences in each conspiracy to share nouns.

How it works

Each passage is made up of two kinds of sentences: “main sentences” and “filler sentences.” Main sentences look like this:


but the content we wrote looks more like this:

Studies show that people who spend too much time in {{place1}} frequently end up with incurable cases of {{malady}}. This trend is consistently repeated all the way back through {{era}}, when {{government_org}} first set up shop in {{place1}}.

The items in {{brackets}} stand for words which will be substituted in from our massive list of content variables. There are 12 categories of content variables: maladies, dangerous nouns, eras, abstract nouns, government organizations, companies, countries, civilian organizations, events, places, famous people, and government people. I haven’t counted all the individual nouns we have in the system, but it appears to be over 650. Some of them are silly and a bit flippant; some of them are the kind of things that conspiracy theorists might actually say. Others are historically problematic and make me uncomfortable whenever they show up! Filler sentences are static, and contain no variables. They say practically nothing, too.

The passages this program generates each have a minimum of 4 main sentences: an introduction, two arguments about “evidence,” and a conclusion or warning. There can be additional evidence sentences, and there is a chance for one “filler” sentence to appear between any sentence after sentence 2. Here’s a conspiracy it generated, with the parts labelled:


When the program first begins constructing a random passage, it selects one introductory sentence and a bunch of nouns to fill it with. It then attempts to select a second sentence that shares at least one of those noun fields. There are never any filler sentences between these first two main sentences; this helps the passage feel more like someone is telling you a story about something instead of just linking random phrases together.


The process continues. For each main sentence, the program selects a sentence that shares noun categories with the immediately previous main sentence, then fills those categories with nouns used in the earlier sentences, generating new nouns to fill new categories if necessary.  The nouns shared between later sentences don’t have to be identical the noun shared between the first two sentences. There are certain classes of nouns which the program prefers NOT to link: for example, it would rather share a {{person}} between two sentences than an {{era}}, an {{abstract_noun}}, a {{dangerous_noun}}, or a {{malady}}. The program also attempts to bring back previously-mentioned nouns, even if that noun has not been consistently shared. If the {{person}} “Oprah” shows up in sentence 1, but not in main sentences 2 or 3, she could still show up in main sentence 4 or 5.

The effect of this passage-structuring system is that our passages tend to feel rambly and unfocused, but that they also have a chance of returning to original topics or making neat circular arguments. We feel that this is an appropriate way for conspiracy theories to behave. I’ve noticed that writings by real conspiracy theorists tend to display bizarre, barely-penetrable dream-logic, as if the author is following directions on a map nobody else can read. Therefore, when it came to verisimilitude, we found it acceptable to write a system that assembles passages randomly, with no real comprehension of related “topics” or sentence subjects.

The project also contains fake footnotes and relevant page titles. Page titles can list one or two nouns. The first noun listed is always the noun shared between sentences 1 and 2. If this noun is also the noun repeated most-often throughout the conspiracy, no other noun is listed. But if another noun is listed more often than this first noun, that noun will also be included in the conspiracy title. Footnotes, on the other hand, are just selected randomly and in random quantities from a collection of works found via Google Scholar.

Problems and solutions

We are aware that much of the time, our conspiracy theories sound nothing at all like actual speech, or like actual coherent conspiracy theories. However, we have settled with this in favor of solutions which would have harmed the overall quality of the project.

  1. We could have trained the program to recognize the subject of a sentence. We could have done this by adding additional tags to indicate which noun field in each sentence was the subject. We then could have written a linking algorithm which paid more attention to sentence topics/subjects. However, this would have taken a very long long time and probably a lot of backtracking and content re-writing, and we were treating this as a short project.
  2. We could have written the main sentences in a more vague or homogenous way, so that they resembled one another more closely in tone and style. However, this would have forced us to make the content overall more “mellow” or “middle of the road”, which would have made the project less hilarious.
  3. We could have had a more strict linking system, where each sentence in a passage shared the same noun or couple of nouns. This would have made the sentences less rambly and more uniform, which was not something we found appealing, stylistically.
  4. We could have been more judicious about using certain noun categories more frequently. Right now our collection of sentences contains far more instances of {{government_org}}, {{dangerous_noun}}, or {{organization}} than {{era}}, {{abstract_noun}}, or {{event}}. I would like us to even out noun category usage over time, but right now, I think the imbalance is OK, since it gives more weight to the kinds of noun categories that are traditionally associated with actual conspiracy theories.

We are satisfied with the current state of the project but figure that there’s a lot of work we could still do on it.

About mad-libbed content

I have previously tried to complete other mad-libbed content projects, but have always failed to actually implement any systems. This is the first time I have seen a random-prose-generation project through from start to finish.

In the end, content proved to be both our greatest strength and our greatest weakness. Our system was entirely creator-content-based; the program had no ability to write its own sentences, and users could only contribute individual nouns in predefined categories, via the “Search” feature. No matter how sophisticated our linking systems are– and no matter how sophisticated they might become in the future, after more development– the quality of our content will still be our major limiting factor.

For example, when we first started working on the project, there was no distinction between {{organization}} and {{government_org}} and no distinction between {{famous_person}} and {{government_person}}. Additionally, we had a lot of people in those lists who were long dead– so long dead that the didn’t make sense in most of the sentences they’d turn up in. At one point, we had to go through the variable lists and split everything up and cull a ton of words.

We had similar problems with the main and filler sentences. Sometimes we’d write a sentence that sounded good by itself, but made no sense in the context of other sentences. Sometimes we’d write introductory sentences that had too many variables, and seemed to tell too complete a story– so every sentence that followed would sound unrelated and weird.

Every time Ian (who programmed the entire project) made adjustments to the linking systems, our passages improved– but they could improve only so long as the sentences made sense. I think the most time-consuming, dull, and frustrating barrier we had to overcome was the degree to which poor content limited us.


We hope to continue updating the site, but we will always have to navigate a tradeoff between conspiracy “coherency” and other qualities we value, like randomness, rambliness, high variance, and the sheer size of the project overall. (The sentences themselves contain over 9500 words!)

If I ever have to work on a project where I must write a mad-lib content generator, I will prefer the passages to be much less detailed than the ones in this project. I’d prefer to work with passages consisting of only a few sentences– three sentences, say, and no filler– and much less than 12 variable categories. With good content, such a project could seem just as varied and interesting, while requiring a fraction of the necessary man-hours to implement, and granting the creators more fine control over the final generated results.