<?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: Ashwin Temkar</title>
    <description>The latest articles on DEV Community by Ashwin Temkar (@ashwintemkar).</description>
    <link>https://dev.to/ashwintemkar</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%2F4153443%2F1de761b6-3575-416c-be70-77420d1f49ed.png</url>
      <title>DEV Community: Ashwin Temkar</title>
      <link>https://dev.to/ashwintemkar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ashwintemkar"/>
    <language>en</language>
    <item>
      <title>I got tired of scrolling for dinner, so Gemma only gets to point</title>
      <dc:creator>Ashwin Temkar</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:59:20 +0000</pubDate>
      <link>https://dev.to/ashwintemkar/decided-2e6o</link>
      <guid>https://dev.to/ashwintemkar/decided-2e6o</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;The app is here: &lt;a href="https://foodpivot.ashwintemkar.com" rel="noopener noreferrer"&gt;foodpivot.ashwintemkar.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kiranraj Chintada (&lt;a href="https://dev.to/kiranrajchintada302"&gt;@kiranrajchintada302&lt;/a&gt;) was on this with me.&lt;/p&gt;

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

&lt;p&gt;I got tired of scrolling for dinner, so the app only has to answer one question. What should I eat next?&lt;/p&gt;

&lt;p&gt;Not which restaurant is trending. Not who has the better rating. The food.&lt;/p&gt;

&lt;p&gt;You tell it where you are. Big cities first: Pune, Hyderabad, Mumbai, Bengaluru, Delhi. It looks at places nearby whose menus are already known, from the map and from what those kitchens publish. Then it looks at you. How you eat. What today or tomorrow looks like. A tag if you have one: healthy, Chinese, light, something you can finish before a gym session. And what you already ate.&lt;/p&gt;

&lt;p&gt;Gemma names the dish. The nearby places show up only because they already serve that dish.&lt;/p&gt;

&lt;p&gt;You can type things like this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gym tomorrow, keep it light.&lt;/li&gt;
&lt;li&gt;Chinese, not too heavy. I'm in Kothrud.&lt;/li&gt;
&lt;li&gt;Rainy evening in Jubilee Hills. I had biryani yesterday.&lt;/li&gt;
&lt;li&gt;Something healthy before a long meeting.&lt;/li&gt;
&lt;li&gt;Office lunch, vegetarian, Baner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answer is a plate. Hakka noodles. A grilled bowl. Misal. Dosa. Whatever sits closest to the day you just described. The kitchen is where you go to get it, not the thing you had to choose.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://foodpivot.ashwintemkar.com" rel="noopener noreferrer"&gt;foodpivot.ashwintemkar.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Where you are, and what you feel like.&lt;/strong&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/PASTE_SCREENSHOT_1_URL" 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/PASTE_SCREENSHOT_1_URL" alt="Area and a short line about the day, before any dish is named" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The food. One dish, one reason, from your tags and your last meals.&lt;/strong&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/PASTE_SCREENSHOT_2_URL" 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/PASTE_SCREENSHOT_2_URL" alt="A single dish suggestion, with the reason in one sentence" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Places nearby that already have it on the menu.&lt;/strong&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/PASTE_SCREENSHOT_3_URL" 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/PASTE_SCREENSHOT_3_URL" alt="Nearby kitchens that serve the dish, after the food has been chosen" width="800" height="400"&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/ashwintemkar" rel="noopener noreferrer"&gt;
        ashwintemkar
      &lt;/a&gt; / &lt;a href="https://github.com/ashwintemkar/foodpivot" rel="noopener noreferrer"&gt;
        foodpivot
      &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;Food Pivot&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;You are tired and do not want to decide dinner. Food Pivot reads the mood, keeps the diet and allergy rules, and asks Gemma 4 to pick one plate that is already on the menu.&lt;/p&gt;
