#NaBoMaMo: 30 Bot Victory


I made it! In November I made 30 twitterbots in 30 days. For the first 15 bots, see this post; for the second 15 and some more reflections, read on.

Why 30 Bots in 30 Days?

As I hit the end of the month, it became very clear that making 30 bots in 30 days was a very silly thing to do. I am feeling very triumphant about it, but I could also feel myself hitting the limitations of what you can do working at that pace — not least my own tiredness from overwork, keeping other projects and my full-time PhD going while I made a bunch of bots.

But first, what’s gained from this process. Obviously, output! Doing a #NaXxXxMo project means aiming or output over quality, practising getting it done rather than getting it perfect. As Darius Kazemi says, buying lots of lottery tickets is a worthwhile approach to internet art: I’m proud of at least half of the ideas, and in a few cases the execution is close to finished. If you struggle with getting it done, then absurd targets properly push you, and even if you miss the target or some of the ideas are rubbish, you’ll get at least one good thing out the other end.

It runs a little deeper than that, though. For the course of the month a part of my brain was always working away at the bot question, which was problematic when I was trying to sleep. Even when I wasn’t writing a bot, the back of my mind would be poking at the question of how to make the next bot, undoing a tricky structural problem or thinking through a coding dilemma. That meant that my work got noticeably deeper and more skilled over the course of the month: I was pushing my bot-mind harder and further each week, and so I started coming up with much more difficult ideas and executions than I would have done without the pressure. Even now I’ve let my bot mind go for a while to go back to my books, I feel like next time I summon the bot mind I’ll be starting from a richer place.

A third reason to do something like #NaXxXxMo is to make an event of it. I like performance and I like events. This was a bit of a 30 day endurance art marathon, and that meant a bunch of people willing me on (which is a lovely feeling!), a hook to hang the project on which meant more attention for my wider work, and participation in a community of folk doing a similar thing. It gave the art a social context, and that always amplifies an artwork.

But there are drawbacks, of course. Some of the bots are little more than sketches made to fulfil a commitment; my favourite ideas are mostly half-finished, though everything’s at least at minimum-viable-artwork stage; some ideas could have been better developed before release; and now I have enough development work to last me at least a year. It’s that last part that most daunts (and excites) me. I now feel like a bot gardener, like I have a rich ecology of my own bots to gently tend to. I want to grow them over time, to feed their corpora and prune and graft their code. I want folk following my bots to see them flourish. I want to make art in public, like a garden: something that people enjoy the growing of as well as the result.

Lastly, I want to extend tremendous thanks to the #botALLY community. Not only to those whose code I borrowed or whose tutorials I used (I’ve tried to link these in the notes every time), but also to the many folk who offered answers to sometimes very basic technical questions, and who gave a lot of encouragement to me as I worked. There is absolutely no way I could have managed this month without them. I would never have made one bot without someone helping me, let alone 30 (or 34, counting previous projects). The artbot community is characterised by openness and generosity: it’s still at a stage where we help each other out with ideas and jokes and code, and long may that last. My hope is that the unmonetisability of artbots continues strong, and that this remains a project dedicated to the commons. To that end, I’m releasing as much of my code and process as I can (with a delay while I learn appropriate means of doing so), and if you want a hand with your bots then I’m happy to pass on what’s been passed on to me.

Bots 16 to 30

16. Debate Coach

This is an experiment less in procedural poetry and more into the social utility of Twitterbots. How can a bot help us have better conversations on Twitter?

As well as tweeting thoughts on looking after yourself in an argument every 6 hours, if you send a message to Coach she’ll reply with advice or a question about dealing with an argument. Things like “Can you be compassionate to the person you’re talking with?” but also like “Anger is sometimes useful and sometimes not.”

The bot won’t reply to anyone except you, so you can @ her while tweeting someone else, or you can @ her separately if you don’t want them to know. She can take up to 5 minutes to respond, and misses 5% of messages, due to platform limitations, so you don’t hear from her, @ her again.

I put a lot of thought into this desig, trying to make something that was constructive, useful, non-judgemental and hard to abuse. I’d be really interested in hearing what you think should be included, and especially if you use Coach and have feedback!

Platform: CBDQ (source)
Dev time: 90 minutes
To do: Expand library, with a focus on expanding the subtlety of her responses to keywords.

17. Every Reversal

