← Explore in the portfolio

Interactive fiction / Narrative systems

Crosswinds in Sapa

A story that remembers your choices. Relationships become state, and state becomes an ending.

My contribution
Narrative experience, game engine and authoring tools
Context
Independent interactive fiction
Year
Ongoing
  • JavaScript
  • HTML / CSS
  • JSON
  • Python
  • GitHub Pages
Crosswinds in Sapa visual novel showing a scene and the choices that branch its story
Crosswinds in Sapa visual novel showing a scene and the choices that branch its story

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.