<?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: Gyan prakash Tiwari</title>
    <description>The latest articles on DEV Community by Gyan prakash Tiwari (@gyanprakasht987).</description>
    <link>https://dev.to/gyanprakasht987</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Gyan prakash Tiwari</title>
      <link>https://dev.to/gyanprakasht987</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gyanprakasht987"/>
    <language>en</language>
    <item>
      <title>Dabba: Turning WhatsApp Tiffin Orders into Tomorrow’s Cooking Plan</title>
      <dc:creator>Gyan prakash Tiwari</dc:creator>
      <pubDate>Thu, 15 Oct 2026 16:42:20 +0000</pubDate>
      <link>https://dev.to/gyanprakasht987/dabba-turning-whatsapp-tiffin-orders-into-tomorrows-cooking-plan-41l6</link>
      <guid>https://dev.to/gyanprakasht987/dabba-turning-whatsapp-tiffin-orders-into-tomorrows-cooking-plan-41l6</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/t/devchallenge"&gt;#devchallenge&lt;/a&gt; &lt;a href="https://dev.to/t/hf26challenge"&gt;#hf26challenge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every evening, WhatsApp groups across Indian neighbourhoods fill up with messages like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[14/10/26, 9:12 PM] Priya Sharma: kal 2 veg thali lunch, no onion
[14/10/26, 9:40 PM] Rahul Verma: parso ka dabba cancel kar do
[14/10/26, 10:05 PM] Megha Jain: kal se 6 din band, bahar ja rahe
[14/10/26, 10:31 PM] Harsh Khan: 1 dabba kl afternoon 12 bje
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a home tiffin business, these are not casual messages. They are tomorrow’s production plan.&lt;/p&gt;

&lt;p&gt;The owner has to understand the Hinglish, resolve words like &lt;code&gt;kal&lt;/code&gt; and &lt;code&gt;parso&lt;/code&gt;, remember each customer’s usual dish, count the orders, and decide how much food to prepare before sunrise.&lt;/p&gt;

&lt;p&gt;Cook too much, and food and profit go to waste.&lt;/p&gt;

&lt;p&gt;Cook too little, and a regular customer may order somewhere else.&lt;/p&gt;

&lt;p&gt;Most small tiffin kitchens still manage this process with a notebook, a calculator, and memory.&lt;/p&gt;

&lt;p&gt;That is the problem &lt;strong&gt;Dabba&lt;/strong&gt; is designed to solve.&lt;/p&gt;

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

&lt;p&gt;Dabba converts a WhatsApp conversation into a structured order list and a practical kitchen prep plan.&lt;/p&gt;

&lt;p&gt;The workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste the evening’s WhatsApp messages.&lt;/li&gt;
&lt;li&gt;Parse each message into a structured order.&lt;/li&gt;
&lt;li&gt;Resolve relative dates such as &lt;code&gt;kal&lt;/code&gt;, &lt;code&gt;parso&lt;/code&gt;, and &lt;code&gt;Monday&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use kitchen memory to understand customer-specific phrases like &lt;code&gt;1 dabba&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Forecast the final demand for each dish and meal.&lt;/li&gt;
&lt;li&gt;Show the owner how many portions to cook, along with a confidence range.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, Dabba knows that Harsh’s simple message, &lt;code&gt;1 dabba&lt;/code&gt;, usually means a paneer thali. It can also understand that Megha’s “six days off” means fewer orders every day until she returns.&lt;/p&gt;

&lt;p&gt;The final result is a prep list such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Paneer thali       Cook 34   Possible range: 31–38
Veg thali          Cook 22   Possible range: 20–25
Rajma rice         Cook 16   Possible range: 14–18
Rotis              86
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is simple: help a small kitchen make better decisions before the cooking starts.&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw0lez4olgdob0dlxzxco.gif"&gt;Dabba demo: paste a WhatsApp group, generate orders, and update kitchen memory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hosted demo: &lt;a href="https://dabba-jgho.onrender.com" rel="noopener noreferrer"&gt;&lt;strong&gt;https://dabba-jgho.onrender.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The free Render instance may take about a minute to wake up.&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;Use tonight’s sample&lt;/strong&gt; to load twelve example messages. Dabba parses the messages in roughly 12 seconds and generates a prep plan in about 30 seconds.&lt;/p&gt;

&lt;p&gt;The most important demo interaction is the correction flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Harsh’s &lt;code&gt;1 dabba&lt;/code&gt; is initially interpreted as the wrong dish.&lt;/li&gt;
&lt;li&gt;The owner changes it to a paneer thali.&lt;/li&gt;
&lt;li&gt;Dabba stores that correction as kitchen memory.&lt;/li&gt;
&lt;li&gt;The next time Harsh writes &lt;code&gt;1 dabba&lt;/code&gt;, Dabba remembers that he usually wants paneer.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h3&gt;
  
  
  Dabba — kitchen operations for a home tiffin business
&lt;/h3&gt;