A dreadful joke bot, suggested by Nora Reed. I am embarrassed by it! But that day I was too tired to come up with a good idea, and doing this was a useful exercise in learning to select and manipulate random words correctly: it’s not trivial to get nouns and transitive non-first-person-present verbs to match properly, especially when using WordNik rather than RiTa, as the former is much less discriminating. I used the WordNik API again, plus the npm libraries singularize and conjugate  — it was useful to learn better how to find and use new libraries that did what I needed, and I reused that skill a lot later in the month.

I’ve justified this bot by saying that, now that there’s a bot for it, no-one ever needs to make a Russian reversal joke again.

Platform: Node.js and Herokuu (source tba)
Dev time: 1 hour
To do: Nevr again.

18. Everybody Nodes

This is my most complex bot ever, despite the silliness of the results. Although it’s the same sort of model as @JohnnyBotten, for Johnny I hand-picked rhyming lists for every syllable, for for Leonard all the substituted words are generated procedurally: when the code hits a substitution, it goes to the dictionary for a word that matches part of speech, syllables, metre, tense, and, if necessary, rhyme.

No way could I do it myself. Most of the conceptual work I learned from this tutorial on @SortingBot: http://tinysubversions.com/notes/sorting-bot. I will eventually share the messy and hacky source, but Darius does it all better, so copy from that instead.

This was quite difficult for me to do, but learning it made making a much wider variety of bots much easier. And this time the process was pretty smooth: I more or less understood everything I was doing, for the first time. The ratio of copy/pasting magic spells and hoping they work to actually learning how to write magic spells improved. It’s thrilling to start from close to zero knowledge and understanding and then to get to being able to make a toy like this.

Thanks also to Alec Finlay for the request and Tully Hansen for the name.

Platform: Node.js and Herokuu (source tba)
Dev time:  6 hours
To do: Learn how to chain tweets together so he tweets a whole song in sequence

19. Work No. 128

This was a resurrection of the first bot I ever made, which died due to its Google Apps Script system being deprecated and me not having the skills yet to fix it. I took the core of the old code (generating two types of tweet based on similar unicode characters) and reimplemented it. The big probem was figuring out how to make the tweets alternate (see Julian of Norwich below), and I still haven’t learned how to do this reliably in code: instead I wrote two different programs, set them both to tweet hourly and offset them by half an hour! A good dodge for a rest day.

Conceptually, this is supposed to be my most pointless bot. It’s a bit of a vicious and easy take on Martin Creed’s original lightbulb going on and off, and on the emptiness of YBA art in general. It’s also an exercise in seeing just how useless Twitter will let me be without banning my bot. But, gallingly, I think the result has a kind of spooky beauty to it. One friend called it the bass beat to his timeline.

Platform: Node.js and Herokuu (source tba)
Dev time:  30 minutes
To do: Finished!

20. Auto Else

A tribute to Baroness Elsa von Freytag-Loringhoven, my favourite Dadaist and true originator of Duchamp’s Fountain. It takes 10 verse models from  her extraordinary complete poems and perfoms word substitutions on them, using exactly the same process as Everybody Nodes, with a bit of sound poetry modelling from Uberursonate thrown in.

I don’t feel the result is yet as representative of her extensive work as I’d like — the playfulness and rhythm is there, but not the range, and getting the viscerality of her writing down is tricky when working with word substitution. Perhaps adding to the pallette will be enough, but once I see that I may have to do something more extensive.

Platform: Node.js and Herokuu (source tba)
Dev time:  90 minutes
To do: Automate more poems and fragments and then see

21. Orkney Visit

A fantasy travel guide for Orkney. I was aiming for verisimilitude, and getting the name generation right so that each name was basically believable (but unlikely to be real) and felt Orcadian was where I put most of my time. There was some fiddly work around how frequent to make different variable elements and where to capitalise what, but I’m pleased with those results. Being tired, I didn’t have as much time left to get the framing right, and I’m unsatisfied with the limited variety of the descriptions: I need a much bigger set of syntaxes based on what a tourist guide could include, ad potentially wholly different kinds of tweets. Perhaps it could create an Orkney with a touch more fantasy in it, occasional intrusions of magic. One thing I’ve learned this month is that speculative worldbuilding is more fun than direct parody of existing conditions.

Thanks to for the suggestion

Platform: CBDQ (source)
Dev time:  30 minutes
To do: Need to rethink the framing extensively

22. Rules for the Day

