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 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.
| Route | Who does it | Budget | What you get |
|---|---|---|---|
| Script tag | Any CMS editor | 5 minutes | Paste two lines into a Custom HTML block. The component registers itself and renders your mountain. |
| Web component attributes | Front-end developer | An hour | Configure <xyzski-mountain> with resort, token, theme, interactive, and expanded attributes to fit your layout. |
| JS API + events | Product engineer | A day | Subscribe 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.
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)