← Back to blog

18 April 2026 · 560 words

Opening the reachable train circle

productmilestone
FOMO Sun has always been Swiss-first. In v1.9.0 we quietly redrew the catalog boundary — 323 destinations became 387, and the map finally reaches Milan, Paris, Munich, and the Dolomites.

The rule that decides what's in

FOMO Sun is not a general travel search. The product promise is narrower than that: what sunny place can I actually reach today, from where I am, by train? Everything downstream — the joystick, the timeline, the hero pick — assumes a trip is a realistic one-day or weekend move.

That constraint is encoded as a single number: 6.5 hours one-way from any Swiss origin, direct train preferred, one change accepted. Basel → Paris on TGV Lyria is 4h03. Zurich → Milan on the ETR 610 EuroCity via Gotthard is 3h20. Buchs SG → Feldkirch → the Arlberg is two connections, still inside the cap. Everything beyond 6.5h falls out.

For the first year of FOMO Sun, that cap was mostly theoretical — the catalog was Swiss. 1.8.3 had already done the plumbing to break out: widened maxBounds, added OSM as a base layer below swisstopo, put 'AT' through the country union. 1.9.0 is the payload.

What got added

+64 destinations, roughly:

  • Austria (+18) — Vorarlberg (Bregenz, Feldkirch, Bludenz), the Arlberg (Lech, Zürs, St. Anton), Montafon, Bregenzerwald, Tirol (Innsbruck, Seefeld).
  • Bavaria (+13) — Munich, Ulm, Augsburg, Lindau, Füssen, Garmisch-Partenkirchen, Mittenwald, Oberstdorf, Bad Tölz, Baden-Baden, Heidelberg.
  • Lombardy + the Dolomites + Veneto (+22) — Milan, Bergamo, Brescia, the Lake Garda fill (Desenzano, Sirmione, Riva), Verona, Vicenza, Padova, Bolzano, Merano, Val Gardena, Cortina d'Ampezzo, Bellagio + Menaggio + Lecco (Lake Como), Arona.
  • France (+11) — Paris, Lyon, Annecy, Chamonix, Grenoble, Dijon, Beaune, Mâcon, the Léman-south pair (Évian, Thonon).

Each entry got a lat/lon, altitude, country, type vector, and — where we could verify it — a direct or 1-change train connection from a Swiss origin.

Milan and Paris are different

There's a structural distinction baked into the data: some destinations are "premium HSR anchors". Milan and Paris head that list. A Paris day trip from Basel is not the same product as a Pilatus day trip from Luzern. It's heavier, more expensive, more intentional — but the 4h03 TGV ride makes it possible, and possible is the bar FOMO Sun sets.

Anchors got quality: 'curated' plus a hand-written description block so the hero copy reads smoothly when they land at the top of the list. The full set: Milan, Paris, Munich, Innsbruck, Lyon, Bolzano, Verona, Baden-Baden, Heidelberg, Sirmione, Lindau, Füssen, Garmisch-Partenkirchen, Lech, St. Anton, Bellagio, Annecy, Chamonix.

Compare to a destination like Mellau in the Bregenzerwald: a perfectly good weekend-hike candidate, correct flag, correct altitude, but no curated copy. It will surface when the ranking puts it there; it won't ever headline the front page on its own.

What came next

Two things that should have been in 1.9.0 slid to follow-ups:

  1. Raster stamps for the 64 new destinations — the SVG fallback works but reads generic for premium anchors. Shipped as 1.9.1. See the next post.
  2. Tourism-board URLs. The old "Explore place" link was a MySwitzerland search, which returns nothing useful for Bolzano. 1.9.3 introduced DESTINATION_DMO_URLS in src/lib/destination-dmo.ts — 60+ curated per-destination URLs (germany.travel, italia.it, austria.info, france.fr), HTTP-verified at authoring time. Munich now points at the actual München Tourismus site, not a Swiss search results page.

Why this was a minor bump, not a major

The catalog roughly doubled in geographic reach. That sounds like a major. But the product contract — reachable sunny escape, by train, today or tomorrow — didn't change. The 6.5h cap didn't change. The joystick didn't change. We just taught the reachability set a wider truth about where European trains actually go.


Shipped 2026-04-18 as v1.9.0. Full release notes in docs/RELEASES.md.