← Home
Feature Dossier · v11.1.0

The Wanderer's
Atlas

The personal site is now an explorable illustrated world — arrive in orbit, dive through the clouds, and walk a hand-drawn map whose six regions are the six things this site is about.

orbit ▸ dive ▸ map ▸ region interiors ▸ the game layer

Hometown Square Treks Book Forest Marathons Scriptorium Projects

Orientation

One theme, end to end

Built as sixteen phases on a single branch behind an ATLAS_LIVE flag and a hidden /world preview route, then flipped live at /. The old editorial layout survives one click away — and is automatic under reduced-motion — but it is no longer the front door. Toggle the sun/moon in the corner: this page's day and night are the Atlas's own palette swap.

6
Regions, each a real page group
7+3
Quests + time / return achievements
5
Hidden easter eggs on the map
149.66KB gz
Entry bundle, within budget
0
Accounts or servers — all local

The journey

Five moves from orbit to a page

A real sequence — each stage hands off to the next, and every one is skippable, remembered, or gracefully reduced.

1

Arrival — the orbit

A bright orbital scene: the homepage globe in a new orbit mode, day-side, drifting clouds, six glowing regions teasing their live counts. Drag to rotate. One pulsing call to action — Enter the World — with Skip intro always beneath it.

reuses GlobeRenderer · three.js stays lazy
2

The dive

Clicking Enter plays an authored ~3.5s GSAP cinematic: the camera plunges, clouds whip past into a white bloom, and the curved globe unfolds into a flat illustrated map. Skippable mid-flight; remembered forever after (introSeen); a quiet fade under prefers-reduced-motion.

GSAP loads only if you actually dive
3

The map hub

A full-screen 2.5D parallax vector map — six biomes around a hometown center, idle life everywhere, pan / zoom / pinch. Hover a region and it lifts with a teaser; click and the camera flies in, turning the region's art into the page's header. On phones the whole map fits in one window.

usePanZoom owns the viewBox · GSAP owns transforms
4

Region interiors

Every content page is rebuilt as a themed interior of its region — a biome header band, breadcrumb, parchment column and per-region accent tokens — rendered by RegionShell from a single truth table. The page content itself is untouched between shells.

one registry.js feeds shells + the compass menu
5

The game layer

A passport with per-region stamps, quests, hidden easter eggs, achievement toasts and confetti — plus a mini illustrated Sanket who guides you one speech-bubble at a time. Everything is local: no accounts, no server.

pure questEngine over declarative quests

The six regions

Every place is a page group

The map's domain table is the single source of truth for keys, colours and routes. Each biome carries its own collector quest.

🏘️

Hometown Square

/about · /now · /stats · /changelog · /mindmap · /interactive-me

about, now and everything home

🧭The hub — its Square biome anchors the map and holds the Observatory & Gallery Trail.
⛰️

Treks

/treks

treks and summit forts

⛰️Summiteer — open five treks on the Ridge.
🌲

Book Forest

/books

books and reviews

📖Bibliophile — open five books in the Forest.
🌊

Marathons

/sports

races and running

🏃Roadrunner — open five races on the Coast.
📜

Scriptorium

/100-days-to-offload · /micro-blog · /challenges

blogs and micro-posts (1,600+ of them)

✒️Wordsmith — open five posts in the Scriptorium.
🛠️

Projects

/projects · /resume

projects and resume

🔧Tinkerer — open three projects in the Workshop.

The game layer

A passport you actually fill

A pure engine evaluates declarative quests over your visit log — Explorer counts regions, Collectors count actions, the hunt counts eggs, and time / return achievements read the clock. Completing one drops a stamp with confetti. All of it lives in one versioned atlas.v1 localStorage key.

The quest ledger

🧭
Cartographer
Set foot in all six regions of the Atlas.
× 6
📖
Bibliophile
Open five books in the Book Forest.
× 5
🏃
Roadrunner
Open five races in Marathons.
× 5
⛰️
Summiteer
Open five treks in Treks.
× 5
✒️
Wordsmith
Open five posts in the Scriptorium.
× 5
🔧
Tinkerer
Open three projects in Projects.
× 3
🔎
Curious Wanderer
Uncover every hidden secret on the map.
× 5
🦉
Night Owl · achievement
Explore the Atlas after dark (23:00–05:00).
time
📅
Regular · achievement
Drop by on three different days within a week.
× 3
🏅
Completionist · achievement
Finish every other quest in the Atlas.
all

The passport · ten stamps

