<?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: HammerAlert</title>
    <description>The latest articles on DEV Community by HammerAlert (hammeralert).</description>
    <link>https://dev.to/hammeralert</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%2Forganization%2Fprofile_image%2F13735%2F807197f1-f794-4fa1-b3c3-d93ce04f5912.png</url>
      <title>DEV Community: HammerAlert</title>
      <link>https://dev.to/hammeralert</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hammeralert"/>
    <language>en</language>
    <item>
      <title>Building a self-updating .ics auction calendar from 150+ sources</title>
      <dc:creator>Lawrence Locke</dc:creator>
      <pubDate>Sun, 21 Jun 2026 14:33:26 +0000</pubDate>
      <link>https://dev.to/hammeralert/building-a-self-updating-ics-auction-calendar-from-150-sources-1bpe</link>
      <guid>https://dev.to/hammeralert/building-a-self-updating-ics-auction-calendar-from-150-sources-1bpe</guid>
      <description>&lt;p&gt;&lt;a href="https://hammeralert.com" rel="noopener noreferrer"&gt;HammerAlert&lt;/a&gt; tracks upcoming auctions from 150+ houses and exposes them as a single calendar feed you can subscribe to in Apple Calendar, Google Calendar, or Outlook. Here's how the calendar side of it actually works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard part isn't the calendar — it's the sources
&lt;/h2&gt;

&lt;p&gt;Every auction house publishes its schedule differently: different page structures, date formats, time zones, category names, and languages. Before anything can land in a calendar, all of it has to be pulled in and normalized into one shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  One schema for every sale
&lt;/h2&gt;

&lt;p&gt;Each upcoming sale becomes a record with the same fields, no matter where it came from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;house&lt;/code&gt; — Christie's, Phillips, Bukowskis…&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;title&lt;/code&gt; — the sale name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;category&lt;/code&gt; — jewellery, watches, modern &amp;amp; contemporary art…&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;region&lt;/code&gt; — UK, Europe, US, Asia &amp;amp; Pacific&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;start&lt;/code&gt; — start date/time, stored in UTC&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;url&lt;/code&gt; — link back to the house's own listing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Normalizing region, category, and time zone up front is what makes filtering and a clean calendar possible later.&lt;/p&gt;

&lt;h2&gt;
  
  
  A personal, tokenized .ics feed
&lt;/h2&gt;

&lt;p&gt;Calendar apps don't authenticate against an API — they fetch a plain &lt;code&gt;.ics&lt;/code&gt; URL on a schedule. So every signed-in user gets their own tokenized feed:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hammeralert.com/api/calendar/your-personal-token.ics&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The token identifies the user and their preferences without a login, so the URL is safe to paste into a calendar app but still personal. The endpoint renders the filtered set of sales as standard iCalendar &lt;code&gt;VEVENT&lt;/code&gt;s on each request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filtering happens server-side
&lt;/h2&gt;

&lt;p&gt;Because the feed is generated per token, the user's saved preferences — categories, regions, specific houses — are applied when the &lt;code&gt;.ics&lt;/code&gt; is built. The calendar app only ever sees the sales that matter to that person, not all 2,000+ upcoming lots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staying fresh automatically
&lt;/h2&gt;

