<?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: Oitrika Bhattacharjee</title>
    <description>The latest articles on DEV Community by Oitrika Bhattacharjee (@oitreeka).</description>
    <link>https://dev.to/oitreeka</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%2F4158704%2Fdb329751-5e9b-400d-80aa-ded7ba89da8a.jpg</url>
      <title>DEV Community: Oitrika Bhattacharjee</title>
      <link>https://dev.to/oitreeka</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oitreeka"/>
    <language>en</language>
    <item>
      <title>Orderkhata</title>
      <dc:creator>Oitrika Bhattacharjee</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:55:02 +0000</pubDate>
      <link>https://dev.to/oitreeka/orderkhata-4dcc</link>
      <guid>https://dev.to/oitreeka/orderkhata-4dcc</guid>
      <description>&lt;p&gt;My dad sells and rents medical equipment in Kolkata mostly oxygen concentrators and CPAP machines. Orders reach him on WhatsApp in a mix of Bengali, Hindi and English. He reads each one and copies it into a notebook. I built Orderkhata to sort those orders with Gemma on my own laptop.&lt;/p&gt;

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

&lt;p&gt;Orderkhata reads one customer message and returns the items and quantities, any rental days and the delivery time the customer asked for. The total comes from his own price list. When a message is unclear it says what to ask the customer and stops there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who would pay
&lt;/h2&gt;

&lt;p&gt;Any small shop that takes orders on chat. A wrong item costs money and for equipment it can mean a patient waiting for the wrong machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open mattered
&lt;/h2&gt;

&lt;p&gt;Customers write their names, addresses and the device they need. A local Gemma model through Ollama keeps all of that on his computer. There is no per-message fee and I can swap the model with one flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it checks the model
&lt;/h2&gt;

&lt;p&gt;Gemma proposes and code decides. Every quantity must appear in words copied from the message and rental days must come from the message too. Prices and totals never come from the model. A failed answer gets one retry with the exact problems listed. After that the message goes back to my dad untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;I ran 25 test messages through three prompt versions with Gemma 3 4B. v1 and v2 ran once. v3 ran twice.&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%2Ffdwvig3wv1u21advigxr.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%2Ffdwvig3wv1u21advigxr.png" alt="run test" width="799" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatddvk02i772e308eiw7.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%2Fatddvk02i772e308eiw7.png" alt="table" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12 of the 25 messages are not orders or are too unclear to act on, such as questions and thank-yous. In every version and run none of those 12 printed an order. Of the 13 real orders, v3 run 1 printed 6 right, 1 wrong and sent 6 back to my dad. Run 2 printed 7 right, 0 wrong and sent 6 back.&lt;/p&gt;

&lt;p&gt;After run 1, I added a check for items the customer named that the answer left out. I replayed it on the saved run 1 logs. It flagged 6 of the 8 wrong printed answers and blocked no correct ones. Run 2 used that check. I did not re-run v1 and v2.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong
&lt;/h2&gt;

&lt;p&gt;Gemma invented orders. For “Thank you bhaiya, machine ta bhalo cholche” and “Do you deliver to Salt Lake?”, it answered one Philips Everflo concentrator. The code blocked it because the quoted words did not name the item.&lt;/p&gt;

&lt;p&gt;More rules made it worse. With the long v3 prompt, Gemma returned an empty {} as its first answer in 14 of 25 messages in run 1 and 19 of 25 in run 2, with the same settings. The retry recovered 4 of the empties in run 1 and 5 in run 2. A single run of this model is not stable.&lt;/p&gt;

&lt;p&gt;It dropped items, and the first checker could not see that. “3 nasal cannula 1 connector tube lagbe kal sokale” printed only the cannulas in all three versions. Other versions also dropped oxygen masks and CPAP masks. Every wrong printed answer in run 1 was a dropped item, because the check verified what Gemma said and not what it left out. That is why I added the dropped-item check.&lt;/p&gt;

&lt;p&gt;It rarely picked the rental item. For “ek CPAP machine rent pe chahiye 15 din ke liye” and “3 oxygen concentrator on rent for 1 week”, Gemma chose the purchase item with days attached, and the checker refused it. Rentals are most of my dad’s business, so this is the biggest weakness.&lt;/p&gt;

