Skip to Content

🪐 Companion Atlas

Explore a life as a place and a timeline. Companion Atlas turns located Companion Memory events into a navigable globe, then lets you collect moments into a scrapbook and play them as a journey on a desktop, phone, or WebXR headset.

Companion Atlas desktop overview with the demo globe, selected memory inspector, and time machine
The desktop shell: globe, selected-memory inspector, and the time machine along the bottom, on the bundled Pacific Crossing demo story.

There is no hosted Atlas and no Hub App Store listing yet. The viewer runs from source, and the source repository is private, so today this page is a reference for the Companion Intelligence team and early testers. A Hub manifest for installing Atlas as a custom app exists in the repository, but Atlas is not in the store. The planned public address, atlas.ci.computer, does not resolve yet. Atlas is licensed under the PolyForm Noncommercial License 1.0.0.

Companion Atlas is a pre-release viewer. The screenshots on this page were captured on 2026-09-02 from the bundled Pacific Crossing, Spring 2026 demo story. They contain demo locations and public imagery, not anyone’s private memory archive. Live-memory and physical-device validation are called out separately below.

Product shape

Atlas has one story model and three presentation surfaces:

SurfaceBest forCurrent entry point
Desktop browserReviewing a whole archive, searching, curating, and saving journeysCesium globe with inspector and time machine
Mobile browserQuick place review, collection, and sharingResponsive Cesium shell at a 390 × 844 reference viewport
WebXRSpatial exploration and embodied time travelThree.js globe with WebXR controls and a Quest 3 emulator

The viewer can load a published companion.atlas/story@1 document or query a connected Companion Memory for located memories. A story is the portable, shareable unit; a live Memory connection is the private archive behind it.

Presentation surfaces
3
Desktop browser, mobile browser, and WebXR, over one story model.
from Product shape
Located memories per page
100
The live GraphQL query pages Companion Memory results 100 at a time.
from Connect to local Companion Memory
Located-memory cap
2,000
The client stops here and only warns in the console when the server reports more.
from Known gaps

Both sources feed the same story model, and the scrapbook writes back out as a story:

Open the viewer

Safe demo story

Run the viewer from a source checkout (npm install, then npm run dev; it serves on port 4174 by default) and open the bundled story with the URL below. The empty memory parameter intentionally disables any build-time Memory connection so the result is safe to share:

http://127.0.0.1:4174/?memory=&story=/stories/sample-pacific-journey.json&renderer=cesium

The same story is available over a Tailscale hostname when the dev server is bound to the tailnet. Replace only the host in the URL; do not add credentials to a published link.

Connect to local Companion Memory

Use a same-origin dev proxy when Companion Memory is running locally:

http://127.0.0.1:4174/?memory=/memory&renderer=cesium

The viewer sends a located-memory GraphQL query through /memory, pages up to 100 results at a time, restores chronological order, and maps the response to the story model. The development proxy target is configured with VITE_DEV_MEMORY_PROXY, for example http://localhost:5173/api when the Companion Memory web app is the local gateway.

For a direct Companion Memory origin, use ?memory=<memory-origin> and provide a session cookie, ?token=<jwt>, or ?apiKey=<key> as appropriate for the local environment. Tokens and API keys must stay in local environment configuration or a private session: the Share control removes memory, token, and apiKey from the copied URL. When a live Memory request is unauthorized, the viewer now offers an in-viewer sign-in/retry path. It exchanges the server’s CSRF-protected credentials for a short-lived bearer kept in the current browser tab; it never adds credentials to a share URL. Portal OIDC redirect login remains a separate integration item.

WebXR emulator

The development-only Quest 3 emulator makes the immersive path testable in a normal browser:

http://127.0.0.1:4174/?memory=&story=/stories/sample-pacific-journey.json&renderer=xr&xremu=quest3

?xremu=quest2, ?xremu=questPro, and ?xremu=generic are also accepted. The emulator is never installed in production and is skipped when a real immersive device is available.

Function inventory

Data and navigation

