This is a tool written in Go that allows you to visualise the routes of your story.
Routes of the Question, the classic Ren'Py example
Doki Doki Litterature Club will no longer have secrets for you!
An extract from my personnal VN, Coalescence. You can't imagine handling a heavy VN like this one without graphic tools... (the labels aren't blurred on the real image)
chmod +x renpy-graphviz*renpy-graphviz.png just appeared, enjoy !I made a tag system to enforce some behaviours. For example
label chapter_1: #renpy-graphviz: TITLE
Before tags, you must write renpy-graphviz to ensure there are no collision with existing words in your VN.
Here are the tags available
TITLE: style for chaptersBREAK: breaks the current flow, for parallel labels for exampleIGNORE: ignores the current label. Jumps to this label still existGAMEOVER: style for endingsSKIPLINK: avoid long arrows by creating a "shortcut" - read the doc below before usingCase, spaces and separators are handled very loosely, don't worry about it.
Set some styles

Cancels any "guessed link".
label one:
"blah blah"
label two:
"bla bla"
# renpy-graphviz: BREAK
label three:
"the end"
| without tag | with tag |
|---|---|
![]() |
![]() |
Ignore the current line. If this is a jump to a label that isn't ignored, the label will still appear on the graph but not the arrow that should go towards it.
Avoids long arrows by creating another label with the same name. Beware, the label can't have any children and is marked by an asterix to show it is a copy.
label one:
if condition:
jump six # renpy-graphviz: SKIPLINK
else:
pass
label two:
label three:
label four:
label five:
label six:
| without tag | with tag |
|---|---|
![]() |
![]() |
This require your VN to be structured in a certain way, so it's possible that it isn't perfect for you. Feel free to raise an issue here, or to change your VN structure.
The program works only for scripts that do not stack call statement, i.e. the program expects a break statement before any other label/call if you used call to get there.
Works:
label start:
eileen "hello"
call second
eileen "I'm back"
# renpy-graphviz: BREAK <- recommended here but not mandatory, see Tags section
label second:
eileen "inside a CALL statement"
break <- works !!!
Does NOT work:
label start:
eileen "hello"
call second
eileen "I'm back"
# renpy-graphviz: BREAK <- recommended here but not mandatory, see Tags section
label second:
eileen "inside a CALL statement"
call / jump third_label <- Isn't taken into account !!!!
label third_label
This program is free and under the AGPLv3 license.
Beware, if you use this program, you must credit it somewhere on your game.
Used Renpy Graph Vizualiser from EwenQuim
Enjoy!
$ claude mcp add renpy-graphviz \
-- python -m otcore.mcp_server <graph>