Shown at start state — every traveller begins with an empty passport. Each earned quest turns its dashed seal solid.

🧭Cartographer
📖Bibliophile
🏃Roadrunner
⛰️Summiteer
✒️Wordsmith
🔧Tinkerer
🔎Curious
🦉Night Owl
📅Regular
🏅Completionist

Hidden on the map

Five secrets in the art

Each egg is a small hotspot tucked into a biome — click it to stamp it and pop a toast. The hints on the map stay deliberately vague; here is what they are (spoilers, gently). One only appears after dark.

🎖️
Marathons · shore

The 50K medal

“A glint half-buried along the shore.”

Tata Ultra 50K — the ultra-marathon medal.

⛺
Treks · the ridge

A lone tent

“Something pitched high on the ridge.”

Panhala → Pawankhind — the 22-hour night trek.

⛵
Scriptorium

A paper boat

“Adrift near the Scriptorium.”

A paper boat — a nod to The Wanderer's Substack.

🌱
Hometown Square

A young sapling

“Newly planted in the square.”

A Nirman sapling — growing something new.

⭐
Book Forest · sky

A bright star

“Twinkles only after dark.”

The Jan-22 birthday constellation.

🌙 Night only

Design choices

The locked creative decisions

Every direction below was confirmed one-by-one before a line was written — the creative guardrails the whole build answers to.

DirectionLiving Atlas — globe orbit → cinematic dive → illustrated map hub.
Game depthHUD + quests + passport. No walkable avatar — explorable, but nobody gets lost.
BreadthFull rebuild of every page as a region interior. The data layer is unchanged.
Escape hatchSkip intro always visible; remembered Atlas / Classic preference; reduced-motion auto-lands in Classic.
Art styleFlat vector illustration, authored as inline-JSX SVG components (for CSS-var theming + per-element life).
SoundAmbient loop per biome + micro-SFX, off by default, hand-rolled WebAudio — no library.
GuideA mini illustrated Sanket with speech bubbles — replaces react-joyride.
ChromeA world HUD (compass, return-to-map, passport, sound, sun/moon) replaces the nav, sidebar and footer.
Day / nightAuto from the visitor's local hour (19:00–06:00 → night) + a manual toggle, coupled to the theme.
World nameThe Wanderer's Atlas — tying to the Substack identity, framing visitors as fellow explorers.
QuestsExplorer + Collector + hidden eggs + time / return achievements — all localStorage, no accounts.
AnimationGSAP (free, all plugins), confined to lazy atlas chunks — never the entry bundle.

System patterns

How it holds together

The spectacle sits on a boring, testable spine. A handful of ownership rules keep animation, routing and theming from ever fighting each other.

Two shells, one route table

Atlas and Classic share one set of routes. View mode resolves synchronously — ?view= → stored choice → reduced-motion → flag — so the first paint is never wrong, and a shared PageMeta means metadata can't fork between shells.

PageShell.jsuseViewMode.jsPageMeta.js

The ownership rule

To stop animations fighting over the same value: usePanZoom owns the SVG viewBox; GSAP only ever touches element transforms and opacity. Never both on one property.

hooks/usePanZoom.jsmap/parallax.js

Overlay choreography, not FLIP

React Router unmounts the source tree, so cross-route shared-element FLIP is fragile. Instead AtlasFrame mounts once outside Routes and owns the transition overlay — navigations bridge without a flash.

atlas/AtlasFrame.js

One GSAP import point

GSAP is imported only through a single module, so tree-shaking and chunk placement stay controlled — it lands in the lazy atlas chunk and never the entry bundle.

atlas/lib/gsap.js

Accessibility mirror

The SVG hotspots are aria-hidden; an offscreen <nav> of six real links is the single source of truth for assistive tech. Roving tabindex, arrow keys walking the geographic ring, Enter / Space / Escape.

map/WorldMap.jsRegionHotspot.js

Day / night is a token swap

All art and UI colour comes only from --atlas-* custom properties under .atlas-root[data-time]; flipping the attribute repaints the whole scene — windows light up, stars appear. Region accents live under [data-region].

theme/atlasTokens.css

A zero-specificity reset

The .atlas-root reset wraps its element selectors in :where() so bare-element defaults never out-specify the Tailwind utilities on imported page content — pages look identical in either shell.

theme/atlasTokens.cssstyles/classic.css

A pure, tested core

The quest engine is a pure evaluator over declarative definitions; world state is an atlas.v1 reducer with a debounced writer and a tested migration that seeds your passport from the old globe-visited key.

