<?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: Bokman Lab</title>
    <description>The latest articles on DEV Community by Bokman Lab (@bokmanlab).</description>
    <link>https://dev.to/bokmanlab</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%2F4170016%2Fb30e80b1-5d8f-4370-8f24-210856c3f2ae.png</url>
      <title>DEV Community: Bokman Lab</title>
      <link>https://dev.to/bokmanlab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bokmanlab"/>
    <language>en</language>
    <item>
      <title>Frost Window: 30 years of weather and a laptop-sized Gemma tell you what to do outside this week</title>
      <dc:creator>Bokman Lab</dc:creator>
      <pubDate>Thu, 08 Oct 2026 02:20:40 +0000</pubDate>
      <link>https://dev.to/bokmanlab/frost-window-30-years-of-weather-and-a-laptop-sized-gemma-tell-you-what-to-do-outside-this-week-8fl</link>
      <guid>https://dev.to/bokmanlab/frost-window-30-years-of-weather-and-a-laptop-sized-gemma-tell-you-what-to-do-outside-this-week-8fl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every October, gardeners in cold places ask the same question: how many weekends are left before the first frost? The answer decides whether you dig up the basil this Saturday, whether it is time to put garlic in the ground, and whether that hike should happen now or next spring.&lt;/p&gt;

&lt;p&gt;Most apps answer with a single "average first frost" date. An average hides the thing you actually care about, which is risk. A town whose average is November 10 can still freeze on October 30 one year in ten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frost Window&lt;/strong&gt; gives you the risk, then gets out of the way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You type a place name.&lt;/li&gt;
&lt;li&gt;It pulls 30 years of daily low temperatures for that spot from the free Open-Meteo archive.&lt;/li&gt;
&lt;li&gt;It works out, for every one of those years, the last spring frost and the first fall frost.&lt;/li&gt;
&lt;li&gt;It turns that into four plain sentences: the chance of frost by next week, the typical and the early first frost, whether it is bulb-planting season, and the date seedlings are safe next spring in 9 of 10 years.&lt;/li&gt;
&lt;li&gt;A small open-weight model, Gemma 3 4B running locally through Ollama, turns those sentences into a four-line "go do this outside" plan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the real output for Seoul, run on October 8:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Facts:
- No frost in the next 7 days in any of the past 30 years.
- Typical first frost is in about 32 days (Nov 10); an early year is Oct 30.
- This is garlic and tulip planting season.
- Next spring, frost-tender seedlings are safe outside after Apr 12 in 9 of 10 years.

This week's outdoor plan (gemma3:4b, running locally):
Enjoy a hike in Bukhansan National Park, cycle along the Han River, or explore the beautiful gardens of Namsan.
This is perfect garlic and tulip planting season – get those bulbs in the ground!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And Minneapolis on the same day, where the picture is very different:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Facts:
- Frost by next week happened in 27% of past years.
- Typical first frost is in about 16 days (Oct 24); an early year is Oct 10.
- Harvest tender crops (tomatoes, basil, peppers) soon.
- This is garlic and tulip planting season.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The screen part takes about thirty seconds. Everything it suggests happens outdoors.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live page with eight cities (Seoul, Minneapolis, London, Toronto, Denver, Sapporo, Berlin, Melbourne), all generated on my machine with the same code:&lt;br&gt;
&lt;a href="https://lottolove5131-lang.github.io/frost-window/" rel="noopener noreferrer"&gt;https://lottolove5131-lang.github.io/frost-window/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To run it for your own town:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b
python frost_window.py &lt;span class="s2"&gt;"Your Town"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It needs only the Python standard library.&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/lottolove5131-lang" rel="noopener noreferrer"&gt;
        lottolove5131-lang
      &lt;/a&gt; / &lt;a href="https://github.com/lottolove5131-lang/frost-window" rel="noopener noreferrer"&gt;
        frost-window
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local frost odds from 30 years of open weather data + an offline outdoor plan from Gemma via Ollama.
    &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;Frost Window&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;When will it frost where I live, and what should I go do outside this week?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frost Window answers that from 30 years of daily low temperatures for any place on Earth, then asks a small open-weight model (Gemma, running on your own laptop through Ollama) to turn the numbers into four short lines of "go outside" advice.&lt;/p&gt;

