npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

extwee

v2.3.12

Published

A story compiler tool using Twine-compatible formats

Downloads

1,102

Readme

codecov

npm version

License: MIT

NPM Badge

Table of Contents

Story Compilation

The process of story compilation converts human-readable content, what is generally called a story, into a playable format such as HyperText Markup Language (HTML). The result is then presented as links or other visual, interactive elements for another party.

The term compilation is used because different parts of code are put together in a specific arrangement to enable later play. As part of Twine-compatible HTML, this means combining JavaScript code (generally a "story format") with story HTML data.

Extwee is not an authoring tool. It cannot be used to create story content. This data must be created using other tools or processes. Extwee can then compile the content with story format code to produce something playable.

Playable formats are the following and require external story formats[^1] to enable play:

  • Twine 2 HTML
  • Twine 1 HTML

More human-readable formats include:

  • Twee 3[^2]
  • Twine 2 JSON[^3]

From 2009 to 2015, Twine 1 supported a now historical format named TWS. This was a binary format used for archival purposes. Extwee can read this format but does not support creating it because no other tools, including current versions of Twine, accept it as valid input.

Twine 2 supports exporting a collection of stories (known as a library) in the Twine 2 Archive HTML format. Extwee can also read and write this format, creating either a collection of stories from the data or writing a collection of internal objects to a file.

[^1]: Extwee does not include or publish story formats. These can be found in the Story Format Archive (SFA).

[^2]: Twee exists in three versions. The first existed between 2006 to 2009 and was part of Twine 1. The move to Twine 2 in 2009 dropped support and the story compilation tools Twee2 and Tweego adopted their own extensions and modifications. Beginning in 2017, work was done to unite the different projects. This resulted in Twee 3 in March 2021.

[^3]: In October 2023, JavaScript Object Notation (JSON) was added as a supported community format for story compilation tools. Extwee is the first tool to support this format.

Format Support

Extwee supports multiple historical and current Twine-compatible formats.

| Format | Input | Output | |----------------------------------------------------------------------------------------------------------------------------------|-------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Twine 1 HTML (2006 - 2015) | Yes | Partial support. Twine 1 HTML can be produced, but the StorySettings optional passage introduced in Twine 1.4.0 requires external libraries like jQuery not included with Extwee. | | Twine 1 TWS (2009 - 2015) | Yes | Extwee does not support TWS (Python pickle) output because no current version of Twine or other story compilation tool produces this historical format. | | Twine 2 HTML (2015 - Present) | Yes | Yes | | Twine 2 Archive HTML (2015 - Present) | Yes | Yes | | Twee 3 (2021 - Present) | Yes | Yes | | Twine 2 JSON (2023 - Present) | Yes | Yes | | Twine 2 Story Format (2015 - Present) | Yes | Yes |

Note: Round-trip translations can present problems because of required fields and properties per format. Some metadata may be added or removed based on the specification being followed.

Node and Web API

The following objects and methods are available in Node.js or browser contexts.

Note: When used in a browser context, all objects and methods are part of the window.Extwee global.

Objects

An object must be created using either the new keyword in JavaScript or as the result of parsing data.

  • StoryFormat
  • Passage
  • Story

Story and Passage objects can generate multiple output formats: toTwee(), toTwine1HTML(), toTwine2HTML(), and toJSON(). Stories cannot be played in a browser without the corresponding compiler combining it with story format data.

The StoryFormat object supports toString() method of producing a tab-separated JSON output and toJSON() method of generating JSON output matching the Twine 2 Story Format Specification.

Parsers

Translates output formats such as HTML, Twee, JSON, or JSONP into objects.

Note: Twine 1 story formats exist across multiple files (header.html and optional code.js). They cannot be parsed into a StoryFormat object.

  • parseTwee()
  • parseJSON()
  • parseStoryFormat()
  • parseTwine1HTML()
  • parseTwine2HTML()
  • parseTwine2ArchiveHTML()

Compilers