gamification/questEngine.jsworld/migrate.js

The repo owns its audio

The seven ambient beds and the SFX sprite are procedurally synthesised at build time (filtered noise + sine partials) — no third-party audio, and nothing loads until you turn sound on.

scripts/generate-atlas-audio.mjs

Craft & guardrails

The details that sell it — and keep it honest

Atmosphere is layered in carefully, and every flourish has a guardrail: a budget, a fallback, or an off-switch.

🏔️

2.5D parallax

Sky and far ranges lag the camera, near props lead it, plus a little pointer drift — all via gsap.quickSetter on transforms.

🕯️

Idle life

Flag flutter, page-birds, workshop gears, waves, drifting clouds — and a night state where windows glow, stars come out and fireflies drift, all CSS-var driven.

📱

Mobile as a tier

The same map fits all six regions in one window (the SVG letterboxes into the sky on tall screens), with pan / pinch and the compass menu as a text fallback.

🔊

Opt-in audio

Off by default. Turn it on and a per-region ambient bed cross-fades as you move — loading nothing until then.

🧑‍🎨

The guide

A flat-vector mini Sanket pops in with one line at a time — a welcome, a nudge to the passport, a hint that sound exists. Each beat is acknowledged once, forever.

♿

Reduced-motion first-class

Prefer reduced motion and you land straight in Classic; the map's screen-reader nav and full keyboard model are always present regardless.

📦

On a budget

Dropping react-joyride (~40 KB) roughly paid for GSAP (~30 KB, lazy). Deleting a 3,960-line vendored theme cut the entry stylesheet 25.90 → 15.85 KB gz. Per-biome art is capped at 25 KB.

💾

Yours, and local

Passport, quests, eggs, preferences — everything is one localStorage key. No accounts, no server round-trips, no tracking of your journey off-device.

Made with Claude Code

How the world got built

The Atlas was designed and implemented with Claude Code as the build agent, working from an approved plan against the live codebase. The method mattered as much as the map: decide first, build in phases, and keep the branch shippable the whole way.

🧭

Decisions before code

Sixteen creative decisions and four build-workflow decisions were each confirmed one-by-one — direction, game depth, art style, sound, chrome — before a line was written.

🖼️

A cheap concept-board gate

Before any real biome art, a single rendered mockup — map composition, one full biome, both day/night palettes, the HUD — was approved once. Art is expensive to redo; a mockup isn't.

🌑

The dark build

The changelog stayed deliberately silent through phases 0–14 — a conscious exception to the always-update rule — so the flip could land one comprehensive v11.0.0 entry telling the whole story at once.

✅

Green at every phase

Each phase left the branch passing lint, test and build, hidden behind an ATLAS_LIVE flag and a /world preview — public-safe and shippable at any moment.

Sixteen phases · one long-running branch · flipped live at the end

0
Dead-CSS prunegroundwork · S
1
Foundation — world state, view modes, /world previewM
2
Atlas frame — GSAP, tokens, HUD skeleton, day/nightM
3
Map hub — layers, pan/zoom, hotspots, keyboard & ARIAL
4
Intro — orbit stage, the GSAP dive, skipM
5
First region — RegionShell + Book Forest, stampsM
6
Game layer — quest engine, passport, eggsM
7
Wave 2 — Coastal Road + Sahyadri RidgeM
8
Wave 3 — the Scriptorium trioM
9
Wave 4 — the WorkshopM
10
Wave 5 — Hometown Square, Observatory & Gallery TrailM
11
Art & perf — final biomes, parallax, budgetsL
12
Audio — WebAudio manager, ambient bedsM
13
Guide — GuideAvatar replaces react-joyrideM
14
Cleanup — delete the old theme, fix rounded-fullM
15
The flip — atlas goes live at “/” · v11.0.0push branch · XS

Getting started

How the Atlas began

Before the map, before the phases, there was a brief and a rule: ask everything, assume nothing. These are the prompts that drew the first outline.

Brief“I want to completely redesign this website… an animated site where the user navigates a gamified experience. The homepage should be a bright experience where the user enters a personal world — first a globe, then you zoom in and click to enter, and the world prompts you to browse. Brainstorm, explore every creative idea, ask every possible question for every small feature, and clarify everything — don't assume.”

Rather than reach for code, the session first read the whole docs/ folder and mapped the existing site — the homepage globe, the six content domains, the design tokens — then went looking outward for reference.

