What a Headcanon Generator Was Made of Before AI: 139 Entries and 13,662 Sentences
Short answer: it was not a bank of sentences and it was not a model. It was a grammar — 139 hand-written entries spread across 21 lists, assembled the moment you rolled into 13,662 possible sentences, with nothing in the pipeline that could write a word of its own. Two of those 139 entries were the same word typed twice, which quietly gave one outcome double the odds of every other one for as long as the build stayed online. The source survives only as a web-archive snapshot; I decoded it, ran it locally, and counted. Every number below is countable from the file itself.
Every page about a headcanon generator today describes the same machine: you type a character and something writes back. That is how they work now. It is not how they have always worked. This page opens up the earlier generation — the ones built when putting a model behind a button was not an option — and shows the whole thing, because the whole thing turned out to be small enough to hold in one hand. It is not a history and it is not a feature list. It is what was actually inside.
The whole design in one picture: a short list of raw material on the left, one substitution rule in the middle, and a sentence space two orders of magnitude larger on the right. Nothing here generates text. It selects fragments and fits them together.
A grammar is not a bank
The generator that runs on this site is a bank. It holds 180 hand-written lines — five categories by six tones by six lines each — and one line is already one whole sentence. Draw the line, drop in a name, done. A bank is easy to reason about because the unit you draw is the unit you read, which is also why its size is worth publishing and why the repeat math on a fixed pool can be worked out exactly.
This build had no lines. It had slots.
The entire output was one sentence, and the author wrote one version of it for each side:
[malecharacter] is [malegender] and is [malesexuality]
Every bracket pulls a random entry out of a named list, and any entry inside those lists can contain brackets of its own. The sentence therefore does not exist until the moment you ask for one. What the author sat down and typed was not 13,662 sentences. It was 139 fragments, plus the instructions for putting them together.
Here is a coincidence worth exactly one sentence, and then I will leave it alone: the entire 2021 source is 180 lines long — the same count as the bank this site ships today. One is 180 lines of instruction. The other is 180 lines of finished output. Same number, opposite meaning.
That difference — instruction versus output — is what separates this build from both a line bank and a model, and it changes every downstream number.
One bracket, twenty-two phrases
Here is the whole gender system, stripped to its skeleton:
malegender
a [binary] male who uses [binarymaleprns] pronouns
[nbmale]
[binary] holds two entries, cis and trans. [binarymaleprns] holds two more, he/him and he/they. So that single line of source resolves into four distinct phrases, and that is only the first of its two branches. Follow the second one and it opens again: [nbmale] offers non-binary, genderfluid, bigender and demiboy, and each of those pulls pronouns from a list holding anywhere from two to five options.
Count the resolved variants of that one two-line list and you get twenty-two. Two lines of source, twenty-two possible phrases, and the author typed out none of them.
This is the shape of the whole thing. The lists that hold content are short — 23 character names on one side, 46 on the other, and two sexuality lists of nine. The lists that hold structure are the ones that multiply, and most of them are two to five entries long. A list with four options sitting inside a list with five options is worth twenty outcomes, and the author paid for them with nine lines of typing.
The material itself is a snapshot of what a certain kind of fan was writing about in 2021: characters from animated series, young-adult novels, stage musicals and a handful of games, plus real people and a few adults from adult animation. That roster is worth reading on its own, because it dates the build precisely — and because reading a name before you roll it is still the fastest way into a character.
Where 13,662 comes from
Multiply the three slots of the sentence and the space falls out exactly:
- 23 names × 22 gender phrases × 9 sexualities = 4,554
- 46 names × 22 gender phrases × 9 sexualities = 9,108
- Total: 13,662
I did not estimate this and I did not read it off a page. I decoded the source out of the archived HTML, wrote an interpreter for the list syntax, and enumerated the space. It is reproducible in the sense that matters: open the file, expand every bracket, count what falls out.
And here is the number that makes the grammar visible. If every one of the 139 entries had been written out as a standalone finished sentence instead — a plain bank — the author would have needed 13,662 sentences to cover the same ground. They wrote 139. That is a compression ratio of roughly 98 to 1, and it is bought entirely with structure.
It is worth saying plainly what that bargain costs, because it is the same bargain every template makes. A bank of thirty lines on one page is thirty finished thoughts and nothing else. A grammar is 139 fragments that will produce a shrug of a sentence nine times out of ten, in exchange for producing something like a real one on the tenth. Neither is better. They are different tools with different failures.
The entry that was typed twice
While counting the lists, one number came back wrong.
The female-side sexuality list held ten entries. It should have held nine, because one of them appears in it twice:
femalesexuality
a lesbian
bisexual
pansexual
aroace
an asexual lesbian
biromantic + asexual
pansexual
panromantic + asexual
straight
straight + asexual
Nobody writes that on purpose. It is what happens when a list gets edited over time and the person editing it has scrolled past their own work once too often.
The consequence is not cosmetic. A random draw from that list treats the two copies as two separate entries, so pansexual carried twice the weight of every other label. For as long as that version was live, anyone rolling a female-side result was quietly twice as likely to get that one answer as any other — by accident, and invisibly, because the visible output is a single sentence with no way to see the odds behind it.
This is a failure mode that only the grammar design has. In a bank of hand-written lines, a duplicated entry is a duplicated line: you can see it, and anyone who reads the bank will see it. In a grammar, a duplicated entry is a duplicated probability, and it does not announce itself anywhere. The words you read are always correct. The distribution behind them is not.
Worth adding, because it is the sort of thing readers ask: the duplicate does not make the tool wrong or unusable, and it certainly was not intentional. It is a fingerprint. It says a human maintained this by hand, the same way you would maintain a list of anything, and the list got long enough that they lost track of one line. I would rather have the fingerprint than the tidiness.
Bigger sentence space, smaller vocabulary
It is tempting to read 13,662 as variety, and at the sentence level it is. Pull sentences one at a time and a repeat arrives at a median of roughly 138 draws — real headroom next to a 180-line pool, where the same figure is about 17. If you only ever noticed whole sentences, this build looks about eight times more varied than a line bank.
But nobody experiences a headcanon generator at the sentence level. They experience the names, and there are 23 of them on the male side and 46 on the female side. Run the same draw-counting over a 23-entry list and a repeated name lands at a median of 6.
So the same build is roughly eight times wider than a line bank at the sentence level and roughly three times narrower at the vocabulary level. Both numbers are correct, and the second one is the one a reader would actually feel: the sentences stay fresh long after the characters have started circling.
That gap is a direct product of the grammar, and it is worth being precise about why. The syntax has exactly one construct — a bracket means "pull a random entry" — and it is uniform and independent at every occurrence. There is no weights syntax anywhere in the build, no "do not repeat what you already drew", and no mechanism that could add one: the file declares nothing external, and the whole source is the 180 lines counted above.
That second point is the one people usually get backwards. A finite bank can leave repeats out of a single batch by removing each drawn line from that batch's pool, which is exactly the behaviour the no-repeat workflow depends on. This build has no such step, and not because the author chose against it — there is simply no construct in the language it was written in that could express it. Every draw starts from the whole list. The tool is as even-handed as it is only because there is nothing in it that could be otherwise.
The practical upshot for anyone stealing from this design: if you want variety where a reader notices it, put your entries where the vocabulary is, not where the permutation count is. A hundred new name strings is a hundred new draws at the level that shows. A hundred new sentence shapes is a rounding error.
Twenty-one months, and one line changed
There was a second build, archived in November 2022. Between it and the February 2021 original, the output template is byte-for-byte identical — same heading tag, same paragraph wrapper, same call on the button. The single difference in the entire file is the button's label: randomize became Give me a drink, bartender!
Twenty-one months, and the only edit was a joke.
The comment the author left sitting inside the template is still there in both versions:
<!-- Learn HTML here: https://
Nothing in the intervening time had pushed them to touch the structure, and that is not laziness — it is what a grammar does to maintenance. Adding twenty more character names to a sentence bank costs twenty sentences, and each one has to be good. Adding twenty names to a grammar costs twenty entries and multiplies everything the other slots already reach. The second build did not even bother to add names. It just changed the joke.
Compare that with the pace of the tools it lost to. The second build was archived a week before the category was permanently rewritten, and everything that replaced it behaves like a tool with six tones and a model behind it: new settings, new output shapes, new versions, continuously. Two years of nothing followed by two years of everything is a fairly clean summary of the whole transition.
Why the archive is now the only copy
There is no model in either build, and that is verifiable rather than asserted. Both declare an empty list of external components — the field a build would have to use to pull in a model is present and empty. No key, no endpoint, no prompt text anywhere in the file. The entire generative capacity of the tool is the bracket syntax and 139 entries, which is also why a two-minute offline check is a meaningful test for a tool of this shape.
Which makes what happened to them worth noting. The 2021 build is a 404 today — not moved, not redirected, gone. The 2022 build still answers at its original address, and that is the more interesting case: the page loads, and it no longer carries the generator. The fields that used to hold the content are no longer in what the page delivers; searching the live HTML for a single character name, for the button text, or even for the word identity returns zero hits. Whatever still powers it is assembled somewhere else at run time.
So a page that once handed its entire contents to anyone who asked has been reduced to a shell that hands out nothing, while its sibling has been deleted outright. The snapshot is not a convenience copy. It is the only copy of the words.
There is a general lesson buried in that, and it is the reason this page has numbers in it at all. A design that hides its material behind run-time assembly is a design nobody can audit later — not you, not a reader, not the person who wrote it five years on. The reason the count above is 13,662 and not "a large number" is that the build shipped its contents in the page.
What that leaves
Two archived builds, 139 entries, and a contradiction worth sitting with: the version with the smallest pool was the one that felt endless, because its pool was not where the reading happened.
If you want to write with that shape instead of against it, the practical advice is short. Treat the assembled sentence as a prompt rather than an answer, the same way you would treat a paste-ready prompt; take the fragment and finish it yourself. Lean on the structure lists when you want a character unlike the one you always write, and lean on the name lists when you want a familiar face in an unfamiliar slot. And expect the tool to hand you a shrug nine times out of ten, because that is the arithmetic of a grammar, not a fault in it.
The authoring cost was never the compute. It was sitting down and deciding that a character could be "genderfluid, uses they/he pronouns" — and then, four entries later, forgetting they had already written the word pansexual and writing it again.
If you want the wider map of how these tools fit together, the headcanon overview and the working definition are the two other doors in; the walkthrough of every control covers the other end of the same story, and the full list of guides has the rest.
More headcanon guides
- Headcanon Ideas: 30 Seeds, One for Every Cell in the Bank
- Headcanon: Five Families, Six Tones, and Thirty Kinds of Line
- What Is a Headcanon? A Five-Family Definition and a Three-Question Test
- Headcanon Prompts: 25 Paste-Ready Templates for Any Generator
- Headcanon Examples: 20 Annotated Lines and Why Each One Lands
- How to Use a Headcanon Generator: A Step-by-Step Text Walkthrough
- Character Headcanon Without Repeating: Two Characters, One 180-Line Pool
- Headcanon Template: One Page, Thirty Lines, Five Categories
- Headcanon Examples for Appearance: One Trait, One Source
- Headcanon Ideas from a Character Name: Three Reads Before the First Roll
- Headcanon Prompts for One Quote: Four Slots and Four Moves Back Into the Prose
- Headcanon Ideas That Survive an AU: A Three-Rule Consistency Checklist