&lt;p&gt;It made up products and numbers. It returned “Oxygen Cylinder Rental”, “walker” and “wheelchair”, which are not in the price list, and wrote a quantity as the word “dui” instead of a number. All were rejected.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I can’t claim
&lt;/h2&gt;

&lt;p&gt;The 25 test messages were written with AI help to imitate how customers write. They are not real customers. The prices come from my dad’s public IndiaMART listing, and he confirmed them. The web demo uses fixed rules, because a browser page cannot run a model under its privacy settings, and its customer names are sample data. The model runs in the Python script. With 25 messages, a difference of one or two is noise. “0 wrong” means 0 of 8 printed answers in one run.&lt;/p&gt;

&lt;h2&gt;
  
  
  First user
&lt;/h2&gt;

&lt;p&gt;My dad checked and confirmed the prices in the price list. &lt;br&gt;
Repo: &lt;a href="https://github.com/triixdev/Orderkhata" rel="noopener noreferrer"&gt;https://github.com/triixdev/Orderkhata&lt;/a&gt;&lt;br&gt;
Demo: &lt;a href="https://triixdev.github.io/Orderkhata/" rel="noopener noreferrer"&gt;https://triixdev.github.io/Orderkhata/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F86x7aw1oqqjzqpbrjnh5.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%2F86x7aw1oqqjzqpbrjnh5.png" alt="demo" width="799" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prize Categories: Best Use of Gemma&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Pedigree for Graph Hacks</title>
      <dc:creator>Oitrika Bhattacharjee</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:17:35 +0000</pubDate>
      <link>https://dev.to/oitreeka/pedigree-for-graph-hacks-3i10</link>
      <guid>https://dev.to/oitreeka/pedigree-for-graph-hacks-3i10</guid>
      <description>&lt;h1&gt;
  
  
  Following a Hugging Face model's license up its family tree
&lt;/h1&gt;

&lt;p&gt;I built Pedigree for Graph Hacks, a hackathon run by WeMakeDevs and FalkorDB in October 2026. You paste in a Hugging Face model and it follows the model up through the models it was built from. Where something a parent's license asks for seems to have gone missing it says so and shows you the path it walked.&lt;/p&gt;

&lt;p&gt;The idea comes from a July 2026 preprint called "Don't Trust the Label" which looks at how licenses go wrong along AI supply chains. Its authors say no existing tool automatically audits licenses along such a chain. As far as I could tell the scanners out there look at one model at a time, so I tried building a small tool that follows the whole chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;A fine-tuned model is built on top of another model and the parent's license comes along with it. Meta's Llama 3.2 license, for example, asks for things like a notice and an acceptable use policy and a naming rule. The fine-tune has its own page with its own license field. Sometimes that field says MIT and nothing on the MIT page mentions the notice or the policy. You only see the gap if you open both pages and read them side by side. Real chains can also run longer than two models.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Pedigree does
&lt;/h2&gt;

&lt;p&gt;You give it a model id like org/name. It reads the public metadata from the Hub (the license and the base model and the declared training datasets) and writes it into a FalkorDB graph. Then it walks up the chain and compares each declared license with what the parent's license asks for. Every flag shows the path it followed and links to the pages it came from so you can check it by hand in a minute. A flag only means someone should take a look. It is not a legal opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first runs
&lt;/h2&gt;

&lt;p&gt;My first live test was gpt2 because it is old and simple. It came back with an MIT license and no parents and no datasets, which is right for a model with no parent. Then I tried a small chat model. Its card lists four training datasets. One of them, cerebras/SlimPajama-627B, gave me a 404 when I opened it in my browser on October 18. Pedigree reports that as "could not be fetched" and says nothing above it can be verified. Another dataset had the license "other", which Pedigree cannot read, so it says that too and does not call it fine.&lt;/p&gt;

&lt;p&gt;I decided early that anything missing or unreadable should count as a risk and never as a pass. A tool that stays quiet when it cannot read something looks cleanest exactly when it knows the least.&lt;/p&gt;

&lt;h2&gt;
  
  
  One number
&lt;/h2&gt;

&lt;p&gt;On October 18 I read the 60 most downloaded fine-tunes of Llama-3.2-1B. Forty-eight declared a license carrying the same obligations as the parent's. Six declared Apache-2.0 or MIT. Three declared a license Pedigree cannot evaluate and three declared none. I am not naming any of the six. Each one is a lead for a person to check and a flag says nothing about intent. The sample was picked by download count and is not random so it tells you nothing about the Hub as a whole.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where FalkorDB comes in
&lt;/h2&gt;

