The mountain itself
Lidar elevation and surveyed geometry, built into real terrain on your device as the page opens. Every run, lift, building and tree stands where it stands in the ground truth.

Snowpack rebuilds the mountain you are standing on from its own survey, and put the day's weather, the avalanche danger and the ski patrol on it. In a browser. Before you get off the lift.
Lidar elevation and surveyed geometry, built into real terrain on your device as the page opens. Every run, lift, building and tree stands where it stands in the ground truth.
Live snow and weather read band by band up the hill, with the hour by hour ahead, so the summit and the base are two different answers because they always were.
Avalanche danger by aspect and elevation, the ski patrol line for the mountain you are on, and an SOS that sends where you are. None of it is behind a price.

The app counts the day from your phone's own position fixes: runs, vertical, distance, top speed, and the time split between skiing, riding lifts and standing still. The calculation runs on the device. Position fixes stay on the device.
Each day's totals are added to a season ledger and kept: days out, mountains skied, runs, vertical, distance and top speed, for the current winter and every winter recorded before it. The season boundary is 1 August, so a January day is counted in the winter it falls in.
The profile shows the career figures, the season figures, per-day charts for vertical, runs, top speed and time split, a cumulative chart against the previous season, a card per mountain with its own totals and dates, and the table of every recorded day.
You give it four measurements, and only because the model uses them. Your height and weight decide how much air you push, so a tuck is worth what a tuck is worth for your body. Your ski or board length and its waist width decide the arc you carve. Pair a heart rate monitor and your pulse rides along with the day.
Every surface is built at load time from elevation data and surveyed geometry, in the browser, and is checked against surveyed summit elevations after it is built.
The shape of the mountain comes from a digital elevation model served as map tiles. Inside the United States the first request goes to airborne lidar, the national laser survey flown over the country, at a nominal 3 feet. Outside it, and anywhere that survey has not flown, the chain falls back to a global elevation survey at about 100 feet.
The chain is declared in one file that both the browser and the tile route read, so the resolution the app asks for is always one the route serves. The source that built the terrain in front of you is named on screen with its nominal resolution.
The heightfield is meshed at 320 segments a side, about 205,000 triangles, and the mesh density drops on a device that misses the frame budget. Terrain quads run 62 to 203 feet, median 126 feet.
Runs, lifts, buildings, roads, forest stands, water, car parks, peaks and named places come from open mapping data, baked once per mountain and shipped with the app so the mountain loads with no network round trip.
The survey radius is 3.7 miles, which in a shared canyon reaches neighbouring areas. Runs, lifts and station markers are clipped to the resort's own winter sports permit boundary plus an 820 foot margin for access runs. At Solitude that removes 483 runs belonging to Brighton and Park City. The clip applies at every mountain whose boundary the survey carries.
Lifts are built as machines: towers at surveyed positions, rope height and sag from the machine type, drive and return terminals, a maze, carriers at the spacing that type runs, and cabin doors on a cam profile with a dwell time. Twelve lift types are modelled, from fixed-grip chairs to chondolas, T-bars, platters, rope tows and magic carpets.
The sky is computed from Rayleigh and Mie scattering for the sun angle at that place and minute, so horizon paling and sunset reddening follow from the air mass along the line of sight.
Snow is shaded from published measurements of snow albedo, grain size and subsurface scattering, held in a module a test can read without a GPU.
Sun and moon are placed at their computed altitude and azimuth for the coordinate and minute, at their true angular size, with the moon's phase. After dark the stars brighter than magnitude 2.0 and the naked-eye planets are drawn at their computed positions from J2000 elements.



Medium Airborne lidar at 3 ft, global 100 ft elevation elsewhereMesh 320 segments a side, about 205,000 trianglesCheck against surveyed summit elevations, after the build

A first-person camera at eye height on the same geometry the map is drawn from. Walk the base area, board a lift, ride it to the top station and ski down.
The first-person view puts a camera on the surveyed ground at eye height and gives it the same geometry the map and the overview are drawn from. There is no second world: the run you ski, the lift you board and the building you walk round are the survey's own runs, lifts and footprints. What follows is what that means in practice.



