<?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: Simran Singh</title>
    <description>The latest articles on DEV Community by Simran Singh (@i_am_thor).</description>
    <link>https://dev.to/i_am_thor</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%2F4164213%2Fe72e23f8-4097-4c7b-b188-4d2c3fe7dc26.png</url>
      <title>DEV Community: Simran Singh</title>
      <link>https://dev.to/i_am_thor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/i_am_thor"/>
    <language>en</language>
    <item>
      <title>Grass Owed: screen time becomes outdoor debt</title>
      <dc:creator>Simran Singh</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:56:24 +0000</pubDate>
      <link>https://dev.to/i_am_thor/grass-owed-screen-time-becomes-outdoor-debt-4ecm</link>
      <guid>https://dev.to/i_am_thor/grass-owed-screen-time-becomes-outdoor-debt-4ecm</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;My laptop has been quietly charging me interest. Not money. Minutes outside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grass Owed&lt;/strong&gt; is a local-first web app that turns screen time into outdoor debt. For every 10 minutes on a screen you owe 2 minutes outside (both numbers are settings). Walking pays it back, and whatever you don't pay carries over to tomorrow. Like a loan, except the lender is a park.&lt;/p&gt;

&lt;p&gt;It reads your calendar (an .ics file; only start and end times are kept, never titles) to find free gaps, and scores each gap with a weather comfort model for your town. Then it nudges you, but only at sensible moments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;at most three nudges a day&lt;/li&gt;
&lt;li&gt;quiet from 22:00 to 07:00&lt;/li&gt;
&lt;li&gt;a 90-minute cooldown&lt;/li&gt;
&lt;li&gt;never during an event&lt;/li&gt;
&lt;li&gt;never for tiny debts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also knows when to tell you &lt;em&gt;not&lt;/em&gt; to go. At 2 PM on a June day in Jaipur (39 °C) it says: stay in, go out in the evening. An app that tells you to skip the walk is, I think, an app you can trust.&lt;/p&gt;

&lt;p&gt;I built it for myself: phone at college, laptop in the hostel. It's for anyone who sits at a screen all day and keeps meaning to go outside.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fsedjzl34zhx12ahkrkwo.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%2Fsedjzl34zhx12ahkrkwo.png" alt="Grass Owed app showing 16 minutes of outdoor debt, a best gap of 7:11 to 7:27 pm with comfort 98 out of 100, and a funny nudge about the 31 degree heat" width="632" height="733"&gt;&lt;/a&gt;&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%2Fuqrpm08x05h8pa0kpgsy.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%2Fuqrpm08x05h8pa0kpgsy.png" alt="Grass Owed app showing 20 minutes of outdoor debt, 20 minutes on screen and 10 outside, a best gap of 7:12 to 7:32 pm, and a nudge telling me to take a break" width="497" height="731"&gt;&lt;/a&gt;&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%2Fc4i8adlcpwow5586osix.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%2Fc4i8adlcpwow5586osix.png" alt="Grass Owed settings screen with walk minutes set to 2 per 5 minutes on screen, funny tone, three nearby green spots, a calendar file upload, and buttons for laptop auto-tracking and notifications" width="533" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;In the video: a walkthrough of Grass Owed working, from the debt counter and the best free gap to a nudge appearing and the debt going down.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: I added this video on 12 Oct 2026 after 5 minutes of deadline. The app itself is unchanged.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Run it yourself: clone the repo, open a terminal in the &lt;code&gt;app&lt;/code&gt; folder, run &lt;code&gt;python -m http.server 8000&lt;/code&gt;, and open &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Want to see what it says at a different time of day? Add &lt;code&gt;?t=2026-06-10T14:00&lt;/code&gt; to the address and time-travel to a very hot afternoon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A few real nudges from the app:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Time for a little fresh air. You have 6 minutes owed.&lt;br&gt;
The weather is nice. Try a quick walk now.&lt;br&gt;
The 32 degrees C are perfect for a quick break.&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/sssimransingh26-bit" rel="noopener noreferrer"&gt;
        sssimransingh26-bit
      &lt;/a&gt; / &lt;a href="https://github.com/sssimransingh26-bit/Grass-Owed-you-owe-the-park" rel="noopener noreferrer"&gt;
        Grass-Owed-you-owe-the-park
      &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;Grass Owed: You owe the park&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Tracks how much outdoor time you owe, finds the best free gap in your day, and nudges you to go outside with short, funny notifications.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge, Week 1: Touch Grass&lt;/strong&gt; (DEV)
Project started 7 Oct 2026, inside the challenge window (5-11 Oct 2026). Any commits after the deadline will be listed under "Post-deadline commits" below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; work in progress.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it is&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Debt is the score:&lt;/strong&gt; a daily outdoor-minutes goal and a balance that carries over.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gaps come from your calendar file (.ics),&lt;/strong&gt; so suggestions fit your real day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comfort comes from a TabPFN model&lt;/strong&gt; trained on historical weather, so it will not send you out at 2 PM in a hot month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tone is your choice&lt;/strong&gt; (gentle, funny, cheeky). Gemma writes the words; plain code decides when and what.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build time (Colab, run once):&lt;/strong&gt; TabPFN turns…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/sssimransingh26-bit/Grass-Owed-you-owe-the-park" 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 rule I set myself: &lt;strong&gt;the models do their work once, in Colab, and ship two tiny files.&lt;/strong&gt; No model and no server at runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  TabPFN: "when is it actually nice outside?"
&lt;/h3&gt;