Prompt“This should be a completely redesigned experience — explore the ideas on the web for more detailed exploration.”

A research pass surveyed the state of the art in explorable web worlds — Bruno Simon's drivable portfolio, Jordan Breton's floating island, cozy Zelda-like navigators, Stripe's globe — and pulled out the guardrails that separate a delightful world from a frustrating one: don't trap goal-driven visitors, treat mobile as a first-class tier, keep the real content crawlable beneath the spectacle, make sound strictly opt-in.

Then came the long part: a clarifying loop where every creative decision was put as an explicit question and confirmed one at a time — direction, game depth, breadth, the escape hatch, art style, the intro's motion, sound, the guide, the site chrome, day versus night, the world's very name. Twenty-odd choices, each answered before any of them was assumed.

Prompt“Only export the detailed plan to an md file under the docs folder — we'll build in phases.”

So the whole design was written down as a build bible — the vision, the six regions, the architecture, the file map, the sixteen-phase plan, the risks and the verification playbook — to be executed deliberately rather than all at once. One more round of questions settled the workflow itself:

Prompt“Ask questions first.”

Four answers set the rules of the build: one long-running branch behind the ATLAS_LIVE flag; a silent changelog until the flip, so the story could land in a single entry; a cheap concept-board gate before any real art; and audio sourced under permissive licences. With the map drawn and the method agreed, one instruction remained.

Prompt“Start with phase 0.”

And the sixteen phases began — the first of them clearing the ground by deleting a decade-old vendored theme, so the new world had nothing to fight.

Prompt“Study this plan and start implementation of phase 0.”

Phase 0 was demolition done carefully. The vendored stylesheet came out partial by partial — but only after every rule was proven dead: the CSS was compiled before and after and diffed by structure (the new output a pure subset of the old, 424 rules removed and not one added), and each of the 366 orphaned selectors was tested against the live pages to confirm it matched nothing at all. The entry stylesheet shed roughly a third of its weight, and the first green commit landed on the branch.

Prompt“Start implementation of phase 1 and phase 2.”

Phase 1 laid the foundation no visitor sees: one versioned localStorage key for the whole world, a pure and unit-tested migration that quietly carries a returning visitor's old globe visits into the new passport, the view-mode resolver that decides Atlas-or-Classic before the first paint, and a hidden, noindexed /world route to preview it all. Phase 2 raised the frame on top: the day/night design tokens, the world HUD — compass, passport, sun/moon, sound, return-to-map — and the one-way switch that ties the scene's daylight to the site's dark mode, so the two can never disagree.

Prompt“Finish phase 2 of plan.”

The last pass drove every control by hand — the sun/moon flipping both the sky and the theme in lockstep, the passport's Classic escape hatch dissolving the whole frame, the compass listing all six regions — then left the branch green: lint clean, sixty-odd tests passing, and the build split so GSAP and the atlas chrome load only for visitors who actually step into the world. Three phases down; the map itself was next.

Prompt“Start with phase 3 of plan now, give me designs to approve.”

Phase 3 was the map itself — and the plan had placed a gate in front of it. Before any real biome art, the build owed one cheap approval: a rendered concept board showing the map's composition, a single fully detailed biome, both day and night palettes, and the world HUD. Art is expensive to redo; a mockup is not. So the session drew the board rather than the map — the six regions laid out corner to corner with the Book Forest worked up to full detail as the benchmark, a working sun/moon that repainted the whole scene live, and every colour pulled straight from the shipped --atlas-* tokens, so what was approved was exactly what the code would produce.

Approval“Approved.”

The art direction locked in a single word, and the hub could be built for real. The pan-zoom hook that once drove the mind map was promoted to a shared home — a one-line re-export shim left at the old path so nothing broke — the six biomes became inline-SVG components, and WorldMap stacked them in the planned order: sky, far ranges, the biome landmasses, foreground props, the interactive region hotspots, the easter-egg layer, the name plaques. Activating a region flies the camera to its framing and then navigates; returning from a page reverses the very same read. Under the spectacle sat the accessibility spine — an offscreen <nav> of six real links as the single source of truth, a roving tabindex, arrow keys walking the regions in geographic order, Escape resetting the zoom.

Prompt“Finish phase 3 — just commit code directly.”

The map came up clean on the first drive: six hotspots correctly labelled, the screen-reader nav mirroring every route, the scene flipping day to night on command. The branch stayed green — lint clean, eighty-nine tests passing with twenty new ones guarding the map's geometry — and the entry bundle didn't move a byte: the whole map, all six biomes and the pan-zoom hook landed in a lazy chunk that only a visitor actually stepping into the world ever loads. Four phases down, and the world finally had its map.

