Interactive fiction / Narrative systems
Crosswinds in Sapa
A story that remembers your choices. Relationships become state, and state becomes an ending.
- JavaScript
- HTML / CSS
- JSON
- Python
- GitHub Pages

What I contributed
Connected branching scenes and relationship state to a browser story player, with a node-based editor for developing and testing routes.
What came out of it
A playable branching narrative with condition-based endings, local save slots, a story log and a visual authoring workflow.
Choices that leave an afterimage.
Crosswinds in Sapa follows a Singaporean engineer facing a personal decision through five relationships. The story moves through work, friendship, travel and memory. Choices affect affection, trust and tension, so an ending depends on the accumulated journey.
I wanted the interaction to carry part of the storytelling. A choice should do more than lead to the next paragraph: its effect can stay with a relationship and change what becomes possible later.
Narrative structure becomes a small engine.
Scenes, choices and their effects are represented as structured data. The player updates relationship state, follows scene links and evaluates ending conditions. Local save slots, a story log and a back control make it possible to explore more than one route.
My contribution brings the narrative and the browser system together. The engine supports condition-based endings instead of reducing every path to a single last decision.
Build tools for the person writing the story.
A visual node graph makes the scene structure visible, with pan and zoom for exploring the branches. Scene editing, ending-rule controls and a live preview provide a way to revise both the words and their behaviour.
JSON import and export keep the story portable. A local Python development server supports the editor’s file operations, while the published player remains a self-contained static website.
Writing and software share the same space.
The public project includes a playable story and its authoring tools. It demonstrates how I think about state, navigation and content when the interface is itself part of the creative work.
It sits alongside the novel library as a different form of writing: one invites a reader to follow a story, while the other invites them to participate in its direction.