&lt;p&gt;The menu, the distance, and the allergies are code. Gemma only chooses among dishes those rules already allowed. Backboard sends that request. If &lt;code&gt;BACKBOARD_API_KEY&lt;/code&gt; is missing, the same ranker decides.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Local&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker compose up -d
copy .env.example .env
pnpm install
pnpm db:push
pnpm dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;DATABASE_URL&lt;/code&gt; for the local Tiger (Timescale) container:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;postgresql://foodpilot:foodpilot@127.0.0.1:55432/foodpilot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Set &lt;code&gt;BACKBOARD_API_KEY&lt;/code&gt;. The model defaults to &lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt; through Backboard's &lt;code&gt;google&lt;/code&gt; provider. Change &lt;code&gt;BACKBOARD_LLM_PROVIDER&lt;/code&gt; and &lt;code&gt;BACKBOARD_MODEL_NAME&lt;/code&gt; if your Backboard account lists Gemma under a different pair.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Deploy&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Tiger Data.&lt;/strong&gt; Create a Tiger service, copy the Postgres connection string into &lt;code&gt;DATABASE_URL&lt;/code&gt;, then &lt;code&gt;pnpm db:push&lt;/code&gt;. The local compose file is the same Postgres shape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Render.&lt;/strong&gt; New Blueprint from this repo. It…&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/ashwintemkar/foodpivot" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/ashwintemkar/foodpivot" rel="noopener noreferrer"&gt;https://github.com/ashwintemkar/foodpivot&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The city comes first. The address you give, or the area you pick, decides which known menus we even look at. A rainy night in Pune should not be answered with a kitchen in Hyderabad.&lt;/p&gt;

&lt;p&gt;Those menus are the foods we already know are served nearby. Maps tell us the place is close. The published menu tells us the dish is real. We are not asking the model to invent a restaurant.&lt;/p&gt;

&lt;p&gt;Your side of it is small. Diet. Allergies. Tags. What the day is for. The last few things you ate. That history stays with the app, in Tiger Data, so "not again" and "something like last time" are about your meals, not about a rating chart.&lt;/p&gt;

&lt;p&gt;Gemma 4, &lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;, reads that and names the food. The call goes through Backboard, one key, so the app is not tied to a single model vendor. Gemma only sees foods that already fit the diet and the area. It returns one dish and one sentence. If the name is not on that list, we keep the closest match from your own preferences.&lt;/p&gt;

&lt;p&gt;The app itself sits on DigitalOcean, at foodpivot.ashwintemkar.com, so it is awake when you are hungry. Gemma is not running on a GPU we manage. DigitalOcean serves the page. Backboard serves the model. Tiger keeps what you have eaten.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    A[Where you are] --&amp;gt; B[Nearby places with a known menu]
    C[Diet, tags, the day, past meals] --&amp;gt; D[Gemma through Backboard]
    B --&amp;gt; D
    D --&amp;gt; E[The dish]
    E --&amp;gt; F[Places nearby that already serve it]&lt;/code&gt;&lt;/pre&gt;



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

&lt;p&gt;The hard part was never writing a prettier menu. It was refusing to let a model invent dinner.&lt;/p&gt;

&lt;p&gt;Gemma is open-weight, so the model behind the suggestion can change without changing the question. Backboard is the door in front of it: one key, and the food decision is not glued to one company's login. What you ate last is ours to keep, in a database we can read, not a memory we have to trust a closed chat to recall. The nearby food comes from places and menus that are already public.&lt;/p&gt;

&lt;p&gt;A closed assistant will happily name a famous restaurant. This one names the food, then shows you who nearby already cooks it.&lt;/p&gt;

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

&lt;p&gt;You stop doing the app's job. You say the day. You get the dish. The places come after, and only the ones that already have it.&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 names what to eat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Backboard.&lt;/strong&gt; That call goes through a Backboard key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of DigitalOcean.&lt;/strong&gt; The app is on App Platform at foodpivot.ashwintemkar.com.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Tiger Data.&lt;/strong&gt; What you have eaten stays there, and the next suggestion starts from it.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>gemmachallenge</category>
    </item>
    <item>
      <title>Dobara: the repair counter where Gemma reads the fault and the graph sets the rupees</title>
      <dc:creator>Ashwin Temkar</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:59:30 +0000</pubDate>
      <link>https://dev.to/ashwintemkar/doobara-a3b</link>
      <guid>https://dev.to/ashwintemkar/doobara-a3b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A phone comes back to the counter and the customer says it is the same problem. The person at the desk has to decide, while the customer is still standing there, whether the repair is free, whether only the labor is charged, or whether this customer still owes the last job and should not get a new one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dobara&lt;/strong&gt; is that counter for a small repair shop. The sample shop is Screenwala, Karve Nagar, Pune: one owner, two technicians, and a book of phones, parts, and unpaid jobs. You type what the customer said, including the Hinglish a real counter hears. A local open-weight model reads the fault. A graph decides the money.&lt;/p&gt;