The record is an archive of what every instrument bound to the 62 mountains reported, kept at the hour it reported it. One row per mountain, per instrument, per hour. Both witnesses at a mountain are stored, including the hours they agree, because a disagreement between two instruments is only visible later if both sides of it were written down at the time.
Each row is the reading itself. It carries the instrument's own identifier and name, the network it belongs to, how often it reports, its distance from the mountain in miles and its height difference in feet, the role it holds there, the depth it read, the new snow in the last twenty four hours, the water content, the air temperature, the moment the instrument observed and the separate moment of the fetch. Two timestamps, because the difference between them is how stale a figure is, and a reader is entitled to see that rather than being shown one time and left to assume it is both.
Nothing is smoothed on the way in and nothing is filled. Where an hour holds no reading the record holds no row, and any page that draws from it has to render that absence as the gap it is rather than joining the two sides into a straight line. A reading that failed a quality check is not discarded either: the reason it failed is stored verbatim beside it, because a rejected reading and the grounds for rejecting it are together worth more to a future model than a silent hole.
Medium A database table, one row per mountain, instrument and hourKept every observation, at its own hourFilled neverRejected readings kept, with the reason
The snow tracker ranks all 62 mountains, across sixteen states and provinces, on five questions that are scored independently: new snow in the last twenty four hours, new snow in the last seven days, current base depth, expected snow in the next twenty four hours, and the season total to date. They are kept separate rather than folded into one index because they answer different decisions. A mountain that leads on overnight snow can sit in the middle of the base ranking, and a reader deciding where to drive tomorrow morning and a reader deciding where to buy a season pass are not asking the same thing.
Each ranking is rebuilt from the observation record rather than from a stored leaderboard, so a mountain's position is always a function of the readings that exist at the moment it is asked. A reading that arrives late changes the ranking the next time it is drawn; nothing is pinned.
Every figure carries its provenance. A reading an instrument reported is labelled measured and names the instrument and the hour; a figure the Snowpack engine produced is labelled Snowpack Instrument. The two are never mixed under one label and never averaged into each other. When this was written, most carried a measured figure and every one carried a Snowpack figure, and the page shows which is which on every row rather than presenting one number and hoping.
Medium Five rankings, rebuilt from the observation recordRanked 62 mountains, 17 states and provincesViews overnight, seven days, base, tomorrow, seasonLabel the instrument each figure came from
Every instrument bound to a mountain carries a score out of a hundred, computed from the observation record rather than assigned by reputation. Four things go into it: how often the instrument answers when it is asked, how fresh its answer is when it arrives, how far it stands from the skiing in miles, and how far above or below the runs it sits in feet. The last two matter as much as the first two. A station four miles away and two thousand feet below the terrain it is standing in for is a weaker witness than one on the hill, and the score is what makes that difference visible instead of leaving it buried in a station identifier.
The score exists so that weighting can be decided by evidence. An instrument that has been quiet for a fortnight should stop carrying a mountain's headline figure without a person having to notice and intervene, and a source that keeps missing should lose ground to one that does not. Scores are recomputed from the record, so they move as the instruments do.
Two things this does not yet claim, and it matters that the difference is stated rather than blurred. The score beside an individual instrument is about availability and standing: whether it answers, how quickly, and how well placed it is. Accuracy is scored against outcomes at the level of a source, one step above the single station, and that half is not yet drawn beside the station it belongs to. It is written down and it is being wired through; until it is, this page will not call an availability score an accuracy score.
Medium Availability and standing, per instrumentScored every instrument bound to a mountainBuilt from the record this site keepsOut of 100
A single snowfall figure for a mountain is an average over ground that does not behave uniformly. Wind arrives on a bearing, the ridge line stands across it, and the face turned into the storm does not receive what the sheltered face receives. Snow is lifted over the crest and deposited on the lee side while the windward face is scoured. The effect is large enough to decide where a skier should be on the day, and it is absent from a forecast that publishes one number per resort.
So the mountain is divided into eight aspects and three elevation bands, twenty-four cells, and each cell is given a factor: more than one where the storm loads it, less than one where it is stripped. The factors are constrained to conserve what actually fell, so this redistributes the snow across the mountain rather than inventing any. Measured on the live survey at Solitude: 2,209 terrain cells, all 24 rose cells populated, factors from 0.947 to 1.098 in a 35 mph west wind, and an area-weighted mean of 0.99999. The mountain's total does not move. Only where it lands does.
Medium A snowfall factor for each aspect and bandCells 8 aspects by 3 bandsConserved area-weighted mean 0.99999 at SolitudeDrawn from the survey's own geometry
Fifty-two in the United States, eleven in Canada. Each one is a baked survey on disk.