FunctionHow to use itWhat it doesEvidence
Load a demo or published storyUse ?story=<url>; omit it for the bundled sampleLoads a portable story without a Memory accountDesktop overview
Load live located memoriesUse ?memory=<server> or the local /memory proxyFetches located events and converts them into a time-ordered globeLive data is intentionally not published in this screenshot set
Globe homeClick the Globe control in the left railReturns to the all-memories framingDesktop fit all
Fit all placesClick the pin / Fit all places controlPauses playback and frames every located memoryDesktop fit all
Select a memoryClick a globe pin or a scrapbook frameFocuses the memory, moves the clock to its instant, and flies to its locationDesktop overview
Inspect a placeToggle Named places, then select a place markerShows place identity and, for live data, the place’s visit historyDesktop named places
Fly hereScroll the inspector and choose Fly hereReframes the camera around the selected memoryMobile Fly here
Around this timeScroll the inspector to the related-memory cardsMoves to a nearby memory from the same storyMobile Fly here

Search and time

FunctionHow to use itWhat it doesEvidence
Search memoriesClick Search or press ⌘K / Ctrl+KOpens the command palette for titles, places, people, and free-text matchingDesktop search
Search result selectionChoose a result in the paletteFocuses the result and closes the paletteMobile search
Previous / Next memoryUse the two step buttons in the time barSelects the memory immediately before or after the current playheadDesktop time machine
Play / PauseClick the centre time-bar buttonPlays the story through its timeline, or pauses it at the current instantDesktop time machine
Scrub the archiveDrag or tap the histogram trackMoves the clock and its place/time readout; a grab stops playbackMobile time machine
Keyboard time controlFocus the scrubber, then use arrows, Page Up/Down, Home, or EndSupports fine steps, larger jumps, and timeline bounds without a mouseImplemented and covered by automated tests; not a separate published screenshot
Day/night lightingUse the sun button in the time bar or the Layers popoverApplies the real solar terminator to the globe for the selected momentDesktop day/night

Map and media

FunctionHow to use itWhat it doesEvidence
Basemap selectionOpen Map layers, then choose a basemapSwitches between Natural Earth, Satellite, Streets, Terrain, Dark, and Mapbox optionsDesktop basemap
3D buildingsOpen Map layers and choose 3D buildingsUses Google Photorealistic 3D Tiles when a Google key is configured; otherwise the disabled control explains the prerequisiteDesktop map layers
Street View previewSelect a located memoryShows Google Street View of the place when available, clearly credited as place imagery rather than the user’s photoDesktop overview
User mediaSelect a memory with a loadable photoOpens the full media lightbox; Escape closes itDesktop lightbox, Mobile lightbox
No-media stateSelect a memory without a photo or Street View coverageStates that no panorama is available instead of showing a misleading empty frameCovered in the component tests; not represented by a public demo screenshot

Scrapbook and sharing

FunctionHow to use itWhat it doesEvidence
CollectChoose Collect in the memory inspectorAdds the memory to the story-scoped scrapbook and updates its badgeMobile collect
Remove / ClearOpen Scrapbook and use the row ✕ or ClearRemoves one entry or resets the draftDesktop scrapbook
Name a journeyType in Name this journey…Gives the draft a human-readable titleDesktop scrapbook
Set visibilityChoose Private, Household, or PublicStores the intended sharing level for a save or downloaded storyDesktop scrapbook
Curate with CompanionCollect at least one memory, then choose Curate with CompanionBuilds a narrated journey and titles it from the selected momentsDesktop curated journey
Play journeyChoose Play journeyReplaces the base story temporarily with the scrapbook journey and resumes playbackDesktop curated journey
Save to MemoryConnect a live Memory source, then choose Save to MemoryWrites an atlas-story event back to Companion Memory with the selected sharing level; disabled in the offline demoDisabled safely in Desktop scrapbook
Download storyChoose Download .story.jsonDownloads a portable story document without requiring a server connectionDesktop scrapbook
Copy linkClick the share iconCopies the current view while stripping private memory and bearer token parametersDesktop share link, Mobile share link

People and immersive controls