&lt;p&gt;The shop’s promise and the supplier’s warranty are different clocks. Screenwala gives a free comeback for 30 days. The display supplier warrants the part for 90 days. The battery supplier warrants it for 60. The model may name the fault. It may not set the rupees.&lt;/p&gt;

&lt;p&gt;The person who would pay is the shop owner, or someone running two or three counters under one name. A free screen given to someone who should have paid, or a paid job given to someone inside the promise, costs the part. On this book that is Rs 1,800 to Rs 4,500. A small monthly fee is cheaper than one wrong comeback. Nobody has paid it yet. That price is a hypothesis.&lt;/p&gt;

&lt;p&gt;Three walk-ins are the product.&lt;/p&gt;

&lt;p&gt;Rahul Deshmukh says the touch is back. His iPhone 13 had a paid display job, J-104, closed 12 days ago. Imran Shaikh did it. The panel came from Shree Displays. Twelve days is inside thirty. The slip says free comeback, Rs 0, and sends it back to Imran.&lt;/p&gt;

&lt;p&gt;Neha Kulkarni says the battery died again. Her Redmi Note 12 was repaired 40 days ago, job J-088, by Sagar Patil. The shop promise is over. CellHouse’s battery warranty is 60 days, so 20 days remain. The slip charges labor only, Rs 400, and leaves the part on the supplier. Sagar takes it.&lt;/p&gt;

&lt;p&gt;Amit Joshi wants a screen on the other phone. Job J-091 is still open: a charging port on his Samsung M14, Rs 1,800, six days old, Imran’s job. The slip refuses the new work. Collect J-091 first.&lt;/p&gt;

&lt;p&gt;If Rahul says “battery” instead of “touch,” the old display job does not count. That is a new paid battery job, Rs 1,800, assigned to Sagar. The customer’s “same problem” is not evidence. The fault has to match a job in the graph.&lt;/p&gt;

&lt;p&gt;The phones, IMEIs, and invoices are invented.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Dobara counter before a decision&lt;/strong&gt;
&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%2Fb56ddi8o6j5z4f4ccunh.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%2Fb56ddi8o6j5z4f4ccunh.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Pick a walk-in, then &lt;strong&gt;Decide from the graph&lt;/strong&gt;. The slip shows the outcome, the amount, the technician, and the path: customer, device, earlier job, part and supplier, and the 30-day rule. &lt;strong&gt;End this conversation&lt;/strong&gt; clears the slip. &lt;strong&gt;Ask the book&lt;/strong&gt;, with “What did we decide about Rahul?”, reads the decision back. Closing the page does not delete it.&lt;/p&gt;

&lt;p&gt;Replace the two slips below with screenshots from the running app, and put the video or live URL here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dobara.ashwintemkar.com" rel="noopener noreferrer"&gt;&lt;code&gt;dobara.ashwintemkar.com&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Rahul, free comeback, Rs 0&lt;/strong&gt;
&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%2Fymzhbtlcajgujep12xxp.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%2Fymzhbtlcajgujep12xxp.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Neha, labor only, Rs 400&lt;/strong&gt;
&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%2Fcsokorp0osr637jer4fm.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%2Fcsokorp0osr637jer4fm.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/ashwintemkar/dobara" rel="noopener noreferrer"&gt;DOBARA&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;compose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;up&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;requirements.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;server.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:8080&lt;/code&gt;. The graph name is &lt;code&gt;screenwala&lt;/code&gt;. FalkorDB Browser is on port 3000. &lt;code&gt;py check.py&lt;/code&gt; checks the four outcomes: free comeback, labor only, collect first, and a new paid job when the fault does not match.&lt;/p&gt;

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

&lt;p&gt;The open piece that decides is a Cypher &lt;code&gt;CASE&lt;/code&gt; in FalkorDB, not the language model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cypher"&gt;&lt;code&gt;&lt;span class="k"&gt;CASE&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;unpaid&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'collect_first'&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'new_paid'&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;pol.comeback_days&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'free_comeback'&lt;/span&gt;
  &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;last.warranty_days&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="ow"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="ow"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;last.warranty_days&lt;/span&gt; &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="s1"&gt;'labor_only'&lt;/span&gt;
  &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="s1"&gt;'new_paid'&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;age&lt;/code&gt; is today’s day-number minus the day the matching job was closed. Unpaid work wins first. Then a matching paid repair inside the shop promise. Then the same fault still inside the part warranty, which bills labor only. Otherwise it is a new paid job, priced from the skill: touch Rs 4,500, battery Rs 1,800, charging Rs 1,200. The technician is the person who did the earlier repair, or, for a new job, the available person skilled in that fault.&lt;/p&gt;