&lt;p&gt;Calendar clients re-fetch the feed periodically. When a house adds, moves, or cancels a sale, the next fetch reflects it — no re-importing, no manual sync. Add the URL once and it keeps itself up to date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Normalize messy sources into one schema &lt;em&gt;before&lt;/em&gt; you think about output&lt;/li&gt;
&lt;li&gt;A tokenized &lt;code&gt;.ics&lt;/code&gt; URL gives you personalization without an auth flow in the calendar client&lt;/li&gt;
&lt;li&gt;Let the calendar app's own refresh cycle do your syncing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can see it in action at &lt;strong&gt;&lt;a href="https://hammeralert.com" rel="noopener noreferrer"&gt;hammeralert.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;More from HammerAlert:&lt;/strong&gt; &lt;a href="https://hammeralert.com/auctions" rel="noopener noreferrer"&gt;Browse 2,000+ upcoming auctions&lt;/a&gt; · &lt;a href="https://hammeralert.com/guide/how-to-track-auction-calendars" rel="noopener noreferrer"&gt;How to track auction calendars&lt;/a&gt; · &lt;a href="https://hammeralert.com/auctions/house/sothebys" rel="noopener noreferrer"&gt;Sotheby's auction calendar&lt;/a&gt; · &lt;a href="https://hammeralert.com/auction-market-calendar-index" rel="noopener noreferrer"&gt;Auction market calendar index&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>programming</category>
      <category>api</category>
    </item>
    <item>
      <title>How I track upcoming auctions across 150+ houses in one calendar feed</title>
      <dc:creator>Lawrence Locke</dc:creator>
      <pubDate>Sun, 21 Jun 2026 14:32:08 +0000</pubDate>
      <link>https://dev.to/hammeralert/how-i-track-upcoming-auctions-across-150-houses-in-one-calendar-feed-3el</link>
      <guid>https://dev.to/hammeralert/how-i-track-upcoming-auctions-across-150-houses-in-one-calendar-feed-3el</guid>
      <description>&lt;p&gt;Anyone who follows art, watch, jewellery or design auctions runs into the same problem: the sales are spread across a hundred different auction-house websites. Christie's, Sotheby's, Phillips, Bonhams, Bukowskis, Dorotheum — each publishes its own schedule, in its own layout, on its own page. There's no shared calendar, so it's easy to find out about a sale the day after it closed.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://hammeralert.com" rel="noopener noreferrer"&gt;HammerAlert&lt;/a&gt; to fix that.&lt;/p&gt;

&lt;h2&gt;
  
  
  One place for every house
&lt;/h2&gt;

&lt;p&gt;HammerAlert tracks upcoming auctions across &lt;strong&gt;150+ houses worldwide&lt;/strong&gt; and lets you browse them by category, region, or house — no account needed. Thousands of upcoming sales sit in one consistent view instead of a hundred different ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set your preferences once
&lt;/h2&gt;

&lt;p&gt;When you sign in, you choose what you actually care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Categories&lt;/strong&gt; — jewellery, watches, modern &amp;amp; contemporary art, prints, design…&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regions&lt;/strong&gt; — UK, Europe, US, Asia &amp;amp; Pacific&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specific houses&lt;/strong&gt; — follow only the ones you buy from&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else gets filtered out, so you're not drowning in sales you'll never bid on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it in your own calendar
&lt;/h2&gt;

&lt;p&gt;This is the part I use most. Instead of another dashboard to remember to check, HammerAlert gives you a personal calendar feed:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;hammeralert.com/api/calendar/your-personal-token.ics&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add that URL once to Apple Calendar, Google Calendar, or Outlook and your upcoming auctions show up next to everything else. When the schedule changes, the calendar updates on its own — no re-importing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerts when timing matters
&lt;/h2&gt;

&lt;p&gt;On top of the calendar there's a &lt;strong&gt;weekly email digest&lt;/strong&gt; and &lt;strong&gt;per-auction alerts&lt;/strong&gt; for the sales you don't want to miss as they get close.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one calendar beats a hundred tabs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No more checking individual house websites&lt;/li&gt;
&lt;li&gt;One filtered view of the whole market&lt;/li&gt;
&lt;li&gt;Auctions live in the calendar you already use&lt;/li&gt;
&lt;li&gt;Updates follow automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you track auctions for work or for a collection, browse the index first and build your own calendar here: &lt;strong&gt;&lt;a href="https://hammeralert.com" rel="noopener noreferrer"&gt;hammeralert.com&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;More from HammerAlert:&lt;/strong&gt; &lt;a href="https://hammeralert.com/auctions" rel="noopener noreferrer"&gt;Browse upcoming auctions&lt;/a&gt; · &lt;a href="https://hammeralert.com/auctions/house/christies" rel="noopener noreferrer"&gt;Christie's auction calendar&lt;/a&gt; · &lt;a href="https://hammeralert.com/guide/jewellery-auction-calendar" rel="noopener noreferrer"&gt;Jewellery auction calendar guide&lt;/a&gt; · &lt;a href="https://hammeralert.com/guide/watch-auction-calendar" rel="noopener noreferrer"&gt;Watch auction calendar guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>api</category>
    </item>
  </channel>
</rss>
