Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

2026 Participants: Martin Bartelmus * David M. Berry * Alan Blackwell * Gregory Bringman * David Cao * Claire Carroll * Sean Cho Ayres * Hunmin Choi * Jongchan Choi * Lyr Colin * Dan Cox * Christina Cuneo * Orla Delaney * Adrian Demleitner * Pierre Depaz * Mehulkumar Desai * Ranjodh Singh Dhaliwal * Koundinya Dhulipalla * Kevin Driscoll * Iain Emsley * Michael Falk * Leonardo Flores * Jordan Freitas * Aide Violeta Fuentes Barron * Erika Fülöp * Tiffany Fung * Sarah Groff Hennigh-Palermo * Gregor Große-Bölting * Dennis Jerz * Joey Jones * Titaÿna Kauffmann * Haley Kinsler * Todd Millstein * Charu Maithani * Judy Malloy * Eon Meridian * Luis Navarro * Collier Nogues * Stefano Penge * Marta Perez-Campos * Arpita Rathod * Abby Rinaldi * Ari Schlesinger * Carly Schnitzler * Arthur Schwarz * Haerin Shin * Jongbeen Song * Harlin/Hayley Steele * Daniel Temkin * Zach Whalen * Zijian Xia * Waliya Yohanna * Zachary Mann
CCSWG 2026 is coordinated by Lyr Colin-Pacheco (USC), Jeremy Douglass (UCSB), and Mark C. Marino (USC). Sponsored by the Humanities and Critical Code Studies Lab (USC), the Transcriptions Lab (UCSB), and the Digital Arts and Humanities Commons (UCSB).

Week 2: AI Sprint: Vibe Coding Strachey's Love Letter Generator (1952)

The Exercise

This week we're running a collaborative exercise to try vibe coding for yourself and reflect on the experience. Rather than an abstract prompt, we're working with a specific historical object which is Christopher Strachey's Love Letter Generator from 1952.

Christopher Strachey (1916-1975) stands as one of the key figures whose work we now recognise as a foundational transitions in computational culture. The Stracheys belonged to the Bloomsbury Group, the group of intellectuals including Virginia Woolf, John Maynard Keynes and Strachey's uncle Lytton Strachey, which makes his later computational work all the more interesting for crossing of cultural and technical domains.

He was a pioneer in programming language design and denotational semantics, Strachey programmed the first computer music in England in 1951, rendering the National Anthem on Manchester's Ferranti Mark 1, followed by recordings of "Baa, Baa, Black Sheep" and "In the Mood" captured by the BBC. More significant still, in 1952 he created a love letter generator for the same machine that represents the first known instance of computer-generated literature, a development that prefigures contemporary anxieties about LLMs whilst also gesturing towards the literary experimentalism of his milieu.

His later development of time-sharing concepts in 1959 points to the infrastructural transformations that enable the distributed computational environments we now inhabit. What makes Strachey's life so fascinating is how it demonstrates the convergence of cultural, technical and literary spheres, collapsing distinctions that are difficult to cross over, even today.

The (literary) significance of the Love Letter Generator extends beyond its curiosity as an early version of computational culture. It seems to be a parody of one of literature's most codified genres, the love letter. It contains conventional declarations, expected rhythms of longing and affirmation, etc.. Strachey's algorithm (which sadly we seem to have lost) might be what the Russian Formalists would call a device of amatory writing, revealing the "templates" that structure even our most intimate texts. The generator's outputs read either as both sincere and satirical, occupy the same uncomfortable space as Oulipian constraint-based writing or Burroughs's cut-ups, which would emerge a decade later. The fact that Strachey drew his vocabulary from Roget's Thesaurus, shows fascinating connections to the idea of a systematisation of language. Perhaps this deepens the irony as the love letter, supposedly a singularity of expression, is revealed as a combinatorial operation on an inherited lexical dictionary. This might make us think of the generator not just as an engineering experiment but as a work of literary theory made executable, a machine for demonstrating that romantic discourse, like all discourse, is structured by rules that precede and exceed the speaking subject.

Your task: use an LLM to create your own version of the Love Letter Generator, then document what happens.

You can use our new CCS workbench or any other LLM to help co-create it

Why Strachey?

The Love Letter Generator is arguably the perfect historical antecedent for vibe coding. Written for the Manchester Mark 1, Strachey's algorithm generates "love letters" by filling sentence templates with words randomly selected from lists compiled from Roget's Thesaurus. The original code is lost, but the algorithm has been reimplemented many times.