&lt;p&gt;Dabba combines three components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Order parsing:&lt;/strong&gt; Qwen3.5-4B fine-tuned with a LoRA adapter using &lt;a href="https://thinkingmachines.ai/tinker/" rel="noopener noreferrer"&gt;Tinker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demand forecasting:&lt;/strong&gt; &lt;a href="https://priorlabs.ai/" rel="noopener noreferrer"&gt;TabPFN&lt;/a&gt; predicts tomorrow’s demand for each dish and meal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kitchen memory:&lt;/strong&gt; &lt;a href="https://backboard.io/" rel="noopener noreferrer"&gt;Backboard&lt;/a&gt; stores customer preferences and past corrections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; The web app runs on &lt;a href="https://render.com/" rel="noopener noreferrer"&gt;Render&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basic setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv venv &lt;span class="nt"&gt;--python&lt;/span&gt; 3.12
uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements-train.txt
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the required environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TINKER_API_KEY
BACKBOARD_API_KEY
TABPFN_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then generate the simulated kitchen data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.venv/bin/python data/simulate.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The complete source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/its-kumar-yash/dabba" rel="noopener noreferrer"&gt;&lt;strong&gt;View the Dabba repository&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Parsing messy WhatsApp messages with a fine-tuned 4B model
&lt;/h3&gt;

&lt;p&gt;The difficult part is not recognizing words such as &lt;code&gt;thali&lt;/code&gt; or &lt;code&gt;lunch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The difficult part is understanding the context.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Kal&lt;/code&gt; means tomorrow, but tomorrow depends on the date attached to that particular WhatsApp message.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Parso&lt;/code&gt; means the day after tomorrow.&lt;/p&gt;

&lt;p&gt;A message sent on Thursday saying &lt;code&gt;Monday&lt;/code&gt; refers to a different date than the same message sent on Sunday.&lt;/p&gt;

&lt;p&gt;A general-purpose model has to calculate all of this each time. Dabba’s parser was trained on examples where these relationships are explicit.&lt;/p&gt;

&lt;p&gt;I generated the training data from a simulated tiffin kitchen. Eighty customers have different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usual dishes&lt;/li&gt;
&lt;li&gt;Meal preferences&lt;/li&gt;
&lt;li&gt;Office days&lt;/li&gt;
&lt;li&gt;Travel breaks&lt;/li&gt;
&lt;li&gt;Delivery times&lt;/li&gt;
&lt;li&gt;Ordering habits&lt;/li&gt;
&lt;li&gt;Churn patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The simulator produced five months of orders. Each order was then converted into a WhatsApp-style message using Hinglish, English, and Roman Hindi templates.&lt;/p&gt;

&lt;p&gt;Because the program generated both the message and the label, the training labels were exact. Around one-quarter of the messages also included realistic typos, lowercase text, and informal spelling.&lt;/p&gt;

&lt;p&gt;The model was trained with a standard Tinker loop:&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="n"&gt;tc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_lora_training_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Qwen/Qwen3.5-4B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;renderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_renderer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen3_5_disable_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tokenizer&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;129&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forward_backward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cross_entropy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;optim_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;adam_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tinker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AdamParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sampler_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save_weights_for_sampler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dabba-v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The training used three epochs and 129 steps. The total training cost was under two dollars.&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluation
&lt;/h3&gt;

&lt;p&gt;I evaluated the models on the same 200 held-out messages.&lt;/p&gt;

&lt;p&gt;The baselines were zero-shot versions of the original Qwen3.5-4B model and gpt-oss-120b.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Valid JSON&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Items&lt;/th&gt;
&lt;th&gt;Preferences&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;All fields&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;P50 latency&lt;/th&gt;
&lt;th&gt;Cost / 1k messages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-4B zero-shot&lt;/td&gt;
&lt;td&gt;72%&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;td&gt;53%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;66%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.1 s&lt;/td&gt;
&lt;td&gt;$0.52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-120b zero-shot&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;38%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.8 s&lt;/td&gt;
&lt;td&gt;$0.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-4B + Dabba LoRA&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;99%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.3 s&lt;/td&gt;
&lt;td&gt;$0.49&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The larger model produced valid JSON more consistently, but it struggled with relative dates. The fine-tuned 4B model performed much better on the actual task because it had learned the structure of these messages.&lt;/p&gt;

&lt;p&gt;The four missed examples from the fine-tuned model were caused by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two templates where the delivery time was missing from the message&lt;/li&gt;
&lt;li&gt;One dropped &lt;code&gt;jain&lt;/code&gt; preference&lt;/li&gt;
&lt;li&gt;One date error involving &lt;code&gt;kal&lt;/code&gt; from the night of 30 May&lt;/li&gt;
&lt;/ul&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%2Ft482gr3opf7znchrjzp9.png"&gt;All-fields and items accuracy on 200 held-out messages&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Kitchen memory with Backboard
&lt;/h3&gt;

