<?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: Lagnadeep Samal</title>
    <description>The latest articles on DEV Community by Lagnadeep Samal (@lagnadeep_samal_2d1cca395).</description>
    <link>https://dev.to/lagnadeep_samal_2d1cca395</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%2F4165347%2F6f93ef9d-da48-475b-93da-48972d970357.jpeg</url>
      <title>DEV Community: Lagnadeep Samal</title>
      <link>https://dev.to/lagnadeep_samal_2d1cca395</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lagnadeep_samal_2d1cca395"/>
    <language>en</language>
    <item>
      <title>mealmate: a meal planner that can't serve my roommate their allergens</title>
      <dc:creator>Lagnadeep Samal</dc:creator>
      <pubDate>Wed, 07 Oct 2026 07:54:32 +0000</pubDate>
      <link>https://dev.to/lagnadeep_samal_2d1cca395/mealmate-a-meal-planner-that-cant-serve-my-roommate-their-allergens-2a75</link>
      <guid>https://dev.to/lagnadeep_samal_2d1cca395/mealmate-a-meal-planner-that-cant-serve-my-roommate-their-allergens-2a75</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;&lt;strong&gt;mealmate&lt;/strong&gt; is a weekly meal planner for my roommate &lt;strong&gt;om&lt;/strong&gt;, who has food allergies &lt;strong&gt;who has food allergies (peanuts, tree nuts and shellfish)&lt;/strong&gt;. Cooking for the two of us used to mean checking every recipe and every label by hand. A vague "it's probably fine" isn't good enough when the stakes are real.&lt;/p&gt;

&lt;p&gt;You enter your housemate's allergies, favourite foods, dislikes and cooking time. mealmate plans breakfast, lunch and dinner for each day and makes a printable page with a week grid, recipes, a shopping list, and a "read the label on these" list for packaged items like stock and sauces. It runs as a small web app on your own computer.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://drive.google.com/drive/folders/1eMKFDevAiV6uzxoCuBSizH1RcuCls2T9?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/drive/folders/1eMKFDevAiV6uzxoCuBSizH1RcuCls2T9?usp=sharing&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The progress log shows the safety layer working. With the demo model it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monday...
  attempt 1 rejected: Pad thai: 'shrimp' is crustacean (+1 more)
  ok on attempt 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/Lagnadeep-samal" rel="noopener noreferrer"&gt;
        Lagnadeep-samal
      &lt;/a&gt; / &lt;a href="https://github.com/Lagnadeep-samal/mealmate" rel="noopener noreferrer"&gt;
        mealmate
      &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;mealmate&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A weekly meal planner for a housemate with food allergies. A local open-weight model
proposes meals; a plain word-list checker decides whether they are allowed. Nothing
leaves the laptop.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&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;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 1. a local model (one-time)&lt;/span&gt;
ollama pull qwen2.5:7b          &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; older laptop? try llama3.2:3b&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 2. describe your housemate&lt;/span&gt;
cp profile.example.json profile.json     &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; edit allergies, likes, dislikes&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 3a. use it in the browser (recommended)&lt;/span&gt;
python mealmate.py serve                 &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; then open http://localhost:8000&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; 3b. or from the terminal&lt;/span&gt;
python mealmate.py plan --days 5         &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; writes plan.html and plan.json&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; no model handy? watch the guard work with a fake one that gets it wrong first&lt;/span&gt;
python mealmate.py plan --profile profile.example.json --mock

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; quick check of any recipe or shopping list&lt;/span&gt;
python mealmate.py check &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;soy sauce, pesto, oat milk&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; tests (no model or network needed)&lt;/span&gt;
python -m unittest -v&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The web app listens on 127.0.0.1 only…&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/Lagnadeep-samal/mealmate" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Python standard library only, plus tests that run without a model or a network connection.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; an open-weight model (&lt;code&gt;qwen2.5:7b&lt;/code&gt;, or &lt;code&gt;llama3.2:3b&lt;/code&gt; for slower machines) running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. It returns structured JSON that follows a schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planning loop:&lt;/strong&gt; the model plans one day at a time, with the allergies in its system prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The safety layer is not AI.&lt;/strong&gt; &lt;code&gt;allergens.py&lt;/code&gt; is a plain word-list checker. It scans every dish name, ingredient and cooking step, so "drizzle with tahini" in a recipe step can't slip past a clean ingredient list. It knows hidden sources (ghee, casein, Worcestershire sauce, pesto, hummus) and avoids false alarms (peanut butter isn't dairy, eggplant isn't egg).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry with feedback:&lt;/strong&gt; when the checker rejects a meal, the model is told exactly what was found and tries again, up to four times. If it still can't produce a safe day, that day is left blank instead of showing something unsafe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail loudly:&lt;/strong&gt; an allergy the checker doesn't recognise is treated as a literal word to avoid and is never silently dropped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface:&lt;/strong&gt; a tiny local web server on &lt;code&gt;127.0.0.1&lt;/code&gt; only, with a form, a live log and the finished plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;mealmate is not a medical device. It can't see inside a packet or catch cross-contact in a shared kitchen, and it deliberately over-blocks. The page says so, and for severe allergies the person should read each plan before cooking.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; an allergy list is health information. It never leaves the laptop. There's no account, no upload and no third-party terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; it costs nothing to run, so my roommate can use it for years without a subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable:&lt;/strong&gt; I can change the model with one setting, or add another local runtime with a few lines. If a model plans badly, I can replace it without rewriting the app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspectable safety:&lt;/strong&gt; the part that matters most is code anyone can read and test, not a prompt I'm hoping holds. With a closed API I couldn't put a deterministic guard between the model and my roommate, and I couldn't be sure the model behind it wouldn't change underneath me.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I built MealMate myself and wrote and debugged the code. I used Claude as a coding partner when I got stuck, but I made the development decisions and implemented the changes. I chose my roommate as the person to build for, decided what the tool needed to do, and added features like the browser version and a modern colour palette.&lt;/p&gt;