&lt;p&gt;Models and datasets and licenses and obligations are all nodes. Edges record who was derived from whom and who was trained on what and which obligations each license carries. A flag is a Cypher pattern. It walks up the lineage for up to six levels and looks for an obligation that the parent's license carries and the child's license does not. The path it walked is the explanation shown to the reader. Without the graph there would be nothing to show for a flag.&lt;/p&gt;

&lt;p&gt;Each person who saves a decision gets a separate private graph. A decision stores a snapshot of the lineage as it looked then. Later a re-check takes a fresh snapshot and compares the two so it can say exactly which license changed and where. When a model is checked again its old parent links are deleted first. Model cards change and I did not want the graph to keep a relationship the publisher had removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong
&lt;/h2&gt;

&lt;p&gt;Docker complained at first that its engine was not running. Once that was sorted it refused to pull the FalkorDB image and said a TLS protocol version was not supported. My internet was fine because a plain curl to Docker's servers worked. After I shut down WSL and logged out of Docker the pull went through.&lt;/p&gt;

&lt;p&gt;My laptop had Python 3.15 and 3.12 installed. I used 3.12 because 3.15 was new enough that some packages might not have builds for it. I did not try 3.15 so I cannot say it would have failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did not check
&lt;/h2&gt;

&lt;p&gt;Only the Llama 3 and Llama 3.2 rules were compared with the license text. Every other rule is marked unverified so flags for other licenses are leads and nothing more. The Hub only knows what publishers declare and declarations can be missing or wrong. None of this is legal advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy and security
&lt;/h2&gt;

&lt;p&gt;Pedigree reads public model metadata and asks for no personal data. There are no accounts. Your browser keeps a random id and your saved reviews live in a private graph under that id. A Forget button deletes the whole graph. No tokens live in the repository. The site has a privacy policy and a terms page.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;I set up the database and ran every command on my own machine and tested against live Hugging Face data and made the calls about what to keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related work and thanks
&lt;/h2&gt;

&lt;p&gt;Pedigree is a small tool next to some serious research. The preprint "Don't Trust the Label: License Laundering in AI Supply Chains" (arXiv 2607.20300) describes how licenses go wrong along AI supply chains. "AI Supply Chain Galaxy" (arXiv 2606.16292) is a visual analytics system for license compliance. What Pedigree adds is a path you can read for each flag and a place to keep your decisions and see what changed. Thanks to FalkorDB and WeMakeDevs for the hackathon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/triixdev/Pedigree" rel="noopener noreferrer"&gt;https://github.com/triixdev/Pedigree&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Last Light : a printed walk card written by a model on my own computer</title>
      <dc:creator>Oitrika Bhattacharjee</dc:creator>
      <pubDate>Mon, 12 Oct 2026 02:38:09 +0000</pubDate>
      <link>https://dev.to/oitreeka/last-light-a-printed-walk-card-written-by-a-model-on-my-own-computer-p01</link>
      <guid>https://dev.to/oitreeka/last-light-a-printed-walk-card-written-by-a-model-on-my-own-computer-p01</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;Last Light prints a one page card for a walk. I type in where I am and how long I want to walk. Ordinary code works out when the sun sets, when I should turn around and when I should be home. &lt;strong&gt;A Gemma model&lt;/strong&gt; running on my own computer writes the small part: &lt;em&gt;three things to notice and one small task.&lt;/em&gt; I print the card and &lt;em&gt;leave my phone&lt;/em&gt; at home.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The screen is the shortest part.&lt;/em&gt; Making the card takes a minute or two and then I put the computer away.&lt;/p&gt;

&lt;h2&gt;
  
  
  The puzzle
&lt;/h2&gt;

&lt;p&gt;I wanted a reason to come back tomorrow. &lt;strong&gt;&lt;em&gt;Every card has a quest, which is its small task.&lt;/em&gt;&lt;/strong&gt; When I get home I run one command and collect a puzzle piece. &lt;strong&gt;There are twelve pieces and together they make a small picture of a cabin on a hill with a tree and a low sun.&lt;/strong&gt; You get one piece a day and it runs on the honor system. A progress picture shows which squares are still covered. When the last piece is in the finished picture is saved and appears on every card after that. Then a &lt;strong&gt;&lt;em&gt;new puzzle&lt;/em&gt;&lt;/strong&gt; starts. Progress lives in a small file on my computer. I collected my first piece after this walk.&lt;/p&gt;

