We have been making Yarn Spinner for over a decade. Compilers, virtual machines, engine integrations, editor plugins, speech bubbles, dialogue wheels, a museum exhibit that survived thousands of small children. We pride ourselves on being feature complete. We pride ourselves on understanding what narrative designers actually need.
We have been wrong about this for ten years.
The most important narrative design technology ever invented is not a compiler. It is not a virtual machine. It is not a node graph. It predates the computer. It predates the printing press. It arguably predates the novel. It is a deck of 78 illustrated cards from Renaissance Italy, and every serious narrative designer in the world has known this since approximately the fifteenth century, and not one of you thought to mention it.
Tarot.

We have been sitting in rooms with narrative designers for a decade. Conferences. Workshops. Client meetings. Everyone nodding politely at our node groups while apparently thinking “yes but where are the pentacles.” Nobody said anything. We had to find out for ourselves. This is a failure and we will be processing it for some time.
So we fixed it.
Tarot Yarn Spinner is now shipping. With a fully integrated tarot system. A real 78-card deck. Major and Minor Arcana. Four suits. Reversals. Spread positions. Deck depletion. Custom card art. We have finally caught up with the fifteenth century and we are not slowing down.

How It Works#
You call tarot() in your Yarn script. A card comes out. You use it to decide what happens next. That’s it. That’s the feature.
title: TheTavern
when: tarot_suit($card) == .Cups && tarot_reversed($card)
---
The tavern is warm. Too warm. The kind of warm where
strangers put their arms around you and tell you about
their marriages.
<<set $card = tarot_labeled("The Bard")>>
<<jump TheBard>>
===
title: TheTavern
when: tarot_suit($card) == .Swords && tarot_value($card) >= 8
---
A dozen soldiers. Armed. Organised. Not the usual tavern
garrison, these are campaign veterans with the dead eyes
and good posture of people who have killed professionally
and been promoted for it.
-> Ignore them. Order ale.
<<set $card = tarot_labeled("The Trouble")>>
<<jump TheTrouble>>
===
TheTavern. Yarn Spinner’s saliency system picks one to run.when: checks what you drew — this node only runs if the card is Cups suit and reversed. Compound conditions let you layer suit, value, reversal, and arcana.when: on the same node group — Swords suit with value >= 8. High-value Swords = organised military danger.tarot_labeled() call draws a new card from the deck, labels it, and the story forks.You can interrogate a drawn card about its entire life story: tarot_suit(), tarot_value(), tarot_reversed(), tarot_arcana(), tarot_name(), tarot_label(). Check how many cards you haven’t used yet with tarot_remaining(). Demand a Major Arcana specifically with tarot_major() (for when you need fate and not just vibes). Shuffle everything back with <<shuffle_tarot>>.
Pair this with Yarn Spinner 3’s saliency system and the suit picks the theme, the value picks the intensity, a reversal complicates everything, and a Major Arcana draw means the universe has decided to get involved.
Cups
Swords
Wands
PentaclesThe sample script demonstrates all of this through the medium of Gerrik of Puddle, mutant monster-hunter, professional grump. Every playthrough is different because the deck is different. He does not enjoy any of them.

We would like to formally apologise for the delay. Tarot has been around since the 1440s. We have had five hundred and eighty-six years to do this. We have no excuse and we are not taking questions.
No But Actually#
OK so we have been having fun with this but the feature is real and the reason it exists is genuinely interesting. Tarot as a tool for narrative design has been getting serious academic attention since the late 2010s. Emily Short wrote about tarot decks as expressive systems and worked on Parrigues Tarot as an interactive narrative project. Sullivan, Eladhari, and Cook published on tarot-based methods for procedural content generation. And Cat Manning wrote a chapter called “Tarot as Procedural Storytelling” in Short and Adams’ Procedural Storytelling in Game Design (CRC Press, 2019) that laid out why tarot is such a compelling framework for generating stories.

Manning’s argument is worth understanding. A tarot deck is not one taxonomy. It’s several, overlapping:
- Physical placement in a spread (Celtic Cross, three-card, five-card arc) assigns each card a role: past/present/future, situation/action/outcome.
- Suits (Cups, Swords, Wands, Pentacles) carry thematic associations. Cups are emotion and relationships. Swords are intellect and conflict. Wands are will and energy. Pentacles are material and practical.
- Rank within a suit modulates intensity. An Ace is raw potential. A Ten is culmination. Court cards are personalities.
- Major vs. Minor Arcana separates the cosmic from the everyday. The Fool, The Tower, The Wheel of Fortune. These are fate-level events. The Seven of Cups is Tuesday.
- Reversal (upright vs. upside down) shifts interpretation. Not always a negation. Sometimes a complication, an internalisation, an excess.
- The art itself carries associations. Different decks lead different readers to different interpretations of the same card. The Rider-Waite-Smith deck, the Thoth deck, the Marseille deck, the PoMo deck with its Bottles and Bills and TVs and Guns. Manning points out that words on the cards can prime interpretation: Crowley’s Thoth deck prints evocative one-word prompts on its Minor Arcana, where other decks leave the associational meaning entirely to the images.
When you do a reading, all of these layers are active at the same time. The Three of Swords in the “past” position of a three-card spread means something different than the Three of Swords in the “advice” position of a Celtic Cross. A reading heavy in one suit tells you something the individual cards don’t. A jump from Minor to Major Arcana across positions signals a shift from the mundane to the fated. Reversals in the outcome position feel different than reversals in the situation position.