&lt;p&gt;A language model cannot know that Harsh’s &lt;code&gt;1 dabba&lt;/code&gt; means paneer.&lt;/p&gt;

&lt;p&gt;That information belongs to the kitchen.&lt;/p&gt;

&lt;p&gt;When the owner corrects an order, Dabba stores a simple memory in Backboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST /assistants/&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;/memories

&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"content"&lt;/span&gt;: &lt;span class="s2"&gt;"Harsh Khan: usual dish paneer_thali, prefs no_onion."&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before parsing a new message, Dabba searches the kitchen memories using the sender and message text. It keeps only memories that belong to that customer and adds them to the prompt under a section called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Known rules from the kitchen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no extra language model involved in storing or retrieving these facts. They are treated as structured operational knowledge.&lt;/p&gt;

&lt;p&gt;On 35 test messages where regular customers wrote only &lt;code&gt;dabba&lt;/code&gt;, the fine-tuned parser selected the correct dish 100% of the time when the relevant kitchen memory was available.&lt;/p&gt;

&lt;p&gt;That is the kind of information a model should not have to guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Forecasting tomorrow’s demand with TabPFN
&lt;/h3&gt;

&lt;p&gt;At around 9 pm, the kitchen has three important pieces of information:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Historical sales for each dish&lt;/li&gt;
&lt;li&gt;The date and weekday for tomorrow&lt;/li&gt;
&lt;li&gt;The orders already booked for tomorrow&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The advance orders are especially useful. They are a known future signal, so I included them as a feature in the forecasting model.&lt;/p&gt;

&lt;p&gt;For each dish and meal, Dabba builds features such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;day of week
day of month
holiday indicator
Navratri indicator
advance orders
lag 1
lag 7
lag 14
7-day average demand
28-day average demand
7-day average advance orders
advance-order share
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rain is present in the historical data but deliberately excluded from the feature set. At 9 pm, the owner does not reliably know tomorrow’s weather, so the model should not use information that would not be available at decision time.&lt;/p&gt;

&lt;p&gt;The model is a &lt;code&gt;TabPFNRegressor&lt;/code&gt; from Prior Labs. It is fitted on the historical data and asked for the 10th, 50th, and 90th percentile predictions.&lt;/p&gt;

&lt;p&gt;I evaluated the model over the last 28 days using walk-forward validation and compared it with the rules of thumb a kitchen owner might normally use.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Predictor&lt;/th&gt;
&lt;th&gt;MAE in dabbas&lt;/th&gt;
&lt;th&gt;Over-cooked / day&lt;/th&gt;
&lt;th&gt;Under-cooked / day&lt;/th&gt;
&lt;th&gt;Exactly right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Same as yesterday&lt;/td&gt;
&lt;td&gt;2.56&lt;/td&gt;
&lt;td&gt;18.1&lt;/td&gt;
&lt;td&gt;17.7&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7-day average&lt;/td&gt;
&lt;td&gt;2.30&lt;/td&gt;
&lt;td&gt;15.7&lt;/td&gt;
&lt;td&gt;16.5&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same weekday last week&lt;/td&gt;
&lt;td&gt;1.79&lt;/td&gt;
&lt;td&gt;12.6&lt;/td&gt;
&lt;td&gt;12.5&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advance orders ÷ usual advance share&lt;/td&gt;
&lt;td&gt;1.55&lt;/td&gt;
&lt;td&gt;12.4&lt;/td&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradient boosting&lt;/td&gt;
&lt;td&gt;1.07&lt;/td&gt;
&lt;td&gt;7.3&lt;/td&gt;
&lt;td&gt;7.7&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TabPFN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.90&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;51%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The evaluation contained 392 dish-day predictions across 14 dish-and-meal series.&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%2Fsxcq4053clih15lcatjw.png"&gt;Actual demand versus TabPFN’s median prediction and 10–90% range&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The important business metric is not only MAE.&lt;/p&gt;

&lt;p&gt;For a kitchen, overproduction and underproduction have different costs. Extra food becomes waste, while cooking slightly more can prevent a missed order.&lt;/p&gt;

&lt;p&gt;The owner’s rule mis-cooked roughly 22 dabbas per day across the menu. TabPFN reduced that to around 13. Its predictions still leaned slightly toward underproduction, so the app uses the upper part of the prediction range when extra cooking is relatively inexpensive.&lt;/p&gt;

&lt;p&gt;One limitation is worth calling out: the requested 10–90% prediction band covered 97% of the observed outcomes. The interval is therefore wider than its nominal confidence level suggests.&lt;/p&gt;

&lt;p&gt;For this use case, wider bands are safer than false precision, but the calibration still needs improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Hosting on Render
&lt;/h3&gt;

&lt;p&gt;The hosted version runs as a single Python web service on Render.&lt;/p&gt;

&lt;p&gt;The 4B parser is accessed through Tinker’s sampling API because the free 512 MB service cannot hold the model locally. TabPFN also runs through Prior Labs’ API for the same reason.&lt;/p&gt;

