yoocal Live app

Sources and the system

One nightly read. One card.

Yoocal’s listings come from public calendars in the towns we already serve. A website on this page is a place the nightly job reads. Reading it does not make a contract, a logo, or a promise that the site endorses Yoocal.

Inventory below is the job as the listing engine is written. Catalog counts are from the public app on 2 October 2026: 3,036 listings, 61 that day, Park City 1,695, Heber Valley 691, Jackson Hole 513, Elkhart Lake 84, Green Lake 53, Midway 0. Health totals move every morning and are left off this page.

Three words that must stay apart

Source site

A public calendar we read.

The bureau, the theatre, the chamber, the resort, the library, the newspaper calendar. The nightly job copies a date, a clock, a place, and a price only when that page printed one.

Host Partner

$9.99 for a day on the desk.

Partner on the host screen is a paid placement: Featured is $0.99 a day, Partner is $9.99 a day. That business is a customer. It is a different word from a website we read.

Distribution

A door, with no rows of its own.

A lodge text and a newspaper embed carry the desk into a hand. They do not supply Tonight. CitySpark is the publisher product we are compared with. We also read the Park Record calendar that CitySpark powers. Those are two facts.

The same row, seen by every team

A film on the venue’s own showtimes page, 7:00 PM, with a price printed on that page. That is the standard the desk is for.

Engineering

The venue clock wins.

parkcityfilm.org is a Tier-1 primary. If a newspaper or a race site says 7:30 for the same night, the card time stays 7:00. The other time is stored beside it. The price on the card is the price the venue printed. An empty price stays empty.

Ops

The film step can fail alone.

The film scraper is its own step inside the Park City job. If it fails, the bureau calendar can still publish. The morning digest names the failed step. Ops repairs the film read. Ops does not type a showtime into the app.

Product

Tonight requires a clock.

This card can sit on Tonight because a person can meet someone at 7:00. A card that says “Time varies” is a defect these venue sites exist to prevent. The film fills a gap in the day. It is a listing, which is supply. It becomes fit only when someone marks Going and another person opens the list.

Design

One venue line.

Title, 7:00 PM, Park City Film, the printed price, one link to the venue. The newspaper that also listed it does not become a second logo. If the times disagree, the card leads with the venue time and can show the other time. The homepage of the desk is the town, with no strip of scraper logos.

When only an aggregator has it

A race that lives on one race site.

Running in the USA, RunSignup, or a newspaper can fill a hole the venue has not published. The card still shows a title, a clock, and a place. The outbound link is that race page. The same race on a resort site later replaces the clock and the link. The aggregator row is how the day stays full. It is the loser when a primary exists.

When a host types it

Review first. Then the desk.

A bar submits Thursday. That row waits. It does not enter the nightly raw files that morning. After a person approves it, it can sit on the desk as an overlay, with the organizer’s own link. The 42 / 11 / 3 report on the host screen is a specimen. A real host sees a real count, and only then is a second week a serious ask.

How a row moves

1One job, in the listing repo, reads the sites on this page.
2Each town writes a raw file. A hand file is left untouched.
3Merge. Venue time wins. Aggregators fill holes. Price is copied or left empty.
4Five city views publish. The app reads them and does not scrape.
5The card shows one clock, one venue, one price state, one link.

The job runs at 09:37 UTC, about 3:37 AM in Denver while daylight saving is in effect. “Today” on the files is a fixed UTC−6 date. The app at yoocal-2026 reads the published views from yoocal.com. This showroom’s desks use labeled specimen cards so a design can be clicked without pretending the specimen night is the live catalog.

Rules every team shares

A clock from a source.

Tonight is a meeting time. A row with no clock waits, or it shows the uncertainty. Nobody invents 7:00.

A price from a source.

Free when the source says free. The printed dollars when the source printed them. Otherwise “Via organizer.”

The venue wins the argument.

A bureau, a theatre, a resort, or a festival clock beats a search result and a ticket directory.

One scrape owner.

The listing repo reads the web. The 2026 app, this showroom, and a future client read the JSON. They do not fetch these sites again.

An empty town stays empty.

Midway is live in the product and has 0 listings. It stays off a homepage until rows exist. An announced town is never a 404, and it is never filled with invented nights.

The logo stays ours.

A source is a link. It is not a badge on the desk. Partner, as a word on a card, is reserved for the paid host day.

Park City