Avalanche danger by aspect and elevation, active weather warnings in full, ski patrol contact and posts, and a hold-to-send distress signal. Every item in this section is in the free version.
The reading is a grid of eight compass aspects by three elevation bands: below treeline, treeline and alpine. Each cell carries its own rating on the five-step North American Avalanche Danger Scale, in that scale's own colours. This is the standard operational display used by avalanche centres, ski patrol and guides.
Rings run from below treeline at the centre to alpine at the outside. Each wedge is one of the eight compass aspects. A north-east facing slope in the alpine band reads off one cell. The five ratings and their colours are set by the North American Avalanche Danger Scale.
The app also shows the bulletin's problem types, its valid period, and the forecast zone the reading was issued for.


A group is identified by a four-word phrase and nothing else. Both the encryption key and the name of the mailbox the group posts into are derived from that phrase on the device, by two different one-way operations, so the phrase itself never leaves the phone and the relay never learns it. Anyone holding the phrase is in the group; anyone who does not hold it cannot read a packet, cannot name the mailbox to look in, and cannot enumerate the groups that exist.
The phrase is drawn from a fixed list of 53 words, chosen to be readable aloud on a chairlift: four of them give about 7.9 million combinations. That is the right order for a group of friends sharing a run for an afternoon, and it is deliberately not a password. The security of a session rests on one claim only: the mailbox is unguessable for the two minutes anything is in it. Whether the phrase itself would hold against somebody working to break it is a separate question, and this design does not make that claim.
The phrase is stretched through 150,000 rounds of PBKDF2 with SHA-256 and a fixed salt into a 256 bit AES-GCM key, and separately hashed with SHA-256 into the mailbox name. Each packet is sealed with its own random initialisation vector. Neither the phrase nor the key is ever transmitted.
The relay stores ciphertext under a hashed name and can do nothing else with it: it cannot read a position, a name or an SOS flag, because it holds no key. It discards every blob after 120 seconds. A member who stops posting therefore leaves the roster in two minutes with no delete protocol, no account to close and nothing retained afterwards.
Membership is possession of the phrase. There are no accounts, no server-side roster, and no record that a particular group ever existed.
Sharing begins on a button press. While it is running a persistent chip is shown that doubles as the stop control. It stops when the tab closes and does not resume on return.
Position, heading, speed, battery level, and the day's run, vertical and speed summary where you have switched that on. Each packet carries the current fix only: no track, no history, and nothing that could be joined into one afterwards, because the previous packet is already gone.
A device posts every five seconds while sharing is on. Stale packets are dropped from the roster before the relay's own two minute window closes, so a member who has walked into a dead spot fades from the map rather than sitting frozen at a position that is no longer true.
Members appear on the 3D mountain as beacons with name and distance, and in a roster with last-seen times. An armed SOS flag travels in the same packet.
Medium AES-GCM over a relay that holds ciphertext onlyKey PBKDF2 from a four-word phrase, on the deviceRetention two minutes
One web application, no install and no app store. The same scene and the same figures on every device it runs on.

