Return of the Robo-Writers
The NaNoGenMo 2022 Roundup
2022 marked the 10 year anniversary of NaNoGenMo, the procedural generation event where participants attempt to write a program that produces a “novel”. The definition of “novel” is very loose here: it only matters that the book contains 50,000 words — whatever they may be — and that the source code is made available as well. For the past three years I’ve published a review of some of my favorite picks from the results, and despite my best procrastination attempts, the task of highlighting some quality submissions is once again mine.
Besides reading this review, I encourage people to check out the main Issues page on Github. There are many more novels than just those covered here, and each entry has commentary from the author plus links to the source code to learn more. This year also had several “same author, multiple entries” events, so I’ve tried to limit summaries here to one per human. 2022 was a less prolific year that most, but there were still plenty of gems worth a look. Let’s take a peek at some of my favorites!
LLMs and Diffusions
2022 was a breakout year for large language models, text-to-image generators, and transformers of massive size. DALL-E 2 made a tremendous impact with its ability to generate style copies of surreal and absurd imagery, while Stable Diffusion and Midjourney opened image generation tools to the wider public. ChatGPT, launched in late 2022, has achieved massive success (and been shoehorned into all sorts of situations it should not be used in). We aren’t yet at whole novel creation from a prompt, but authors are already using the technology as a force multiplier: a sort of “content-aware fill” when you don’t want to spend time writing what that throwaway tavern interior looks like.
Last year saw some entries built on GPT-2 and other LLMs, interfacing via things like AI Dungeon, but this time the barriers are lower and a much larger number of authors have use these tools to construct their novels.
“Memoirs of a Failed Poet” by yashkens
In a palace, all the gold I own
I would give to you, love, as a gift. But I have not enough. Love,
You are my all. My one thought is for you
And I shall never have enoughTo give you all that you deserve. When you are well, I’ll come back
and ask you for your part. Good-bye. Yours ever,
A lover.
This simple poem is about a young educated woman, who has fallen in love with her boyfriend. She wants him to know how much she loves him. A person’s name or words are not important in a poem, here the speaker reveals her deep love and passion for her lover.
This is an expressive poem which contains a lot of passion. The speaker wants to say that she has enough money to give her lover but is unable to do this…
This entry is a collection of poems produced by two trained language models: the first writes poems, while the second attempts to read and analyze the poem. It is presented as the collected works of a “failed” poet, who was unappreciated in their time — now, they are revisiting their work, and expounding on the meaning that people overlooked in their writings.
“The Journey of Tom Hero” by Jeffrey Binder
Bridge Troll Tom Hero remembered was enormous, of a shaggy, shambling, and shapeless bulk. His whole body, from head to foot, was covered with a thick, wiry, and dirty-looking hide, which seemed to have been all shed therefrom in one night, or in one day, and night of it, and night of it. He wore a ragged, dirty, tattered pair of trousers, which were as dirty as his hide; and a dirty, tattered pair of boots, which, though they did not appear to be worn, yet were evidently of the poorest quality, and were as shabby as the rest. In short, he was a very dirty creature, whose whole person was a mass of filth and dirt, which scarce permitted him to look handsome, much less be distinguished.
Hero never afterwards mentioned either the name of the Bridge Troll, Tom Hero, or any circumstance connected with that adventure.
An exercise in “text expansion” using a finetuned model, this entry takes an index of a book and attempts to use it to re-create the book. The model was trained on an Adam Smith work (given the text and its index). Then, the author wrote his own index based on Joseph Campbell’s monomyth, which the model then expands upon to write a 50,000 word book.
“The Botanical Codex of Aldhaka” by Hylis Wilk
Modeled loosely on the Voynich manuscript, this entry uses a combination of OPT, Stable Diffusion and Midjourney to create a compendium of fictional plants. Each two-page entry contains a generated description of a plant (written in a completely generated script) and then an accompanying AI rendering of the plant. Though it’s unreadable here, a peek at the Github issue shows the prompts used and some idea of what the outputs looked like. The results are gorgeous and mysterious.
Other LLM-powered entries included a GPT-2 Philosopher musing endlessly on provided topics, and a compendium of architectural oddities with occasional illustration provided by Stable Diffusion.
Nano-NaNoGenMo
At the opposite end of the large-model-powered books are the NNNGMs, entries which must fit in 256 bytes of code. The challenge is to produce interesting output in a highly constrained environment. Clever authors find a way to source more words and variety from the outside environment. Here are some favorites.
“Rasp” by nervousdata
grinning singing ii smarts int sir i st i nnnrrr gingivitis stirrings shirt i srssrsg twigging fairness stressors gents. r nee forborne i fezzes froze ferment z foe frizz fr o o fr no zoo effrontery earner r fr oz ooze e sunroof. eye twerp thatcher trowel t yeah tr weer whittler cartwheel atwitter bathwater that trrhhh as h re sett eye a what.
A series of three-sentence paragraphs, formed by shuffling letters around and then feeding them through autocorrect to see what comes out. Sometimes a word emerges from the letter soup, other times it’s all ngggrgrrg.
“Streaming” by Nick Montfort
TIMEBASE 1 1000
rcvlatency
mapped to different
The
It
This
CIBoxBlur default
and exit
receive packets
standards
to configure The
of x and y
bt709
histogram 6db 286
device allows one
pixels with average
16 bit raw audio
Creative reformatting and blanking of words from the ffmpeg documentation produces a very long poem about pixel format conversion. Occasionally the stream stops and tells the reader to “(wait)”.
“Deuxportrait” by Nathan Mifsud
I don’t know anything about your plagued French! I can’t see what you want with a wife, anyway. I wouldn’t allow anybody to do anything but myself, anyhow, at such a time as this. I have not had time to write, and this will be but a short letter. I would as soon taking an airing on the slant of a rainbow as in such a front yard. I am inert and drowsy all the time. I do not know whether they would go any farther, but on your account as well as my own I will not take the risk. My late wife was the dramatist and stage-manager. I have brought it here to lay at your feet. My son having proved his earnestness, I was about to consent to the marriage of my own accord. I have drifted along hopelessly for a hundred pages of manuscript without knowing where to commence
Take the collected works of Mark Twain and Winston Churchill, pick out any autobiographical sentences, and reformat them together to build a self-portrait in the style of Edouard Levé’s Autoportrait. There is a lot to learn about the computer author here — contradictory, funny, but always unique.
There were a number of other NNNGM entries this year — some other favorites: a poem generator, a guessing game from the Webster’s Dictionary, UNIX fortunes in Latin, and a request to OpenAI just asking it to write the dang program.
Generation from Scratch
Some entries that attempted to create a novel from a hand-crafted algorithm, template, or repurposed code meant for something else.
“Transcript of the Tournament of War” by Kelly Egan
Game 3, Round 1
GARCIA: What a cloudy day for war.
HUERTA: Hello, I’m Daryl Huerta.
GARCIA: And I am Ray Garcia.
HUERTA: Welcome to Game 3 of the 1st round of the War Championship. On one side of the table today, Juliana Miller. On the other, Jeremiah Roy. Miller defeated Roy in their last game. Who will win today, Ray?
GARCIA: Roy really dominated in that game, but couldn’t turn it into a win. Roy is definitely ready for a rematch, but as you know Daryl, there is always a possibility it could go either way.
HUERTA: The dealer has signaled the start of the match. Two sixes. We have a war! Miller loses the battle. Roy takes 6 cards. Miller’s hand, Ace over queen.
GARCIA: Miller just showed us how its done.
HUERTA: Miller beats Roy with King of Spades over Five of Spades.
A simulation of a tournament of War (the card game), this entry is simple enough, but the framing as a transcript of sportscasters elevates it to something more. Huerta is the straight man telling the facts while Garcia inserts color commentary along the way. The treatment of essentially random outcomes as calculated deep strategy is very funny.
“An Unfinished Novel of 50015 Words” by Charles Horn
This is followed by a ‘w’ enclosed in single quotation marks. Then there is a dash. This is followed by an ‘o’ enclosed in single quotation marks. Then there is a dash. This is followed by an ‘r’ enclosed in single quotation marks. Then there is a dash. This is followed by a ‘d’ enclosed in single quotation marks. Then there is a dash. Then there is a period, ending the current sentence.
Yes, more of the same. Exasperated, the reader jumps forward again, to page 29. At the top of the page there is a quote, as if spoken by a character. “This is new. . .”
“This flow of words and letters, recognizable yet not directly meaningful, has a somewhat soporific effect. There is a rhythm to them; a plodding familliarity, yet there is something alien, perhaps ominous. Where is it all leading? Is there anything to uncover, or is it all effectively empty terrain?”
It appears to be the narration of a reader’s internal thoughts. But which reader? This hasn’t happend. Yet?
This novel is about you, the reader. In the book, the reader narrates exactly what they’re reading, which quickly runs into narrating the reading of their narration. To complicate things further, the reader occasionally jumps forward or backward in the novel, quotes themselves from elsewhere (sometimes multiple layers deep), begins describing the letter forms themselves… The author describes it as a “self-referential object”, as in, a book within which it describes itself. The Github issue also has a detailed worklog, and some ideas for further development.
“Role Task” by Ben Steinberg
Raymond thought Brent was looking graven. Brent asked, “Movement student wish return public than group?” “Mr. Jackson, I presume,” said Brent Anderson. Raymond and Brent moved to Burnaby. Start past fast study remain military. Debate serious coach three around health either end. Before culture effect summer expect see. Manage time range else since different body notice. Brent was looking for a toilet paper tube. Raymond Jackson wept. Raymond asked, “Heart young product book support community nor?” Gun hit pick cell PM parent. Brent Anderson fell in love with Raymond Jackson. News know past right successful. Brent asked Raymond for the time. Brent thought Raymond was looking broadest. Answer fill understand national. Raymond Jackson said “City cup energy indeed simply.” Republican forget agency star leave. Five change player democratic Congress center. Under four approach summer compare matter. Structure recently morning glass thousand base mention. Brent felt patriot. Raymond greeted Brent.
Brent was replacing brakes. Mr. Jackson’s shoes were too tight. Total hospital risk sing rock seat. Mr. Jackson’s shoes were too tight.
A clever (mis)use of the Python unit testing modules “Factory Boy” and “Faker”, this entry creates characters, chapters, and sentences out of the bits of sample data normally intended for checking your Python programs. The language reads a bit like caveman-speak, which gives a unique charm and also encourages the reader to insert their own meaning. The write-up in the repository goes into much more detail.
Speaking of stories based on software development, there’s an entry that tells a story from the commits to a repo, and another one that narrates the counting of Github stars being added over time.
“Pokémon Adventure” by dawnithan
I ended up looking inside a damp, dark cave for new POKéMON. Should’ve brought an escape rope!
I took a stroll down a nice route full of people and POKéMON — I love the fresh, crisp air!
Whoa, you won’t believe it; I stumbled across LOUDRED! And it’s got the ability SOUNDPROOF!
Apparently it is Lv. 54 and has a IMPISH nature. Seems to know INCINERATE, BITE, THUNDER-PUNCH, and POWER-UP-PUNCH!
Oh, and here’s what the POKéDEX says:
The force of this Pokémon’s loud voice isn’t just
the sound — it’s also the wave of air pressure that
blows opponents away and damages them.
Score! Just stellar.
Using data from the Pokémon API, dawnithan has generated an account of one trainer’s journey to catch ’em all. The main character travels to different locations, encounters monsters (with descriptions), and then captures them to complete the Pokédex. Since the entry stops just short of 50,000 words, there are some bonus “mudkips” tacked onto the end :)
Cut and Paste
Sometimes it’s enough to just take the good words other people wrote and combine them in a new way, instead of trying to write your own!
“Telegrams from a Future World” by Sebastian Martin
INT. EMPTY APARTMENT
No one there — nothing makes a sound.EXT. HIGHWAY — LONG SHOT — DAY
a radio in the next room quietly says: …As the 27th Conference of Parties (COP27) Session of the United Nations Framework Convention on Climate Change, UNFCCC, kicks…INT. LAB DECK, PRESERVATION ROOM — DAY
An uncanny emptyness in the space — no sound.EXT. CASTLE ROOF TOPS — CONTINUOUS
No one to be seen — nothing makes a sound.
Sebastian Martin’s entry combines together scene descriptions from movie scripts, news snippets of climate change stories, and descriptions of empty desolation to describe a world devoid of life due to catastrophic events. It is an eerie read, definitely with a strong style.
“████” by Leonard Richardson
███████ fascinated █████████████, ███████’███████████████. ██████████████████████’██████████. ██████████████ graveyard █████ unclean ████, ███ Amelia ████’█████████████████████████████████’███████. ████████’█████ injury ████████ healing, ████████████████████, ██████████. ███ graveyard ██████████████, ███████████████████████████████.
“████ ██ Ishmael” by Hugo van Kemenade
████ ██ Ishmael. ████ █████ ███ — █████ mind ███ ████ precisely — ██████ ██████ ██ ██ money ██ ██ purse, ███ ███████ particular ██ ████████ ██ ██ █████, █ ███████ █ █████ ████ █████ █ ██████ ███ ███ ███ watery part ██ ███ █████. ██ ██ █ ███ █ ████ ██ driving ███ ███ spleen ███ regulating ███ circulation. Whenever █ ████ ██████ growing grim █████ ███ █████; ████████ ██ ██ █ damp, drizzly November ██ ██ soul; ████████ █ ████ ██████ involuntarily pausing ██████ ██████ warehouses, ███ bringing ██ ███ rear ██ █████ funeral █ ████; ███ especially ████████ ██ hypos get ████ ██ upper ████ ██ ██, ████ ██ ████████ █ ██████ moral principle ██ ███████ ██ ████ deliberately stepping ████ ███ ██████, ███ methodically knocking ██████’█ hats ███ — ████, █ ███████ ██ ████ ████ ██ ███ ██ ███ ██ ████ ██ █ ███. ████ ██ ██ substitute ███ pistol ███ ████.
Blackout poetry is a common topic for NaNoGenMo and this year we had a pair of entries of the sort. The first entry takes an unpublished book from the author, then blacks out words that appeared in any of the auther’s other two published books. You can read only the unique details that set apart this new novel, but most of it is obscured by the darkness.
Hugo van Kemenade’s entry, inspired by the previous, works on Moby Dick and blacks out all repeat words in the book — leaving only their first usage untouched. The early chapters are fairly clear, but the end of the novel is nearly entirely blotted out.
“El Bosque Reanimado” by Juan Alonso
La que nunca un disgusto me dio. Guardó sus ropas en un baulito de madera con forro de papel floreado y se marchó a la ciudad. Era incoercible e inatacable y parecía estar dispuesta a consumir toda su pericia en aquella persecución. Unos llenan de oro esas ollas; otros muchos más jóvenes he tratado yo cuando se estaban convirtiendo en mesas de comedor y en tresillos para gabinete. Juanita Arruallo la llamó, en sus horas vacías, la lagartija o la araña «mala noche hará hoy» de ellas arrancaba el sol destellos de los siete colores, y era, contrató los servicios de Pilara, la tendrá dentro de unos minutos, que huía con inigualable rapidez.
An entry in Spanish, this entry chops up “The Animated Forest” (Wenceslao Fernández Flórez, 1943) and recomposes its phrases into a new book of weird description. The text fragments are split at certain words and recombined by pairing each ending with a beginning that matches. The code, also in Spanish, describes the technique in more detail.
NaNoGenMo 2022 did not see a lot of non-English entries, but there was at least one in German made of rearranged favorite book quotes as well.
Presentation is Everything
Some entries where a strong focus on the final layout pays off.
“A Letter Groove” by Liza Daly
This beautiful entry is composed by layering high quality page scans together and then cutting out segments to reveal more things underneath. The source books are in “IIIF” archival format, which pairs high-quality images or other media with metadata (OCR’ed text, for example) and presents it in a unified container. I love an entry where I get to learn about a new technique or format! There’s an online version as well, where you can paste your own IIIF manifest to generate your own cut-up novel. Highly recommended.
“The Architect” by Vera Chell
Vera Chell produced this parody of social media interactions, written as templates for a language called YeetWords. The story is told through a mixture of social media screenshots, brands buying ad space, and newspaper clippings. There is a progression from start to finish of an ongoing conspiracy, fueled by the viral topics that are trending online. I really liked the bogus ads (with photos!) and the tone of the social media posts from users. Are the architects behind this recent hammock craze? Read and find out!
“Society of the Spectacle (XFified)” by John Ohno
Here we have “Society of the Spectacle” by Guy Debord, reformatted through a tool that renders the section headers to mimic those from The Xenofeminist Manifesto. Huge, brightly colored letters overlay on a varied collection of images, whilethe text itself is then formatted in a strong blue font and small margins. It’s a stunning presentation in a 216 pages PDF. Very cool.
Last but Not Least
Rounding out this review: a grab bag of entries that didn’t fit the above but deserve a callout anyway.
“Broken Computer Games” by Kay Savetz
A hilarious homage, or parody (your choice), of David H. Ahl’s “BASIC Computer Games” book series of the early 1980s. Ahl’s BASIC book series contained hundreds of type-in programs for contemporary microcomputers, and helped spark a passion for programming for thousands of young readers. This version repeatedly selects two programs randomly from the original book, mashes them together by picking lines from each. The result is a tangled mess of BASIC code, which the program then tests with PyBASIC to see if it leads to a crash. The survivors are formatted and printed in the resulting PDF and look nearly indistinguishable from the original.
“Moby-Dick (Colorized)” by Aleksey Tikhonov
“The Best of Times” / “The Worst of Times” by Kevan Davis
Here we have a pair of entries with colorized words. Aleksey Tikhonov’s work takes Moby Dick and passes it through a custom-built color-name-to-color RNN. The output highlights words and phrases in different colors. It is interesting to see the decisions made by the RNN — some are natural choices (sea, ocean, etc. in blue) while others are a bit odd (“frozen” and “frost” are red?) The issue links to a very descriptive blog post on Aleksey’s creation of their name-to-color system which itself is worth a read.
Kevan Davis independently worked on another word colorization project: this one performs sentiment analysis on “A Tale of Two Cities”, coloring th positive words in green and the negative ones in red. It further divides the book into two books — The Best of Times containing the “positive” paragraphs, while The Worst of Times is only the negative.
“Determiner Adjective Noun” by Albert Hwang
“Pronoun’s determiner noun,” verb determiner adjective noun, verb adverb preposition pronoun noun conjunction pronoun noun. “Number noun pronoun verb determiner noun pronoun verb verb other preposition pronoun verb noun preposition Noun Noun conjunction adjective noun preposition determiner noun. Noun pronoun determiner verb, noun, conjunction verb pronoun determiner adjective noun preposition determiner adverb adjective noun.”
A simple but effective idea: take “The Great Gatsby”, and replace every word by its part-of-speech. This result stops just short of 50,000 words (as Fitzgerald’s original does), but then again: rules are made to be broken.
“distance and even dust” by Zach Whalen
All right, I have to admit, I’m a bit of a sucker for entries where I can’t tell what is going on even with a good write-up. This one is remixing a 1904 novel through application of Perlin noise — treating the book (line, column, page) as a three-dimensional random pattern and then somehow averaging them together to create a cloud-like structure. Again, the code is very straightforward, but … well the results sure look neat, even if I don’t quite get it haha.
Conclusion
I’m really impressed that the NaNoGenMo contest has successfully run for 10 years straight. The field has expanded a lot since the early years — CharRNN, PyTorch, TensorFlow, DeepDream, GPT and the rest all were released in the past decade, and the entries have grown to embrace (or reject!) these in the quest to produce 50,000 interesting words. It’s heartening that people still find untapped potential in the idea after several hundreds of generated novels.
As always, I encourage you to visit the Issues page on Github to view other entries, and leave comments for your favorites. Many of the entries have devlogs, extensive write-ups, alternate takes, or just good conversations in the issue threads which just can’t all be covered here.
I also hope that anyone interested will join in for 2023’s iteration of NaNoGenMo. The creativity and fun of the event, coupled with its lax deadline and rules, mean that programmers of any skill level can enter and produce something worth reading. Some past participants had not done any coding before, but found it a rewarding experience all the same. And hey— it starts next week! See you there!