<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jared Smith</title>
    <description>The latest articles on DEV Community by Jared Smith (@missoulatonight).</description>
    <link>https://dev.to/missoulatonight</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4215638%2F425ea09d-f6de-48b8-9f36-b04dfaa2400a.png</url>
      <title>DEV Community: Jared Smith</title>
      <link>https://dev.to/missoulatonight</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/missoulatonight"/>
    <language>en</language>
    <item>
      <title>How We Track Twice-Daily Live Music and Weekend Events Across Missoula Venues</title>
      <dc:creator>Jared Smith</dc:creator>
      <pubDate>Thu, 29 Oct 2026 15:54:18 +0000</pubDate>
      <link>https://dev.to/missoulatonight/how-we-track-twice-daily-live-music-and-weekend-events-across-missoula-venues-44cj</link>
      <guid>https://dev.to/missoulatonight/how-we-track-twice-daily-live-music-and-weekend-events-across-missoula-venues-44cj</guid>
      <description>&lt;p&gt;Local event listings break in small ways every day. A band moves a start time back by an hour. A venue posts a door time on its ticket page and a show time on a flyer. A food truck changes its evening spot at noon. When a city calendar checks sources only once a week, readers show up late or miss the show.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://missoulatonight.com/" rel="noopener noreferrer"&gt;MissoulaTonight&lt;/a&gt; to solve that problem with a simple twice-daily update loop. MissoulaTonight is a free live-events calendar for Missoula, MT. Our rule is straightforward. Missoula shows, dances, game nights and food trucks, updated twice daily. This post explains how our twice-daily pipeline gathers, cleans, and checks local schedules so the listings stay up to date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Weekly Event Scraping Fails for a Music Town
&lt;/h2&gt;

&lt;p&gt;People who search for live music missoula want facts they can trust tonight, not next week. Missoula has a deep music scene for its size. You have big touring rooms, mid-size downtown stages, craft breweries, cidery taprooms, community arts spaces, and neighborhood bars. Each room publishes its schedule in a different way.&lt;/p&gt;

&lt;p&gt;Large concert venues use structured ticket platforms. Those pages list clear dates, ticket prices, and age rules. Smaller bars and community rooms post schedules on static web pages, social feeds, or monthly image calendars. Some venues list only the door time. Other venues list the opener time or the headliner time.&lt;/p&gt;

&lt;p&gt;If a collector script runs once a week and trusts the first time string it sees, the output is full of bad data. A reader looking up &lt;a href="https://missoulatonight.com/concerts" rel="noopener noreferrer"&gt;missoula music&lt;/a&gt; needs to know when the doors open, when the music starts, whether the room is all-ages or 21-and-over, and where to buy tickets.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Twice-Daily Update Loop, Around 05:00 and 16:00 Mountain Time
&lt;/h2&gt;

&lt;p&gt;We run our collection and verification passes twice every day, around 05:00 and 16:00 Mountain time.&lt;/p&gt;

&lt;p&gt;The 05:00 Mountain run picks up the changes posted since the 16:00 run the day before.&lt;/p&gt;

&lt;p&gt;The 16:00 Mountain run is the pre-evening check. A show announced in the morning usually shows up by this afternoon refresh. Running a full pass at 16:00 means that anyone checking &lt;a href="https://missoulatonight.com/this-weekend" rel="noopener noreferrer"&gt;missoula events this weekend&lt;/a&gt; on a Friday afternoon usually sees that morning's changes before heading downtown.&lt;/p&gt;

&lt;h2&gt;
  
  
  Normalizing Venue Data into One Clean Record
&lt;/h2&gt;

&lt;p&gt;Every raw event goes through four steps before it appears on the public calendar.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Source Fetch per Venue Type
&lt;/h3&gt;

&lt;p&gt;Each source has an adapter. Some adapters read one venue's page, and one Logjam Presents adapter covers The Wilma, the Top Hat, and KettleHouse Amphitheater. If a venue uses a structured calendar feed or JSON-LD event markup, we read the structured fields first. If a venue posts plain HTML tables or text lists, the parser extracts the date block, title block, and time strings from the page layout. We keep the source URL attached to every record so our readers and our checks can verify the origin.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Separating Door Time from Show Time
&lt;/h3&gt;

