The interactive narrative design tool that’s free
Ripple Effect is a desktop application for writing branching narrative. You lay passages out on a canvas, wire each choice to what it leads to, and press play to walk the result — over a folder on your own disk.
Free, and there is no account to make. Every platform, and how to install
Early days — you may still meet the odd rough edge.
Story logic you can drop into any engine
Bindings for TypeScript, C and C++, C# and Dart, a C ABI for anything else, and a story that talks with your game both ways — so a choice can be a place, a person or a moment, not just a button.
Read moreFor writers and narrative designersWrite prose, and keep the structure in view
Spelling and grammar checked and dictation heard on your own machine, house-style rules you write yourself, and a map of how every chapter hands the story on.
Read moreFor tabletop players and storytellersStoryboard the campaign, and track everything in it
Characters, items and factions as entities with typed attributes, console variables for the state of the world, and the dice on the board.
Read moreAn editor for stories that branch
Interactive narrative — a game’s dialogue, a visual novel, a gamebook, a tabletop campaign — is a story where the reader’s choices decide what comes next. Ripple Effect is a desktop tool for writing one, testing it, and handing it to whatever will play it.
Write
A passage is prose in Markdown, set like a book, in as many languages as the story needs.
Wire
Each passage is a card on a canvas, and every choice is a wire to what it leads to.
Play, then ship
Press play to walk the story as a reader would. When it is ready, its engine plays it in your game, site or app.
What sets it apart
Your story lives on your disk, not in a browser tab
Ripple Effect is a desktop application, and a project is a folder you already have. The app writes no scaffold into it and claims no ownership: open a directory and it is a project.
- No account to make, and no project uploaded anywhere
- Editing, playing and checking your spelling all happen on your machine, online or not
- A native canvas that draws a zoomed-out board as sketches, so a big one stays quick
- Cloud features are planned as an option, never a requirement
- the-keeper
- chapters
- act-one.graph.json
- act-two.graph.json
- passages
- scripts
- notes.md
The systems a game needs, built in
Entities with typed attributes, console variables and host callbacks are part of the story’s model, not a convention you rebuild in every project. Where a wire is not enough, Python is.
- A sandboxed Python subset, in Script nodes and inside the prose itself
- Components and entities: describe a goblin once, spawn six
- Typed console variables, watched live while the story plays
- Callback events that tell your game what the story just did
# weather.py — how hard the storm blows tonight
keeper = component("Keeper")
gust = roll + keeper["nerve"]
if gust > 15:
storm = "gale"
else:
storm = "squall"
| nerve | int | 4 |
| lantern | bool | true |
| pack | list<string> | [3 items] |
| lamp_oil | int | 3 |
| storm | string | squall |
| bell_rung | bool | false |
Built to sit inside the tools you already use
Boards are JSON, prose is Markdown and scripts are .py — every one opens in an editor you already trust and keeps working if this app disappears. And agents, in your terminal or on your desktop, can read and edit a project through its MCP server.
- Stable ids and relative paths, so a change reads as a change in review
- Version control built into the editor, over the repository you already have
- A compiled campaign is a folder a build pipeline reads without the editor
act-one.graph.json
a board
en.md
a passage, per language
weather.py
a script
.git
your repository
"connections": [{"id": "connection_4","type": "default","from": { "nodeId": "narration_1", "portId": "choice_0" },"to": { "nodeId": "narration_2", "portId": "in" }},+ {+ "id": "connection_9",+ "type": "default",+ "from": { "nodeId": "narration_1", "portId": "choice_1" },+ "to": { "nodeId": "end_0", "portId": "in" }+ },
Hand the folder to an agent and keep writing
Ripple Effect is an MCP server. Point Claude Code — or anything else that speaks the protocol — at the project you have open, and it works in the same folder you are working in, on the board you are looking at, while you are looking at it.
project_infoproject_outlinecatalog_findboard_readboard_linkspassage_readcomponent_readsoundscape_readdiagnostics_readtrace_betweentrace_intotranslation_statusnode_typespython_capabilitiespython_evalcampaign_startcampaign_statecampaign_choosecampaign_answercampaign_tracecampaign_autoplaycampaign_endpassage_createpassage_writecomponent_writeboard_add_passageboard_add_nodeboard_connectfile_createsaveboard_set_nodeboard_set_choiceboard_disconnectboard_remove_nodefile_movefile_deletesoundscape_setsoundscape_add_clipsoundscape_set_clipwriting_readgrammar_checkdictionary_editstyle_rule_writestyle_rule_delete44 tools, plus nine resources and two prompts. Everything that writes is behind the second switch.
Two switches, both off
Agent access makes the app listen at all. Agents may edit is separate and subordinate to it. Neither is on when you install.
A socket, never a port
The server is inside the running app, reached over a local socket by a bridge the client spawns. Nothing is listening on the network.
Edits go where yours go
A board is changed through its own session, so the edit lands in your undo stack. Every write says which paths it touched, and posts to Messages.
What is shipped, and what is next
Each release is a pack of features with a name. The order is the order they are planned in — there are no dates here, because the honest thing to say about a version that has not started is what it is, not when it lands.
Tavern Meetup
- Boards on an infinite canvas, passages in every language, components with typed attributes
- Control flow, random numbers and Python in the prose
- Playable campaigns, script navigation, tracing every route between two passages
Mimic Chest
- Version control built in, with nothing to install
- An MCP server, so an assistant you already use can read and change the project
- In-app updates that fetch and open the right installer
Homebrew Rule
- The story runs without the editor: campaigns compiled for a runtime, as Markdown or HTML
- State with no wire: console variables, state machines, gates, saved games
- Macros, dice, an Input node, and reading time in fifty-four languages
Elven Choir
- Soundscapes: a timeline of music and sound a passage brings, and keeps until another replaces it
- Sound effects from a node or from Python, and media switches on export
- Project templates, metadata on every node, a play window that fills the app
Multiclassing
- The story engine in Rust, released on its own for desktop, phones and the web, with host callbacks
- A workspace like a code editor's: docking tabs, find and replace in project, a menu bar, Zen Mode
- Boards that say what is wrong with them, passages that take arguments, and the app in Italian
Grammar Lich
- Spelling, grammar and style rules of your own, checked on your machine, with a dictionary per project
- Dictation on your computer by NVIDIA's Nemotron models, in English or in 32 languages
- Countdowns on choices, and stories that read the time, where you are and the reader's language
Illusion School
- Integration with the Recraft V2 API
- LLM integration for generative narration
Party Gathering
- Real-time collaboration
World Smith
- Timelines and storyboarding
- Indoor and outdoor maps
- World wiki
Open a folder and start writing
No account, no project scaffold, nothing written into your directory that you did not ask for.