&lt;p&gt;Gemma 3 4B runs locally through Ollama. It returns JSON: phone, customer, fault. The fault is kept only when the complaint says touch, screen, display, battery, or charging. A fault the model invents is dropped. Amounts never come from the model.&lt;/p&gt;

&lt;p&gt;The app is Python, FastAPI, and one HTML page. The graph holds the shop, the policy, people, skills, customers, devices, parts, suppliers, jobs, and decisions. A decision points at the customer, the jobs it used, the policy, and the technician. The next session reads those nodes. There is no second database.&lt;/p&gt;

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

&lt;p&gt;A repair book is phone numbers, IMEIs, and what people still owe. Sending that to a closed API on every walk-in means another company sees the book, and a per-call price sits under whatever fee the shop can charge.&lt;/p&gt;

&lt;p&gt;Gemma on the shop machine makes the reading cost electricity. FalkorDB on the same machine makes the rule a query the owner can change: comeback days and labor rupees are properties, not a prompt. The slip can show the path from Neha to J-088 to CellHouse. A closed model can be told to be careful with warranties. It cannot be required to stop at an empty path.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma. Gemma 3 4B, through Ollama, reads every complaint on the shop machine. The graph still sets the outcome.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>OpenTrips: should I go out this weekend, with a number you can check</title>
      <dc:creator>Ashwin Temkar</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:54:57 +0000</pubDate>
      <link>https://dev.to/ashwintemkar/opentrips-should-i-go-out-this-weekend-with-a-number-you-can-check-4863</link>
      <guid>https://dev.to/ashwintemkar/opentrips-should-i-go-out-this-weekend-with-a-number-you-can-check-4863</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;p&gt;CHECK OUR OPEN APP HERE: &lt;a href="https://opentrips.ashwintemkar.com/" rel="noopener noreferrer"&gt;OpenTrips&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Team: HONEYBEE&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ashwin Temkar (&lt;a href="https://dev.to/ashwintemkar"&gt;@ashwintemkar &lt;/a&gt;) and Kiranraj Chintada (&lt;a href="https://dev.to/kiranrajchintada302"&gt;@kiranrajchintada302 &lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;OpenTrips answers one question before you leave the house. Should I go out this weekend?&lt;/p&gt;

&lt;p&gt;You type a place, two dates, and a sentence about yourself. "Beginner, bad knee, budget 3000 rupees, wants hills." You get three things back.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A go, caution, or wait verdict for rain and landslide risk, with the model's measured accuracy on the screen.&lt;/li&gt;
&lt;li&gt;A day by day outdoor plan and a packing list from a model we fine tuned for that job.&lt;/li&gt;
&lt;li&gt;A map of recorded landslides nearby, the forecast grid, and places to stay, so you can leave with the plan instead of researching it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The screen is the planning step. The point of the plan is to close the laptop. It is for anyone planning a walk, a day in the hills, or a camp, anywhere a forecast exists. It is not a hotel trip planner. The itinerary is trails, viewpoints, and short walks sized to ability. Stays on the map are context, not the product.&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;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;td&gt;Outdoor go or wait, plus a plan and a packing list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risk model&lt;/td&gt;
&lt;td&gt;TabPFN on real NASA landslide events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plan model&lt;/td&gt;
&lt;td&gt;Qwen3 8B, fine tuned on Tinker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weather and rain history&lt;/td&gt;
&lt;td&gt;Open Meteo, no API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maps&lt;/td&gt;
&lt;td&gt;OpenStreetMap and Leaflet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Render, API and web app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saved plans&lt;/td&gt;
&lt;td&gt;Postgres, reopen by link, cached for no signal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Split&lt;/th&gt;
&lt;th&gt;Majority guess&lt;/th&gt;
&lt;th&gt;Logistic regression&lt;/th&gt;
&lt;th&gt;TabPFN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time, last 20 percent of each class&lt;/td&gt;
&lt;td&gt;0.556&lt;/td&gt;
&lt;td&gt;0.799&lt;/td&gt;
&lt;td&gt;0.914 accuracy, 0.972 AUC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geography, India-tagged rows held out&lt;/td&gt;
&lt;td&gt;0.390&lt;/td&gt;
&lt;td&gt;0.821&lt;/td&gt;
&lt;td&gt;0.899 accuracy, 0.956 AUC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The plan model, on 10 requests it never saw in training: base model 0 of 10, fine tuned model 8 of 10.&lt;/p&gt;