From a suggestion from , this is an instructional poem in the vein of Autoflaneur, but a little more difficult and abstract (and quicker to make). It comes from my interest in instructional performance (as does the later bot Tiny Situationist and my other work like Casual Games for Casual Hikers).This is much less frequent than most of my bots to give it the right context: it tweets a set of rules every 12 hours, so you can get the latest rules for the day whatever your timezone, but only one set.

What happens when we give ourselves strange rules and try to follow them? How does it invite new experience, new ways of thinking? What does it mean to follow a rule? I haven’t tried these rules out yet but I’m keen to.

Platform: Node.js and Heroku (source tba)
Dev time:  20 minutes
To do: Finished!

23. New Border Ballads

This bot takes an old project and improves it, importing the results to Twitter. It generates markov chains (a kind of procedural generation based on analysing the probability that a given word or character will follow another) from Walter Scott’s Minstrelsy of the Scottish Border, and then breaks up the chain into verselike tweets.

I used the first markov chain library I could get working, and got the result functional without too much thought about how it was working. There’s a lot I want to do. I want to learn how markov chains really work so that I can tweak them for more satisfying results. I want to combine this with RiTa’s tools for parsing metre and rhyme to producing verses that scan and rhyme. But this is a long way off, and there’s a lot of stumbling blocks on the way! I’m doing it bit by bit, and this bit is fun in itself.

Platform: Node.js and Heroku (source tba)
Dev time:  90 minutes
To do: Lots.

24. Glasgow Makes People

An easy bot that didn’t involve learning new techniques, but curiously effective! SVG tutorials from w3schools, words from the same lists I used at the beginning of the month.

It is, though, the riskiest bot I’ve done: I’m pretty confident it contravenes the IP of the original corporate slogan, and Britain doesn’t have very good legal protections for parody work. That was a deliberate choice on my part: I like crossing the line when I think it’s a line that deserves to be crossed, and I await with pleasure the result when Glasgow City Marketing Board notices.

The text glitch was added at a whim right at the end of the process, copy/pasting from Zalgo rather than generating procedurally. It makes the result spookier, but I’m not sure if it’s better or not! Perhaps if I made it appear less often I’d like it more. The image glitch came from making a mistake in the SVG code, making the stroke width of the outline letters too wide, and I loved the result so I kept it.

Platform: CBDQ (source)
Dev time:  30 minutes
To do: Might tweak the glitch, or find a good library for varied glitch generation.

25. Tiny Situationist

This is a direct but loving détournement of Jonny Sun’s , which took care bots mainstream this month, building on work by Nora Reed and others. Because tinycarebot has a profile and a creator within a specific culture (let’s call it millennial, oh dear), it’s also faced unfair backlash and parody. And I do like the bot, but have my own criticisms of self-care — or rather, of the neoliberal appropriation of self-care as individualistic rather than collective. So, from a suggestion from I decided to have a play with what self-care can mean. Using the RiTa tools I learned to use during the month, Tiny Situationist takes each of the syntaxes of tinycarebot’s tweets and substitutes parts of speech to make absurd suggestions in the same polite tone. The result, I think, is a kind of situationism for Twitter — détourning a popular artwork and constructing situations which question social space. That too is a kind of care.

Platform: Node / Heroku (source tba)
Dev time:  30 minutes
To do: I think this one’s finished, but if tinycarebot goes I might grow this one.

26. Infinite Laughter

A direct take-off of ‘s , but working with the opposite affect (or is it the same?) There’s not much to say here! Except that the source has some neat tricks for producing maximum variety with minimum effort, varying repetition and spaces of everything, and nesting persistent variables.

Platform: CBDQ (source)
Dev time:  15 minutes
To do: And yet more international laughter

27. I Think You’ll Find

Similarly to Plural Fan, this bot makes light fun of the pedantic tendency in internet arguments (and my own proclivity for showing off by knowing the names of things). Fallacy-spotting irritates me because, while it’s logically accurate, it’s so rhetorically weak: it never convinces anyone they’re wrong if you name the Latinate fallacy they’ve just used, and I don’t think people learn how to make more intelligent arguments by learniing the names of fallacies.

