Skip to content
xyzski

Product

One embed.
Both of your teams.

Marketing gets a hero that guests fly through. Engineering gets a web component that installs in minutes and degrades gracefully. Same two lines of HTML.

<script async src="https://www.xyzski.com/embed/v1.js"></script>
<xyzski-mountain resort="sunlight" token="demo"></xyzski-mountain>

69 runs liveFor your marketing team

The trail map becomes the destination.

Guests explore, not scroll

Every run is hoverable with its name, difficulty, length, and drop. The mountain answers “what would I ski here?” before a guest ever calls.

Engagement you can count

The embed reports views, expands, and point-of-interest clicks to your dashboard — first-party, sampled, no personal data collected.

Seasonal refreshes included

New lift? Rerouted run? We re-bake your bundle from updated map data on your tier's schedule — no code changes on your site.

For your web team

Three ways in. Pick your difficulty.

RouteWho does itBudgetWhat you get
Script tagAny CMS editor5 minutesPaste two lines into a Custom HTML block. The component registers itself and renders your mountain.
Web component attributesFront-end developerAn hourConfigure <xyzski-mountain> with resort, token, theme, interactive, and expanded attributes to fit your layout.
JS API + eventsProduct engineerA daySubscribe to the viewer event stream — loaded, hover, select, poi — and drive your own UI: run finders, lift status, custom camera flights.

~490 KB demo bundlePerformance

Lighter than your current hero image.

~490KBwhole demo bundle (Sunlight)
~100KBdemo first-paint tier
60fpson hardware GL

Bundles scale with the mountain: Sunlight bakes to ~490 KB, a resort the size of Telluride to ~1.7 MB — tier-loaded, so first paint stays light either way.

Tiered terrain loading

A 256-px heightfield paints first (~100 KB with trails); the 1024-px tier streams in after the camera settles. Never downgraded, never re-fetched.

Renders only when seen

The frame loop is gated by viewport intersection and tab visibility. Offscreen, the embed costs your page nothing.

Software-GPU fallback

We detect SwiftShader-class renderers and fork to a lite quality tier with capped resolution. Old office laptops still fly.

Survives context loss

If the browser drops the WebGL context, the embed shows a poster frame and restores itself — no blank hole in your homepage.

Accessibility

Works for every guest.

  • Keyboard support — open the explorer, toggle layers, and close with Escape without a pointer; focus stays trapped inside the dialog while it's open. Camera orbit is pointer-driven today; keyboard orbit presets are on the roadmap.
  • prefers-reduced-motion renders a static, fully-drawn model: no camera drift, no draw-in animation.
  • Hovered runs are announced to screen readers; the canvas itself stays out of the accessibility tree.

Licensing handled

Compliant by construction.

Trail data is OpenStreetMap (ODbL); terrain is USGS 3DEP (public domain) or Copernicus DEM; forest cover is ESA WorldCover (CC BY 4.0). The embed renders the required attribution chip automatically — your legal team never has to think about it.

Map data © OpenStreetMap contributors (ODbL)

See it running on your mountain.