&lt;p&gt;The repository includes support for alternative local configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ollama for running the parser locally&lt;/li&gt;
&lt;li&gt;Local TabPFN weights for offline forecasting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hosted version was the one I measured for this submission, but the local path is important for kitchens that do not want customer messages leaving the house.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters Here
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Small models can be enough
&lt;/h3&gt;

&lt;p&gt;The fine-tuned 4B model beat the much larger zero-shot model on this specific task.&lt;/p&gt;

&lt;p&gt;The reason was not raw scale. It was specialization.&lt;/p&gt;

&lt;p&gt;A small adapter trained on the language, date expressions, and ordering patterns of a tiffin kitchen was more useful than a much larger model that had not seen the task in the same way.&lt;/p&gt;

&lt;h3&gt;
  
  
  The kitchen can keep its own data
&lt;/h3&gt;

&lt;p&gt;WhatsApp messages contain names, routines, preferences, travel plans, and delivery information.&lt;/p&gt;

&lt;p&gt;That data should not automatically become part of somebody else’s model or cloud system.&lt;/p&gt;

&lt;p&gt;Dabba can run with a local parser and local forecasting components, giving the kitchen a path toward keeping its operational data in-house.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forecasting should be accessible
&lt;/h3&gt;

&lt;p&gt;Demand forecasting is usually associated with large companies, data teams, and expensive infrastructure.&lt;/p&gt;

&lt;p&gt;TabPFN makes it possible to fit a useful tabular model on a relatively small dataset without building a large forecasting pipeline from scratch.&lt;/p&gt;

&lt;p&gt;The owner does not need to see the model internals. They need an answer such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cook 34 portions.
Likely range: 31–38.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the useful abstraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest Limitations
&lt;/h2&gt;

&lt;p&gt;The kitchen is simulated.&lt;/p&gt;

&lt;p&gt;The customers, habits, festival effects, and demand patterns were generated by me. The parser’s messages also come from 26 templates across three language registers.&lt;/p&gt;

&lt;p&gt;The test set was held out, but it still comes from the same simulated distribution.&lt;/p&gt;

&lt;p&gt;That means the results show that the method works on a realistic prototype workload. They do not prove that it will work equally well for every real kitchen.&lt;/p&gt;

&lt;p&gt;The next step is collecting more real, anonymised examples from different tiffin services.&lt;/p&gt;

&lt;h2&gt;
  
  
  My First Real User
&lt;/h2&gt;

&lt;p&gt;I tested Dabba with a two-person tiffin kitchen near my flat. The kitchen uses one WhatsApp group and a notebook.&lt;/p&gt;

&lt;p&gt;I received eleven messages with the names changed. All eleven were parsed successfully.&lt;/p&gt;

&lt;p&gt;One regular customer’s &lt;code&gt;1 dabba&lt;/code&gt; was initially interpreted as a veg thali, even though he normally orders rajma. The owner corrected the row, Dabba stored the correction, and the next two messages from that customer were interpreted as rajma.&lt;/p&gt;

&lt;p&gt;The correction flow worked exactly as intended.&lt;/p&gt;

&lt;p&gt;Interestingly, the owner’s first feature request was not the forecast.&lt;/p&gt;

&lt;p&gt;She wanted a printable delivery list with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer name&lt;/li&gt;
&lt;li&gt;Dish&lt;/li&gt;
&lt;li&gt;Quantity&lt;/li&gt;
&lt;li&gt;Delivery time&lt;/li&gt;
&lt;li&gt;Preferences such as &lt;code&gt;no onion&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a small feature, but it is also a useful reminder that the best product roadmap usually comes from watching someone use the tool.&lt;/p&gt;

&lt;p&gt;Her next request was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Agar yeh bill bhi bana de.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In English: “It would be great if it could make the monthly bill too.”&lt;/p&gt;

&lt;p&gt;That is probably the next feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built Dabba with Claude Code over three evenings.&lt;/p&gt;

&lt;p&gt;The session covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The kitchen simulator&lt;/li&gt;
&lt;li&gt;Training data generation&lt;/li&gt;
&lt;li&gt;Tinker fine-tuning&lt;/li&gt;
&lt;li&gt;TabPFN forecasting&lt;/li&gt;
&lt;li&gt;Backboard memory&lt;/li&gt;
&lt;li&gt;The web interface&lt;/li&gt;
&lt;li&gt;Render deployment&lt;/li&gt;
&lt;li&gt;Evaluation scripts&lt;/li&gt;
&lt;li&gt;Debugging two labelling issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent also helped identify bugs by inspecting the error files instead of assuming the first result was correct.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Thinking Machines — Tinker&lt;/li&gt;
&lt;li&gt;Prior Labs — TabPFN&lt;/li&gt;
&lt;li&gt;Render&lt;/li&gt;
&lt;li&gt;Backboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dabba is a small tool for a very practical problem: helping a local kitchen decide what to cook tomorrow morning.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Dabba: Turning WhatsApp Tiffin Orders into Tomorrow’s Cooking Plan</title>
      <dc:creator>Gyan prakash Tiwari</dc:creator>
      <pubDate>Thu, 15 Oct 2026 16:34:01 +0000</pubDate>
      <link>https://dev.to/gyanprakasht987/dabba-turning-whatsapp-tiffin-orders-into-tomorrows-cooking-plan-2kll</link>
      <guid>https://dev.to/gyanprakasht987/dabba-turning-whatsapp-tiffin-orders-into-tomorrows-cooking-plan-2kll</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/t/devchallenge"&gt;#devchallenge&lt;/a&gt; &lt;a href="https://dev.to/t/hf26challenge"&gt;#hf26challenge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every evening, WhatsApp groups across Indian neighbourhoods fill up with messages like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[14/10/26, 9:12 PM] Priya Sharma: kal 2 veg thali lunch, no onion
