906 Dashboard · Embeddable widgets

Live Upper Peninsula conditions, on your site

Four widgets, rendered and maintained by 906 Dashboard from NOAA and National Weather Service data. One line of HTML on your page; nothing to install, nothing to update, and nothing to keep accurate yourself.

⛷️ Snow report

Base depth, what fell overnight, and what is forecast at the hill. For lodging, rentals and anyone whose winter guests ask "is there snow yet".

Install the ski widget →

🌌 Aurora forecast

Whether tonight is worth going out, from NOAA space-weather data and NWS cloud cover. Honest on a quiet night.

Install the aurora widget →

🎯 Legal shooting hours

A live countdown to the close of legal light for any UP county, with what is in season today.

Install the hunting widget →

🫎 Weather buddy

A moose or a porch goose who dresses for today's weather, with the temperature and local time. The friendliest thing on your homepage.

Install the weather buddy →

How installing works

Every widget installs the same way. Paste the placeholder where the widget should appear and the loader script anywhere on the page — it finds the placeholder itself, and one script handles any number of widgets.

<div data-906-widget="ski" data-client="your-id"></div>
<script async src="https://widgets.906dashboard.com/widget.js"></script>

Your client id carries your brand colours, your default location and your preferred size, so the snippet above is usually the whole job. The per-widget sections below list the attributes worth overriding.

Your domain has to be allowlisted first. Embedding is gated by a frame-ancestors header on our side. Until your hostname is on that list the widget renders as blank space — send us the address and it is a one-line change. Include any staging or preview host too: frame-ancestors applies to every frame in the chain, so a CMS page-builder preview that wraps your page needs listing as well as the live site.

If your CMS strips script tags

Some templates escape <script> inside a content block. If the snippet renders as visible text instead of a widget, use an iframe instead — same widget, no script tag. Swap ski.html for aurora.html, hunting.html or buddy.html as needed.

One trade-off worth knowing: without the script there is nothing to report the widget's height back to your page, so this version is a fixed-size card rather than the automatic band-on-desktop, card-on-mobile. It is pinned to size=card deliberately — a card is the size that works at every width.

<iframe src="https://widgets.906dashboard.com/ski.html?client=your-id&size=card"
        title="Snow report — 906 Dashboard"
        width="100%" height="400" loading="lazy"
        referrerpolicy="strict-origin-when-cross-origin"
        style="border:0;max-width:360px"></iframe>

⛷️ Snow report

The headline is the base depth, because "is there anything to ski" is what decides whether somebody makes the drive. Below it: what fell in the last 24 hours, what is forecast over the next three days, and the temperature and wind at the hill.

Two scales, and the widget says which is which. Base depth and observed snowfall come from the nearest National Weather Service climate station — Michigan has only three, so that number is regional and the widget names the station under it. The three-day forecast is the hill's own. We label it rather than implying a summit reading, because a widget that sends someone up a bare mountain is worse than no widget.
<div data-906-widget="ski" data-client="your-id"></div>
<script async src="https://widgets.906dashboard.com/widget.js"></script>
AttributeValuesWhat it does
data-region up nlp up is the Upper Peninsula, reported against Marquette. nlp is northern Lower Michigan, reported against Gaylord.
data-area a hill or trail id Pins the forecast to one ski area — ten downhill and seven Nordic systems per region. Omit it for the regional roll-up. Ask us for the id for your hill; it is usually the obvious short name.
data-size auto card strip panel See Sizes below. auto suits most pages.
In a sidebar · card
Northern Lower · Boyne Mountain

Full width

Out of ski season the widget says CLOSED rather than reporting a truthful zero that reads as bad news about a mountain nobody is trying to ski. It returns on its own in November.

🌌 Aurora forecast

Whether tonight is worth going out, combining NOAA's space-weather forecast with NWS cloud cover for a specific town. A pinned widget reports that town's own sky and names the viewing spot people should drive to.