A sample output:

DARLING SWEETHEART

YOU ARE MY AVID FELLOW FEELING. MY AFFECTION CURIOUSLY CLINGS TO YOUR PASSIONATE WISH. MY LIKING YEARNS FOR YOUR HEART. YOU ARE MY WISTFUL SYMPATHY: MY TENDER LIKING.

YOURS BEAUTIFULLY

M. U. C.

This raises the follwing questions:

  1. The letters are grammatically correct, emotionally legible, yet produced without actual understanding. Strachey noted his interest in how "a rather simple trick" could produce "an illusion that the computer is thinking", anticipating both the ELIZA effect and what I'm calling elsewhere the "competence effect," but for text generation rather than dialogue.

  2. Who wrote these letters? Strachey? The machine? Roget (whose Thesaurus supplied the vocabulary)? This question of distributed authorship maps directly onto vibe coding's triadic hermeneutic structure.

  3. Both Strachey and Turing were gay men working during the 1952 prosecutions. Jacob Gaboury reads the generator as "pure camp", as an exultant love of the artificial. The gender-neutral, anonymous letters can be read as a quiet act of resistance.

  4. There was a Code Critique thread on the Strachey Love Letter Algorithm at the 2024 CCSWG, proposed by Titaÿna Kauffmann. Key questions included: How is reimplementation a reinterpretation? What does it tell us about the legacy and "reborn-digital" heritage of Strachey? How can we "queer" this narrative through CCS? This questions remain (even more) relevant to vibe coding.

The Sprint Structure

Days 1-2: Vibe code your generator

Choose an LLM (Claude, ChatGPT, Gemini, Copilot, the CCS workbench or whatever you have access to) and prompt it to create a Love Letter Generator. You might, for example,

  • Ask it to recreate Strachey's original algorithm
  • Ask for a "love letter generator" without mentioning Strachey
  • Share Montfort's reimplementation and ask for modifications
  • Try different approaches and see what emerges
  • Remember to keep your prompt history. This becomes a primary text for critical reading.

Days 2-4: Document the cognitive modes

As you work, you might want to pay attention to, for example,

  • Cognitive delegation: Where did you offload judgment to the LLM? Did it lead you down unproductive paths?
  • Productive augmentation: Where did human architectural control combine effectively with machine implementation?
  • Cognitive overhead: Did managing the LLM's context or correcting its assumptions take you significant effort?

Note any moments where the "competence effect" appeared, which is where the LLM's output looked ok but was subtly wrong, or where its apparent understanding masked a deeper misunderstanding.

Days 2-7: Share and compare