&lt;p&gt;I can also type rough notes after a walk and the model turns them into a short journal entry that stays in a file on my computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the walk went
&lt;/h2&gt;

&lt;p&gt;I took the card to the lake. It asked me to look for sunlight through the leaves, birdsong in the branches and reflections on the water.&lt;/p&gt;

&lt;p&gt;It was calm and soothing. Birds were chirping. People were walking by and there was a breeze in the trees. The wind was cold on my warm cheeks. I saw a kingfisher on the lake and some swans. The card did not mention either of them. It got me outside and slowed me down and I found those myself. That is what I wanted from it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open weights mattered
&lt;/h2&gt;

&lt;p&gt;Where I walk and when tells you when my house is empty. I did not want to send that to someone else's server. &lt;strong&gt;&lt;em&gt;Gemma runs through Ollama on my own computer so my location and my notes stay here.&lt;/em&gt;&lt;/strong&gt; After the first download, which is around 3 GB, it needs &lt;strong&gt;no internet&lt;/strong&gt;. The code only talks to my own machine and refuses anything else unless I add a flag. I can switch to another model with one flag and every card &lt;strong&gt;costs nothing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I did not compare it with a closed model so I cannot say which writes better. The small model I used is a little bland.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Sunset comes from a standard formula in plain &lt;strong&gt;Python&lt;/strong&gt; and unit tests check it against two known sunsets. The model is asked for structured output. The code checks its shape and length and everything is escaped before it goes into the page, so a strange answer cannot break the card. If the model is not running I get a plain built in card and the footer says no model was used.&lt;/p&gt;

&lt;p&gt;I can &lt;strong&gt;use my own photo as the card background&lt;/strong&gt;. It is embedded in the file and hidden data such as location is removed first. There are 20 tests and no packages beyond Python itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does not work well
&lt;/h2&gt;

&lt;p&gt;The suggestions are general. The sunset time is an estimate and does not know about hills or buildings. The puzzle trusts me to do the task. I only &lt;strong&gt;ran it with a real model on Windows.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo and code
&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%2F36a9qzpsny4au5x1oe3g.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%2F36a9qzpsny4au5x1oe3g.png" alt="demo" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvercti6hd19xiri13gn1.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%2Fvercti6hd19xiri13gn1.png" alt="puzzle" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/OitrikaBhattacharjee/last-light" rel="noopener noreferrer"&gt;https://github.com/OitrikaBhattacharjee/last-light&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo credit: &lt;a class="mentioned-user" href="https://dev.to/oitreeka"&gt;@oitreeka&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Best Use of Gemma. I used gemma3:4b locally through Ollama.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I made it
&lt;/h2&gt;

&lt;p&gt;I used Claude as my coding assistent to check if my code is working correctly. The puzzle idea, the look of the card and my lake photos are mine and I ran and tested everything on my own computer.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Safe Plate: a meal planner that crosses out my allergens</title>
      <dc:creator>Oitrika Bhattacharjee</dc:creator>
      <pubDate>Sun, 04 Oct 2026 14:58:51 +0000</pubDate>
      <link>https://dev.to/oitreeka/safe-plate-a-meal-planner-that-crosses-out-my-allergens-543i</link>
      <guid>https://dev.to/oitreeka/safe-plate-a-meal-planner-that-crosses-out-my-allergens-543i</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&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;/strong&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;em&gt;&lt;strong&gt;Safe Plate&lt;/strong&gt;&lt;/em&gt; for the friend who needs it most. Me.&lt;/p&gt;

&lt;p&gt;I have severe food allergies including prawn and eggplant. Meal planning is stressful because I always wonder what is hiding in a recipe. Safe Plate is a small tool that makes the weekly planning part easier.&lt;/p&gt;