Manning writes that there are 4.675 × 1021 possible 10-card Celtic Cross spreads. And yet tarot manages to avoid what Kate Compton calls the “oatmeal problem” in procedural generation, where everything you produce is technically possible but nothing feels meaningful. Tarot avoids this because meaning is constructed associationally, by a human, through layered intersecting taxonomies. The reader brings their own knowledge, their own associations, their own deck. It’s up to them to fill in the gaps. That’s what makes it feel personal rather than random.
This is what makes tarot interesting to us as tool builders. A tarot deck is a procedural engine. Not a fortune-telling prop. The suits are thematic domains. The values are intensity curves. Reversals are complications. Major Arcana are fate intervening. The deck depletes and the possibility space contracts. You can map all of this onto a branching narrative system, and Yarn Spinner’s saliency system turns out to be a natural fit. when: conditions on node groups let you write nodes that respond to suit, value, reversal, arcana type, deck state, any combination. The story selects itself based on what you drew.
The sample script demonstrates how these layers compose. As the deck thins, the story starts to notice:
title: TheEnd
when: tarot_remaining() <= 10
---
{tarot_remaining()} cards left. The stories are running out.
You have been Gerrik of Puddle for a long time now.
Long enough that the deck is thin and the roads are
familiar and even the monsters are starting to repeat
themselves.
The last card drawn: {tarot_name($card)},
drawn for "{tarot_label($card)}."
-> One more. There is always one more.
<<clear_tarot>>
<<jump Start>>
-> Some stories know when to end.
<<stop>>
===
title: TheEnd
when: tarot_remaining_major() == 0
---
{tarot_remaining()} cards remain. But the major arcana
are spent — no more Fools, no more Towers, no more
Wheels of Fortune.
Fate has said everything it intends to say. What remains
is just... life. The small cards. The daily work of
swords and cups and trying to get paid.
===
tarot_remaining() tracks how many cards are left. As you play, the possibility space contracts. The story knows it’s running out.{tarot_remaining()} and {tarot_name($card)} surface card data directly in dialogue text.tarot_name() returns the display name (e.g. “13 - Death” or “Ace of Cups (Reversed)”) and tarot_label() returns the spread position you assigned when you drew it.<<clear_tarot>> and jump back to start — the drawn cards are cleared from display but the deck stays depleted, so the next playthrough has fewer possibilities. Use <<shuffle_tarot>> instead if you want to reshuffle everything back.Manning’s point is that the richness of tarot comes from these multiple co-existing layers of meaning, none of which take precedence over the others. A narrative designer can use the same structure. And crucially, because the influence is external to the writer, it’s a tool for solving the blank page problem. You didn’t decide that this scene should be about soldiers. The deck decided. Your job is to figure out what that means.
PS#
One more thing, since we are now tarot experts with over three weeks of experience.
Tarot’s association with the occult is largely made up. Tarot started as 15th-century Italian playing cards. Regular playing cards. The mystical layer was bolted on centuries later by 18th and 19th century secret societies who invented a completely fake history and then told everyone that’s what tarot had always been. It worked.
Procedural Storytelling in Game DesignShort & Adams (2019)
A Wicked Pack of CardsDecker, Depaulis & Dummett (1996)
Decker, Depaulis, and Dummett describe it in A Wicked Pack of Cards: The Origins of the Occult Tarot (1996) as perhaps “the most successful propaganda campaign ever launched: not by a very long way the most important, but the most completely successful. An entire false history, and false interpretation, of the Tarot pack was concocted by the occultists; and it is all but universally believed.”
Jess Olson’s sociological analysis of tarot in North America (Canadian Journal of Sociology, 2022) traces how tarot reading communities construct meaning through shared practice. Readers don’t just interpret cards in isolation. The practice is social. Meaning emerges from community norms, from which spreads and decks and interpretive frameworks gain currency within a group. Olson found that readers often describe their relationship with their deck in terms of trust and intimacy, and that the process of learning to read isn’t about memorising card meanings but about developing a personal associational vocabulary.
None of which changes the fact that we’re very sorry that we didn’t add this sooner. Yarn Spinner is finally relevant to the narrative design world! You’re welcome.
A Deck for Everyone#
If you enjoyed our Tarot for Yarn Spinner project, you might also enjoy a nice side effect of our making that: a much-improved Public Domain version of the Rider-Waite-Smith tarot deck.

Mars went a bit overboard cleaning them up — patching blemishes, repairing scratches, straightening skewed scans, and tweaking colours across all 78 cards. The result is a fresh, usable public domain deck, now here for all to use. Grab the lot from themartianlife.com/tarot.
The Major Arcana


Cups

Swords

Wands

Pentacles

Like what we do?
Every purchase and sponsorship helps us keep building weird and wonderful tools for narrative game developers.
Support Yarn Spinner →Unless otherwise noted, the content of this post is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0). Logos, screenshots, and artwork shown in this post remain the property of their respective owners and are not covered by this license. The Yarn Spinner logo and branding imagery are also not covered by this license.