[14/10/26, 9:40 PM] Rahul Verma: parso ka dabba cancel kar do
[14/10/26, 10:05 PM] Megha Jain: kal se 6 din band, bahar ja rahe
[14/10/26, 10:31 PM] Harsh Khan: 1 dabba kl afternoon 12 bje
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a home tiffin business, these are not casual messages. They are tomorrow’s production plan.&lt;/p&gt;

&lt;p&gt;The owner has to understand the Hinglish, resolve words like &lt;code&gt;kal&lt;/code&gt; and &lt;code&gt;parso&lt;/code&gt;, remember each customer’s usual dish, count the orders, and decide how much food to prepare before sunrise.&lt;/p&gt;

&lt;p&gt;Cook too much, and food and profit go to waste.&lt;/p&gt;

&lt;p&gt;Cook too little, and a regular customer may order somewhere else.&lt;/p&gt;

&lt;p&gt;Most small tiffin kitchens still manage this process with a notebook, a calculator, and memory.&lt;/p&gt;

&lt;p&gt;That is the problem &lt;strong&gt;Dabba&lt;/strong&gt; is designed to solve.&lt;/p&gt;

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

&lt;p&gt;Dabba converts a WhatsApp conversation into a structured order list and a practical kitchen prep plan.&lt;/p&gt;

&lt;p&gt;The workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste the evening’s WhatsApp messages.&lt;/li&gt;
&lt;li&gt;Parse each message into a structured order.&lt;/li&gt;
&lt;li&gt;Resolve relative dates such as &lt;code&gt;kal&lt;/code&gt;, &lt;code&gt;parso&lt;/code&gt;, and &lt;code&gt;Monday&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use kitchen memory to understand customer-specific phrases like &lt;code&gt;1 dabba&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Forecast the final demand for each dish and meal.&lt;/li&gt;
&lt;li&gt;Show the owner how many portions to cook, along with a confidence range.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, Dabba knows that Harsh’s simple message, &lt;code&gt;1 dabba&lt;/code&gt;, usually means a paneer thali. It can also understand that Megha’s “six days off” means fewer orders every day until she returns.&lt;/p&gt;

&lt;p&gt;The final result is a prep list such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Paneer thali       Cook 34   Possible range: 31–38
Veg thali          Cook 22   Possible range: 20–25
Rajma rice         Cook 16   Possible range: 14–18
Rotis              86
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is simple: help a small kitchen make better decisions before the cooking starts.&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw0lez4olgdob0dlxzxco.gif"&gt;Dabba demo: paste a WhatsApp group, generate orders, and update kitchen memory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hosted demo: &lt;a href="https://dabba-jgho.onrender.com" rel="noopener noreferrer"&gt;&lt;strong&gt;https://dabba-jgho.onrender.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The free Render instance may take about a minute to wake up.&lt;/p&gt;

&lt;p&gt;Press &lt;strong&gt;Use tonight’s sample&lt;/strong&gt; to load twelve example messages. Dabba parses the messages in roughly 12 seconds and generates a prep plan in about 30 seconds.&lt;/p&gt;

&lt;p&gt;The most important demo interaction is the correction flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Harsh’s &lt;code&gt;1 dabba&lt;/code&gt; is initially interpreted as the wrong dish.&lt;/li&gt;
&lt;li&gt;The owner changes it to a paneer thali.&lt;/li&gt;
&lt;li&gt;Dabba stores that correction as kitchen memory.&lt;/li&gt;
&lt;li&gt;The next time Harsh writes &lt;code&gt;1 dabba&lt;/code&gt;, Dabba remembers that he usually wants paneer.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h3&gt;
  
  
  Dabba — kitchen operations for a home tiffin business
&lt;/h3&gt;

