This is a description of the Javascript API of yarn.

Configuration Variables

These should be set in the game header (before any named passage).


The name of the passage to start on when beginning a new game.


The title of the game, which, if given, will be put in the menu.

The author's name, which, if given, will be put next to the title in the menu.


If true (which is the default), a restart link will be displayed in the menu.

Note: Without a restart link, the player will not be able to restart the game unless you provide a restart link (which currently isn't a simple task) in an accessible passage, or by manually deleting the save data cookie.


Setting this to true will enable debug behaviors:
- there is no confirmation on the 'restart' menu item
- the debug panel is visible (a box for jumping to a different passage, the current save data values)


If set to true, reverses pipelinks: links will be of the form [[display text|destination]] (twine) instead of the normal [[destination|display text]] (wikipedia).


The duration, in seconds, of the fade-in at the beginning of each passage.

Game Variables


The object which holds persistent data. When a user returns to the game page, this object is automatically restored from a cookie. Everything else (info, script globals, etc.) will be reset as if the game were newly loaded.

$ save.coins = 42;
$ save.inventory = ['bear', 'soup', 'onion'];
The wind picks up.
$ if (save.havecoat) write("It's a good thing you brought this coat along.");
$ else write("You start to shiver as the wind strips your body of its heat.");

The data may be anything that is JSON-serializable.


write(arg) -> null

Adds one or more lines to the current passage. arg is optional, and may be a string or a list of strings. Strings will be split on the newline character ('\n'). E.g., passing 'two\nlines' is the same as passing ['two', 'lines']. If arg is omitted, it is treated as if it were the empty string (''), which produces a blank line.

display(name) -> null

Show the named passage, without clearing anything written so far. This is used to include other passages in the current one.


:: one
in passage one

:: two
in passage two
$ display('one');
back in passage two

which looks like (with the player starting at passage 'two'):

in passage two
in passage one
back in passage two

randint(a, b) -> r

Return an integer between a and b, inclusive.

setColors(fg, bg) -> null

Set the foreground and background colors of the page. The arguments should be CSS colors.