&lt;p&gt;The 0.390 majority guess always says non-event, because that is the most common training label outside India. Always saying event on the India rows scores 0.610. TabPFN at 0.899 is above both. The India rows in the csv are 775 events and 496 non-events. The plan result is a small sample. A 95 percent Wilson interval on 8 of 10 is about 49 percent to 94 percent.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A[Place, dates, one sentence] --&amp;gt; B[OpenStreetMap coordinates]
    B --&amp;gt; C[TabPFN risk]
    B --&amp;gt; D[Qwen3 8B plan]
    C --&amp;gt; E[Go, caution, or wait plus accuracy]
    D --&amp;gt; F[Days, packing, warnings]
    F --&amp;gt; G[Rule checker]
    G --&amp;gt; H[Saved link]
    H --&amp;gt; I[Leave, plan cached for no signal]&lt;/code&gt;&lt;/pre&gt;



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

&lt;p&gt;Video: ADDING_SOON_THE_YOUTUBE_URL&lt;/p&gt;

&lt;p&gt;Live app: &lt;a href="https://opentrips.ashwintemkar.com/" rel="noopener noreferrer"&gt;OpenTrips&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The API on a free Render instance can take about half a minute to wake up on the first request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;What the demo should show, in order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Type a place, dates, and a constraint sentence.&lt;/strong&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%2F2aqkwvldzoarvokhz2as.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%2F2aqkwvldzoarvokhz2as.png" alt="Home, the trip form" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The verdict appears with accuracy 0.899, not a buried footnote.&lt;/strong&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%2Flnd2gi7ndtligduu5vhq.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%2Flnd2gi7ndtligduu5vhq.png" alt="Verdict with risk score and model accuracy" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The day list, packing list, and whether the constraint check passed.&lt;/strong&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%2Fzcc9m0lvw6it19av8vng.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%2Fzcc9m0lvw6it19av8vng.png" alt="Day plan, packing list, and constraint check" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The map. Recorded landslides, rain grid, stays.&lt;/strong&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%2Fu5v4r1n3c27082ok4u4v.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%2Fu5v4r1n3c27082ok4u4v.png" alt="Map with landslides, weather, and stays" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Refresh the saved link. The plan is still there.&lt;/strong&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%2Fyd1mjnfq8sqvsnrbatmy.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%2Fyd1mjnfq8sqvsnrbatmy.png" alt="Saved plan URL still open after refresh" width="800" height="600"&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/ashwintemkar" rel="noopener noreferrer"&gt;
        ashwintemkar
      &lt;/a&gt; / &lt;a href="https://github.com/ashwintemkar/opentrips" rel="noopener noreferrer"&gt;
        opentrips
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Should I go out this weekend? Rain/landslide risk + AI trip planning, anywhere in the world. Built for Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.
    &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;OpenTrips&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Should I go out this weekend?&lt;/p&gt;