&lt;p&gt;Dabba combines three components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Order parsing:&lt;/strong&gt; Qwen3.5-4B fine-tuned with a LoRA adapter using &lt;a href="https://thinkingmachines.ai/tinker/" rel="noopener noreferrer"&gt;Tinker&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demand forecasting:&lt;/strong&gt; &lt;a href="https://priorlabs.ai/" rel="noopener noreferrer"&gt;TabPFN&lt;/a&gt; predicts tomorrow’s demand for each dish and meal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kitchen memory:&lt;/strong&gt; &lt;a href="https://backboard.io/" rel="noopener noreferrer"&gt;Backboard&lt;/a&gt; stores customer preferences and past corrections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; The web app runs on &lt;a href="https://render.com/" rel="noopener noreferrer"&gt;Render&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basic setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv venv &lt;span class="nt"&gt;--python&lt;/span&gt; 3.12
uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements-train.txt
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the required environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TINKER_API_KEY
BACKBOARD_API_KEY
TABPFN_TOKEN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then generate the simulated kitchen data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.venv/bin/python data/simulate.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The complete source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/its-kumar-yash/dabba" rel="noopener noreferrer"&gt;&lt;strong&gt;View the Dabba repository&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Parsing messy WhatsApp messages with a fine-tuned 4B model
&lt;/h3&gt;

&lt;p&gt;The difficult part is not recognizing words such as &lt;code&gt;thali&lt;/code&gt; or &lt;code&gt;lunch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The difficult part is understanding the context.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Kal&lt;/code&gt; means tomorrow, but tomorrow depends on the date attached to that particular WhatsApp message.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Parso&lt;/code&gt; means the day after tomorrow.&lt;/p&gt;

&lt;p&gt;A message sent on Thursday saying &lt;code&gt;Monday&lt;/code&gt; refers to a different date than the same message sent on Sunday.&lt;/p&gt;

&lt;p&gt;A general-purpose model has to calculate all of this each time. Dabba’s parser was trained on examples where these relationships are explicit.&lt;/p&gt;

&lt;p&gt;I generated the training data from a simulated tiffin kitchen. Eighty customers have different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usual dishes&lt;/li&gt;
&lt;li&gt;Meal preferences&lt;/li&gt;
&lt;li&gt;Office days&lt;/li&gt;
&lt;li&gt;Travel breaks&lt;/li&gt;
&lt;li&gt;Delivery times&lt;/li&gt;
&lt;li&gt;Ordering habits&lt;/li&gt;
&lt;li&gt;Churn patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The simulator produced five months of orders. Each order was then converted into a WhatsApp-style message using Hinglish, English, and Roman Hindi templates.&lt;/p&gt;

&lt;p&gt;Because the program generated both the message and the label, the training labels were exact. Around one-quarter of the messages also included realistic typos, lowercase text, and informal spelling.&lt;/p&gt;

&lt;p&gt;The model was trained with a standard Tinker loop:&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="n"&gt;tc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_lora_training_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Qwen/Qwen3.5-4B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;renderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_renderer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qwen3_5_disable_thinking&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tokenizer&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;129&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forward_backward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cross_entropy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;optim_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;adam_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tinker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AdamParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;lr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sampler_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save_weights_for_sampler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dabba-v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;result&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The training used three epochs and 129 steps. The total training cost was under two dollars.&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluation
&lt;/h3&gt;

&lt;p&gt;I evaluated the models on the same 200 held-out messages.&lt;/p&gt;

&lt;p&gt;The baselines were zero-shot versions of the original Qwen3.5-4B model and gpt-oss-120b.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Valid JSON&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Items&lt;/th&gt;
&lt;th&gt;Preferences&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;All fields&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;P50 latency&lt;/th&gt;
&lt;th&gt;Cost / 1k messages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-4B zero-shot&lt;/td&gt;
&lt;td&gt;72%&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;td&gt;53%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;td&gt;66%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.1 s&lt;/td&gt;
&lt;td&gt;$0.52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gpt-oss-120b zero-shot&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;96%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;38%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.8 s&lt;/td&gt;
&lt;td&gt;$0.56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-4B + Dabba LoRA&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;99%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.3 s&lt;/td&gt;
&lt;td&gt;$0.49&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The larger model produced valid JSON more consistently, but it struggled with relative dates. The fine-tuned 4B model performed much better on the actual task because it had learned the structure of these messages.&lt;/p&gt;

&lt;p&gt;The four missed examples from the fine-tuned model were caused by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two templates where the delivery time was missing from the message&lt;/li&gt;
&lt;li&gt;One dropped &lt;code&gt;jain&lt;/code&gt; preference&lt;/li&gt;
&lt;li&gt;One date error involving &lt;code&gt;kal&lt;/code&gt; from the night of 30 May&lt;/li&gt;
&lt;/ul&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%2Ft482gr3opf7znchrjzp9.png"&gt;All-fields and items accuracy on 200 held-out messages&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Kitchen memory with Backboard
&lt;/h3&gt;

&lt;p&gt;A language model cannot know that Harsh’s &lt;code&gt;1 dabba&lt;/code&gt; means paneer.&lt;/p&gt;

&lt;p&gt;That information belongs to the kitchen.&lt;/p&gt;

&lt;p&gt;When the owner corrects an order, Dabba stores a simple memory in Backboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST /assistants/&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;/memories