The beachhead. 1,695 listings on 2 October 2026. The daily job runs scraper.py, then the Egyptian Theatre script, then the Park City Film script. Venue sites lead. Aggregators fill what the venues have not posted.

SiteKindHow the desk uses it
visitparkcity.comPrimaryTourism bureau calendar, plus a sitemap pass. The broad official list. A venue’s own page still wins the clock when both exist.
deervalley.comPrimaryResort events. Attribution prefers the resort over a copy of the same night.
deervalleymusicfestival.orgPrimaryFestival schedule. Music nights that the resort page and the bureau both echo.
parkcityfilm.orgPrimaryShowtimes. Tier-1 for time. This is the read that should retire “Time varies” on a film.
parkcityshows.comPrimaryEgyptian Theatre ticketing. The theatre’s own upcoming list.
parkcityopera.orgPrimaryOpera events, read as structured data on the venue site.
parkcityinstitute.orgPrimaryInstitute events. The pipe is the Showpass public API. The card links to the institute, with the pipe hidden.
mountaintownmusic.orgPrimaryShow sitemaps. Local music the bureau list often shortens.
parkcitytrails.orgPrimaryMountain Trails calendar API. Trail nights and volunteer days with a real start.
parksillysundaymarket.comPrimaryThe Sunday market’s own site, also mirrored by a hand-kept annual.
pcscarts.orgPrimaryArts Council calendar, rendered in a browser because the page is scripted. Fragile, so a miss shows up as a thin arts day, and ops watches it.
kpcw.orgPrimaryCommunity calendar. The pipe is Tockify. The same read is cached for Heber, so Heber does not fetch KPCW a second time.
parkrecord.comAggregatorNewspaper calendar, through the CitySpark API, with a browser fallback. Useful breadth. Loses the clock to a venue. Scene columns are a seed, not a live crawl of every article.
utah.comAggregatorState tourism events for Park City. Fills a hole. Does not set the time when a venue has spoken.
runningintheusa.comAggregatorRaces. The page blocks a plain fetch, so the job uses a render-and-extract step. Race shops and RunSignup sit beside it.
runsignup.comAggregatorRace registration API for Park City. Same rule: fill, then lose to a primary.
slrc.comAggregatorSalt Lake Running Company calendar, read through an Elfsight widget. Wasatch races that a venue has not posted.

Hand-kept Park City annuals, linked to the organizer and expanded into dates: Song Summit, the Kimball Arts Festival, Miners Day, the Fourth, the farmers market, Park Silly, the gallery stroll. The seed file also holds a few standing rooms. The build drops an always-on amenity that has no clock, so a daily class does not become Tonight.

Heber Valley, and Midway

Heber is the valley over the hill: 691 listings. Midway has no scraper of its own. The app slices Park City and Heber rows whose text mentions Midway. On 2 October 2026 that slice was 0, so Midway stays off the homepage until the slice has rows.

SiteKindHow the desk uses it
gohebervalley.comPrimaryValley tourism events, including Swiss Days. Detail pages are opened so a weekend has an end date. If this read fails, a short hand list is the fallback, and ops should treat that as a degraded day.
thedaintypearco.comPrimaryClasses from the shop’s product feed. A class with a date and a clock can be a card. A product with no meeting time cannot.
wasatchparksandrec.comPrimaryCounty event complex. The list page is scripted, so the job reads the sitemap and each detail page. Fair days, the pageant, rodeos.
hebervalleylife.comPrimaryLocal magazine event sitemap. Valley nights the bureau page skips.
townlift.comAggregatorLocal news calendar. A TownLift row that names Midway can feed the Midway slice. It still loses a clock fight to a venue.
kpcw.orgPrimaryHeber rows from the Park City job’s cache. Heber does not call KPCW again.
runningintheusa.comAggregatorHeber races.
runsignup.comAggregatorHeber race registrations.
slrc.comAggregatorThe running-shop calendar, Heber filter.

Fallback seeds, used when the live valley read returns nothing: hebermarket.com, hebervalleyrailroad.org, the Deer Creek page on stateparks.utah.gov, and a Heber City calendar link. They keep a few known summer weeks on the desk. They are a spare tire.

Civic calendars named, and not fetched

heberut.gov and midwaycityut.gov

The Heber script’s header still names both city iCal feeds. The current job does not call them. Product and design must not tell a Midway host that Yoocal pulls the city calendar until that fetch is real. Engineering’s gap is those two feeds, wired into the Heber job, with Midway still published as a slice of rows that actually mention Midway.

