<?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: 780</title>
    <description>The latest articles on DEV Community by 780 (@780s).</description>
    <link>https://dev.to/780s</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%2F4112303%2F9747c459-10d2-45f7-969a-9cfc07929ec0.png</url>
      <title>DEV Community: 780</title>
      <link>https://dev.to/780s</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/780s"/>
    <language>en</language>
    <item>
      <title>Pantrybridge</title>
      <dc:creator>780</dc:creator>
      <pubDate>Mon, 07 Sep 2026 00:38:44 +0000</pubDate>
      <link>https://dev.to/780s/pantrybridge-3igp</link>
      <guid>https://dev.to/780s/pantrybridge-3igp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-09-03"&gt;Weekend Challenge: Generosity Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wanted to build something for this challenge that didn't just &lt;em&gt;talk&lt;/em&gt; about generosity but actually meant something, and felt beneficial. This tool can make it easier to go from "I have food to donate" to "I'm donating food".&lt;/p&gt;

&lt;p&gt;You take a picture of your pantry shelf, Gemini figures out what's actually in it, and the app turns that into a recipe for whoever receives it, a handwritten-style note of kindness, a real way to find a food bank near you, and a printable manifest to hand over at drop-off.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&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%2Fyp40i0h24140bzlxunyn.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%2Fyp40i0h24140bzlxunyn.png" alt="Pantrybridge landing page" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PantryBridge is a small AI-powered toolkit for food donation. The flow is:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Scan your pantry.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Upload a photo (or pick one of three one-click sample hauls if you don't have a pantry photo handy). Gemini does multimodal image analysis and returns a structured inventory: item names, categories, estimated quantities, dietary tags, urgency, and packaging condition.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExNndjdjY0eHRkMGhhNzZsNWN3c3Iyc29hdnVqZ2FkeWhqeGR2N2NvNiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2Fu5Sa24iPxdoK06g71F%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExNndjdjY0eHRkMGhhNzZsNWN3c3Iyc29hdnVqZ2FkeWhqeGR2N2NvNiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2Fu5Sa24iPxdoK06g71F%2Fgiphy.gif" alt="Scanning flow" width="480" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(&lt;em&gt;Sorry, GIPHY messed up my gif&lt;/em&gt;)&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;strong&gt;Review the inventory.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Everything shows up in a clean table with donation-readiness stats and a volunteer tip generated specifically for that haul. (If you need to, you can delete or add items!)&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%2Fe6k060scd2yim62e0dlc.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%2Fe6k060scd2yim62e0dlc.png" alt="Scanned pantry" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;strong&gt;Find a real drop-off location.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Enter your zip code and the app confirms your city/state (via a real geocoding lookup) and links you straight to Feeding America's actual food bank locator, so you're finding a real place to donate, not a mock one.&lt;br&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%2Fkgyrvy2k1wjfcxp6bbnm.gif" class="article-body-image-wrapper"&gt;&lt;img src="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%2Fkgyrvy2k1wjfcxp6bbnm.gif" alt="Drop off flow" width="480" height="314"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4. &lt;strong&gt;Get a recipe and a kindness note.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Gemini writes a short recipe using mostly what you're donating, plus a genuinely warm, non-patronizing note to include with the box.&lt;br&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%2Fvucquwnpxnhp3drf3bul.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%2Fvucquwnpxnhp3drf3bul.png" alt="Recipe + kindness note" width="799" height="455"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  5. &lt;strong&gt;Print a donation manifest.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A little printable card with the itemized contents and a mock barcode/QR for quick intake logging, with confetti when you pledge or print.&lt;br&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%2Fc2meuxtyteinx50nla4x.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%2Fc2meuxtyteinx50nla4x.png" alt="Donation card" width="768" height="1220"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://pantrybridge-production.up.railway.app/" rel="noopener noreferrer"&gt;Try the Live App&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/1224466974" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you'd rather run it yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/780s/pantrybridge.git
&lt;span class="nb"&gt;cd &lt;/span&gt;pantrybridge
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Drop a &lt;code&gt;GEMINI_API_KEY&lt;/code&gt; into &lt;code&gt;.env.local&lt;/code&gt; to hit the real Gemini API. Without one, every route quietly falls back to realistic mock data instead of erroring out, so the app is never actually broken, it's just running on canned data until you add a key.&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/780s" rel="noopener noreferrer"&gt;
        780s
      &lt;/a&gt; / &lt;a href="https://github.com/780s/pantrybridge" rel="noopener noreferrer"&gt;
        pantrybridge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A submission to the DEV.to Generosity Weekend Challenge
    &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;PantryBridge&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;AI-powered food donation and mutual-aid toolkit built for the &lt;strong&gt;DEV Weekend Challenge: Generosity Edition&lt;/strong&gt; (Best Use of Google AI).&lt;/p&gt;