&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"content"&lt;/span&gt;: &lt;span class="s2"&gt;"Harsh Khan: usual dish paneer_thali, prefs no_onion."&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before parsing a new message, Dabba searches the kitchen memories using the sender and message text. It keeps only memories that belong to that customer and adds them to the prompt under a section called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Known rules from the kitchen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no extra language model involved in storing or retrieving these facts. They are treated as structured operational knowledge.&lt;/p&gt;

&lt;p&gt;On 35 test messages where regular customers wrote only &lt;code&gt;dabba&lt;/code&gt;, the fine-tuned parser selected the correct dish 100% of the time when the relevant kitchen memory was available.&lt;/p&gt;

&lt;p&gt;That is the kind of information a model should not have to guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Forecasting tomorrow’s demand with TabPFN
&lt;/h3&gt;

&lt;p&gt;At around 9 pm, the kitchen has three important pieces of information:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Historical sales for each dish&lt;/li&gt;
&lt;li&gt;The date and weekday for tomorrow&lt;/li&gt;
&lt;li&gt;The orders already booked for tomorrow&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The advance orders are especially useful. They are a known future signal, so I included them as a feature in the forecasting model.&lt;/p&gt;

&lt;p&gt;For each dish and meal, Dabba builds features such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;day of week
day of month
holiday indicator
Navratri indicator
advance orders
lag 1
lag 7
lag 14
7-day average demand
28-day average demand
7-day average advance orders
advance-order share
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rain is present in the historical data but deliberately excluded from the feature set. At 9 pm, the owner does not reliably know tomorrow’s weather, so the model should not use information that would not be available at decision time.&lt;/p&gt;

&lt;p&gt;The model is a &lt;code&gt;TabPFNRegressor&lt;/code&gt; from Prior Labs. It is fitted on the historical data and asked for the 10th, 50th, and 90th percentile predictions.&lt;/p&gt;

&lt;p&gt;I evaluated the model over the last 28 days using walk-forward validation and compared it with the rules of thumb a kitchen owner might normally use.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Predictor&lt;/th&gt;
&lt;th&gt;MAE in dabbas&lt;/th&gt;
&lt;th&gt;Over-cooked / day&lt;/th&gt;
&lt;th&gt;Under-cooked / day&lt;/th&gt;
&lt;th&gt;Exactly right&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Same as yesterday&lt;/td&gt;
&lt;td&gt;2.56&lt;/td&gt;
&lt;td&gt;18.1&lt;/td&gt;
&lt;td&gt;17.7&lt;/td&gt;
&lt;td&gt;24%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7-day average&lt;/td&gt;
&lt;td&gt;2.30&lt;/td&gt;
&lt;td&gt;15.7&lt;/td&gt;
&lt;td&gt;16.5&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same weekday last week&lt;/td&gt;
&lt;td&gt;1.79&lt;/td&gt;
&lt;td&gt;12.6&lt;/td&gt;
&lt;td&gt;12.5&lt;/td&gt;
&lt;td&gt;32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advance orders ÷ usual advance share&lt;/td&gt;
&lt;td&gt;1.55&lt;/td&gt;
&lt;td&gt;12.4&lt;/td&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;td&gt;36%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradient boosting&lt;/td&gt;
&lt;td&gt;1.07&lt;/td&gt;
&lt;td&gt;7.3&lt;/td&gt;
&lt;td&gt;7.7&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TabPFN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.90&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;51%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The evaluation contained 392 dish-day predictions across 14 dish-and-meal series.&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%2Fsxcq4053clih15lcatjw.png"&gt;Actual demand versus TabPFN’s median prediction and 10–90% range&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The important business metric is not only MAE.&lt;/p&gt;

&lt;p&gt;For a kitchen, overproduction and underproduction have different costs. Extra food becomes waste, while cooking slightly more can prevent a missed order.&lt;/p&gt;

&lt;p&gt;The owner’s rule mis-cooked roughly 22 dabbas per day across the menu. TabPFN reduced that to around 13. Its predictions still leaned slightly toward underproduction, so the app uses the upper part of the prediction range when extra cooking is relatively inexpensive.&lt;/p&gt;

&lt;p&gt;One limitation is worth calling out: the requested 10–90% prediction band covered 97% of the observed outcomes. The interval is therefore wider than its nominal confidence level suggests.&lt;/p&gt;

&lt;p&gt;For this use case, wider bands are safer than false precision, but the calibration still needs improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Hosting on Render
&lt;/h3&gt;

&lt;p&gt;The hosted version runs as a single Python web service on Render.&lt;/p&gt;

&lt;p&gt;The 4B parser is accessed through Tinker’s sampling API because the free 512 MB service cannot hold the model locally. TabPFN also runs through Prior Labs’ API for the same reason.&lt;/p&gt;