Jackson Hole

513 listings. The first town on the shared toolkit: a WordPress events API, sitemaps, one music page, and a render step for the sites that hide from the job’s data center. 25 miles around Jackson, so Teton Village and Alta can appear when the event is really there.

SiteKindHow the desk uses it
gtmf.orgPrimaryGrand Teton Music Festival. Summer classical. Venue time wins.
jhcenterforthearts.orgPrimaryCenter for the Arts. The calendar hides from the job’s IP, so a render-and-extract step reads it.
wildlifeart.orgPrimaryNational Museum of Wildlife Art.
jhiff.orgPrimaryJackson Hole Film Festival sitemap.
snowkingmountain.comPrimaryMountain events, with a second pass over the King Concerts lineup so a concert title stays clean.
milliondollarcowboybar.comPrimaryThe music listing page. The job reads that list, and skips the detail pages, because the detail pages have carried stale dates.
thecloudveil.comPrimaryHotel community calendar: rodeos, fairs, races, concerts. A lodging site used here as a calendar. The guest text in Arrival is a different door and does not read this site.
dishingjh.comPrimaryFood and drink nights.
jacksonhole.comPrimaryJackson Hole Mountain Resort, Teton Village. Structured events on the sitemap.
grandtarghee.comPrimaryGrand Targhee, Alta. Render-and-extract. Inside the Jackson radius on purpose.
jacksonholechamber.comAggregatorChamber sitemap of event pages. Broad, official-adjacent. A venue still wins the clock. The crawl is slowed so the chamber’s rate limit holds.
runningintheusa.comAggregatorRaces within 25 miles. The RunSignup list for Jackson is left off because this read is the fuller one.

Elkhart Lake

84 listings. Race weekend is the reason a visitor is in town. The quiet week is the reason a local opens the desk. Both have to be true, and both have to have clocks.

SiteKindHow the desk uses it
elkhartlake.comPrimaryTourism calendar through the site’s events API. HTML and a hand list run only when that API returns nothing.
roadamerica.comPrimaryThe track. A live read plus a hand-kept 2026 list of race weekends and track days. The hand list is how a weekend survives a markup change. It is reviewed when the season is published, and it is not a guess.
siebkens.comPrimaryResort concerts. Live page, plus a hand-kept 2026 summer series. Free on the bandstand when the page says free.
osthoff.comPrimaryThe Osthoff calendar API. Lake Deck shows that the tourism site has not syndicated yet. HTML is the fallback.
elkhartlakewi.govPrimaryVillage calendar. Council nights and village events beside the race.
visitsheboygancounty.comAggregatorCounty tourism, filtered to Elkhart Lake. Fills county-wide nights that belong in the radius.
allevents.inAggregatorStill called. A directory. It fills a hole and loses any clock fight. It is the weakest read on this desk.

A hand file holds The Tiki Bar at Elkhart Lake Beach Resort. The nightly build is required to leave that file alone. Editors change it. The job does not rewrite it.

Green Lake

53 listings. This town has no handwritten list of domains inside the city script. A discovery step finds event pages, then reads structured data, then a calendar widget, then a render-and-extract step. The default of that script is a review queue. The daily job publishes straight through. Ops treats a new Green Lake domain as something to read in the digest before it is allowed to define Tonight.

Sites that discovery had already read, as of the 15 September 2026 health file on the listing clone. Floors exist for the four that must not silently collapse. Counts from that morning are omitted here because they go stale every run.

SiteKindHow the desk uses it
chamber.visitgreenlake.comPrimaryChamber calendar. Health floor 80. The broad local list.
visitgreenlake.comPrimaryTourism site beside the chamber.
thrasheroperahouse.comPrimaryVenue. Health floor 12.
nortonsgreenlake.comPrimaryVenue. Health floor 6. This host is strict about TLS, and a sloppy client drops it with no error. Ops watches the floor.
greenlakelibrary.orgPrimaryLibrary calendar. Ordinary-week supply for the local desk.
greenlaketownsquare.orgPrimaryTown square events.
greenlakeassociation.orgPrimaryLake association.
greenlake4on4th.comPrimaryA named local event series.
fromthelandfestival.comPrimaryFestival site.
avromfarmparty.comPrimaryA single farm event. Kept while it has a date. Dropped when the date is past.
iceboat.orgPrimaryIceboat events. Seasonal, and that is the point of a lake desk.
bananasentertainment.comPrimaryEntertainment calendar discovered for this town.
thenorthwestern.comAggregatorRegional newspaper. Health floor 10. Fills holes. Loses the clock to a venue.
wpr.orgAggregatorPublic radio listings that mention the town.
fleetfeet.comAggregatorRace retail calendar.
raceentry.comAggregatorRace registration. Same lose-to-primary rule.