&lt;p&gt;Time parsing is where many event listings go wrong. A raw listing might say "Doors 7 / Show 8" or "7:00 PM (Doors at 6:00 PM)". If a parser grabs the first number, it stores 6:00 PM as the start time on one site and 7:00 PM on another.&lt;/p&gt;

&lt;p&gt;Our normalizer splits time text into two explicit fields, &lt;code&gt;doors_at&lt;/code&gt; and &lt;code&gt;starts_at&lt;/code&gt;, both anchored to the &lt;code&gt;America/Denver&lt;/code&gt; / Mountain time zone. When a listing gives both times, we display the show time and keep the door time visible in the event details. When a listing gives only one time, we store it as the start time and leave the door time empty.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Entity Deduplication Across Promoters and Venues
&lt;/h3&gt;

&lt;p&gt;A single concert can appear in several places at once: on the venue website, on a promoter page, on a ticket page, and in social posts. Without deduplication, a calendar shows the same band more than once on the same night.&lt;/p&gt;

&lt;p&gt;We match records by canonical venue ID and local calendar date first. Within a venue and date bucket, we compare normalized titles and start times. When a promoter listing and a venue listing describe the same show, we merge them into one event record. The merge fills a missing ticket link, price, image, or age rule from the other listing and keeps the source links of both.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Filtering Out Non-Events and Stale Placeholders
&lt;/h3&gt;

&lt;p&gt;A standing weekly entry can stay on a calendar after the plan for that night changes. When a venue's own post names a different act for that night, the venue post wins. The pipeline also leaves out events the site does not list, such as film screenings, watch parties, and worship services. On each refresh, a show is marked as soon as its sources show a cancellation or a move, and listings that drop off their sources get retired. Cancelled shows are marked or removed so no one drives across town to a locked door.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing Views Around How Locals Plan Their Week
&lt;/h2&gt;

&lt;p&gt;Once the event records are clean, we build fast, static-friendly views grouped by how people actually browse local schedules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Daily Overview (&lt;a href="https://missoulatonight.com/" rel="noopener noreferrer"&gt;MissoulaTonight&lt;/a&gt;)&lt;/strong&gt; opens on live music by day, starting tonight. Filter chips switch to all events, or to performance, game nights, dance, talks and learning, community events, food trucks, or festivals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Dedicated Concerts View (&lt;a href="https://missoulatonight.com/concerts" rel="noopener noreferrer"&gt;Missoula Concerts and Live Music&lt;/a&gt;)&lt;/strong&gt; filters the feed down to live music missoula fans care about, from touring acts at large theaters to local bands at taprooms and neighborhood spots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Weekend Planner (&lt;a href="https://missoulatonight.com/this-weekend" rel="noopener noreferrer"&gt;Missoula Events This Weekend&lt;/a&gt;)&lt;/strong&gt; groups Friday, Saturday, and Sunday into one scannable page so locals and visitors can plan a full weekend without clicking through each venue's own calendar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open Methodology and Local Corrections
&lt;/h2&gt;

&lt;p&gt;Software handles the twice-daily heavy lifting, but local knowledge keeps a community calendar honest. We publish our update schedule and source rules openly on our &lt;code&gt;/methodology&lt;/code&gt;, &lt;code&gt;/about&lt;/code&gt;, and &lt;code&gt;/media&lt;/code&gt; pages. We also take direct corrections at &lt;code&gt;hello@missoulatonight.com&lt;/code&gt; whenever a local band, venue manager, or organizer spots a change between our morning and afternoon runs.&lt;/p&gt;

&lt;p&gt;Reliable local software does not need complex hype. It needs clear data structures, respect for how venues publish information, and a steady twice-daily clock.&lt;/p&gt;

&lt;p&gt;AI agents wrote this post and checked its facts against our own listings and sources.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>data</category>
      <category>music</category>
      <category>events</category>
    </item>
  </channel>
</rss>