&lt;p&gt;No account. No API key. No cloud model. The only network calls are to the free, open Open-Meteo weather archive.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it tells you&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;$ python frost_window.py "Seoul" --model gemma3:4b

Facts:
- No frost in the next 7 days in any of the past 30 years.
- Typical first frost is in about 32 days (Nov 10); an early year is Oct 30.
- This is garlic and tulip planting season.
- Next spring, frost-tender seedlings are safe outside after Apr 12 in 9 of 10 years.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The numbers come…&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/lottolove5131-lang/frost-window" 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;The design rule was simple: &lt;strong&gt;the model never decides when frost comes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frost dates come from counting, not from generation. &lt;code&gt;frost_dates()&lt;/code&gt; walks each complete year of daily minimums and records the last day at or below 0 °C before July and the first one after July. Percentiles over those 30 values give the "typical", "early year" and "safe in 9 of 10 years" dates. That part is about forty lines and you can check it by hand.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;facts()&lt;/code&gt; then converts the numbers into short sentences with a few rules ("if the median first frost is under three weeks away, say harvest tender crops"). Only those sentences go to Gemma, with an instruction to use them and nothing else. Gemma's job is the part language models are good at: turning dry facts into something friendly, and picking a local park or river to suggest.&lt;/p&gt;

&lt;p&gt;Three things broke along the way, and fixing them improved the tool more than any prompt tweak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The 1B model invented places.&lt;/strong&gt; With &lt;code&gt;gemma3:1b&lt;/code&gt;, Seoul got a "Moon Valley" walk that does not exist. Moving to &lt;code&gt;gemma3:4b&lt;/code&gt; fixed it: Bukhansan, the Han River and Namsan are all real. It costs about 35 seconds per plan on a CPU-only laptop, which is fine for a weekly plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model contradicted the data.&lt;/strong&gt; My first prompt sent the raw JSON, and the 1B model wrote about "frosty air" in a week where frost had never happened in 30 years. Pre-digesting the numbers into sentences stopped that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Southern Hemisphere was upside down.&lt;/strong&gt; Melbourne's "first fall frost" came out in July, because my season logic assumed fall starts in July. The code now shifts the calendar by half a year for negative latitudes. Then a second problem showed up: frost at Melbourne's city coordinates happened in only one of the last 30 years, and the tool was reporting that single cold night as a "typical" date. It now says "Frost is rare here" when frost occurs in fewer than half the years, instead of pretending a pattern exists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stack: Python standard library, Open-Meteo geocoding and historical archive APIs, Ollama, Gemma 3 4B. The demo page is one static HTML file reading a JSON file.&lt;/p&gt;

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

&lt;p&gt;Three reasons, all concrete for this project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No API key, no account, no billing page. A garden club, a school, or a hiking group can run it on whatever laptop is in the room.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The weather data is open, so the numbers are checkable.&lt;/strong&gt; Anyone can pull the same 30 years from Open-Meteo and confirm the frost dates. That matters more than the prose: a frost date you cannot verify is just a guess with confidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is swappable and stays on your machine.&lt;/strong&gt; If &lt;code&gt;gemma3:4b&lt;/code&gt; is too slow on an old laptop, &lt;code&gt;--model gemma3:1b&lt;/code&gt; works, and I documented exactly how it fails. If a better small model ships next month, it is a one-word change. Nothing about where you live leaves your computer except the coordinates sent to the weather archive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed API would have made the friendly part slightly more polished. It would also have made the tool cost money, need a key, and depend on a service that can change under it. For a tool meant to be used once a week by people who would rather be outdoors, open was the better fit.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;AI disclosure: I built this with help from an AI coding assistant, which wrote much of the code and drafted parts of this post with me. All outputs shown are real runs of the published code.&lt;/em&gt;&lt;/p&gt;

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