Reads the job used to make, and stopped

The code is still in the repo. The city jobs do not call it. The comment on each one is the reason. Turning one back on is an engineering change with a reason, a digest line, and a product rule for whose clock wins.

ReadWhere it wasWhy it is off
Google Events, via a search APIPark City, Heber, ElkhartIt echoed official sites and attached the wrong dates. Wrong dates are worse than a hole.
Eventbrite town directoriesPark City, Heber, ElkhartLow-trust copies. The build already drops them when a better source is near. The call was spending quota to create rows the merge throws away.
RunSignup for JacksonJacksonThe Running in the USA extract is the fuller race list, and running both made duplicates.
patch.comNamed on the Elkhart headerThe header names it. The job does not call it.

Pipes, which are not town websites

These move bytes. A card never names them as the place to go.

PipeCarries
TockifyKPCW’s community calendar.
ShowpassPark City Institute’s public event API.
CitySpark portalThe Park Record calendar. CitySpark the company remains the publisher incumbent on the pitch. The portal is only the pipe for that one newspaper.
ElfsightThe Salt Lake Running Company widget.
Render and extractPages that block or hide their HTML. Firecrawl fetches. A model extracts fields. Used for walled race pages, the Jackson arts center, Grand Targhee, and Green Lake when structured data is missing. Keys live only in the listing repo.
GeocoderTurns a written address into a point when the source gave none. A street address can override a bad point. A far town is dropped from that city’s view.
Digest mailThe morning letter to ops. A mail key, not a source of nights.

Engineering

One owner of the scrape: the private listing repo that publishes yoocal.com. The 2026 app is a reader. This showroom is a reader of specimen cards. A second scraper in either frontend is a bug.

What a row is allowed to contain

Title, date, clock, end, place, venue, link, the source name, and a price only if a page printed one. The merge may add a stable id, categories, and a conflict record. It may not add a dollar amount, a crowd size, or a “featured” flag that the source did not have.

When two sites disagree

Keep both. Store the conflict, the uncertain time, the source links, and the list of sources. Display the Tier-1 clock. The other clock stays available for the card to show. Averaging 7:00 and 7:30 into 7:15 is forbidden. So is hiding the disagreement.

What the build throws away

Dates before today. An always-on amenity. A seven-day recurrence with no clock. A low-trust aggregator sitting on top of a better source at the same venue and time, or the same venue and date. A point that lands outside the town’s radius after the address is trusted.

Files the app actually reads

Five views, after the merge. Park City, 10 miles. Heber, 10 miles. Jackson, 25 miles. Elkhart Lake, 15 miles. Green Lake, 25 miles. A race that crosses Heber and Park City may appear on both. That is intended. Midway is a filter in the app, not a sixth file.

A new source is a change in the listing repo: a primary or a labeled aggregator, a health line, and a note of whose clock wins. Host submissions stay out of the nightly raw files until an editor approves an overlay. The hand seed is never overwritten by the job. Dead links that return 404 or 410 are rewritten from a cache. Secrets are names in the listing repo’s CI, and they are never copied into the app or this site.

Ops

The morning is a pipeline with a letter at the end. One city is allowed to fail. The desk is not allowed to fail silently.

  1. Park City, including the theatre and the film. Heber. Elkhart Lake. Green Lake, in publish mode. Jackson.
  2. The incremental store, then editor overrides, then an automatic repair.
  3. A quality audit, a pass that resolves ambiguous fields, and the audit again.
  4. A health check against floors. A source under its floor is a page in the digest, including when the rest of the town looks fine.
  5. The merge that writes the master file and the five views. This is the moment the app can change.
  6. A last audit, then the standing checks: recurring drops, multiday gaps, two events in one room at one time, bad dates, cross-source duplicates, coverage cliffs, encoding junk, and ongoing events that vanished. Coverage cliffs warn. They do not stop the publish, because a throttled API can look like a cliff for one morning.
  7. A model-side health check, the digest email, then a commit by the bot and a push. A later gate can turn red on a real high bug. By then the files are already public. Ops repairs forward. Ops does not pretend the morning was clean.

