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 live — For 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 into your customer portal — first-party, no personal data collected, next to your invoices and billing.

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 bundle — Performance

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.