<?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: Elias Shieh</title>
    <description>The latest articles on DEV Community by Elias Shieh (@elias-shieh).</description>
    <link>https://dev.to/elias-shieh</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%2F4197173%2F9f92babd-474f-4c49-90e3-d6113e93567a.png</url>
      <title>DEV Community: Elias Shieh</title>
      <link>https://dev.to/elias-shieh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elias-shieh"/>
    <language>en</language>
    <item>
      <title>My alarm won't let me snooze if I'd be late</title>
      <dc:creator>Elias Shieh</dc:creator>
      <pubDate>Thu, 22 Oct 2026 20:09:39 +0000</pubDate>
      <link>https://dev.to/elias-shieh/my-alarm-wont-let-me-snooze-if-id-be-late-42p0</link>
      <guid>https://dev.to/elias-shieh/my-alarm-wont-let-me-snooze-if-id-be-late-42p0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every morning I want to sleep a little longer, but I'm scared to keep pressing snooze.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/HcZXvemBTq8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Snooze Oracle uses past Uber trips to work out when I need to get up for a meeting. It finds the latest time I can get up for which the model estimates at least a 90% chance of being on time. The alarm rings 30 minutes before that, and I can snooze up to 10 minutes at a time until I reach it.&lt;/p&gt;

&lt;p&gt;Right now it is a web replay and a command-line planner that writes the alarms to a calendar file. There is no phone app yet, and I don't live in New York, so I haven't used it on a real morning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try to snooze it yourself: &lt;a href="https://snooze.eliasshieh.com" rel="noopener noreferrer"&gt;snooze.eliasshieh.com&lt;/a&gt;&lt;/strong&gt; (works in a phone browser)&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;If you have to be somewhere at the same time every weekday, you probably set the same alarm every day. But the trip doesn't take the same time every day. On the route in my demo, a weekday Uber from University Heights in the Bronx to Midtown, requested between 7 and 9am, took 28 to 75 minutes from request to drop-off in July and August. So when the alarm rings, you don't know how long you can stay in bed.&lt;/p&gt;

&lt;p&gt;In the replay, the meeting is at 9:00 in Midtown. The alarm rings at 07:14. You snooze to 07:24, 07:34 and 07:44, and then it says no: one more minute would drop the estimated chance of being on time to 89%. So I can keep snoozing without doing the math in my head, and I don't have to check the map the night before.&lt;/p&gt;

&lt;p&gt;It doesn't know about tomorrow's accident or rain. It learns from past trips how long your route usually takes on a weekday morning at that hour, and how much that changes. So the wake-up time depends on the day of the week and the meeting time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The demo page replays one day of August 2026 data. Pick a commute or an airport pickup, press Start and keep pressing Snooze. When another snooze would put the estimate below 90%, the button says "No safe snooze" and the page shows the number.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fah72mrctslg7ill8mlch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fah72mrctslg7ill8mlch.png" alt="Four states of the alarm: 07:14 first ring, snooze to 07:24, snooze to 07:34, and at 07:44 no safe snooze, 89%" width="800" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page is static. The curves were computed with TabPFN on my machine and saved into the page, so nothing on it calls a model.&lt;/p&gt;