Compiles story, story formats, or other data into an archive or playable format.

  • compileTwine2HTML()
  • compileTwine1HTML()
  • compileTwine2ArchiveHTML()
  • compileStoryFormat()

To create playable Twine 1 HTML, an engine.js file must be supplied. (See Story Format Archive for available Twine 1 engine.js file.)

Compilation of a story format adds the necessary function wrapper to convert the JSON output, via toJSON(), to JSONP.

Support Functionality

Multiple Twine formats support using an IFID to identify one work from another.

As part of its API, the Extwee method generateIFID() can be used to create a new IFID for a Story object or as part of other processes.

Web Build Imports

For users who want to use pre-built, minified versions optimized for browser environments, Extwee provides several web build exports:

Available Web Builds

  • Core Build: import Extwee from 'extwee/web' - Complete functionality including parsers, compilers, and core utilities
  • Twine 1 HTML: import Extwee from 'extwee/web/twine1html' - Specialized for Twine 1 HTML parsing and compilation
  • Twine 2 Archive HTML: import Extwee from 'extwee/web/twine2archive' - Specialized for Twine 2 Archive HTML parsing and compilation
  • TWS Format: import Extwee from 'extwee/web/tws' - Specialized for TWS (Twine 1 workspace) parsing

Usage Examples

// Use the full core build
import Extwee from 'extwee/web';
const story = new Extwee.Story();
const ifid = Extwee.generateIFID();

// Use a specialized build for smaller bundle size
import Extwee from 'extwee/web/twine1html';
const story = Extwee.parseTwine1HTML(htmlContent);

These web builds are UMD-compatible and can be used with module bundlers like webpack, or loaded directly in browsers. They are optimized and minified for production use.

Note: Web builds include their dependencies bundled, making them suitable for browser environments but larger than the Node.js imports which rely on external dependencies.

Documentation

Extwee has documentation hosted on GitHub Pages.

Command-Line Usage

Extwee supports a command-line interface for four general scenarios.

Notes: As of Extwee 2.2.5, short and long command-line option flags are separated. Short options use one hyphen followed by one character and all long options begin with two hyphens and a name as word.

Compiling Twee 3 + Twine 2 Story Format into Twine 2 HTML

Compile Twee 3 + StoryFormat into Twine 2 HTML:

extwee -c -i <tweeFile> -s <storyFormat> -o <Twine2HTML>

De-compiling Twine 2 HTML into Twee 3

De-compile Twine 2 HTML into Twee 3:

extwee -d -i <twine2HTML> -o <outputTwee>

Compiling Twee 3 into Twine 1 HTML

Enabling Twine 1 mode requires using the --twine1 long flag.

Because Twine 1 story formats can be split across files, compilation requires the "engine" from Twine 1 named engine.js, the name of the story format, and then its header.html template code and the optional but often included code.js file.

(Refer to the Story Formats Archive for access to historic engine.js and other files.)

extwee --twine1 -c -i <tweeFile> -o <Twine1HTML> --engine <engineJS> --name <storyFormatName> --codejs <CodeJS> --header <header>

De-compiling Twine 1 HTML into Twee 3

Enabling Twine 1 mode requires using the --twine1 flag.

extwee --twine1 -d -i <twine1HTML> -o <outputTwee>

Config File Usage

When invoked from its command-line interface using npx extwee, it will look for a extwee.config.json file in the local directory. If found, and its fields are valid, processing will use the values found in the file.

Consult the possible options in its dedicated file.

Tree Shaking Support

For advanced tree shaking patterns, most formats are broke into compile.js and parse.js files exporting associated compile() and parse() functions.

When using the API, it is possible to only import a single function or object to produce smaller and potentially faster code in projects dependent on Extwee functionality.

Contributing

Contributions are welcome! Please read our Contributing Guide for details on:

  • Setting up your development environment
  • Code style and standards
  • Testing requirements
  • Submitting pull requests

See also:

License

Distributed under the MIT License. See LICENSE.txt for more information.