FunctionHow to use itWhat it doesEvidence
People facetChoose People in the rail / bottom navigationGroups live-memory events by participant and can play a person’s journey; the bundled demo has no peopleDesktop people, Mobile people
Enter VR / Enter ARChoose the corresponding control in the XR rendererStarts an immersive session when a device or emulator supports itWebXR baseline, WebXR entered
Turn and zoom the globeDesktop XR: drag and scroll; headset: grab with a grip and move both hands to zoomProvides a flat-window fallback plus hand-based locomotion in immersive modeWebXR entered
Wrist memory menuLook toward the off hand in VRSurfaces the memory list and lets the user travel to a memory that is not currently in viewImplemented in the XR scene; physical-headset verification remains open
Sky time scrubIn VR, reach into the sky and pull the triggerTurns the sky into a time axis; the sun, moon, readout, and visible pin window follow itImplemented in the XR scene; needs headset input validation
Comfort controlsUse the Comfort panel in XRToggles comfort tunnel, steady stars, snap turn, and level horizon; settings persist locallyWebXR baseline
XR controller ray / grabUse the emulated controller or a physical controllerTests the spatial input path and world grabbing without relying on page buttonsWebXR controller

Platform guidance

Desktop

The desktop shell is the richest review surface: it keeps the rail, top-bar actions, inspector, globe, and time machine visible together. Use it for archive-wide review, curation, and diagnosing a live Companion Memory connection.

Mobile

The reference capture is 390 × 844. The responsive shell keeps navigation in a bottom rail and lets the inspector scroll independently. The initial viewport prioritizes the selected memory; Fly here and Collect are below the fold on a phone, so the location-action screenshot intentionally captures the scrolled state. The compact 320px layout has no horizontal overflow, but the mobile flow still needs iOS Safari, Android Chrome, and soft-keyboard validation before release sign-off.

WebXR

The emulator verifies that the XR renderer mounts, presents a globe and memory cards, exposes VR/AR entry points, and renders a controller. It is an emulator smoke test, not evidence of comfort, tracking, passthrough, or text legibility on a physical headset. Validate Quest 3, a WebXR-capable desktop browser, and at least one browser with no WebXR support before release.

Screenshots

Every image below is a fresh demo-data capture from the Codex browser on 2026-09-02. Desktop and mobile images are 1280 × 720 and 390 × 844 respectively. The XR images are 1280 × 720 and use ?xremu=quest3.

Desktop

Companion Atlas desktop overview with the demo globe, selected memory inspector, and time machine
Desktop overview: globe, selected-memory inspector, and time machine.
Companion Atlas desktop search palette showing an Equatorial Corridor result
Search palette (⌘K / Ctrl+K) matching titles, places, people, and free text.
Companion Atlas desktop Map layers popover with basemaps, disabled 3D buildings, and lighting
Map layers popover: basemaps, 3D buildings (disabled until a Google key is configured), and lighting.
Companion Atlas desktop time machine focused on a previous demo memory
Time machine focused on a previous memory via the Previous / Next step buttons.
Companion Atlas desktop globe with day and night lighting enabled
Day/night lighting applies the real solar terminator for the selected moment.
Companion Atlas desktop People panel empty state
People panel empty state — the bundled demo has no people.
Companion Atlas desktop empty Scrapbook drawer
Scrapbook drawer, empty.
Companion Atlas desktop Scrapbook drawer with two collected memories
Scrapbook with two collected memories.
Companion Atlas desktop Scrapbook configured with a title and Household visibility
Scrapbook named and set to Household visibility.
Companion Atlas desktop curated journey shell with collected memories
Curate with Companion builds a narrated journey from the collected moments.
Companion Atlas desktop state after copying a sanitized share link
After Copy link: the copied URL has its memory and token parameters stripped.
Companion Atlas desktop with the Named places layer enabled
Named places layer enabled.
Companion Atlas desktop full-media lightbox with a public demo road image
Full-media lightbox; Escape closes it.
Companion Atlas desktop globe framed to fit all demo places
Fit all places frames every located memory.
Companion Atlas desktop basemap switch showing Natural Earth selected
Basemap switch with Natural Earth selected.

Mobile

