<?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: Pranav Prakash</title>
    <description>The latest articles on DEV Community by Pranav Prakash (@rubercuber6129).</description>
    <link>https://dev.to/rubercuber6129</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%2F4206395%2F9b4931c6-db90-4e93-91ec-43d32b979bc2.png</url>
      <title>DEV Community: Pranav Prakash</title>
      <link>https://dev.to/rubercuber6129</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rubercuber6129"/>
    <language>en</language>
    <item>
      <title>Good project - vote for it thanks!</title>
      <dc:creator>Pranav Prakash</dc:creator>
      <pubDate>Sun, 25 Oct 2026 17:36:37 +0000</pubDate>
      <link>https://dev.to/rubercuber6129/good-project-vote-for-it-thanks-14pf</link>
      <guid>https://dev.to/rubercuber6129/good-project-vote-for-it-thanks-14pf</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-3oei" class="crayons-story__hidden-navigation-link"&gt;Not Yet: a planner that tells you exactly how long you can do nothing&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-3oei" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission 🦥&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/rubercuber6129" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4206395%2F9b4931c6-db90-4e93-91ec-43d32b979bc2.png" alt="rubercuber6129 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/rubercuber6129" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Pranav Prakash
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Pranav Prakash
                
                
              
              &lt;div id="story-author-preview-content-4916811" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/rubercuber6129" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4206395%2F9b4931c6-db90-4e93-91ec-43d32b979bc2.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Pranav Prakash&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-3oei" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-3oei" id="article-link-4916811"&gt;
          Not Yet: a planner that tells you exactly how long you can do nothing
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hf26challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hf26challenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-3oei" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-3oei#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Not Yet: a planner that tells you exactly how long you can do nothing</title>
      <dc:creator>Pranav Prakash</dc:creator>
      <pubDate>Sun, 25 Oct 2026 17:36:08 +0000</pubDate>
      <link>https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-3oei</link>
      <guid>https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-3oei</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;&lt;em&gt;A team entry by &lt;a class="mentioned-user" href="https://dev.to/mohnishrawat"&gt;@mohnishrawat&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/rubercuber6129"&gt;@rubercuber6129&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/aditya_dhawan_ee0e786a8ce"&gt;@aditya_dhawan_ee0e786a8ce&lt;/a&gt;. Mohnish built the extraction and the scheduler and ran the benchmark, so the "I" below is Mohnish. Pranav redesigned the page around the 14-day chart. Aditya tested it and fed back on the plan and the page.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I wanted a to-do app that answers one question: how long can I put this off?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not Yet&lt;/strong&gt; does that. You paste the brain dump that's been rattling around your head all week, in whatever order it comes out, and it tells you the exact moment you have to start caring. When I ran it on Tuesday morning with a typical uni week, it said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You can relax until Wed 21 Oct, 22:00.&lt;/strong&gt;&lt;br&gt;
That's 1 day 10 h of doing absolutely nothing about this list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gemma 4 reads the mess and pulls out each task with its deadline and a guess at how long it takes. Then a scheduler works &lt;em&gt;backwards&lt;/em&gt; from every deadline. Each task goes as late as it can safely go inside the hours you're willing to work (weekday evenings and weekend afternoons by default), and everything finishes 12 hours early as a safety margin.&lt;/p&gt;