&lt;p&gt;I tap the foods I cannot eat and they get crossed out. I pick Indian or Bengali food or both. One button gives me a week of breakfast lunch and dinner ideas that skip the foods I crossed out. It also writes a shopping list. I can type in any extra allergen and add it to my list. My name goes in the title so it feels like mine.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Safe Plate is not medical advice and it does not replace reading labels. Please always consult your doctor about your allergies and your diet.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://oitrikabhattacharjee.github.io/Safe-Plate/" rel="noopener noreferrer"&gt;https://oitrikabhattacharjee.github.io/Safe-Plate/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3hmbu56m5t3yakmharly.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%2F3hmbu56m5t3yakmharly.png" alt="Safe Plate home screen with cuisine and allergen buttons" width="799" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc9vz11gk1nl1ce5k2k32.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%2Fc9vz11gk1nl1ce5k2k32.png" alt="Safe Plate weekly meal plan" width="799" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvaij4snadn9t5f2q53db.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%2Fvaij4snadn9t5f2q53db.png" alt="Safe Plate shopping list" width="800" height="396"&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/OitrikaBhattacharjee" rel="noopener noreferrer"&gt;
        OitrikaBhattacharjee
      &lt;/a&gt; / &lt;a href="https://github.com/OitrikaBhattacharjee/Safe-Plate" rel="noopener noreferrer"&gt;
        Safe-Plate
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A cute allergy safe weekly meal planner. Runs fully in your browser with no tracking and no server. Made for my own severe food allergies lol.
    &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;My Safe Plate&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A cute weekly meal planner for people with food allergies. I built it for myself because I have severe allergies and I was tired of guessing what hides in a recipe.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Tap the foods you cannot eat and they get crossed out. Pick Indian or Bengali food or both. Press one button to get seven days of breakfast lunch and dinner that never include those foods. It also makes a shopping list. You can add your own allergens too.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Privacy&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Everything runs in your browser. The page makes no network requests and sends nothing anywhere. Your choices are saved only in your own browser and one button erases them.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it stays safe&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Every recipe has allergen tags. Anything tagged with a crossed out food is removed before the week is planned. This is plain code and not AI. I tested it across 400…&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/OitrikaBhattacharjee/Safe-Plate" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;Safe Plate is one HTML file with plain JavaScript. There is nothing to install.&lt;/p&gt;

&lt;p&gt;The filtering part is plain rules. Every recipe has allergen tags I wrote myself. When I cross out a food the planner leaves out any recipe tagged with it. I did not want a chatbot guessing about my allergies.&lt;/p&gt;

&lt;p&gt;These tags are only as good as my knowledge. They cannot see hidden ingredients in sauces or spice blends and they cannot know how a dish is cooked at home or whether there is cross contact in a kitchen. Some dishes say check labels for this reason.&lt;/p&gt;

&lt;p&gt;To check my own code I ran a test across 400 generated weeks with different mixes of cuisines and allergens. The planner followed its own tags every time. That test only shows the code works as written. It does not prove a recipe is safe for a real person.&lt;/p&gt;

&lt;p&gt;For new ideas the page builds a ready prompt that can be pasted into an open model such as Gemma running on my own laptop with Ollama.&lt;/p&gt;

&lt;p&gt;I used an AI assistant to help write and restyle the code.&lt;/p&gt;

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

&lt;p&gt;My allergy list is private health information. I did not want it sitting on someone else's server. So the &lt;em&gt;&lt;strong&gt;whole page runs in my browser and makes no network requests&lt;/strong&gt;&lt;/em&gt;. Even the font is built into the file. My choices stay in my own browser and one button erases them.&lt;/p&gt;

&lt;p&gt;The same idea applies to the open model. &lt;em&gt;&lt;strong&gt;It can run on my own laptop with no internet so my food list does not have to leave my device&lt;/strong&gt;&lt;/em&gt;. A closed API would need that list sent away every time. Because the rules and the model are separate I can also swap models or add my own recipes without touching the filtering part.&lt;/p&gt;

&lt;h2&gt;
  
  
  What My Person Said
&lt;/h2&gt;

&lt;p&gt;I am the friend I built this for so here is my honest reaction. I wanted it to look cute enough that I would want to open it every day. &lt;em&gt;&lt;strong&gt;I love the soft pink colors and the little food doodles. Privacy was my top priority so it matters to me that nothing I type leaves my browser.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Would Build Next
&lt;/h2&gt;

&lt;p&gt;Recipes written for my exact allergies and a button that talks to a model on my own laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important Note
&lt;/h2&gt;

&lt;p&gt;Please always consult your doctor or allergist before relying on any meal plan. Read every label and check with whoever cooks the food. Safe Plate is a personal project and not a safety tool.&lt;/p&gt;

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