Companion Atlas mobile overview at 390 by 844 pixels
Mobile overview at the 390 × 844 reference viewport.
Companion Atlas mobile search palette showing a Strait Relay result
Mobile search palette; choosing a result focuses it and closes the palette.
Companion Atlas mobile Map layers panel
Mobile Map layers panel.
Companion Atlas mobile People panel empty state
Mobile People panel empty state.
Companion Atlas mobile empty Scrapbook drawer
Mobile Scrapbook drawer, empty.
Companion Atlas mobile time machine focused on the Equatorial Corridor
Mobile time machine: drag or tap the histogram track to scrub.
Companion Atlas mobile full-media lightbox with a public demo road image
Mobile full-media lightbox.
Companion Atlas mobile inspector scrolled to the Fly here and Collect actions
Inspector scrolled to Fly here and Collect — below the fold on a phone.
Companion Atlas mobile inspector showing a memory in the Collected state
A memory in the Collected state.
Companion Atlas mobile with Named places enabled
Named places enabled on mobile.
Companion Atlas mobile state after copying a sanitized share link
After copying a sanitized share link on mobile.

WebXR

Companion Atlas WebXR emulator baseline with globe, memory cards, comfort panel, and Enter VR and Enter AR controls
WebXR emulator baseline: globe, memory cards, comfort panel, and the Enter VR / Enter AR controls.
Companion Atlas WebXR emulator after entering an immersive VR session
After entering an immersive VR session in the emulator.
Companion Atlas WebXR emulator showing a Quest-style controller beside the globe
A Quest-style controller rendered beside the globe.

Known gaps and release plan

P0 — make live data trustworthy

  • Add refresh/logout and expiry handling around the current in-viewer sign-in bridge. The viewer no longer depends on a build-time bearer for an initial recovery, but its tab-scoped access token is still short-lived.
  • Surface the Companion Memory result count and pagination state in the UI. The client currently stops at a hard cap of 2,000 located memories and only warns in the console when the server reports more.
  • Add explicit live connection, expired-session, CORS, and empty-located-memory states to the release checklist and end-to-end suite.

P1 — remove interaction surprises

  • Keep the primary location actions reachable without guesswork on 320 × 568 and 390 × 844 viewports; test the inspector with the keyboard visible.
  • Make date search match its promise. The current palette handles text and numeric year matching more reliably than natural-language dates.
  • Keep the visible success/failure status for Copy link and cover it with a browser-level accessibility assertion in the release suite.
  • Either implement the advertised gallery route or remove view=gallery from links and documentation until it has a distinct view.

P1 — validate real devices and accessibility

  • Run the same scenarios on iOS Safari, Android Chrome, a desktop browser without WebXR, and a physical Quest 3. Include screen-reader, keyboard-only, reduced-motion, contrast, focus-order, and touch-target checks.
  • Measure Cesium/XR bundle size and first interactive render on a mid-range phone; the current production build emits large-chunk warnings.
  • Exercise media absence, weather availability, place history, live People groups, save success, save failure, and offline/reconnect transitions with controlled fixtures.

P2 — make the story loop legible

  • Add analytics or local diagnostics for load source, search completion, collection, curation, save, and download outcomes without collecting private memory content.
  • Document story-schema versioning, supported media URLs, Google imagery attribution, and the difference between a user’s media and Street View.
  • Add a repeatable screenshot matrix to release CI so desktop, mobile, and XR regressions are caught before publishing docs.

Verification evidence

The current source-level and runtime checks for this pass were:

  • Viewer tests: 17 files, 198 passed.
  • Story-schema tests: 7 files, 36 passed.
  • Server tests: 5 files, 22 passed.
  • Viewer typecheck, viewer build, root build, and server build passed.
  • Visual suite: 16 of 16 passed.
  • Share-link safety smoke: a dummy apiKey parameter was removed from the copied URL in the Codex browser.
  • git diff --check passed.
  • Codex-browser smoke: authenticated live sign-in and reload recovery, desktop demo flow, 390 × 844 and compact 320px mobile flows, and Quest 3 WebXR emulator baseline / VR / controller / flat drag-and-zoom states were exercised.

These results establish a documented demo path, not release sign-off for live private data or physical hardware. Keep the Companion Atlas source repository (private) and the Companion Memory server documentation aligned as the integration contract evolves.

Last updated on