I Call Window Seat
Download on the App Store
← How it worksHow a story happens
Window Seat · every railway

How a story happens

Look out the window long enough and something happens. Balloons lift off at dawn over the rice fields. Seals haul out on the rocks the tide has left bare. A village on the Konkan coast lights its lamps for Diwali. These are the stories. There are 402 of them across the six railways, and every journey picks its own.

Hot-air balloons rising over a farmhouse and its autumn trees, a snow-capped volcano behind, through a train window
Balloons inflate and lift off together: a Japan by Train story, at dawn.

A few minutes of the world doing something together

The scenery is busy on its own: birds, cars at the level crossing, a farmer in a field, another train going the other way. That part is left to chance, and it should be. A story is different. It's a handful of things that belong together, arranged to happen in front of you. The seals don't just appear. The tide goes out first, the rocks come up draped in weed, then the seals are on them, then the last of them slip back in while the gulls work the water.

Each story is a short recipe, not a video clip. Here is Diwali night on the Konkan Railway, trimmed:

{
  "id": "diwali-night",
  "title": "Diwali night",
  "when": {
    "timeOfDay": [0.78, 0.93],
    "seasons": ["autumn"],
    "regions": { "kudal": 4, "ratnagiri": 3, "bardez": 3, "salcete": 3, … },
    "weatherBelow": { "rain": 0.15, "cloud": 0.7 },
    "anchor": ["night", "settled"]
  },
  "phases": [
    { "name": "lamps",  "role": "cue",       "duration": [60, 85],
      "look": "dusk: kandils glowing in the verandas, diyas lit one by one along the steps" },
    { "name": "diwali", "role": "payoff",    "duration": [60, 90],
      "look": "every house lit: kandils, rows of diyas, coloured lights; the temple's lamp tower aflame; fireworks" },
    { "name": "glow",   "role": "aftermath", "duration": [45, 70],
      "look": "the last rockets fade; the diyas and the kandils burn on in the palms" }
  ],
  "dials":  [{ "dial": "lights", "phase": "diwali", "to": 1 }, { "dial": "festival", "phase": "diwali", "to": 1 }, …],
  "events": [{ "event": "fireworks", "phase": "diwali", "x": 7 }, …],
  "stage":  [{ "family": "temple", "phase": "diwali", "count": [1, 2], "depth": [40, 160],
               "look": "a temple's lamp tower aflame" }, …]
}
From konkan.json, one of 402 recipes like it. A "look" is a note for whoever builds and checks it; the numbers do the work.

What a story sets off

Every story plays in three parts of a minute or two each: a hint, the moment, and what's left after. Diwali starts with lanterns glowing in the verandas and lamps lit one by one along the steps. Then every house is lit, the temple's lamp tower burns and fireworks go up. Then the last rockets fade and the lamps burn on in the palms. Three to five minutes, start to finish.

To get there, a story turns a few dials at once:

  • The weather and the light: clear, still air for the balloons; the lights coming on at dusk.
  • More of something: fireworks seven times as often, gulls diving with the dolphins, more farmers out on planting day.
  • Its subject, put where you'll see it: seals hauled out on the flats a stone's throw from the line, a temple or two with their lamps, so the moment happens in front of the window and not behind a hill.
  • The land itself: fields that turn gold for the harvest, then go to stubble.

A story never sets the time of day or the season. It waits for a moment that fits.

Seals on the tidal flats of the St. Lawrence and cormorants on posts, through a train window with red curtains, two glasses of red wine and a brass clock on the sill
Seals hauled out at low tide below Le Massif, cormorants drying their wings: a Train de Charlevoix story.

When they happen

When the train leaves the station, the whole hour is laid out at once: the route, the towns, the hours of the day it passes through, the weather that will come and go. Then the stories are fitted to it. Each one says when it can happen, and only the ones that fit are in the running:

  • The hour and the season: balloons at dawn in spring, summer or winter; Diwali on an autumn evening.
  • The place: seals only where the tide has bared the rocks, dolphins only along the sea cliffs, fireworks only over a town at night.
  • The weather: no balloons in wind or rain. A storm story only plays inside a stretch of bad weather, and bad weather keeps to about a quarter of the journey, because the view is the point.

Then the hour gets a shape: a calm departure, a few small discoveries, a bigger moment around the middle, the best one saved for a landmark near the end, and a quiet run into the station. Twelve versions of the journey are laid out, and the one with the best shape is the one you ride.

A few rules keep it fresh:

  • No story twice in one journey.
  • The big spectacles from your last journey (the balloons, the paragliders) don't come back on the next one, and those from the two before that are rare.
  • Big stories at least three minutes apart.
  • A few rare ones, like the rowing crews racing for the harbour in La Spezia's Palio, turn up in about one journey in seven.
A red-roofed temple and its tall white lamp tower among palms and red flowers, through a train window with red curtains
A temple and its lamp tower on the Konkan Railway, by day. On an autumn evening, Diwali night lights every lamp on it.

So two people on the same train on the same evening see different things. Look up and you might catch one.

Who made them

  • The stories were written with an AI coding assistant (Claude), directed and reviewed by me, the same way as the drawing code. Each one was watched in the app and adjusted until its moment reads at a glance.
  • Nothing makes up a story while you watch. Every story comes from the library, and the planning is a set of rules and a roll of the dice. An early version let the iPhone's on-device AI model choose the next story; it was dropped once the whole journey started being planned in one go.

Josh Lannin, developer of Window Seat