&lt;p&gt;The video's narration is ElevenLabs text-to-speech, the music was made with ACE-Step 1.5, and the video's 3D scenes are three.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ting-hong-shieh" rel="noopener noreferrer"&gt;
        ting-hong-shieh
      &lt;/a&gt; / &lt;a href="https://github.com/ting-hong-shieh/snooze-oracle" rel="noopener noreferrer"&gt;
        snooze-oracle
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An alarm that lets you snooze only while you'll still make it. TabPFN-3.5 on NYC Uber trips.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Snooze Oracle&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ting-hong-shieh/snooze-oracle/docs/img/hero.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fting-hong-shieh%2Fsnooze-oracle%2FHEAD%2Fdocs%2Fimg%2Fhero.jpg" alt="A cartoon sleeper on the edge of the bed, next to a tablet showing the Snooze Oracle replay"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ting-hong-shieh/snooze-oracle/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f74c8d3527c7a094930d214c08c064d32928cb177a0c261f8b861263336fd587/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f64652d4170616368652d2d322e302d626c7565" alt="License: Apache-2.0"&gt;&lt;/a&gt;
&lt;a href="https://snooze.eliasshieh.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/34bb79078f06dadbb592a8670b7d5e763588b4fd8dd765db3ba24c71ae9bf03e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f64656d6f2d736e6f6f7a652e656c69617373686965682e636f6d2d663663393662" alt="Demo"&gt;&lt;/a&gt;
&lt;a href="https://youtu.be/HcZXvemBTq8" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/223b38f4e40fe37d2c368dfff4827af1252f45ac7cb68777bff3022ce6365789/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f766964656f2d313030253230732d666638613661" alt="Video"&gt;&lt;/a&gt;
&lt;a href="https://dev.to/elias-shieh/my-alarm-wont-let-me-snooze-if-id-be-late-42p0" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/3836232d4be9cdf2767799ac2e4de78e8b4370bfbb9f7d4df45b7135c3623228/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4445562d77726974652d2d75702d306130613061" alt="DEV post"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An alarm that works out, the night before, the latest time you can get up and still be on
time with an estimated 90% probability. It rings 30 minutes earlier and allows snoozes of up
to 10 minutes until that cutoff, then refuses.&lt;/p&gt;
&lt;p&gt;Two mornings are covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Commute:&lt;/strong&gt; an Uber to a meeting in Midtown, the Financial District or Hudson Yards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pickup:&lt;/strong&gt; meeting someone off an early flight (landing 03:00–08:59) at JFK or LaGuardia.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ride times come from TabPFN-3.5 run locally on NYC TLC Uber trips; flight delays from
TabPFN-3.5 on BTS on-time data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://snooze.eliasshieh.com" rel="nofollow noopener noreferrer"&gt;https://snooze.eliasshieh.com&lt;/a&gt; replays six August 2026 mornings (four commutes
two airport pickups) with a simulated alarm clock and a map of each route. The page is
static: the curves were precomputed and nothing on it calls a model.&lt;/p&gt;
&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19" rel="nofollow"&gt;DEV Hacktoberfest Open-Source AI Challenge, Week 3&lt;/a&gt;
The write-up is on …&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ting-hong-shieh/snooze-oracle" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Data.&lt;/strong&gt; NYC TLC trip records for about 14 million Uber trips a month (July and August 2026), and BTS on-time records for flights into JFK and LGA. The models only get July trips (for flights, the 12 months before) and are tested on August.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why TabPFN.&lt;/strong&gt; It did best where data is thin. On airport routes with fewer than 30 trips in July, I gave TabPFN, LightGBM and a lookup table exactly the same rows. TabPFN's mean pinball loss (lower is better) was 2.49 minutes, against 2.78 for LightGBM and 2.97 for the lookup. On busy routes it tied LightGBM.&lt;/p&gt;

&lt;p&gt;I don't train or fine-tune TabPFN. I use the pretrained model as it is. For each ride prediction, I give it up to 10,000 July trips as examples. I start with trips on the same route around the requested hour, then add trips from the same borough to the same destination. It predicts a range of trip times and how likely each one is, and the planner uses that to compare possible wake-up times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The alarm.&lt;/strong&gt; For each possible wake-up time, it simulates 2,000 mornings: getting ready (I assume about 15 minutes) and the ride. For an airport pickup, I compare my arrival with the flight's predicted arrival plus 20 minutes for the passenger to get out. The target is the latest wake-up time where at least 90% of those mornings are on time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu6y00hnf7svt33kpo6nu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu6y00hnf7svt33kpo6nu.png" alt="Chance of being on time by wake-up time for the demo morning: it stays near 100% until about 07:35, crosses 90% at 07:44, and is 51% at 07:57, when the usual ride plus 10 minutes would wake you" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The test.&lt;/strong&gt; Every strategy picks one wake-up time the night before and is scored against August trips. The fixed buffer is the simple way: take the meeting time, then subtract 15 minutes to get ready, the July median trip time, and a buffer. The other three are the same alarm built on a lookup table, on LightGBM and on TabPFN.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiev9vrgirwoyhy2i8xdx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiev9vrgirwoyhy2i8xdx.png" alt="Late mornings in the August replay: all 12 routes, 10-minute buffer 8.3%, 13-minute buffer 5.1%, TabPFN alarm 5.1%; the demo route, 22.9%, 17.1% and 12.7%" width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Across all 12 commute routes, the alarm was late 5.1% of the time and the 10-minute buffer 8.3%. But you sleep a little less. On average the alarm got you up 2.9 minutes earlier than the 10-minute buffer.&lt;/p&gt;

&lt;p&gt;A 13-minute buffer matched the alarm's overall late rate at about the same average wake-up time, but I could only pick 13 after seeing the August results. On the University Heights route, the 13-minute buffer was late 17.1% of the time. The TabPFN alarm was late 12.7%, which is better but still above my 10% target, and it got you up 7.1 minutes earlier than the 13-minute buffer on average (small sample, see the details below).&lt;/p&gt;