When the run is red

The run fails only when Park City, Heber, and Elkhart all fail. Jackson or Green Lake can fail while the run stays green. The summary still names them. A green checkmark with a missing lake is an ops incident.

What ops does not do

Ops does not invent a listing to fill a hole, does not paste a key into the app, and does not call a source to ask for a partnership from this page. A blocked site is a failed step. The response is a fix, a fallback that is already labeled, or a hole on that desk.

Product

Supply is the catalog. Fit is a person using it. The sources exist so step one of the fit test can be honest: a guest in Park City opens a card with a real time.

Tonight

A card needs a clock from a primary, or from an aggregator when no primary has the night. “Time varies” on the live app is the bug this page is the cure for. The Friday desk shows the standard on purpose: every specimen card has a clock.

Free and price

Free is a claim a source made. A blank is “Via organizer.” A host who wants a dollar on the card supplies the dollar. Product never backfills a typical ticket price.

Whose night is it

Park City is the scoreboard. Heber can be a card inside a trip. Jackson, Elkhart, and Green Lake keep their desks because the reads are real. A new town starts when a primary calendar is boring and reliable, which is after the Friday test, and the private review still has that sequence open.

Midway

A slice, currently empty. Homepage placement waits for rows. The missing city iCal is an engineering gap, and it is also a sentence product must not say yet.

The host week

Featured and Partner are distribution on top of a real night. The ask for a second week comes after a count of opens and Goings. A saved order with no card charge is a partial path. It is not revenue.

What a source is worth

A primary makes the commit possible. An aggregator makes the day less empty. A lodge makes the first open happen. A newspaper embed is a later door. None of those is a reason to add a chatbot, a map tour, or a 44th city in front of Going.

Design

The brand book still governs the mark, the paper, the ink, and the gold dot. Sources change what a card is allowed to say. They do not change the brand into a directory.

The card

Title. Clock. Venue. One price state: Free, the printed price, or Via organizer. One outbound link, the winner of attribution. Interested, then Going.

The disagreement

Venue time first. The other time in a quiet line, with the other site named in words. Two equal clocks teach the guest not to trust either.

The desk

Search, day, time of day, free, and a feeling. The result is a short list. A wall of source logos is a different product and does not ship on the homepage.

Words

Partner means the paid host day. A read is “from the venue,” “from the bureau,” or the site’s name on the link. Specimen banners stay on this showroom. The host report’s 42, 11, and 3 stay labeled as a specimen.

Empty

An empty day is an empty day. An empty Midway is a sentence, “The list is still quiet,” and a path to Heber or Park City. It is never a fake market, a fake price, or a removed route.

Season

May through October, outside first. November through April, après the lifts. The same sources feed both. Winter design changes the hour and the room. It does not invent a second catalog.

Editorial, host success, and distribution

Editorial

The inbox is a source with a person.

Submit lands as pending. An editor key locks the inbox. Until that key is set, the inbox is open, which is an ops fact and a product risk. Approval can add the organizer’s video after review. The ticket link is the organizer’s URL. Yoocal does not sell the seat and does not put Yoocal’s name on their ticket.

Host success

The count, then the week.

The host sees views, Interested, and Going for the nights they bought. The showroom calculator is a specimen and states that no card is charged. A second week is the sale. A first week with a zero is a conversation, and the honest line is the zero.

Distribution

Lodging and papers carry the desk.

Arrival is the check-in text. The property is a door. The Cloudveil’s calendar is a Jackson source, which does not make every hotel a data feed. Publishers get an embed of our desk. We do not wrap CitySpark’s widget, and we do not scrape a paper we also ask to embed us, beyond the Park Record calendar already in the Park City job.

A new website, before anyone adds it

  1. It is a venue, a city, a bureau, or a labeled aggregator that fills a hole in a town we already serve.
  2. Its pages carry a date and, for Tonight, a clock.
  3. It is wired only in the listing repo, with a health line.
  4. On a conflict, a named tier says whose clock and whose link win.
  5. Price is copied or left empty.
  6. Design adds no logo to the desk. The card gains one true line.
  7. Product can say the sentence out loud: “We read their public calendar.” Anything stronger waits for a real agreement, which this page does not claim.

Open the Friday desk