&lt;p&gt;You name a place, pick dates, and describe yourself in one sentence. OpenTrips returns a rain and landslide risk verdict with the model's measured accuracy, plus a day by day outdoor plan and a packing list. The plan is for walks, hills, and camps. It is not a hotel itinerary.&lt;/p&gt;
&lt;p&gt;Built for the Hacktoberfest Open Source AI Challenge, Week 1, Touch Grass.&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ashwintemkar/opentrips" rel="noopener noreferrer"&gt;https://github.com/ashwintemkar/opentrips&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Risk model&lt;/td&gt;
&lt;td&gt;TabPFN on real NASA landslide events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plan model&lt;/td&gt;
&lt;td&gt;Qwen3 8B, fine tuned with Tinker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weather&lt;/td&gt;
&lt;td&gt;Open Meteo, no API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maps&lt;/td&gt;
&lt;td&gt;OpenStreetMap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What you get&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;A verdict of go, caution, or wait, and the accuracy number 0.899 on the screen.&lt;/li&gt;
&lt;li&gt;Days, distances, a packing list, and a pass or fail check against your budget and ability.&lt;/li&gt;
&lt;li&gt;A map of recorded landslides nearby, the forecast grid, and places to stay.&lt;/li&gt;
&lt;li&gt;A link you can reopen. A plan you…&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/ashwintemkar/opentrips" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/ashwintemkar/opentrips" rel="noopener noreferrer"&gt;https://github.com/ashwintemkar/opentrips&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;What a judge can check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;landslide_dataset.csv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,935 training rows, events and non events, rainfall features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;train_tabpfn.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Time split and India held out split, versus majority and logistic regression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;add_india_negatives.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Random India non events, so the India test has both classes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;train_plan_model.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tinker fine tune of Qwen3 8B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;compare_plans.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Base model versus fine tuned model on held out requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;plan_examples.jsonl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The 24 outdoor prompt and JSON pairs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rule_checker.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Budget and distance checks, used live by the API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;main.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;POST /risk&lt;/code&gt; and &lt;code&gt;POST /plan&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;frontend/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Form, results, map, saved plan page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;Two services. Kiran built the Next.js app people touch. I built the data, TabPFN, the Tinker fine tune, and the FastAPI service. Open Meteo and OpenStreetMap sit in the middle. Neither needs a paid key.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    U[Person] --&amp;gt; WEB[Next.js on Render]
    WEB --&amp;gt; GEO[OpenStreetMap place search]
    WEB --&amp;gt; RISK[POST /risk]
    WEB --&amp;gt; PLAN[POST /plan]
    WEB --&amp;gt; MAP[Map and nearby layers]
    RISK --&amp;gt; METEO[Open Meteo forecast]
    RISK --&amp;gt; TAB[TabPFN on NASA landslide rows]
    PLAN --&amp;gt; QWEN[Qwen3 8B fine tuned on Tinker]
    MAP --&amp;gt; NASA[NASA events near the pin]
    WEB --&amp;gt; DB[Postgres saved plan link]&lt;/code&gt;&lt;/pre&gt;





&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    participant P as Person
    participant W as Web app
    participant R as Risk API
    participant L as Plan model
    P-&amp;gt;&amp;gt;W: Place, dates, constraints
    W-&amp;gt;&amp;gt;W: Resolve the place on OpenStreetMap
    W-&amp;gt;&amp;gt;R: Latitude, longitude, dates
    R-&amp;gt;&amp;gt;R: Rain windows from Open Meteo
    R--&amp;gt;&amp;gt;W: Risk, verdict, accuracy 0.899
    W-&amp;gt;&amp;gt;L: The sentence plus that risk
    L--&amp;gt;&amp;gt;W: Days, packing, warnings, checks
    W--&amp;gt;&amp;gt;P: Plan link they can reopen&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  TabPFN, on recorded events
&lt;/h3&gt;

&lt;p&gt;The training table is the NASA Global Landslide Catalog plus rainfall from the Open Meteo archive. The raw export has 11,033 events in 142 countries. We kept events located within 10 km. 786 India events passed that filter. 775 of those have rainfall and are in the csv. We sampled the rest of the world down for runtime. Each event gets 1 day, 3 day, 7 day, and 14 day rainfall ending on the event date. Non events are random places and dates run through the same rainfall pipeline. The 496 India non events come from add_india_negatives.py, so the India test has both classes. They are not rainy days at known landslide places with no recorded event. A cut on 14 day rain alone scores 0.819 on India, close to the logistic regression.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;landslide_dataset.csv&lt;/code&gt; has 3,935 rows. It is committed so the result is not a claim judges have to take on faith.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A[NASA catalog, 11033 events, 142 countries] --&amp;gt; B[Keep location accuracy within 10 km]
    B --&amp;gt; C[775 India events with rain in the csv]
    B --&amp;gt; D[960 events sampled from the rest of the world]
    C --&amp;gt; E[Open Meteo archive rain]
    D --&amp;gt; E
    E --&amp;gt; F[1, 3, 7, and 14 day rainfall]
    G[Random non events, same rain features] --&amp;gt; H[Plus 496 India non events]
    F --&amp;gt; I[landslide_dataset.csv, 3935 rows]
    H --&amp;gt; I
    I --&amp;gt; J[TabPFN fit at API startup]&lt;/code&gt;&lt;/pre&gt;