&lt;p&gt;What you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A relax-until time.&lt;/strong&gt; The first moment anything on the list needs you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 14-day chart.&lt;/strong&gt; One row per day. Work shows up only where it has to go, and moves when you change the margin or an estimate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sloth days.&lt;/strong&gt; Days in the next two weeks with nothing scheduled at all. That uni week had 9.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Just do these now."&lt;/strong&gt; Anything under five minutes, like replying to your mum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bad news early.&lt;/strong&gt; If something won't fit even if you start right now, it tells you how many hours you're short.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A calendar file&lt;/strong&gt; you can import into Google Calendar or Apple Calendar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built it for students in week 9 of semester, like me, and for anyone whose to-do list is mostly background guilt.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Try it: &lt;a href="https://not-yet-uomu.onrender.com" rel="noopener noreferrer"&gt;https://not-yet-uomu.onrender.com&lt;/a&gt;&lt;/strong&gt; (it's on Render's free tier, so the first visit can take up to a minute to wake up)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Uni week&lt;/strong&gt;, then &lt;strong&gt;Tell me when I have to care&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Finish early by&lt;/strong&gt; to "0 h (living dangerously)" and watch the work slide later.&lt;/li&gt;
&lt;li&gt;Change any effort or deadline in the table. The plan updates instantly without calling the model again.&lt;/li&gt;
&lt;/ol&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%2Fj9k3tp01uj5adjzkc73i.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%2Fj9k3tp01uj5adjzkc73i.png" alt="Not Yet planning a uni week" width="800" height="1473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works on a phone too, and follows your system's dark mode:&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%2Foruni2kquxg7gmi0a45t.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%2Foruni2kquxg7gmi0a45t.png" alt="Not Yet on a phone" width="780" height="1688"&gt;&lt;/a&gt;&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/Mqhnish" rel="noopener noreferrer"&gt;
        Mqhnish
      &lt;/a&gt; / &lt;a href="https://github.com/Mqhnish/not-yet" rel="noopener noreferrer"&gt;
        not-yet
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;Not Yet 🦥&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The laziest schedule that still hits every deadline.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Paste the to-do brain dump that's been living in your head. Not Yet reads it with Gemma 4, an open-weight model, works out what each thing needs, and schedules every task as late as it can safely go inside the hours you're actually willing to work. Then it tells you the one thing you wanted to know: how long you can do nothing.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Mqhnish/not-yet/docs/plan-light.png"&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%2FMqhnish%2Fnot-yet%2FHEAD%2Fdocs%2Fplan-light.png" alt="Not Yet planning a student's week"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relax-until time.&lt;/strong&gt; The first moment any task needs you, and how long that is from now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sloth days.&lt;/strong&gt; Days in the next two weeks with nothing scheduled at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-minute jobs&lt;/strong&gt; go in a "just do these now" list, because doing them is lazier than remembering them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest warnings.&lt;/strong&gt; If something won't fit even if you start now, it says so and by how many hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One click to your calendar&lt;/strong&gt; (.ics), and every number and…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Mqhnish/not-yet" 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;Small open models are good at reading messy human text and less reliable at arithmetic. So in Not Yet, Gemma does the reading and Python checks anything that has to be exact.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Gemma turns the brain dump into tasks
&lt;/h3&gt;

&lt;p&gt;Gemma 4 gets your text, plus the current time and a three-week calendar for reference. It returns JSON with a title for each task, effort in hours, whether it's a two-minute job, whether it has to happen in one sitting, and whether it's a task or a fixed event like a class.&lt;/p&gt;

&lt;p&gt;Two extra fields keep it honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;quote&lt;/code&gt;: the exact words the task came from. If that quote isn't in your text, the UI flags the task with "Couldn't find this in your text. Check it."&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;when&lt;/code&gt;: the exact words that say when it's due.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the JSON doesn't parse, it goes back to Gemma once with the error message.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Dates are maths, so code does them
&lt;/h3&gt;

&lt;p&gt;I only found this because I measured it. The benchmark runs the three sample brain dumps through Gemma 4 E4B on my laptop five times each and compares the output with 22 tasks I labelled by hand. Gemma found almost every task (108 of 110), but it got the deadline right only &lt;strong&gt;63 times out of 98&lt;/strong&gt;. It would read "friday 11:59pm" perfectly and then put it on the wrong Friday, or turn "next tuesday" into a Wednesday.&lt;/p&gt;