&lt;p&gt;Snap a photo of your pantry shelf and PantryBridge uses Gemini to detect items, match them against local food bank shortages, generate a family recipe from the donated staples, write a heartfelt kindness note, and produce a printable donation manifest.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&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;npm install
npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open &lt;a href="http://localhost:3000" rel="nofollow noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Google AI (Gemini) integration&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Add your key to &lt;code&gt;.env.local&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight highlight-source-dotenv notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-v"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;your_gemini_api_key_here&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Without a key, both API routes (&lt;code&gt;/api/analyze-pantry&lt;/code&gt;, &lt;code&gt;/api/generate-kit&lt;/code&gt;) gracefully fall back to realistic mock data, so the app is always fully demoable.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Project structure&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/app/api/analyze-pantry&lt;/code&gt; — multimodal pantry photo analysis (Gemini 3.6 Flash)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/app/api/generate-kit&lt;/code&gt; — recipe + kindness note generation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/components&lt;/code&gt; — UI building blocks (uploader, inventory table, matcher, recipe/kindness cards, printable manifest)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/lib&lt;/code&gt; — Gemini client, mock data/fallbacks, food-bank matching logic&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/780s/pantrybridge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;p&gt;It's a Next.js 16 (App Router) app with Tailwind v4 and shadcn/ui, talking to Gemini through &lt;code&gt;@google/generative-ai&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A few decisions I'm actually proud of, past the obvious "call Gemini with a prompt" version:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The vision prompt is opinionated, not just "list the items."&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Early on, Gemini would miss stacked items, double-count identical products, or slap dietary tags on things it couldn't actually justify. I rewrote the prompt as an explicit rulebook: scan the whole frame including backgrounds, group identical products into one entry with an accurate count instead of five duplicate rows, only tag something "Gluten-Free" if the packaging says so or it's an unambiguous fact about that exact product, and never invent an item that isn't visible. I also switched to Gemini's structured &lt;code&gt;responseSchema&lt;/code&gt; instead of just asking nicely for JSON, so the output is actually guaranteed to match the app's types instead of occasionally almost matching them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The food bank feature used to be fake, and I fixed that.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;My first pass had three made-up local food banks with made-up addresses and a distance calculator that computed real mileage to those fictional places. It looked great in a demo and was completely wrong. I ripped it out and replaced it with something smaller but honest: a real zip-code geocode (via a free public API) to confirm your city, and a direct link to Feeding America's actual food bank locator. Less flashy, but it doesn't quietly lie to anyone who actually tries to use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing is allowed to hard-fail during a demo.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Both Gemini routes fall back to curated mock data if the API key is missing or a call errors out, so judges (or anyone without a key) never hit a broken screen. The three sample pantry photos resolve to hand-written mock analyses instantly rather than round-tripping through the model, which makes the one-click demo path fast and consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The UI went through a real design pass, not just "add Tailwind classes."&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I migrated the hand-rolled components over to shadcn/ui, then deliberately stripped out the stuff that makes modern websites look the same: sparkle icons, gradient-filled icon boxes, numbered circle badges, bouncy hover animations on things that aren't even clickable. What's left is flatter, quieter, and has an actual typographic hierarchy (Space Grotesk for headings, Inter for body, a handwritten font just for the kindness note).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment took a couple of tries.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;This has three server-side API routes calling Gemini and a geocoding API, so it needed somewhere that actually runs a Node server, not a static host. It landed on Railway: connect the repo, add the env var, done.&lt;/p&gt;

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

&lt;p&gt;I am submitting to the &lt;strong&gt;Best Use of Google AI&lt;/strong&gt; subcategory.&lt;/p&gt;

&lt;p&gt;Gemini does two distinct jobs here: multimodal vision (reading a photo and returning structured, schema-validated inventory data) and creative generation (the recipe and the kindness note), both through the same API key with no other AI provider involved.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you enjoy this project, make sure to comment with your thoughts!
&lt;/h3&gt;

&lt;p&gt;(&lt;em&gt;...and no, this post was not written by AI&lt;/em&gt;)&lt;/p&gt;

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