&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    subgraph timeSplit [Time split]
        T1[Older rows of each class] --&amp;gt; T2[Train]
        T3[Last 20 percent of each class] --&amp;gt; T4[Test]
    end
    subgraph geoSplit [India held out]
        G1[Every country except India] --&amp;gt; G2[Train]
        G3[India events and India non events only] --&amp;gt; G4[Test]
    end
    T2 --&amp;gt; M[TabPFN versus majority versus logistic regression]
    T4 --&amp;gt; M
    G2 --&amp;gt; M
    G4 --&amp;gt; M&lt;/code&gt;&lt;/pre&gt;





&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    R[Live forecast rain plus latitude and longitude] --&amp;gt; P[TabPFN probability]
    P --&amp;gt; W{Score}
    W --&amp;gt;|above 0.6| WAIT[wait]
    W --&amp;gt;|above 0.3| CAUTION[caution]
    W --&amp;gt;|otherwise| GO[go]
    WAIT --&amp;gt; UI[Shown with accuracy 0.899]
    CAUTION --&amp;gt; UI
    GO --&amp;gt; UI&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;At request time the API pulls the live forecast for those same rainfall windows and asks TabPFN for the probability of a landslide style event. Above 0.6 is wait. Above 0.3 is caution. Otherwise go. The number on the card is the geography split, 0.899. The training table is about 44 percent events, far more common than a real weekend, so the 0.6 and 0.3 cuts are not the chance a wet weekend is safe. Precision and recall stay blank, because we did not compute them. We did not make a calibration plot.&lt;/p&gt;

&lt;p&gt;The first evaluation runs looked strong and were wrong. One split had no India non events, so the model was mostly saying "event." We fixed the data and published the number from the fixed split. The holdout is the country tag, not a distance buffer. 130 of the 1,271 India test rows are within 10 km of a training event. The median distance is 99 km. The time split is stratified too. The last 20 percent of each class by date, not one global sort that dumped almost all of one class into the test slice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tinker, on an open weight model
&lt;/h3&gt;

&lt;p&gt;The plan is not a second call to a general chat model. The base model is &lt;code&gt;Qwen/Qwen3-8B&lt;/code&gt;, which is open weight. We fine tuned a LoRA of rank 16 on Tinker.&lt;/p&gt;

&lt;p&gt;Training data is 24 hand written prompt and JSON pairs. Places include India, the US, the UK, Switzerland, Nepal, Japan, Peru, New Zealand, Kenya, France, Iceland, and South Africa. Constraints include a bad knee, asthma, an elderly parent, a toddler, fear of heights, and pregnancy. The instruction prefix is the same at training time and at request time.&lt;/p&gt;

&lt;p&gt;The first run was a single gradient step. The model still wrote chain of thought and ignored the JSON. A 20 epoch loop fixed that. The model then repeated the answer until the token limit, because it never learned to stop. We keep the first balanced JSON object instead of training again.&lt;/p&gt;

&lt;p&gt;A rule checker scores each plan. Valid JSON, at least one day, a packing list, budget at or under the number in the sentence, and distance per day inside a cap inferred from words like beginner or advanced. Held out result:&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;Pass rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base Qwen3 8B&lt;/td&gt;
&lt;td&gt;0 of 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fine tuned checkpoint&lt;/td&gt;
&lt;td&gt;8 of 10, small sample&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The live &lt;code&gt;/plan&lt;/code&gt; route runs that checker. &lt;code&gt;checks_passed&lt;/code&gt; is the checker result. It is not hardcoded to true.&lt;/p&gt;

&lt;p&gt;Checkpoint: &lt;code&gt;tinker://4deeaa51-09a3-5d86-8281-29ad275d2c0c:train:0/sampler_weights/opentrips-plan-v1&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What the app does around those two models
&lt;/h3&gt;

&lt;p&gt;The form resolves the place with OpenStreetMap Nominatim, then calls &lt;code&gt;/risk&lt;/code&gt; and &lt;code&gt;/plan&lt;/code&gt;. The results page shows the verdict, the accuracy, the itinerary, and a Leaflet map. Map layers are nearby NASA landslide points, an Open Meteo weather grid, and stays ranked by distance and by how close they are to a recorded landslide. A plan can be saved and reopened by link. A service worker caches a plan page you already opened, so that page still loads with no signal.&lt;/p&gt;

&lt;p&gt;That is the offline behavior. The models do not run on the phone in the forest. The plan is made before you leave, then cached.&lt;/p&gt;

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