&lt;p&gt;So now Gemma just copies the date words it saw, and a small resolver in Python turns phrases like "next tuesday 9am" or "before the 25th" into real datetimes. When the resolver doesn't know a phrase ("in march", "eventually"), Gemma's own answer is kept.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Same 15 runs&lt;/th&gt;
&lt;th&gt;Deadlines right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma's own calendar maths&lt;/td&gt;
&lt;td&gt;63 / 98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma copies the words, Python does the maths&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98 / 98&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The benchmark caught the resolver's first version out too. It scored 92/100, and one miss came up in every run. For "cancel the gym trial before it charges me on the 28th", Gemma copied only "the 28th", so the plan let me cancel on the day it charges me. The resolver now looks back through the sentence for a dropped "before", and the prompt asks Gemma to keep words like "by" and "before" when it copies. These are the samples I developed against, so 98/98 only means there are no known failures on them. The labels are in the repo if you'd like to argue with them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Scheduling backwards
&lt;/h3&gt;

&lt;p&gt;Working hours are cut into 30-minute slots. Starting with the task due last, each task takes the latest free slots that end before its deadline minus the margin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deadline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;slots_needed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scheduled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;idxs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_pick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deadline&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splittable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idxs&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# only fits if it eats the safety margin
&lt;/span&gt;        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tight&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;idxs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_pick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deadline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splittable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idxs&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# doesn't fit at all: take what's left, report the gap
&lt;/span&gt;        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;short&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple greedy is enough here. If you flip time around, every deadline becomes a start time and you get a textbook problem with one worker and jobs that become available at different times. For that problem, any schedule that never sits idle while work is waiting finishes as early as possible. So if a valid plan exists, this one finds it.&lt;/p&gt;

&lt;p&gt;A test backs that up. It generates 300 random to-do lists and compares the scheduler with a brute-force capacity check, and the two agree on all 300.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A brief that can't make things up
&lt;/h3&gt;

&lt;p&gt;Gemma also writes a short morning brief in the voice of a calm sloth, using facts the scheduler computed. Python then checks that every time in the brief appears in those facts. If Gemma invents "start at 8:30", the brief is thrown away and a plain template takes its place. The page tells you which one you're reading.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4.&lt;/strong&gt; E4B (4-bit, through MLX) on my MacBook while building and benchmarking. 26B A4B through Google AI Studio for the live demo, so judges don't need a GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python and FastAPI&lt;/strong&gt;, with one HTML page and plain JavaScript. The chart is hand-written SVG. No build step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; hosts the live demo on its free tier. The repo has a &lt;code&gt;render.yaml&lt;/code&gt; blueprint, so you can deploy your own copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;70 tests&lt;/strong&gt;, including mocked HTTP for both model backends and the random scheduler check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We both used Claude Code as our coding agent. The app itself runs only on Gemma.&lt;/p&gt;

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

&lt;p&gt;A to-do list is basically a diary. Mine has a visa form on it and a message I've been avoiding. With an open-weight model, none of that has to leave my laptop. I built and benchmarked Not Yet entirely offline. Gemma 4 E4B on a MacBook (M5, 16 GB) took a median of 20.4 seconds per brain dump across the 15 benchmark runs, and it cost nothing.&lt;/p&gt;

&lt;p&gt;Open weights also meant I could look inside. Early on, one extraction call took 65.5 seconds. The chat template is open, so I could see Gemma 4 was reasoning before it answered (about 1,750 extra tokens) and switch that off. The same call then took 18.5 seconds, and the benchmark shows the task doesn't need the reasoning.&lt;/p&gt;

&lt;p&gt;Switching models takes three environment variables. The same code talks to local servers like Ollama and &lt;code&gt;mlx_lm.server&lt;/code&gt;, or to Gemma on Google AI Studio. The live demo uses the bigger hosted model so it's fast for everyone, and you can run the small one on a plane.&lt;/p&gt;

&lt;p&gt;Running locally also made it cheap to be careful. The benchmark that found the date bug does 15 full extractions, and I re-ran it after every fix for free. On a paid API I'd probably have run it less often and shipped the bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;On that uni week, Not Yet found 13 hours of real work in a list that felt much longer. The first block didn't start until Wednesday night. Nine of the next 14 days stayed completely empty, and two of the jobs were small enough to finish before my coffee went cold.&lt;/p&gt;