&lt;p&gt;I pulled 4 years of hourly weather for Jaipur from Open-Meteo (apparent temperature and rain), held out the most recent 12 months, and ran a face-off: a simple baseline (average by month and hour) against TabPFN-3.5 running locally in Colab. TabPFN trained on a 10,000-row sample. The output is a 12 x 24 lookup file, &lt;code&gt;comfort_table.json&lt;/code&gt;, about 13 KB.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;MAE on held-out year (apparent temp, °C)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Baseline (mean by month and hour)&lt;/td&gt;
&lt;td&gt;2.340&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN&lt;/td&gt;
&lt;td&gt;2.303&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;TabPFN wins! By about 0.04 °C, roughly 1.6%. I'll be honest: that's one split scored on a 5,000-row sample, so it could be noise. I'm reporting it as it came out, because a tiny honest win beats a big imaginary one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma: "say it like a friend, not a calendar"
&lt;/h3&gt;

&lt;p&gt;I ran Gemma 4 E2B (&lt;code&gt;google/gemma-4-E2B-it&lt;/code&gt;, Apache-2.0) once on a free Colab T4 to write the nudge lines: 180 lines across 6 situations and 3 tones (gentle, funny, cheeky), 10 per combination. The app started with 36 hand-written placeholder lines, so this is five times the variety.&lt;/p&gt;

&lt;p&gt;I didn't trust the model blindly. Plain code checks every line for length, allowed placeholders (like &lt;code&gt;{best_time}&lt;/code&gt;), required details and banned words before it's kept. Of 181 lines Gemma returned, 180 passed (99.4%). The one rejected line invented a placeholder that doesn't exist, which is a very creative way to fail.&lt;/p&gt;

&lt;p&gt;Generation took about 20 seconds per call (18 calls, roughly 6 minutes total, about 2 seconds per kept line), and lines average about 60 characters. The result is one small JSON file, so nudges work with no signal.&lt;/p&gt;

&lt;h3&gt;
  
  
  The app
&lt;/h3&gt;

&lt;p&gt;A vanilla JavaScript PWA with no backend. The logic (debt ledger, .ics parser, gap finder, rules engine) lives in one pure module with 8 Node tests. A service worker caches everything so it opens offline.&lt;/p&gt;

&lt;p&gt;On a laptop it counts screen time automatically with the browser's Idle Detection API (Chrome or Edge). On a phone you use start/stop buttons, because browsers can't read phone screen time.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the debt moves
&lt;/h3&gt;

&lt;p&gt;With laptop auto-tracking on, every 10 minutes of active use adds 2 minutes of debt, so it keeps climbing for as long as you work. Walking pays it back one minute for one minute, so a 20-minute walk clears 20 minutes of debt, which is what 100 minutes of screen time creates. Debt never goes below zero and carries over to the next day.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Actually Went Outside
&lt;/h2&gt;

&lt;p&gt;Yes, I tested it outdoors, which feels like the least I could do for a Touch Grass challenge. On 12 October 2026 I went outside for 20 minutes with the app's "I'm out" button running, and my debt went from 40 to 20 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What worked&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The debt number dropped as soon as I tapped "I'm back", and it matched the minutes I was outside.&lt;/li&gt;
&lt;li&gt;Laptop auto-tracking counted my screen minutes without me pressing anything.&lt;/li&gt;
&lt;li&gt;A Gemma-written nudge showed up on the screen.&lt;/li&gt;
&lt;li&gt;It kept working with the network off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What didn't, or isn't done&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The TabPFN improvement is tiny.&lt;/li&gt;
&lt;li&gt;Rain probability per hour is noisy (about 120 days per cell), so comfort scores jump a little between neighbouring hours.&lt;/li&gt;
&lt;li&gt;Calendar time zones are ignored, and repeating events are only expanded daily and weekly for 14 days.&lt;/li&gt;
&lt;li&gt;Notifications only fire while the app is open. Reliable delivery to a closed phone app needs a push server, which I didn't build.&lt;/li&gt;
&lt;li&gt;Laptop auto-tracking works only in Chrome or Edge on desktop.&lt;/li&gt;
&lt;li&gt;It isn't deployed to a public URL, so the demo runs locally.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Because this app knows your calendar and your screen habits, and that is exactly the kind of data you don't want to send to someone else's server.&lt;/p&gt;

&lt;p&gt;Open weights meant both models could run in a free Colab notebook, and their output became two tiny files. There's no cloud API at runtime, no per-request cost, and no personal data leaves the device. Open weather data from Open-Meteo made the training set free to get.&lt;/p&gt;

&lt;p&gt;One honest note: TabPFN's weights are free for non-commercial use under Prior Labs' licence, so this is a hackathon project and not a product.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN:&lt;/strong&gt; it predicts outdoor comfort by month and hour from historical weather, exported as the lookup the app uses, with the error reported against a simple baseline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 4 E2B wrote the app's 180-line nudge bank, with code validating every line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Credits: weather data from &lt;a href="https://open-meteo.com" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt;. The comfort table was generated with TabPFN-3.5 by Prior Labs GmbH under the TabPFN-3.5 Non-Commercial License. Gemma 4 by Google DeepMind (Apache-2.0).&lt;/p&gt;

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