<div data-906-widget="aurora" data-client="your-id"></div>
<script async src="https://widgets.906dashboard.com/widget.js"></script>
AttributeValuesWhat it does
data-spot mqt cph wfp mun irw grm pcm all Pin the forecast to one town, or all for the whole UP. Telling a guest already in Marquette that Copper Harbor is clearer does them no good, so a pinned widget never does it.
data-size auto card strip panel See Sizes below.

Locations

CodeForecast forViewing spot named
mqtMarquettePresque Isle Park
cphCopper HarborBrockway Mountain
wfpWhitefish PointWhitefish Point
munMunisingSand Point
irwIronwoodLittle Girl's Point
grmGrand MaraisGrand Marais Harbor
pcmPorcupine MountainsUnion Bay

If your own pages already recommend viewing locations, we can point the widget at yours instead, or drop the row entirely so it does not offer a second opinion beside your copy.

Pinned to a town · card
Regional roll-up · 906 default

On a quiet night it says QUIET, in grey, honestly. Aurora activity is spiky — long stretches of nothing, then an enormous night. A widget that manufactured excitement on a Kp 1 evening would send your guests out for nothing.

🎯 Legal shooting hours

The question a hunter in the woods actually has: can I shoot right now, and for how long? A live countdown to the close of legal light for any of the fifteen UP counties, with what is in season today and current field conditions.

<div data-906-widget="hunting" data-client="your-id"></div>
<script async src="https://widgets.906dashboard.com/widget.js"></script>
AttributeValuesWhat it does
data-county any of the fifteen UP counties Which county's legal light to count down. Four UP counties sit in Central Time and the widget handles that for you.
data-size auto card strip panel See Sizes below.
In a sidebar · card
Another county · Gogebic
It is a convenience, not an authority. Opening times round up and closing times round down, so the window shown is never wider than the real one — but the DNR digest governs, and the widget says so.

🫎 Weather buddy

A character, not a data table. The moose is the Upper Peninsula's and the porch goose is northern Lower Michigan's. They put on a winter coat when it snows, a raincoat when it rains, flannel when it is brisk and sunglasses when it is not, over a scene that turns to night after sunset. Beside them: the live temperature, the sky, and the local time.

<div data-906-widget="buddy" data-client="your-id" data-character="moose"></div>
<script async src="https://widgets.906dashboard.com/widget.js"></script>
AttributeValuesWhat it does
data-character moose goose Which buddy, and which towns they know. The moose covers ten UP towns from Copper Harbor to Menominee; the goose covers twelve across northern Lower, from Traverse City to Mackinac Island.
data-city a town, e.g. marquette traversecity Pins the buddy to one town. Left out, visitors get a dropdown and the widget remembers their pick.
data-picker 0 Hides the dropdown and shows the town's name instead. For a lodge that only cares about its own weather.
data-size auto card panel card is the compact scene for a sidebar; panel is the full one. auto picks on the width it is given. There is no strip — a character does not fit in a band.
The moose · Upper Peninsula
The goose · northern Lower

Pinned to one town · no dropdown

The buddy reads the National Weather Service directly, from the visitor's browser, so there is no data feed of ours to go down. If NWS has a bad minute the buddy keeps showing the last reading for up to three hours, then says it is unavailable rather than dressing for weather that has passed.

Sizes

ValueShapeUse it when
autoBand at 700 px and wider, card belowThe usual choice. It switches on the width the widget is actually given, so a narrow sidebar on a desktop gets the card too.
cardFixed card, max 360 pxA sidebar, or anywhere you want a predictable block.
stripFull-width bandUnder a page header, or across the top of a landing page.
panelTwo-column cardA wide content column where a band would look stretched.

When a feed goes down

This sits on your homepage, so a dead upstream should be our problem rather than your phone call. Three tiers, in order: live data; then the last good reading that visitor saw, stamped Last known with a timestamp; then a complete, correctly-branded component saying conditions are unavailable. Never a broken box or an empty frame. It recovers on its own.

Checking it worked

Load your page and confirm:

If you see an empty space where the widget should be, your domain almost certainly is not on the allowlist yet — the browser console will say so explicitly, naming frame-ancestors. The question we will ask is not "what is your domain" but what is in the address bar when you see it fail, because a CMS preview answers that differently from the live page.