&lt;p&gt;We ran the same uni week on the live demo on Sunday 25 Oct. Gemma 4 26B A4B read it in 17 seconds, and Not Yet said we could relax until Monday at 19:00. The algorithms problem set was already 2 hours short even if we started right away, and the page said so at the top. A normal to-do list would have shown it as one more line.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 4 does all the language work, reading the brain dump and writing the brief. It runs locally with E4B and in the live demo with 26B A4B through Google AI Studio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt;: the app and its API run on Render's free tier, and the repo includes a &lt;code&gt;render.yaml&lt;/code&gt; blueprint for deploying your own copy.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>python</category>
      <category>ai</category>
    </item>
    <item>
      <title>Not Yet: a planner that tells you exactly how long you can do nothing</title>
      <dc:creator>Pranav Prakash</dc:creator>
      <pubDate>Sun, 25 Oct 2026 17:19:54 +0000</pubDate>
      <link>https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-4e2l</link>
      <guid>https://dev.to/rubercuber6129/not-yet-a-planner-that-tells-you-exactly-how-long-you-can-do-nothing-4e2l</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;&lt;em&gt;A team entry by &lt;a class="mentioned-user" href="https://dev.to/mohnishrawat"&gt;@mohnishrawat&lt;/a&gt;, &lt;a class="mentioned-user" href="https://dev.to/rubercuber6129"&gt;@rubercuber6129&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/aditya_dhawan_ee0e786a8ce"&gt;@aditya_dhawan_ee0e786a8ce&lt;/a&gt;. Mohnish built the extraction and the scheduler and ran the benchmark, so the "I" below is Mohnish. Pranav redesigned the page around the 14-day chart. Aditya tested it and fed back on the plan and the page.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I wanted a to-do app that answers one question: how long can I put this off?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not Yet&lt;/strong&gt; does that. You paste the brain dump that's been rattling around your head all week, in whatever order it comes out, and it tells you the exact moment you have to start caring. When I ran it on Tuesday morning with a typical uni week, it said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You can relax until Wed 21 Oct, 22:00.&lt;/strong&gt;&lt;br&gt;
That's 1 day 10 h of doing absolutely nothing about this list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gemma 4 reads the mess and pulls out each task with its deadline and a guess at how long it takes. Then a scheduler works &lt;em&gt;backwards&lt;/em&gt; from every deadline. Each task goes as late as it can safely go inside the hours you're willing to work (weekday evenings and weekend afternoons by default), and everything finishes 12 hours early as a safety margin.&lt;/p&gt;