&lt;p&gt;A closed chat API can write a pleasant itinerary. It cannot show a measured error rate on landslide records it was never trained on, and you cannot ship the training table next to the code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Closed default&lt;/th&gt;
&lt;th&gt;What open made possible&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ask a hosted chat model if the weekend looks fine&lt;/td&gt;
&lt;td&gt;TabPFN on a public CSV of real events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Labels the author wrote, then a model that copies them&lt;/td&gt;
&lt;td&gt;Labels are recorded reports, with a majority baseline and a logistic regression baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One country, no held out region&lt;/td&gt;
&lt;td&gt;India-tagged rows held out, tested only on those rows, 0.899 accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A base model that chats&lt;/td&gt;
&lt;td&gt;Fine tuned open weight Qwen3 8B that emits JSON, 8 of 10 versus 0 of 10, small sample&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weather behind a paid key&lt;/td&gt;
&lt;td&gt;Open Meteo, no key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maps behind a paid vendor&lt;/td&gt;
&lt;td&gt;OpenStreetMap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model swap means a new product&lt;/td&gt;
&lt;td&gt;The CSV, the checker, and the API stay. The checkpoint can change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Qwen3 8B weights are public. Tinker let us change them for this task and keep the checkpoint. TabPFN let us treat a few thousand rows as a classifier without standing up a training cluster. The dataset is in the repo so someone else can rerun the comparison.&lt;/p&gt;

&lt;p&gt;We do not claim the phone runs the model with no signal. A new plan needs the server, because the forecast and the models run there. The honest offline piece is the saved plan you already opened.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of TabPFN. The risk score is TabPFN on historical landslide rows. Baselines are in the table above. Accuracy 0.899 is on every result.&lt;/li&gt;
&lt;li&gt;Best Use of Tinker. Qwen3 8B fine tuned to write the plan. Held out pass rate 8 of 10 against 0 of 10 for the base model, a small sample.&lt;/li&gt;
&lt;li&gt;Best Use of Render. The FastAPI model service and the Next.js app are both hosted on Render.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading. If the verdict says go, close the tab.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>Mentor Me - an AI mentor that reviews code the way I actually would</title>
      <dc:creator>Ashwin Temkar</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:50:03 +0000</pubDate>
      <link>https://dev.to/ashwintemkar/mentor-me-an-ai-mentor-that-reviews-code-the-way-i-actually-would-3e4k</link>
      <guid>https://dev.to/ashwintemkar/mentor-me-an-ai-mentor-that-reviews-code-the-way-i-actually-would-3e4k</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Mentor Me is an AI mentor for a junior developer I informally mentor. She gets code review and "why would you do it this way" answers from me whenever I have a free minute, which is inconsistent and usually late at night. Mentor Me reviews her code on her own schedule and writes up what actually matters so she's never stuck waiting on me, and the feedback still reads like mine, not a generic bot's.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://mentor-me.ashwintemkar.com" rel="noopener noreferrer"&gt;https://mentor-me.ashwintemkar.com&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/ashwintemkar/mentor-me" rel="noopener noreferrer"&gt;https://github.com/ashwintemkar/mentor-me&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backboard&lt;/strong&gt; routes the review request through a single API key to an open-weight model, so the mentor agent isn't locked to one provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tinker&lt;/strong&gt; (Thinking Machines) fine-tunes a small open model with LoRA on a corpus of my own past review comments, so its feedback carries my actual tone and priorities instead of generic LLM notes. &lt;code&gt;finetune/compare.py&lt;/code&gt; samples the base model and the fine-tuned checkpoint on the same prompt, side by side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; hosts the app itself (via a &lt;code&gt;render.yaml&lt;/code&gt; Blueprint), so my mentee just opens a link nothing runs on my machine for her to depend on.&lt;/li&gt;
&lt;li&gt;Sign-in (Google/GitHub) and sessions run on Supabase Auth.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This only works because the model is open-weight. I can fine-tune it on my own private review history no closed, hosted model lets an individual mentor do that without becoming an enterprise customer. Backboard means I'm not locked to one model or vendor, so I can route to whichever open model is cheapest or sharpest that week. And because it costs next to nothing to run, my mentee can ask for a review as often as she wants without anyone metering her, or her mistakes sitting on a server neither of us controls beyond the inference call itself.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Tinker (Thinking Machines)&lt;/li&gt;
&lt;li&gt;Best Use of Backboard&lt;/li&gt;
&lt;li&gt;Best Use of Render&lt;/li&gt;
&lt;/ul&gt;

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