&lt;p&gt;The repository includes support for alternative local configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ollama for running the parser locally&lt;/li&gt;
&lt;li&gt;Local TabPFN weights for offline forecasting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hosted version was the one I measured for this submission, but the local path is important for kitchens that do not want customer messages leaving the house.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters Here
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Small models can be enough
&lt;/h3&gt;

&lt;p&gt;The fine-tuned 4B model beat the much larger zero-shot model on this specific task.&lt;/p&gt;

&lt;p&gt;The reason was not raw scale. It was specialization.&lt;/p&gt;

&lt;p&gt;A small adapter trained on the language, date expressions, and ordering patterns of a tiffin kitchen was more useful than a much larger model that had not seen the task in the same way.&lt;/p&gt;

&lt;h3&gt;
  
  
  The kitchen can keep its own data
&lt;/h3&gt;

&lt;p&gt;WhatsApp messages contain names, routines, preferences, travel plans, and delivery information.&lt;/p&gt;

&lt;p&gt;That data should not automatically become part of somebody else’s model or cloud system.&lt;/p&gt;

&lt;p&gt;Dabba can run with a local parser and local forecasting components, giving the kitchen a path toward keeping its operational data in-house.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forecasting should be accessible
&lt;/h3&gt;

&lt;p&gt;Demand forecasting is usually associated with large companies, data teams, and expensive infrastructure.&lt;/p&gt;

&lt;p&gt;TabPFN makes it possible to fit a useful tabular model on a relatively small dataset without building a large forecasting pipeline from scratch.&lt;/p&gt;

&lt;p&gt;The owner does not need to see the model internals. They need an answer such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cook 34 portions.
Likely range: 31–38.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the useful abstraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest Limitations
&lt;/h2&gt;

&lt;p&gt;The kitchen is simulated.&lt;/p&gt;

&lt;p&gt;The customers, habits, festival effects, and demand patterns were generated by me. The parser’s messages also come from 26 templates across three language registers.&lt;/p&gt;

&lt;p&gt;The test set was held out, but it still comes from the same simulated distribution.&lt;/p&gt;

&lt;p&gt;That means the results show that the method works on a realistic prototype workload. They do not prove that it will work equally well for every real kitchen.&lt;/p&gt;

&lt;p&gt;The next step is collecting more real, anonymised examples from different tiffin services.&lt;/p&gt;

&lt;h2&gt;
  
  
  My First Real User
&lt;/h2&gt;

&lt;p&gt;I tested Dabba with a two-person tiffin kitchen near my flat. The kitchen uses one WhatsApp group and a notebook.&lt;/p&gt;

&lt;p&gt;I received eleven messages with the names changed. All eleven were parsed successfully.&lt;/p&gt;

&lt;p&gt;One regular customer’s &lt;code&gt;1 dabba&lt;/code&gt; was initially interpreted as a veg thali, even though he normally orders rajma. The owner corrected the row, Dabba stored the correction, and the next two messages from that customer were interpreted as rajma.&lt;/p&gt;

&lt;p&gt;The correction flow worked exactly as intended.&lt;/p&gt;

&lt;p&gt;Interestingly, the owner’s first feature request was not the forecast.&lt;/p&gt;

&lt;p&gt;She wanted a printable delivery list with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer name&lt;/li&gt;
&lt;li&gt;Dish&lt;/li&gt;
&lt;li&gt;Quantity&lt;/li&gt;
&lt;li&gt;Delivery time&lt;/li&gt;
&lt;li&gt;Preferences such as &lt;code&gt;no onion&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a small feature, but it is also a useful reminder that the best product roadmap usually comes from watching someone use the tool.&lt;/p&gt;

&lt;p&gt;Her next request was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Agar yeh bill bhi bana de.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In English: “It would be great if it could make the monthly bill too.”&lt;/p&gt;

&lt;p&gt;That is probably the next feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built Dabba with Claude Code over three evenings.&lt;/p&gt;

&lt;p&gt;The session covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The kitchen simulator&lt;/li&gt;
&lt;li&gt;Training data generation&lt;/li&gt;
&lt;li&gt;Tinker fine-tuning&lt;/li&gt;
&lt;li&gt;TabPFN forecasting&lt;/li&gt;
&lt;li&gt;Backboard memory&lt;/li&gt;
&lt;li&gt;The web interface&lt;/li&gt;
&lt;li&gt;Render deployment&lt;/li&gt;
&lt;li&gt;Evaluation scripts&lt;/li&gt;
&lt;li&gt;Debugging two labelling issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent also helped identify bugs by inspecting the error files instead of assuming the first result was correct.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Thinking Machines — Tinker&lt;/li&gt;
&lt;li&gt;Prior Labs — TabPFN&lt;/li&gt;
&lt;li&gt;Render&lt;/li&gt;
&lt;li&gt;Backboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dabba is a small tool for a very practical problem: helping a local kitchen decide what to cook tomorrow morning.&lt;/p&gt;

&lt;p&gt;It combines a specialised small language model, tabular forecasting, and simple kitchen memory to turn messy WhatsApp messages into an actionable prep list.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