&lt;p&gt;The full reports are in the repo: &lt;a href="https://github.com/ting-hong-shieh/snooze-oracle/blob/main/docs/commute_backtest.md" rel="noopener noreferrer"&gt;commute backtest&lt;/a&gt;, &lt;a href="https://github.com/ting-hong-shieh/snooze-oracle/blob/main/docs/backtest.md" rel="noopener noreferrer"&gt;airport backtest&lt;/a&gt; and &lt;a href="https://github.com/ting-hong-shieh/snooze-oracle/blob/main/src/ride/RESULTS_round3.md" rel="noopener noreferrer"&gt;ride model comparison&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I also tested airport pickups, where both the drive and the flight's arrival are uncertain. Here the TabPFN alarm did worse than the lookup alarm: late in 10.3% of simulations, versus 9.1%. It gave some flights too much extra sleep, so I need to improve those predictions before I would trust it for a real pickup.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  All the numbers
  &lt;p&gt;Share of mornings late:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Airport&lt;/th&gt;
&lt;th&gt;Commute&lt;/th&gt;
&lt;th&gt;Demo route&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fixed buffer*&lt;/td&gt;
&lt;td&gt;11.1%&lt;/td&gt;
&lt;td&gt;8.3%&lt;/td&gt;
&lt;td&gt;22.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lookup alarm&lt;/td&gt;
&lt;td&gt;9.1%&lt;/td&gt;
&lt;td&gt;6.1%&lt;/td&gt;
&lt;td&gt;21.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LightGBM alarm&lt;/td&gt;
&lt;td&gt;11.7%&lt;/td&gt;
&lt;td&gt;6.6%&lt;/td&gt;
&lt;td&gt;14.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN alarm&lt;/td&gt;
&lt;td&gt;10.3%&lt;/td&gt;
&lt;td&gt;5.1%&lt;/td&gt;
&lt;td&gt;12.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;*30 minutes at the airport, 10 minutes for the commute. A 13-minute commute buffer was late 5.1% overall and 17.1% on the demo route (University Heights to Midtown Center).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Airport: 1,575 completed flights scheduled to arrive from 4:00 to 7:59, each with 8 pickup zones: 12,600 scenarios. Planning for the scheduled time and ignoring delays was late 46% of the time.&lt;/li&gt;
&lt;li&gt;Airport, by flight: on the 4.3% of scenarios where the alarm woke you 10 or more minutes earlier than a 30-minute buffer, mostly red-eyes from the West Coast and Hawaii, the buffer was late 17.8% of the time and the alarm 3.8%. On the 2.0% where it let you sleep 10 or more minutes longer, mostly short 7am flights into LaGuardia, the alarm was late 16.9% and the buffer 5.6%.&lt;/li&gt;
&lt;li&gt;Commute: 12 routes into Midtown, the Financial District and Hudson Yards, meetings from 8:00 to 10:00, 21 weekdays: 1,260 mornings, of which 1,070 had enough August trips to score.&lt;/li&gt;
&lt;li&gt;University Heights route: 63 simulated mornings with meetings at 8:00, 9:30 and 10:00; the demo's 9:00 meeting had no August mornings I could score. The route has few trips, so its ride samples come from any August weekday, and they don't measure each day's traffic.&lt;/li&gt;
&lt;li&gt;Flights alone: pinball loss TabPFN 10.38, lookup 10.56, LightGBM 10.68.&lt;/li&gt;
&lt;li&gt;I tested commute buffers from 0 to 30 minutes and airport buffers from 0 to 90 minutes on August data. August trips were never in the models' training rows or context, but I used August results to compare buffers and to choose the flight-model variant.&lt;/li&gt;
&lt;li&gt;A feature I dropped: I looked for a reason to wait 10 minutes before requesting the Uber and didn't find one. On the busiest early-morning airport routes, the typical fare changed by $0.80–2.40 between neighbouring 10-minute slots, while the spread of fares inside one slot was $12–34.&lt;/li&gt;
&lt;li&gt;The backtest scored wake-up times. Its snooze simulation used 9-minute snoozes; the demo now uses up to 10.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I can keep the planning local.&lt;/strong&gt; TabPFN runs on my computer, and the planner reads saved predictions. Picking a pickup area or a flight doesn't mean sending my plans to a model provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could test without API fees.&lt;/strong&gt; In my third round of ride tests, TabPFN ran on 2,914 route-and-hour groups, 59,321 trips in total. That took about two hours on my GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other people can check my choices.&lt;/strong&gt; The repo has the code that downloads the public NYC TLC and BTS data, compares the models and tests the alarm. You can change my assumptions, like 15 minutes to get ready or 20 minutes for bags, and rerun the tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code is Apache-2.0. TabPFN-3.5's weights have a separate non-commercial license, so rebuilding the predictions needs a Prior Labs login, that license, the weights and a GPU. The public demo only replays saved results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of TabPFN&lt;/li&gt;
&lt;li&gt;Best Use of ElevenLabs: the narration in the demo video is ElevenLabs text-to-speech.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How this was made:&lt;/strong&gt; I built this with AI coding agents (Claude Code, and Codex for reviews). I chose the idea, the rules and what to test. The agents wrote most of the code, the video and the first drafts of this post. Every number comes from runs on my own GPU.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
