Open storylet toolkit

Storylet Studio.
Design playable stories.

Storylet Studio takes the "what should happen next?" logic out of your game code. Encounters on a road, rumours in a tavern, quest offers, interludes between chapters: your narrative designers turn them into cards, each with a rule for when it fits. You drop one small file into your game and ask which cards apply right now. Same answer on Unity, Unreal, Godot or the web.

MIT-licensed & free · no server · no subscription · no lock-in

the Board · the-hamlet.storylets
The Board in Storyletter: three hands, The Forge, The Inn and The Mystic Tree, each holding the cards just dealt to it, with the journal of the session down the right
Plays in your engine
one .storyletsc bundle
JavaScriptUnityUnrealGodot
What it's for

“What happens next?”

Anywhere your game has to pick from a pool of possibilities, that's a box of storylet cards. You could use one to decide:

  • Which scene of your story should play now
  • Which conversation topics an NPC should offer
  • Which encounters should spawn at a spot on your map
  • Which items should spawn to be picked up
  • Which quests or jobs should be offered to your player
  • Which characters you can meet in the town
  • What bark line should play right now (though Patter's a better solution for barks)
  • What lore should appear in your player's codex
  • What topic your actor should raise with a visitor, right now, at an immersive event
  • Where to send your visitor next in an interactive event
  • More on what it's for →

One bundle. Four runtimes. Tested to match.

Pick the runtime for the engine you actually ship on. What plays in the editor plays in your build: the same cards come up, in the same order, with the same saves, right down to the random draws.

JavaScript
Unity
Unreal
Godot
For the people designing the story

Nothing to wire up. Nothing to untangle.

Other tools have you drawing lines between boxes, and then working out why the story won't go where you meant it to. Here you design a card and attach a condition to it. That's the whole job. The tool works out how the cards relate and draws the flow for you.

  • No wiring, ever. You never join one card to another. Set the rule for when each should appear, and the picture of how they connect is worked out from what you wrote. Change your mind and it redraws itself.
  • Play it right there in the editor. Try the story out without leaving the tool, using the same code that runs in the finished game.
  • Find out why something never happens. Autorun the story thousands of times and it'll show you which cards never come up at all, how often the rest appear, and what's getting in the way.
Tour Storyletter →
Village › Gareth's Debtthe cards you write · the flow it works out
One deck shown two ways at once, divided on the diagonal. The upper half is its cards as a grid, each with the rule for when it comes up. The lower half is the same cards as a flow, with arrows the tool worked out from those rules: one card opens up another, and shuts a third off.The Blacksmith'sTroublewhen: met GarethGareth Asksfor Helpwhen: he owes youThe Ring ofthe Anvilwhen: alwaysA Rumour atthe Innwhen: debt calledThe ForgeFalls Quietwhen: debt calledMira Poursa Secondwhen: eveningopens upshuts offThe Blacksmith'sTroubleGareth Asksfor HelpThe ForgeFalls Quiet
Why teams reach for it

Files you own, merges that behave, answers you can check.

Indie-first, built for a team to grow into. Plain text on disk, a format designed around the merge, and tooling that catches a dead beat before your players do.

Files you own, in your VCS

A project is a folder of plain text files, one per deck, living in git or Perforce. No database, no server, no export step to get your data out.

Merges that behave

A deck is a pool rather than a list, so two designers adding a card are never adding it to the same place. The conflict every other tool gives you doesn't happen here.

"Why didn't that happen?" has an answer

Every time the engine deals, it records what it looked at and why each card was passed over. "Why isn't this beat showing up?" is a line you can read, in the editor and in your game's log.

Review in the editor

Threaded comments on any card, deck or outcome, stored with the project and versioned with it. No spreadsheet round trip.

Save and load, one call

The whole run: state, turns, what's on the table and what's been played, restored exactly, in any runtime.

Automatable from CI

The storyletengine CLI validates, compiles and measures coverage, so you can fail a build on a beat nothing can reach.

Works alongside Patter

Optional. If you also use Patter for dialogue, both can read and write the same game state, so a conversation and a storylet work from one picture of the world.

Read why Storylet Studio →
A simple model

Your beats are cards in a deck, and the engine is the dealer.

Your game deals a hand and the engine picks the cards that fit, best first. Play a card and the world remembers: that particular rumour never comes round again, whilethat offer of a job keeps being shuffled back in until the player acts on it. No flags to set, no list of what's been seen to keep up to date.

Different boxes can deal in different ways: one for encounters, one for dramatic scenes, one for item pickups, each carrying whatever data your game needs on the card.

a card can't be in two places at oncedealt cards stay put until you play themplay a card and the world remembers

Your game asks. Your story answers.

Start a project, deal your first hand and have it running in your own engine in one sitting. It's open source, MIT-licensed, and free.