This is a very simple bot, but part of my interest in (and bots’ suitedness to) getting inside a specific language and then twisting it. The bot just splits the names of everything on Wikipedia’s List of Fallacies in half and then recombines them. It’s fascinating to me that the results sometimes produce genuine meaning (“I love spotting an abusive ignorance in someone’s argument.”), sometimes nonsense (“Association herring is the fallacy I hate most.”), and sometimes something spookily neither (“No true stone: ugh.”) I’m not wholly satisified with the result — the joke doesn’t stay funny and the poetry doesn’t stay beautiful — but I’m not sure how to fix it.

The idea for this one came from Nora Reed.

Platform: CBDQ (source)
Dev time:  30 minutes
To do: ????

28. BotRail

This is maybe the single bot this month that I’m most proud of. Partly because I’m really pleased with the effect — a seriocomic utopian imagining of Scotland’s collectivist public transport future, summoned through maps and announcements only — and partly because to make it I pulled together so much of what I’d learned through other bots in the month.

The maps were built by getting to grips with the SVG tutorials at w3schools. The Scottish placename generator was nicked from my poem-game Ghost Highland Way and expanded through what I’d learned about satisfying name-generation from making Orkney Visit. The text effects were achieved in Unicode using an online widget, using delim.co and textmechanic to process them quickly. The idea came from Henry Bell, whose bot Radical Glasgow I used for researching memorial names. And the concept was developed by remembering what I’d learned from JJUrbanExplorer, that procedurally generated stories become much more satisfying if you root them in real world locations, if you give them a bounded shape and specific flavour, rather than sampling the whole world of words.

Platform: CBDQ (source)
Dev time:  2 and a half hours
To do: Vary the map shapes, expand the naming further

29. Julian of Norwich

Julian of Norwich wrote the first known book in English by a woman. She was an anchorite who experienced mystical visions during a serious illness, and interpreted them through a Christian framework. The result is strange, trippy and beautiful, even to atheists like me. I wanted to celebrate it, and a meditation also seemed like an appropriate choice for the concept at hand: tweeting an entire book one character at a time. It’s barely readable, but it is still readable, though if you’re following along you’re liable to read each individual word a few times. It slows everything right down.

This concept was offered by Gabriel Spector, and I was also influenced in the execution by Neil Simpson’s work on extreme slowing down of text.

I was hoping for this to be an easy execution, but I hit a major stumbling block: Heroku, which is the hosting service used by most bot tutorials, is unsuitable for projects which proceed in a specific order through a list of tweets. (This is because it doesn’t maintain variable states long-term: it keeps resetting to the beginning.) I explored a lot of different options for fixing this — learning a new hosting system, indexing to an external spreadsheet, indexing to the real time — but in the end I went for the quickest available. @air_hadoken had shared an excellent Google Apps Script library for Twitterbots, and I was familiar with the platform having used it for my first bots, so I was able to copy my simple code into that library without too much trouble. This taught me a couple of things: first, that hosting a bot is a way harder problem than coding a bot; second, that I still have a huge amount to learn about how to do weird internet art. I’ve learned the magic spells for Heroku and node.js, but as soon as I need a new spell or a new spellbook then the difficult curve goes vertical again. I start copy/pasting without really understanding what I’m doing again. My hope is that eventually I’ll learn the basics of enough schools of magic to be able to get to grips with new schools without as much trouble, but that’s a long way off. That said, I like being a novice. It’s where all the best books start.

Platform: Google Apps Script (library here)
Dev time: 15 minutes to write the basic code, 2 hours to figure out the hosting
To do: Keep an eye on it for 35 years to make sure it keeps going, adapt the format of the — dividers so the balance looks right as the numbers get longer.

30. Some Endings.

A simple meditation on death and endings: it’s a very macabre bot! I was struggling with the idea of how to end the project, and had all sorts of grand thoughts: in the end, I was very tired, and made a simple substitution poem in CBDQ, and that felt like the most appropriate way to finish.

There’s a structural limitation of simpler bots, which is that Twitter is liable to ban accounts which it thinks are posting repeat tweets. A way many bots get around this is by inserting random stretches of blank space. Originally I had this after each line, so that it was invisible, and then I realised that placing it before the words as well turned the structural limitation into an aesthetic pleasure. It doesn’t display in some browsers or circumstances which trim extra spaces, meaning that the poems are always contingent. As every poem is.

Platform: Cheap Bots Done Quick (source)
Dev time:  30 minutes
To do: Expand the library of substitutions, consider whether I want to vary the syntax (probably not)

Find all the bots at


and an Extra Thanks

to my backers on Patreon, who give me the freedom to do very strange and free projects like this.

Now Make A Bot