The instrument layer: speed, elevation, vertical, heading, the run you are on and the named places around you, in ruled strips with the centre of the frame kept clear. Every figure is the same one the legend and the card show. Feet, miles and miles per hour. Press V to fold it away.
Medium One web application, WebGL and WebXRSurfaces phone, laptop, headset, glassesInstall Add to Home Screen
One payment, kept for good, including every mountain added after you buy. The API plan is for people building their own product on the same engine.
Every mountain, the hour's weather, and everything that keeps you safe on it. No account, no payment details.
First person on the mountain, your day measured, and your group on the map. Lifetime, at the founders' price.
POST /api/x402 with {"buy":"pro"}.
How the payment worksThis is your lifetime key. It is saved on this device and works on any other device via Restore. Keep a copy. Open the app
The same engine, in your own product. Cancel any time, and the key also unlocks Pro in the app.
/api/fleet, ranked/api/snow by mountain or state, with season history/api/atlas: danger bands, alerts and land by coordinate?key=Your API key. Send it as Authorization: Bearer or
?key=. It also unlocks the app.
Medium One payment, kept for goodPrice $3.99 once, for the first 100,000 accountsAccount not required for the free version
The fleet answer is the state of the whole network in a single request: every mountain named and placed, what fell in the last twenty-four hours and the last seventy-two, both reporting instruments with their distance from the hill and their height above or below it, any reason a reading was set aside, the Snowpack lead in front of them, and the order they fall in. Twenty-five cents. 62 resort cards bought one at a time is 62 cents, so the whole picture is priced under its parts, because it costs one sweep rather than 62.
# the whole network, ranked curl "https://snowpack.fyi/api/fleet" \ -H "Authorization: Bearer sp1...your-key" # one mountain, with its own season history curl "https://snowpack.fyi/api/snow?resort=solitude&key=sp1...your-key" # one state curl "https://snowpack.fyi/api/snow?state=UT&key=sp1...your-key"
Every figure carries where it came from. A reading an instrument reported is labelled measured and names the instrument and the hour; a figure the Snowpack engine produced is labelled Snowpack Instrument. The two are never mixed under one label, and a mountain whose instruments have nothing clean to say is unranked rather than sorted to the bottom as though it had measured zero. Units are feet, inches and miles, stated in the answer rather than left to be inferred from a magnitude.
Ask for a coordinate or a slippy tile and get back the avalanche reading for that forecast zone, the active alerts with their full text, the land and boundary beneath it, and the nearest reporting instrument. A tile request is answered for the tile centre and cached by tile. The app calls the same functions.
# any point… curl "https://snowpack.fyi/api/atlas?lat=40.581&lon=-111.655" \ -H "Authorization: Bearer sp1...your-key" # …or any slippy tile, cached for everyone who asks after you curl "https://snowpack.fyi/api/atlas?tile=12/845/1550&key=sp1...your-key"
x402 is HTTP's own 402 Payment Required status used as a payment protocol. A program asks for a resource, is told the price in the refusal itself, signs one USDC transfer, and asks again with the signature attached. There is no account, no key and no sign-up anywhere in that loop, which is what makes it usable by software that has no card and cannot hold a subscription. One answer is a cent, the whole network in one request is twenty-five cents, and a month of the API is 5.99 and returns a key that also unlocks Pro in the app.
# ask, and be told the price curl -i "https://snowpack.fyi/api/atlas?lat=40.581&lon=-111.655&pay=x402" HTTP/1.1 402 Payment Required # sign the authorization, ask again, get the answer curl "https://snowpack.fyi/api/atlas?lat=40.581&lon=-111.655" -H "X-PAYMENT: $(your_wallet_signs_it)" # or buy a month, and get a key curl -X POST "https://snowpack.fyi/api/x402" -d '{"buy":"api"}' -H "X-PAYMENT: $(your_wallet_signs_it)" # everything on offer, in one answer no wallet is needed to read curl "https://snowpack.fyi/.well-known/x402"
The refusal is the price list for that one request, and it is written twice so that a caller on either version of the protocol can read it: the older version in the body, the newer one in a header beside it. Both carry the same four facts, which are the four a wallet needs and nothing more. The scheme is exact: a fixed amount, authorised for one named resource. The chain is Base, written as its own name in the older version of the protocol and as its chain identifier in the newer one, because the two versions spell the same chain differently and a payload naming the other spelling is refused rather than settled. The token is USDC, named by its contract address rather than by its ticker, and carried with the exact signing domain name and version that deployment of the token uses, since a signature built against the wrong one does not verify. The amount is in the token's own smallest unit, converted from the printed price as a decimal string with whole-number arithmetic, so that no price on this site is ever rounded by floating point on its way to becoming money. The offer allows one hundred and twenty seconds for settlement.
A signed authorisation is checked five times before it is treated as a payment at all. The scheme must be exact. The chain must be the one the refusal named. The token contract must be the one Snowpack names, because a payload can otherwise authorise four million units of a worthless token to the right address on the right chain and satisfy every other test. The destination must be the Snowpack receiving address. The amount must be at least the amount asked for. A payload that fails any of the five is answered with the refusal again, restating the price and saying which of the five it failed, rather than with a generic rejection that leaves the caller to guess.
Then the transfer is simulated before it is broadcast, and it is settled on chain before the answer is sent. The order matters in both places. Simulating first turns away an empty balance, an expired window or a reused authorisation without anything having been broadcast and without the work having been done. Settling before delivering means a settled transaction is the only evidence the route accepts: the comfortable order would serve the answer a second sooner and would also serve it to a caller whose payment later reverts, and for a licence that never expires there is no second chance to collect. It is also what makes a replayed payment header harmless, because the authorisation carries a nonce the token contract will spend exactly once, so a second settlement of the same signature reverts on chain rather than buying a second answer.
When a payment fails, the answer says whether money moved, because that is the only thing the payer actually needs to know and it is not always the same answer. A failure while simulating is stated as nothing having been charged, which is true: nothing had been broadcast yet. A settlement that times out or drops is stated as unknown, with the instruction to check the transaction on chain before paying again and to report the hash if it went through. The wrong reassurance would be worse than none, because a payer who is told nothing was charged and then discovers otherwise has paid twice.
Everything for sale can be read without a wallet. A plain GET of the discovery document names the chain, the token, the receiving address, both key purchases with their terms, and every kind of answer with its own price and a sentence saying what it contains. It also reports whether this deployment can actually settle, rather than only whether a field has been filled in, and says so plainly instead of advertising a door that is not there. Under it the catalogue walks the individual resources a page at a time: 2,008 of them, each a real call with its own identifier, its own price and its own description, being 1,644 map tiles, 171 named American places, 62 atlas points, 62 resort cards, 62 high-resolution elevation patches, 6 snow rankings and the whole network in one answer. Two kinds are published at a price of zero, the surveyed geometry and the elevation tiles, because the free 3D stage calls both of them on every load for every reader with no key, and a route that has never returned a payment challenge must not be advertised as though it would.
Medium HTTP 402, paid per requestStandard x402, versions 1 and 2, exact schemeAsset USDC on BaseWindow 120 seconds for settlementSettlement on chain, before the answer is sentListed 2,008 priced resources, readable without a wallet
Medium JSON over HTTPS, by coordinate or slippy tileCache answered for the tile centre, cached by tileCaller the same functions the app calls
Every figure on screen carries one of three labels immediately beside the number: measured, reported, or the Snowpack Instrument. The label carries as much weight as the number it sits beside. It is the answer to the only question that decides whether a figure can be acted on, which is who produced it and from what.
Two rules govern the labels and neither bends. The first is that the three are never mixed under one heading and never averaged into each other: an instrument reading and a model output are different kinds of claim, and a figure that blended them would be neither. The second is that where there is no value there is no figure. The product prints a dash and does not explain it away, does not substitute the nearest mountain's reading, and does not carry the last known value forward as though it were current.
An instrument on or near the mountain reported the value. Snow telemetry is passed through three filters before it is published: a noise floor set below the sensor's own resolution, so a sensor that counts in whole inches cannot appear to report tenths; spike rejection, so a single implausible jump does not become a snowfall; and a bare-ground check, so a sensor reading near zero in autumn is not published as a base.
The label carries the instrument with it: which station, how far it stands from the skiing in miles, how far above or below the runs it sits in feet, and the hour it observed. A station four miles away and two thousand feet below the terrain is a weaker witness than one on the hill, and naming it is what lets a reader judge that rather than trust a bare number.
A forecast office or avalanche centre published the value for this ground. It is shown with its full text, its issuing office or zone, and its valid period.
The value was computed for this coordinate from a numerical weather model. The model and its run time are shown. The label appears next to the figure and is spoken in the audio brief.
The licences Snowpack works under, what each one covers and the credit each one asks for are set out on Sources and citations.
Medium Provenance carried beside every figureClasses measured, reported, Snowpack InstrumentFilters noise floor, spike rejection, bare-ground check
62 mountains are surveyed and standing today, carrying 11,272 runs, 1,042 lifts and 24,520 buildings between them. A mountain joins that list by a fixed procedure: its survey is baked from the ground data, clipped to its own permit boundary so a neighbour's runs and lifts do not appear on it, and then verified against the current standard before it is published. A survey that fails verification is not shipped in a degraded state; it is held back until it passes.
What is in build, in the order it is being done.
Medium The build list, in the order it is workedMethod bake the survey, clip to the permit, verify to standard
The free version needs no account and no payment details. Avalanche danger, weather warnings, ski patrol and SOS are in it, because nothing that keeps you safe sits behind a payment. Pro is one payment of $3.99 and adds the instruments: first person at eye height, close zoom to the door and the kerbstone, the measured day and the season ledger, the encrypted group link, and station readings band by band.
No account to ski or share a day. An account only if you want the same profile on another phone. Free, and a minute to make.
Accounts are not switched on for the site yet. Everything else works without one.
Welcome to Snowpack.
Open your profileYour key is saved and tied to this profile. Pick how you show up on the mountain.
Pick a badge or add your own photo. Your avatar rides with your tracking, your group beacon and your profile.
The tracking system measures every day on your own device. Choose what follows your account.
Pair a heart rate monitor over Bluetooth and your pulse rides with the day.
Tracking runs from this phone's GPS today; heart rate pairing needs a browser with Bluetooth.
Your lifetime key rides with your account now: sign in on any device and Pro unlocks itself.
Open your profile