What it offers
Everything here ships as YAML content and reusable components — no hand-rolled scroll logic to write, no backend, no build step to publish a new stop.
Scroll-synced camera
One stop per viewport, snapped. The map flies to the next
location as you scroll, and jumps instantly under
prefers-reduced-motion.
Dot rail & deep links
A rail on the right edge jumps to any stop; the active card is
mirrored in the URL as #stop-3, so a reload or a
shared link resumes in place.
Progressive journey line
A dotted line draws along the route as you advance and retracts as you scroll back, always clamped to the stop range.
Intro & outro cards
Cards with no place on the map can bracket the journey, laid out over the dimmed map or down a timeline.
Markdown cards
Headings, lists, tables, blockquotes, links and images — written in a YAML block scalar, sanitised before render.
Seven basemaps
Mapbox Standard, Light, Outdoors, Satellite, plus Stamen Watercolor, Terrain and Toner — or any Mapbox style URL.
Image galleries
One image renders as a plain figure; several become a carousel, with optional alt text and captions.
Content errors that point at the line
A schema-checked deck reports the file, line, column and offending source line — on the projector, not just in a terminal.
Screenshots
Every shot below is the deck running on the example content that
ships in public/*.example.yaml — nothing here is
anyone's real journey.
mapStyle: watercolor — one of seven named presets,
or any Mapbox style URL.
Getting started
Journey is a project you run and author content for — clone it, point it at your own YAML, and it's your deck.
-
Clone the repository and install dependencies
npm install -
Add a Mapbox token — create one at
account.mapbox.com, then
cp .env.example .envand paste it in..envis gitignored. Without a token the app renders an explicit error instead of a blank map. - Start the dev server
npm run dev -
Copy the example content to get a full starting deck
cp public/journey.example.yaml public/journey.yaml cp public/intro.example.yaml public/intro.yaml cp public/outro.example.yaml public/outro.yaml
Your deck is yours: journey.yaml,
intro.yaml, outro.yaml and everything
under public/images/ are gitignored, so a personal
journey and its photographs never end up in the repository. The
.example.yaml files are what ship, and they document
every option.
Non-goals
Phones and narrow viewports are not supported — the layout is a fixed horizontal split intended for a laptop or projector, with no fallback arrangement. There is also no deployment setup for the deck itself: a static deploy would embed the Mapbox token in the client bundle, which needs a separate, URL-restricted public token. (This documentation page carries no token and no map — it only shows static screenshots.)