1. Chris Klimas
  2. twinejs



by Chris Klimas, Leon Arnott, Daithi O Crualaoich, Ingrid Cheung, Thomas Michael Edwards, Micah Fitch, Juhana Leinonen, and Ross Smith


This is a port of Twine to a local browser-based app. See twinery.org for more info.

The story formats in minified format under storyformats/ exist in separate repositories:


Run npm install at the top level of the directory to install all goodies.

You'll also need Grunt to continue. Run npm install -g grunt-cli (you will need to have administrator privileges to achieve this task).


Run grunt to perform a basic build under build/standalone; grunt dev will perform the same tasks whenever you make changes to the source code. grunt nw will create executable app versions of Twine from this directory and place them under build/nwjs/. grunt build:cdn will build a version of Twine that makes as much use of CDN resources as possible, and place it under build/cdn.

To create downloadable versions of Twine, run grunt package. These will be placed in the dist/ directory. An additional file named 2.json is created under dist/. This contains information relevant to the autoupdater process, and is currently posted to http://twinery.org/latestversion/2.json.

In order to build Windows apps on OS X or Linux, you will need to have Wine and makensis installed.


Run grunt test to run through Selenium-based tests (for now, these only run on Firefox). To quit a test run as soon as any error is encountered, run grunt test --bail. To run a subset of tests, run grunt test --grep=mysearch. Only tests whose name match the argument you pass will be run.


Would you like to help localize Twine for another language? Awesome! You don't need to know JavaScript to do so. Here's how it works:

  1. Download template.pot from the repository.

  2. Use a translation application like Poedit to create a .po file with the source text translated. If you are using Poedit, get started by choosing New from POT/PO File from the File menu. Make sure to name your po file according to the IETF locale naming convention -- Poedit can help suggest that as well. For example, a generic French translation should be named fr.po, while an Australian English one would be named en-au.po.

  3. Finally, two other things are needed: an SVG-formatted image of the flag that should be associated with your language, and what native speakers call the language you are localizing to (e.g. Français for French speakers). Wikimedia Commons is your best bet for nice-looking SVG flags. Obviously, whatever image you provide must either be in the public domain or otherwise OK to use in Twine without any compensation.

  4. If you're comfortable using Mercurial, then you can open a pull request to have your localization added. Please place it in the src/locale/po directory. If you aren't, you can instead open a bug tracker issue and attach your PO file, flag image, and language name and we'll take it from there.