Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,13 @@ The app ships with pre-built data in `data/resorts.csv` — no pipeline run need

The pipeline orchestrator handles scraping, geocoding, blackout dates, rankings, and merging.

### Before refreshing: back up existing data

```sh
cp -r cache/ backups/cache_backup_$(date +%Y%m%d_%H%M%S)
cp -r data/ backups/data_backup_$(date +%Y%m%d_%H%M%S)
```

```sh
# Incremental refresh (uses cached HTML, fetches new resorts only)
poetry run python pipeline/pipeline.py
Expand Down
2 changes: 1 addition & 1 deletion app.py
Original file line number Diff line number Diff line change
Expand Up @@ -1459,7 +1459,7 @@ def display_resort_modal():
if os.path.exists(_metadata_path):
with open(_metadata_path, 'r', encoding='utf-8') as _f:
_pipeline_metadata = json.load(_f)
_last_run_dt = datetime.fromisoformat(_pipeline_metadata['last_run'])
_last_run_dt = datetime.fromisoformat(_pipeline_metadata['last_run']).astimezone()
_last_run_str = _last_run_dt.strftime('%B %-d, %Y')
else:
_last_run_str = 'unknown'
Expand Down
4 changes: 2 additions & 2 deletions data/ltt_dates_raw.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PARTICIPATING INDY LEARN TO TURN RESORT (NO ACCESS UNLESS RESORT IS LISTED),"Christmas/New Years
Alpine Ski,"Christmas/New Years
Dec 20- Jan 4","MLK Weekend
Jan 17 - 19","President's Weekend
Feb 14 - 16","Peak Saturdays
Expand All @@ -22,7 +22,7 @@ Eagle Point Resort,,,,,,,Yes,Yes,Contract Sent
Eagle Point Resort,PARTIAL (SEE ADDITIONAL),BLACKOUT,BLACKOUT,NO BLACKOUT,NO BLACKOUT,12/25/25-01/03/2026,Yes,Yes,
Greek Peak Mountain Resort,NO BLACKOUT,NO BLACKOUT,NO BLACKOUT,NO BLACKOUT,NO BLACKOUT,,Yes,Yes,Contract Signed
Hunt Hollow Ski Club,NO BLACKOUT,NO BLACKOUT,NO BLACKOUT,NO BLACKOUT,NO BLACKOUT,,Yes,Yes,Contract Signed
Jay Peak,PARTIAL (SEE ADDITIONAL),BLACKOUT,BLACKOUT,NO BLACKOUT,NO BLACKOUT,12/26/25 - 1/1/26; 2/17-2/22/26. Available to Adults Only (13 & Up).,Yes,,Contract Signed
Jay Peak,PARTIAL (SEE ADDITIONAL),BLACKOUT,BLACKOUT,NO BLACKOUT,NO BLACKOUT,Jay Peak stops offering availability on March 29th. Lessons are available to Adults Only (13 & Up).,Yes,,Contract Signed
Kelly Canyon,BLACKOUT,BLACKOUT,BLACKOUT,BLACKOUT,NO BLACKOUT,,No Survey,No Survey,
Little Switzerland,BLACKOUT,BLACKOUT,BLACKOUT,BLACKOUT,BLACKOUT,12/5/25; 12/12/25; 12/19/25; 1/2/26; 1/9/26; 1/16/26; 1/23/26; 1/30/26; 2/6/26; 2/13/26; 2/20/26; 2/27/26. Lessons take place in LS's Terrain Based Learning Area. Instructors are now available after 7pm on weekdays and 6pm on weekends.,Yes,No,
Loup Loup Ski Bowl,BLACKOUT,NO BLACKOUT,BLACKOUT,NO BLACKOUT,NO BLACKOUT,,Yes,,Contract Signed
Expand Down
188 changes: 148 additions & 40 deletions data/our_resorts_raw.json
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,24 @@
"has_terrain_parks": true,
"href": "/our-resorts/camden-snow-bowl"
},
"501": {
"name": "Camp 10 Ski Area",
"coordinates": {
"latitude": 45.549325653827,
"longitude": -89.502865198152
},
"location_name": "Rhinelander, WI",
"vertical": 230,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": false,
"num_trails": 15,
"num_lifts": 4,
"is_open_nights": true,
"has_terrain_parks": true,
"href": "/our-resorts/camp-10-ski-area"
},
"367": {
"name": "Camp Fortune",
"coordinates": {
Expand Down Expand Up @@ -809,6 +827,24 @@
"has_terrain_parks": false,
"href": "/our-resorts/cape-smokey"
},
"496": {
"name": "Carters XC Ski Center",
"coordinates": {
"latitude": 44.4664271,
"longitude": -70.7861293
},
"location_name": "Bethel, Maine",
"vertical": null,
"is_nordic": true,
"is_alpine_xc": false,
"is_xc_only": true,
"is_allied": false,
"num_trails": null,
"num_lifts": null,
"is_open_nights": false,
"has_terrain_parks": false,
"href": "/our-resorts/carters-xc-ski-center"
},
"265": {
"name": "Castle Mountain Resort",
"coordinates": {
Expand Down Expand Up @@ -989,6 +1025,24 @@
"has_terrain_parks": true,
"href": "/our-resorts/christie-mountain"
},
"503": {
"name": "Coffee Mill Ski Area",
"coordinates": {
"latitude": 44.363733823488,
"longitude": -92.043365486506
},
"location_name": "Wabasha, Minnesota",
"vertical": 425,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": false,
"num_trails": 14,
"num_lifts": 3,
"is_open_nights": false,
"has_terrain_parks": true,
"href": "/our-resorts/coffee-mill-ski-area"
},
"74": {
"name": "Cooper Spur Ski Area",
"coordinates": {
Expand Down Expand Up @@ -1205,6 +1259,24 @@
"has_terrain_parks": false,
"href": "/our-resorts/dog-creek-lodge-nordic-center"
},
"495": {
"name": "Domaine skiable des Contamines",
"coordinates": {
"latitude": 45.8115586,
"longitude": 6.7232087
},
"location_name": "",
"vertical": 4265,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": false,
"num_trails": 120,
"num_lifts": 25,
"is_open_nights": false,
"has_terrain_parks": false,
"href": "/our-resorts/domaine-skiable-des-contamines"
},
"462": {
"name": "Donner Ski Ranch",
"coordinates": {
Expand Down Expand Up @@ -2573,24 +2645,6 @@
"has_terrain_parks": false,
"href": "/our-resorts/meadowlark-ski-resort"
},
"292": {
"name": "Methow Trails XC",
"coordinates": {
"latitude": 48.4681634,
"longitude": -120.1825961
},
"location_name": "Winthrop, WA, USA",
"vertical": 2250,
"is_nordic": true,
"is_alpine_xc": false,
"is_xc_only": true,
"is_allied": false,
"num_trails": 64,
"num_lifts": null,
"is_open_nights": false,
"has_terrain_parks": false,
"href": "/our-resorts/methow-trails-xc"
},
"348": {
"name": "Middlebury Snowbowl",
"coordinates": {
Expand Down Expand Up @@ -3167,6 +3221,24 @@
"has_terrain_parks": true,
"href": "/our-resorts/norefjell-ski-resort"
},
"493": {
"name": "North Cascade Heli",
"coordinates": {
"latitude": 48.5963259,
"longitude": -120.4426602
},
"location_name": "Winthrop, WA",
"vertical": null,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": false,
"num_trails": null,
"num_lifts": null,
"is_open_nights": false,
"has_terrain_parks": false,
"href": "/our-resorts/north-cascade-heli"
},
"476": {
"name": "Northern Maine Community Trails",
"coordinates": {
Expand Down Expand Up @@ -3275,6 +3347,24 @@
"has_terrain_parks": true,
"href": "/our-resorts/okunakayama-kogen"
},
"498": {
"name": "Onikoube Ski Resort",
"coordinates": {
"latitude": 38.787074284168,
"longitude": 140.63959801906
},
"location_name": "Narukoonsen Onikobe, Osaki Japan",
"vertical": 2345,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": false,
"num_trails": 9,
"num_lifts": 7,
"is_open_nights": false,
"has_terrain_parks": false,
"href": "/our-resorts/onikoube-ski-resort"
},
"352": {
"name": "Palcall Tsumagoi Resort",
"coordinates": {
Expand Down Expand Up @@ -3336,14 +3426,14 @@
"longitude": -88.524082142113
},
"location_name": "Lakewood, WI",
"vertical": null,
"vertical": 150,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": true,
"num_trails": 10,
"is_allied": false,
"num_trails": 14,
"num_lifts": 6,
"is_open_nights": false,
"is_open_nights": true,
"has_terrain_parks": false,
"href": "/our-resorts/paul-bunyan-ski-hill"
},
Expand Down Expand Up @@ -3473,6 +3563,24 @@
"has_terrain_parks": false,
"href": "/our-resorts/pitztaler-gletscherbahn"
},
"500": {
"name": "Pizol",
"coordinates": {
"latitude": 47.017833560236,
"longitude": 9.4734660286697
},
"location_name": "Bad Ragaz, Switzerland",
"vertical": 7726,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": false,
"num_trails": 36,
"num_lifts": 12,
"is_open_nights": true,
"has_terrain_parks": true,
"href": "/our-resorts/pizol"
},
"452": {
"name": "Plain Valley Ski Trails",
"coordinates": {
Expand Down Expand Up @@ -4571,24 +4679,6 @@
"has_terrain_parks": true,
"href": "/our-resorts/val-direne"
},
"489": {
"name": "Valmorel Ski Resort",
"coordinates": {
"latitude": 45.462299198862,
"longitude": 6.4448444957838
},
"location_name": "Les Avanchers-Valmorel, France",
"vertical": 4265,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": false,
"num_trails": 103,
"num_lifts": 46,
"is_open_nights": false,
"has_terrain_parks": true,
"href": "/our-resorts/valmorel-ski-resort"
},
"364": {
"name": "Washigatake Ski Resort",
"coordinates": {
Expand Down Expand Up @@ -4733,6 +4823,24 @@
"has_terrain_parks": false,
"href": "/our-resorts/white-pine-touring-nordic-center"
},
"497": {
"name": "Whitecap Mountains Resort",
"coordinates": {
"latitude": 46.4069352,
"longitude": -90.3969777
},
"location_name": "Upson, WI",
"vertical": 400,
"is_nordic": false,
"is_alpine_xc": false,
"is_xc_only": false,
"is_allied": false,
"num_trails": 48,
"num_lifts": 7,
"is_open_nights": false,
"has_terrain_parks": false,
"href": "/our-resorts/whitecap-mountains-resort"
},
"378": {
"name": "Whitehorse Nordic Centre",
"coordinates": {
Expand Down
4 changes: 2 additions & 2 deletions data/pipeline_metadata.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"last_run": "2026-03-15T14:42:30.083011+00:00",
"mode": "incremental",
"last_run": "2026-04-22T01:47:15.286723+00:00",
"mode": "full",
"steps_run": [
"scrape_resorts",
"scrape_reservations",
Expand Down
8 changes: 8 additions & 0 deletions data/resort_id_map.csv
Original file line number Diff line number Diff line change
Expand Up @@ -270,3 +270,11 @@ aeee3cb0-2533-440a-947f-53cf18289172,indy,wintergreen
2ad2bd80-d09e-459f-92c4-d3318eddb7e8,indy,wisp
a9356c7c-b010-46e4-a790-544daad6708d,indy,woodstock-nordic-center
ab43f6d7-24a2-4c9e-872e-bb92eb5459f8,indy,yuzawa-nakazato-snow-resort
62097126-afc6-4a54-80f0-606d896b4d62,indy,camp-10-ski-area
83e6f6fb-a0c0-40bc-99c1-7ce734f92243,indy,carters-xc-ski-center
451d6b1f-9565-4117-bafe-0cd77050bc57,indy,coffee-mill-ski-area
439bd26a-57c0-4045-82e0-7e1d7ecc8b44,indy,domaine-skiable-des-contamines
b6749796-0527-45f3-9809-19be011ebe29,indy,north-cascade-heli
b862079f-228b-4506-b309-a0ff565b6f85,indy,onikoube-ski-resort
a66ca6eb-fd19-44ac-bbd6-da5a62a4ae55,indy,pizol
0a331e49-0084-424e-99f8-b57328805376,indy,whitecap-mountains-resort
Loading
Loading