&lt;p&gt;What you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A relax-until time.&lt;/strong&gt; The first moment anything on the list needs you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A 14-day chart.&lt;/strong&gt; One row per day. Work shows up only where it has to go, and moves when you change the margin or an estimate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sloth days.&lt;/strong&gt; Days in the next two weeks with nothing scheduled at all. That uni week had 9.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Just do these now."&lt;/strong&gt; Anything under five minutes, like replying to your mum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bad news early.&lt;/strong&gt; If something won't fit even if you start right now, it tells you how many hours you're short.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A calendar file&lt;/strong&gt; you can import into Google Calendar or Apple Calendar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built it for students in week 9 of semester, like me, and for anyone whose to-do list is mostly background guilt.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Try it: &lt;a href="https://not-yet-uomu.onrender.com" rel="noopener noreferrer"&gt;https://not-yet-uomu.onrender.com&lt;/a&gt;&lt;/strong&gt; (it's on Render's free tier, so the first visit can take up to a minute to wake up)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Uni week&lt;/strong&gt;, then &lt;strong&gt;Tell me when I have to care&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Finish early by&lt;/strong&gt; to "0 h (living dangerously)" and watch the work slide later.&lt;/li&gt;
&lt;li&gt;Change any effort or deadline in the table. The plan updates instantly without calling the model again.&lt;/li&gt;
&lt;/ol&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%2Fj9k3tp01uj5adjzkc73i.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%2Fj9k3tp01uj5adjzkc73i.png" alt="Not Yet planning a uni week" width="800" height="1473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works on a phone too, and follows your system's dark mode:&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%2Foruni2kquxg7gmi0a45t.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%2Foruni2kquxg7gmi0a45t.png" alt="Not Yet on a phone" width="780" height="1688"&gt;&lt;/a&gt;&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/Mqhnish" rel="noopener noreferrer"&gt;
        Mqhnish
      &lt;/a&gt; / &lt;a href="https://github.com/Mqhnish/not-yet" rel="noopener noreferrer"&gt;
        not-yet
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;Not Yet 🦥&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The laziest schedule that still hits every deadline.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Paste the to-do brain dump that's been living in your head. Not Yet reads it with Gemma 4, an open-weight model, works out what each thing needs, and schedules every task as late as it can safely go inside the hours you're actually willing to work. Then it tells you the one thing you wanted to know: how long you can do nothing.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Mqhnish/not-yet/docs/plan-light.png"&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%2FMqhnish%2Fnot-yet%2FHEAD%2Fdocs%2Fplan-light.png" alt="Not Yet planning a student's week"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relax-until time.&lt;/strong&gt; The first moment any task needs you, and how long that is from now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sloth days.&lt;/strong&gt; Days in the next two weeks with nothing scheduled at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-minute jobs&lt;/strong&gt; go in a "just do these now" list, because doing them is lazier than remembering them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest warnings.&lt;/strong&gt; If something won't fit even if you start now, it says so and by how many hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One click to your calendar&lt;/strong&gt; (.ics), and every number and…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Mqhnish/not-yet" 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;Small open models are good at reading messy human text and less reliable at arithmetic. So in Not Yet, Gemma does the reading and Python checks anything that has to be exact.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Gemma turns the brain dump into tasks
&lt;/h3&gt;

&lt;p&gt;Gemma 4 gets your text, plus the current time and a three-week calendar for reference. It returns JSON with a title for each task, effort in hours, whether it's a two-minute job, whether it has to happen in one sitting, and whether it's a task or a fixed event like a class.&lt;/p&gt;

&lt;p&gt;Two extra fields keep it honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;quote&lt;/code&gt;: the exact words the task came from. If that quote isn't in your text, the UI flags the task with "Couldn't find this in your text. Check it."&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;when&lt;/code&gt;: the exact words that say when it's due.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the JSON doesn't parse, it goes back to Gemma once with the error message.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Dates are maths, so code does them
&lt;/h3&gt;

&lt;p&gt;I only found this because I measured it. The benchmark runs the three sample brain dumps through Gemma 4 E4B on my laptop five times each and compares the output with 22 tasks I labelled by hand. Gemma found almost every task (108 of 110), but it got the deadline right only &lt;strong&gt;63 times out of 98&lt;/strong&gt;. It would read "friday 11:59pm" perfectly and then put it on the wrong Friday, or turn "next tuesday" into a Wednesday.&lt;/p&gt;

&lt;p&gt;So now Gemma just copies the date words it saw, and a small resolver in Python turns phrases like "next tuesday 9am" or "before the 25th" into real datetimes. When the resolver doesn't know a phrase ("in march", "eventually"), Gemma's own answer is kept.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Same 15 runs&lt;/th&gt;
&lt;th&gt;Deadlines right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemma's own calendar maths&lt;/td&gt;
&lt;td&gt;63 / 98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma copies the words, Python does the maths&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98 / 98&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The benchmark caught the resolver's first version out too. It scored 92/100, and one miss came up in every run. For "cancel the gym trial before it charges me on the 28th", Gemma copied only "the 28th", so the plan let me cancel on the day it charges me. The resolver now looks back through the sentence for a dropped "before", and the prompt asks Gemma to keep words like "by" and "before" when it copies. These are the samples I developed against, so 98/98 only means there are no known failures on them. The labels are in the repo if you'd like to argue with them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Scheduling backwards
&lt;/h3&gt;