Prompt“Start with phase 4, 5, 6 simultaneously.”

Three phases built in one sitting, each leaning on the last. Phase 4 put the arrival in front of the map: the homepage globe, reused in a new orbit mode with its chrome stripped and a slow auto-rotate, gained an imperative handle so the dive could plunge its camera; CloudBloom and DiveSequence became one GSAP timeline — plunge, whiteout, clouds parting over a map that pulls out from its centre — and AtlasHome turned into the orbit → dive → map state machine, the intro remembered forever after, the whole sequence lazy so GSAP loads only for a visitor who actually dives. Phase 5 raised the first interior: RegionShell wraps a page in a themed biome band — skip link, shared meta, breadcrumb, a real <main> — while leaving the page's own content untouched, and PageShell became the single switch between the Atlas and Classic shells. The Book Forest went first; arriving stamps the region and the RewardToaster pops it with the reused confetti. Phase 6 added the game itself — a pure, unit-tested quest engine over declarative quests and time / return achievements, the passport grown to show them filling, and five easter eggs tucked into the map art. The branch stayed green: lint clean, a hundred-and-one tests with twelve new ones pinning the engine, the entry bundle still inside its budget.

Prompt“Start with phase 7, 8, 9, 10.”

Then the page waves — every remaining route rebuilt as its region's interior, four phases in a row. Wave 2 opened the Coastal Road and the Sahyadri Ridge; wave 3 the Scriptorium trio of blogs, micro-posts and challenges; wave 4 the Workshop of projects and résumé; wave 5 the Hometown Square, carrying the Observatory and the Gallery Trail at their same URLs. Each page changed by exactly one import and one wrapper line, its content identical inside either shell — and each wave brought its own collector quest, so the passport kept growing: Roadrunner, Summiteer, Wordsmith, Tinkerer.

Prompt“Finish till phase 10 and verify.”

The last two waves landed as their own green commits — and then, for the first time, the world was driven in a live browser. A port collision had been quietly serving a blank page; a dedicated preview pinned to a fixed port put it right, and the whole arrival finally played through end to end: the orbit's counting teasers, Enter into the dive, the map waking at night with its windows lit and stars out, a deep-linked Book Forest interior with its breadcrumb and its Return-to-Map, and the passport filling with dated stamps and live quest progress. No console errors, ten phases down — the final art, the audio, the guide and the flip still ahead.

Prompt“Start with phase 11, 12 and 13.”

Three more phases in one sitting, each a different kind of craft. Phase 11 — art & perf grew the five placeholder biomes up to the Book Forest benchmark: a crenellated hill-fort and a switchback summit trail on the Ridge; a START gantry, a medal monument and the striped lighthouse on the Coast; a writing quill and a stamping press at the Scriptorium; two meshing counter-rotating gears and a swinging crane in the Workshop; bunting and a pulsing fountain on the Square. A foreground NearLayer of waves and bushes went in, and a gsap.quickTo parallax where the sky and far ranges lag the camera while the near props lead it. A latent bug fell out along the way — the region header bands reuse the biome art but had never loaded the map's stylesheet, so their lanterns and beams burned at full daylight; the day/night switches were lifted into a shared file the art itself imports, and the headers healed. Phase 12 — audio added a hand-rolled WebAudio manager, dynamically imported the first time a visitor turns sound on (that click is the autoplay unlock), cross-fading a per-region ambient bed as you move — and every one of the seven beds and the SFX sprite was procedurally synthesised from filtered noise and sine partials, so the repo owns its audio outright, licence-clean by construction and loading nothing until asked. Phase 13 — the guide drew a flat-vector mini Sanket — red pheta, moustache, cream bandi over a dark kurta — who speaks one line at a time; a live test caught him greeting visitors over the orbit globe before the map had even appeared, so he was gated to wait until the hub. With him in place, react-joyride was retired entirely — its 92 KB chunk gone, the entry bundle a touch lighter than before it ever arrived.

Prompt“Add links for other pages in the map and add suitable icons for all.”

The compass had only ever offered the six region landings — the other ten pages, from Challenges and the Micro Blog to the Résumé, the Observatory and the Gallery Trail, couldn't be reached from the map at all. So the region registry became the single source of truth for navigation: each region gained an ordered list of its pages, and the compass grew into a full directory grouped by region, every entry carrying a fitting Material Symbols icon. A small gift fell out of grouping by data-region — each group inherits its region's accent colour, so the whole menu reads colour-coded without a line of extra styling.