Post your reflections to this thread (and the code if it is short enough - consider using the "Spoilers" tag to make the post manageable by others.

  1. Does your LLM's version resemble Strachey's structure, or does it "improve" it?
  2. What did the LLM add or subtract?
  3. Is the output a reimplementation of Strachey, of Montfort's reimplementation, or of the concept of a love letter generator?
  4. How do we read the differences critically?
  5. What does your prompt history reveal about the distribution of agency?

Resources

Strachey's Algorithm

The Core Love Letter Logic

The algorithm is remarkably simple. From Montfort's reimplementation:

def longer():
    return (
        ' My'
        + maybe(adjectives)
        + ' '
        + choice(nouns)
        + maybe(adverbs)
        + ' '
        + choice(verbs)
        + ' your'
        + maybe(adjectives)
        + ' '
        + choice(nouns)
        + '.'
    )
def shorter():
    return ' ' + choice(adjectives) + ' ' + choice(nouns) + '.'

It contains a template plus word lists. It can be understood quickly and reimplemented in any language, and which makes it ideal for observing what LLMs do when asked to recreate it.

Critical Reading

Vibe Coding Discussion

This exercise lets us examine several questions

  • When an LLM "reimplements" Strachey's code, what is it actually doing? Is it reading Montfort's version? Training data that includes discussions of the algorithm? The concept filtered through countless blog posts?
  • Does your LLM produce something that looks like Strachey's generator but operates differently? How would you know?
  • From Strachey (1952) to ELIZA (1966) to vibe coding (2025) can we trace how the "competence effect" intensifies as systems become more capable while remaining equally lacking in understanding. Does your experience of vibe coding confirm or question this genealogy?
  • What would it mean to do critical code studies on the vibe coding session itself, including the prompts, the iterations, the failures, rather than on the resulting code?
  • If Strachey's generator produces grammatically correct, emotionally legible love letters through pure combinatorics, what does this suggest about the relationship between literary form and authentic expression? Does the generator parody the love letter, or does it reveal something already present in the genre?
  • Given the Bloomsbury Group's preoccupation with sincerity, intimacy, and the limits of language, particularly in figures like Virginia Woolf and Lytton Strachey, how might we read Christopher Strachey's generator as continuous with rather than discontinuous from that literary project?

I'll post my own attempt and reflections partway through the week. Looking forward to seeing what emerges and post your experiences below.

Comments

  • Here is my version, the Visible Love Generator (after Strachey, 1952) which reimplements the idea in a version that foregrounds the generator's status as literary theory made executable. The program displays the template structure with numbered blank slots, then populates each slot as you press Enter, allowing you to experience the combinatorial process as it unfolds.

    Full code version here

    Post yours below, with screenshots if possible (note if the code is long then it makes sense to post only code fragments or a link to a Gist or similar place.

  • edited 2:20PM

    I decided to implement it in Inform7 as I felt I'd be best equipped to understand any errors it was throwing up. (Tracery would have allowed for a much more elegant way of implementing this, but I only thought of that after I had started on the process.) I sent the following prompt to ChatGPT:

    Recreate Strachey's Love Letter generator for Inform 7

    And this was the output:

    "Strachey's Love Letter Generator"
    
    The Laboratory is a room.
    
    When play begins:
        generate a love letter.
    
    To generate a love letter:
        say "Dear [random term from Terms],[paragraph break]";
        say "You are my [random adjective] [random noun], my [random adjective] [random noun].[line break]";
        say "My [random noun] [randomly adverb] [random verb] your [random adjective] [random noun].[line break]";
        say "You are my [random adjective] [random noun].[paragraph break]";
        say "Yours [randomly adverb],[line break]";
        say "[random term from Terms].";
    
    To decide which text is a random adjective:
        decide on a random entry in the Table of Adjectives.
    
    To decide which text is a random noun:
        decide on a random entry in the Table of Nouns.
    
    To decide which text is a random adverb:
        decide on a random entry in the Table of Adverbs.
    
    To decide which text is a random verb:
        decide on a random entry in the Table of Verbs.
    
    Table of Terms
    term
    "Darling"
    "Sweetheart"
    "Beloved"
    "Honey"
    "Dearest"
    
    Table of Adjectives
    adjective
    "adorable"
    "affectionate"
    "amorous"
    "anxious"
    "ardent"
    "beautiful"
    "charming"
    "dear"
    "devoted"
    "eager"
    "faithful"
    "fond"
    "loving"
    "passionate"
    "sweet"
    "tender"
    
    Table of Nouns
    noun
    "angel"
    "darling"
    "flower"
    "heart"
    "jewel"
    "love"
    "rose"
    "soul"
    "treasure"
    "vision"
    
    Table of Adverbs
    adverb
    "affectionately"
    "ardently"
    "eagerly"
    "fondly"
    "lovingly"
    "passionately"
    "tenderly"
    
    Table of Verbs
    verb
    "adores"
    "cherishes"
    "desires"
    "longs for"
    "treasures"
    "worships"
    

    When I saw this first implementation it suggested, I knew right away that it wouldn't work. I tried it, and it gave an initial error about the table having an invalid name. Once that was fixed, it gave a load more errors because neither way it was trying to look up random entries in tables was how it works. If I didn't know anything about Inform, at this point I could see how it could be quite frustrating to get this to work through this method. And so, thinking about how I would implement this from scratch, I prompted it to try the sort of approach I would try:

    Instead of implementing it with tables, could you implement it with kinds or "to say" statements

    The method with "to say" was the most simple approach and was similar to how I would have written it from scratch. The code compiled with only some minor blank space issues that were easy to fix. The output was as expected.

    "Strachey With Say Phrases"
    
    The Laboratory is a room.
    
    When play begins:
        generate a love letter.
    
    To generate a love letter:
        say "Dear [term],[paragraph break]";
        say "You are my [adj] [noun], my [adj] [noun].[line break]";
        say "My [noun] [adv] [verb] your [adj] [noun].[line break]";
        say "You are my [adj] [noun].[paragraph break]";
        say "Yours [adv],[line break]";
        say "[term].";
    
    To say term:
        say "[one of]Darling[or]Sweetheart[or]Beloved[or]Honey[or]Dearest[at random]".
    
    To say adj:
        say "[one of]adorable[or]affectionate[or]amorous[or]anxious[or]ardent[or]beautiful[or]charming[or]dear[or]devoted[or]eager[or]faithful[or]fond[or]loving[or]passionate[or]sweet[or]tender[at random]".
    
    To say noun:
        say "[one of]angel[or]darling[or]flower[or]heart[or]jewel[or]love[or]rose[or]soul[or]treasure[or]vision[at random]".
    
    To say adv:
        say "[one of]affectionately[or]ardently[or]eagerly[or]fondly[or]lovingly[or]passionately[or]tenderly[at random]".
    
    To say verb:
        say "[one of]adores[or]cherishes[or]desires[or]longs for[or]treasures[or]worships[at random]".
    

    Finally, to make it more interesting, and to see if it could handle the request, I prompted:

    Repeat the To Say implementation, but with terms, adjectives, nouns, adverbs, and verbs take from Edward Lear poems

    It managed a serviceable job. I fixed some issues: "pea-green boat" was a noun and "pea-green" an adjective, so "pea-green pea-green boat" as a possible output, as was "bong-tree bong-tree". I also changed the generation to happen on the room description rather than the game start, so it could be refreshed indefinitely without restarting. Here is the final code:

    "Edward Lear Love Letter Generator"
    
    The Nonsense Garden is a room. "[poem]"
    
    To say poem:
        generate a love letter.
    
    To generate a love letter:
        say "Dear [term],[paragraph break]";
        say "You are my [adj] [noun], my [adj] [noun].[line break]";
        say "My [noun] [adv] [verb] your [adj] [noun].[line break]";
        say "You are my [adj] [noun].[paragraph break]";
        say "Yours [adv],[line break]";
        say "[term].";
    
    To say term:
        say "[one of]Beloved Quangle-Wangle[or]Dearest Jumblie[or]Sweet Pobbles[or]Darling Owl[or]Belovèd Pussy[at random]".
    
    To say adj:
        say "[one of]runcible[or]scroobious[or]luminous[or]silvery[or]melancholy[or]sparkling[or]curious[or]azure[or]pea-green[at random]".
    
    To say noun:
        say "[one of]owl[or]pussycat[or]jumblie[or]quangle-wangle[or]flamingo[or]beetle[or]bong-tree[or]boat[or]turkey[or]nose[at random]".
    
    To say adv:
        say "[one of]gaily[or]merrily[or]softly[or]solemnly[or]curiously[or]tenderly[or]nonsensically[at random]".
    
    To say verb:
        say "[one of]embraces[or]admires[or]follows[or]serenades[or]dances with[or]wanders toward[or]sings to[at random]".
    

    This is what it outputs:

    Dear Beloved Quangle-Wangle,

    You are my curious quangle-wangle, my pea-green boat.
    My nose solemnly embraces your curious owl.
    You are my runcible pussycat.

    Yours softly,
    Sweet Pobbles.

    Dear Darling Owl,

    You are my pea-green flamingo, my luminous jumblie.
    My bong-tree nonsensically wanders toward your azure quangle-wangle.
    You are my pea-green beetle.

    Yours solemnly,
    Beloved Quangle-Wangle.

    Dear Sweet Pobbles,

    You are my curious quangle-wangle, my melancholy bong-tree.
    My flamingo softly dances with your curious jumblie.
    You are my sparkling flamingo.

    Yours curiously,
    Beloved Quangle-Wangle.

    Overall, this implementation is worse than Strachey's original, with less variation. With about three times as many items for grammar lists we could start to avoid the more obvious repetitions. If I'd been making this from scratch, I would have varied the sentence structures somewhat to disguise the template, as I do with my generative text bots. To answer the question @jshrager posed, "who needs code", the value in hand coding a generative text bot is that you can have control over the possibility space, allowing for greater artistry.

  • edited 4:31PM

    @JoeyJones I agree that there settings where code is needed, but I don't think that this is one of them -- or, well, it depends on how you interpret the assignment. One of my students is working on how bad LLMs are at math. We have a catch phrase that we think would make a great paper title: "Don't let the parrot land the plane." -- less eloquently, when you need correct, use correct code; when you need creative, let the llm do it's thing. The assignment here was pretty vague: "Use an LLM to create your own version of the Love Letter Generator, then document what happens." @davidmberry gave me the out with the phase "your own version", writing love letters is pretty much one of the core fortes of LLMs*, so it's a bit of a shame to not let me "land the date", so to speak.

    (* In talks, I often claim [mostly to be controversial] that LLMs are good at the five "P"s that are the standard fare of the web: Politics (people yelling at one another), Products (advertising, etc), Pubmed (which is a stand-in for factoids, as from Pubmed or Wikipedia, etc), Programming (because it's essentially a linguistic skill), and the fifth "P" you can, I'm sure, fill in for yourself, and is the one most relevant to the task at hand! .... since this is an international forum, and this might not be obvious unless you're a native English speaker, I'll give away my punchline: The fifth P that LLMs are good at is "Porn" :-)

  • edited 4:39PM

    All my academic complaining aside, I did actually do the project as intended, sort of:

    https://gemini.google.com/share/952c86fff0d4
    
  • I think you're right, it does depend on how you interpret the assignment. I can use an LLM to generate something interesting and amusing, but I can't get it to generate anything I would be artistically proud of because it isn't my own creation. Spending a short time with Tracery, I was able to make my own variation of Nick Montfort's implementation with considerably more cross-fertilisation of the word lists:

    • The adverb list now directly pulls from the adjectives, allowing for greater variation.
    • The adverbs are deployed in the signing off (as I noticed "ever yours" could be "[adverb] yours").
    • The noun and adjective word lists were deployed for the pet names, giving a wider range of names.
    • I varied the number of sentences to make the template slightly less obvious on repeat generation.

    So with no additionally vocabulary, with a more creative hand-crafted approach I was able to improve the variability and ardour of the love letters:

    {
    "origin":["#dear.capitalize#, #sentence#. #body# #yours#"],
    "sentence":["#my##mine#","my #noun# #verb# your #noun#"],
    "body":["#sentence.capitalize#."," #sentence.capitalize#. #body#"," #sentence.capitalize#. #body#",""],
    "yours":["Yours, JDJ","#adv.capitalize# yours, JDJ"],
    "my":["you are my #adj# #noun#"],
    "mine":[". #my.capitalize#",": my #adj# #noun#",""],
    "dear":["#adj# #petname#"],
    "tenderness":["my #adj# #verb#"],
    "adj":["#nonadverbable#","#adverbable#","#adverbable#"],
    "nonadverbable": ["adorable","erotic","little","loveable","sympathetic","unsatisfied","honey","jewel"],
    "adverbable":["affectionate","amorous","anxious","ardent","avid","breathless","beautiful","burning","covetous","craving","curious","darling","dear","devoted","eager","fervent","fond","impatient","keen","lovesick","loving","passionate","precious","seductive","sweet","tender","winning","wistful"],
    "verb":["adores","attracts","cares for","cherishes","clings to","desires","holds dear","hopes for","hungers for","is wedded to","likes","longs for","loves","lusts after","pants for","pines for","prizes","sighs for","tempts","thirsts for","treasures","wants","wishes","woos","yearns for"],
    "noun":["adoration","affection","ambition","appetite","ardour","charm","desire","devotion","eagerness","enchantment","enthusiasm","fellow feeling","fervour","fondness","liking","longing","#love#","passion","rapture","sympathy","tenderness","thirst","wish","yearning"],
    "adv":["#adverbable#ly","#adverbable#ly","#adverbable#ly","#adverbable#ly","#adverbable#ly","ever"],
    "petname":["duck","moppet","#adj#-heart","sweetheart","#love#"],
    "love": ["love","lust","fancy","heart","hunger","infatuation"]
    }
    

    It can be pasted into a browser-based tracery editor to render such output as:

    Loveable fancy, my passion wants your charm. My longing loves your yearning. My appetite thirsts for your affection. Yours, JDJ

    Little beautiful-heart, my tenderness desires your enchantment. My affection is wedded to your rapture. You are my lovesick fervour. Passionately yours, JDJ

    Breathless moppet, my lust clings to your fondness. Covetously yours, JDJ

    Amorous sweetheart, my liking hopes for your eagerness. My tenderness wants your thirst. My ardour is wedded to your appetite. You are my winning thirst. You are my lovesick liking. Ever yours, JDJ

    To me, as a longtime creator of these kinds of "art bots" or creative text generators, this was a more satisfying kind of generation than anything that could be accomplished through either vibecoding or LLM generation.

Sign In or Register to comment.