&lt;p&gt;I also set up and debugged the local Ollama side myself: pulling the models, checking with ollama ps that they were running on CPU only, and fixing an outdated copy of the file. I used Git to push the project to GitHub so my work stays backed up and in sync.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Pocket Walk: an offline AI that plans your walk, then tells you to put the phone away</title>
      <dc:creator>Lagnadeep Samal</dc:creator>
      <pubDate>Tue, 06 Oct 2026 06:48:53 +0000</pubDate>
      <link>https://dev.to/lagnadeep_samal_2d1cca395/pocket-walk-an-offline-ai-that-plans-your-walk-then-tells-you-to-put-the-phone-away-3268</link>
      <guid>https://dev.to/lagnadeep_samal_2d1cca395/pocket-walk-an-offline-ai-that-plans-your-walk-then-tells-you-to-put-the-phone-away-3268</guid>
      <description>&lt;p&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;/p&gt;

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

&lt;p&gt;Pocket Walk is a walk planner that wants you off the screen as fast as possible.&lt;/p&gt;

&lt;p&gt;You tell it your region, season, what you like looking for (birds, trees, bugs) and how much time you have. A local open-weight model turns a field guide into a &lt;strong&gt;pocket card&lt;/strong&gt;: a handful of riddle-style clues for things to find on your walk. Then you hit "Start walk" and the screen goes dark, with just a breathing orb and a timer. When you're back, you tick off what you found and the model writes a short trail journal.&lt;/p&gt;

&lt;p&gt;The metric I care about is the &lt;strong&gt;grass ratio&lt;/strong&gt;: minutes outside per minute on screen. It sits in the corner of the app and fills up the more you walk. The goal is to make the screen the shortest part of the experience, so the app is built to be left.&lt;/p&gt;

&lt;p&gt;It's for anyone who wants a nudge to look at their own surroundings more closely: casual walkers, kids, students between classes.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1mpd6ITLpQCc5dACMfF3tALElSroYcZJ-/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1mpd6ITLpQCc5dACMfF3tALElSroYcZJ-/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;{&lt;a href="https://github.com/Lagnadeep-samal/pocket_walk" rel="noopener noreferrer"&gt;https://github.com/Lagnadeep-samal/pocket_walk&lt;/a&gt;}&lt;/p&gt;

&lt;p&gt;Run it in two commands, with no account and no API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull llama3.2:3b
python app.py   &lt;span class="c"&gt;# open http://localhost:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It uses only the Python standard library, so there is nothing to &lt;code&gt;pip install&lt;/code&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open model, local inference:&lt;/strong&gt; Llama 3.2 3B through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;, called over &lt;code&gt;localhost&lt;/code&gt;. Setting &lt;code&gt;POCKET_MODEL&lt;/code&gt; swaps in Qwen, Gemma or anything else Ollama serves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval over a local field guide:&lt;/strong&gt; &lt;code&gt;guide.json&lt;/code&gt; holds the species, with habitat, season and an identification hint for each. A small BM25 search (pure Python) picks the best matches for your season, interest and time budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounded generation:&lt;/strong&gt; the model only writes riddle clues from the retrieved notes, and the species list comes from the retrieval step, not from the model. A 3B model can't invent a bird that isn't in the guide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful fallback:&lt;/strong&gt; if Ollama isn't running, the app still works and shows the plain field-guide clues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; one HTML file with no framework and no CDN, so it works with no signal. Your walk log and grass ratio are stored in your browser's &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Offline:&lt;/strong&gt; the model, retrieval and UI all run on your own machine. Nothing here needs a connection, which matters when the whole point is to go where there's no signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private:&lt;/strong&gt; your location, your walks and your notes never leave the device. For something that tracks where you go and when, that matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable:&lt;/strong&gt; changing the model is one environment variable. Changing the region is editing a JSON file. I shipped two starter packs (South Asia and temperate north), and anyone can add their own local species without touching the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; there is no key, no quota and no per-request cost, so a school or a nature club can run it without a budget.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed API would have made this a cloud service that needs a connection and an account, and it would send your location off-device.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned Testing It Outside
&lt;/h2&gt;

&lt;p&gt;My first launch was funny: instead of a setup screen, the app opened straight into walk mode with a giant 0:00 timer. A CSS rule was overriding my "hidden" class. It was a small bug, but a good reminder that even an app about leaving the screen has to work on the screen first.&lt;/p&gt;

&lt;p&gt;Then I took it outside. I walked for &lt;strong&gt;20 minutes&lt;/strong&gt; around the &lt;strong&gt;KIIT campus&lt;/strong&gt; and found &lt;strong&gt;3 of 5&lt;/strong&gt; things on my card. My grass ratio ended up at &lt;strong&gt;4.2:1&lt;/strong&gt;, meaning I spent about four minutes outside for every minute looking at the screen.&lt;/p&gt;

&lt;p&gt;It isn't perfect. A 3B model can write riddles that are vaguer than I'd like, so the plain field-guide hint is a useful backup. The starter guide only has 8 species per region, so repeat walks will show similar finds. And walk mode only blacks out the app, it doesn't lock the phone. That is where I'd improve it next.&lt;/p&gt;

&lt;p&gt;What I'm happiest about is that it ran entirely on my laptop. No account, no API key, no data leaving the device.&lt;/p&gt;

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