Prompt“Fix menu bar CSS views. Rename these pages everywhere: Coastal Road → Marathons, Sahyadri Ridge → Treks, Workshop → Projects.”

Two requests, arriving with a screenshot. The view-switcher tabs on the Sports and Treks interiors had collapsed into run-together text: the atlas's scoped reset — written to give bare chrome sane defaults — was quietly out-specifying the Tailwind utilities on the imported page content and stripping the buttons' padding, background and colour. Wrapping the reset's element selectors in :where() dropped its weight below the utilities, and the tabs snapped back into proper pills, identical to the Classic shell. Alongside it came a naming decision: Coastal Road became Marathons, Sahyadri Ridge became Treks, and the Workshop became Projects — trading biome-poetry for plain labels on those three, while the Scriptorium, Book Forest and Hometown Square kept theirs. The rename rippled through the registry, the map plaques and screen-reader nav, the collector-quest copy and an easter-egg hint — and surfaced one last inconsistency: the passport had been reading its stamp names from the globe's own table rather than the atlas registry, so it still said “Creator” where the map now said “Projects.” Pointed at the registry, it finally read in step with the rest of the world.

Prompt“Start with phase 14 and finish phase 15.”

The last two phases were the flip. Phase 14 — cleanup finally deleted the decade-old vendored theme outright: twenty-eight SCSS partials and the sass dependency gone, the entry stylesheet dropping from 164 KB to 102 KB (25.9 → 15.9 KB gzipped), with a small scoped classic.css left in its place for the escape-hatch shell. A quiet bug fell out with it — rounded-full had been overridden to 0.75rem, which only looks round on short elements and had silently squared off every avatar, icon button and tag pill; it was restored to a true 9999px. The changelog's own headings, force-uppercased by a legacy global, healed the moment the theme left. Phase 15 — the flip set ATLAS_LIVE = true: the Atlas became the site's front door at /, the old /world preview began redirecting home (a 301 at the edge), and the deliberately silent changelog landed its single comprehensive v11.0.0 entry, telling the whole sixteen-phase story at once.

Two questions were put before the flip, and both answers steered it:

NamingKeep the plain names. The Classic nav stays “Mind Map” and “Interactive Me”; the Atlas keeps its “Observatory” and “Gallery Trail” flavour only internally — matching the earlier Marathons / Treks / Projects rename rather than reversing it.
RolloutPush the branch, don't merge. The two phases were committed and the branch pushed so the Cloudflare preview could rebuild with the Atlas live — but main was left untouched, the final merge kept as Sanket's own call after reviewing the preview.

One craft note: because the cleanup and the flip both touch App.js, the two were staged apart — the theme-removal slice committed first, the routing swap with the flip — so each commit compiles on its own rather than only as a pair. Beyond the flip lay one small mobile fix that put all six worlds in a single window — told next.

Field note

The story of a single fix

How v11.1.0 — the change that put all six worlds in one window on a phone — actually happened, prompts and all.

Prompt“Mobile user should be able to see all worlds in single window.”

The map is drawn wide — a 2000×1250 landscape with six biomes spread corner to corner — but a phone is tall and narrow. The hub had been resting zoomed onto the hometown square, so a phone only ever showed the centre; the other five worlds were a drag away. The diagnosis: the map's SVG was set to fill-and-crop (slice), which on a portrait screen quietly clips the left and right regions off-frame.

The fix was two moves: rest the camera on the whole map on every viewport, and on phones only, switch the SVG to fit (meet) so nothing is cropped — all six worlds in one window. A twist surfaced mid-investigation: a second Claude Code session was already working in the same repository and had landed most of that change moments earlier. This session reconciled the two — repairing a formatting pass that had tripped the project's lint rules, and keeping the tests green.

The first attempt anchored the fitted map to the bottom, which left a wall of empty sky above it. Feedback arrived as a screenshot and a second sentence:

Prompt“Fix only mobile view to put scene in the middle of screen. No change for desktop view.”

One character did it — the vertical alignment moved from bottom (xMidYMax) to centre (xMidYMid), with the desktop's immersive full-bleed slice untouched. The change shipped as v11.1.0 alongside an on-screen zoom cluster for touch users, was committed, pushed, and opened as a pull request. Then this dossier — its colours borrowed from the Atlas's own design tokens — was written in the same conversation.