&lt;p&gt;Working hours are cut into 30-minute slots. Starting with the task due last, each task takes the latest free slots that end before its deadline minus the margin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deadline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;slots_needed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scheduled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;idxs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_pick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deadline&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splittable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idxs&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# only fits if it eats the safety margin
&lt;/span&gt;        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tight&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;idxs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_pick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deadline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splittable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;idxs&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="c1"&gt;# doesn't fit at all: take what's left, report the gap
&lt;/span&gt;        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;short&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple greedy is enough here. If you flip time around, every deadline becomes a start time and you get a textbook problem with one worker and jobs that become available at different times. For that problem, any schedule that never sits idle while work is waiting finishes as early as possible. So if a valid plan exists, this one finds it.&lt;/p&gt;

&lt;p&gt;A test backs that up. It generates 300 random to-do lists and compares the scheduler with a brute-force capacity check, and the two agree on all 300.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A brief that can't make things up
&lt;/h3&gt;

&lt;p&gt;Gemma also writes a short morning brief in the voice of a calm sloth, using facts the scheduler computed. Python then checks that every time in the brief appears in those facts. If Gemma invents "start at 8:30", the brief is thrown away and a plain template takes its place. The page tells you which one you're reading.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4.&lt;/strong&gt; E4B (4-bit, through MLX) on my MacBook while building and benchmarking. 26B A4B through Google AI Studio for the live demo, so judges don't need a GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python and FastAPI&lt;/strong&gt;, with one HTML page and plain JavaScript. The chart is hand-written SVG. No build step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; hosts the live demo on its free tier. The repo has a &lt;code&gt;render.yaml&lt;/code&gt; blueprint, so you can deploy your own copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;70 tests&lt;/strong&gt;, including mocked HTTP for both model backends and the random scheduler check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We both used Claude Code as our coding agent. The app itself runs only on Gemma.&lt;/p&gt;

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

&lt;p&gt;A to-do list is basically a diary. Mine has a visa form on it and a message I've been avoiding. With an open-weight model, none of that has to leave my laptop. I built and benchmarked Not Yet entirely offline. Gemma 4 E4B on a MacBook (M5, 16 GB) took a median of 20.4 seconds per brain dump across the 15 benchmark runs, and it cost nothing.&lt;/p&gt;

&lt;p&gt;Open weights also meant I could look inside. Early on, one extraction call took 65.5 seconds. The chat template is open, so I could see Gemma 4 was reasoning before it answered (about 1,750 extra tokens) and switch that off. The same call then took 18.5 seconds, and the benchmark shows the task doesn't need the reasoning.&lt;/p&gt;

&lt;p&gt;Switching models takes three environment variables. The same code talks to local servers like Ollama and &lt;code&gt;mlx_lm.server&lt;/code&gt;, or to Gemma on Google AI Studio. The live demo uses the bigger hosted model so it's fast for everyone, and you can run the small one on a plane.&lt;/p&gt;

&lt;p&gt;Running locally also made it cheap to be careful. The benchmark that found the date bug does 15 full extractions, and I re-ran it after every fix for free. On a paid API I'd probably have run it less often and shipped the bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;On that uni week, Not Yet found 13 hours of real work in a list that felt much longer. The first block didn't start until Wednesday night. Nine of the next 14 days stayed completely empty, and two of the jobs were small enough to finish before my coffee went cold.&lt;/p&gt;

&lt;p&gt;We ran the same uni week on the live demo on Sunday 25 Oct. Gemma 4 26B A4B read it in 17 seconds, and Not Yet said we could relax until Monday at 19:00. The algorithms problem set was already 2 hours short even if we started right away, and the page said so at the top. A normal to-do list would have shown it as one more line.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 4 does all the language work, reading the brain dump and writing the brief. It runs locally with E4B and in the live demo with 26B A4B through Google AI Studio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt;: the app and its API run on Render's free tier, and the repo includes a &lt;code&gt;render.yaml&lt;/code&gt; blueprint for deploying your own copy.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>python</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
