<?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: Jen Bor</title>
    <description>The latest articles on DEV Community by Jen Bor (@jb_0dd10973b389).</description>
    <link>https://dev.to/jb_0dd10973b389</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%2F4078360%2F11220725-cefb-4397-9a5e-64f376bc3bc8.jpg</url>
      <title>DEV Community: Jen Bor</title>
      <link>https://dev.to/jb_0dd10973b389</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jb_0dd10973b389"/>
    <language>en</language>
    <item>
      <title>Comfort Food Challenge — Tell Me Your Day, I'll Feed Your Soul</title>
      <dc:creator>Jen Bor</dc:creator>
      <pubDate>Sat, 15 Aug 2026 03:56:04 +0000</pubDate>
      <link>https://dev.to/jb_0dd10973b389/comfort-food-challenge-tell-me-your-day-ill-feed-your-soul-fe2</link>
      <guid>https://dev.to/jb_0dd10973b389/comfort-food-challenge-tell-me-your-day-ill-feed-your-soul-fe2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, Perfect Landing&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;Whether you're commuting home from an office or closing your laptop after working from home all day, transition burnout is real. When you're running on empty, staring blankly into your pantry or doom-scrolling food delivery apps only adds to the fatigue.&lt;/p&gt;

&lt;p&gt;I wanted to build an empathetic &lt;strong&gt;Culinary Therapy Engine&lt;/strong&gt; inspired by the universal archetype of the superhero grandmother who knows exactly what you need to hear and eat when you’re having a rough day!&lt;/p&gt;

&lt;p&gt;Instead of an endless recipe directory, &lt;strong&gt;Comfort Food Challenge&lt;/strong&gt; invites you to vent your daily stress, pick your desired ambiance and dining dynamic, and tap submit. The system validates your mental state, eliminates decision fatigue by matching you with &lt;strong&gt;one single hero dish&lt;/strong&gt;, and breaks that dish down into &lt;strong&gt;six distinct execution pathways&lt;/strong&gt; tailored to your energy level and bandwidth.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;1. The Vent &amp;amp; Vibe Check&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Vent Box:&lt;/strong&gt; Share your day in plain text. From remote work burnout to daily commute gridlock, pick a mood emoji, and choose a setting (&lt;em&gt;Cozy Cabin&lt;/em&gt;, &lt;em&gt;Bustling City&lt;/em&gt;, &lt;em&gt;Childhood Kitchen&lt;/em&gt;) and dining style (&lt;em&gt;Solo&lt;/em&gt;, &lt;em&gt;With a Buddy&lt;/em&gt;, &lt;em&gt;Family&lt;/em&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;1-Click Preferences:&lt;/strong&gt; A quick toggle menu lets you set allergies, food restrictions, or ingredients you want to exclude without filling out a long profile.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. One Dish, Zero Guesswork&lt;/strong&gt;&lt;br&gt;
Before showing recipes, the system delivers an encouraging validation note acknowledging your specific daily frustration. Rather than presenting 20 competing options, it serves &lt;strong&gt;one perfectly matched hero dish&lt;/strong&gt; to eliminate choice paralysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 6 Realistic Ways to Get It&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15-Min Express:&lt;/strong&gt; Quick pantry shortcut method.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2-Hour Therapy:&lt;/strong&gt; Slow-cooked, deliberate recipe for when cooking helps you decompress after a long day at the desk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With a Friend:&lt;/strong&gt; A split task list for two people cooking together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;≤ 5 Ingredients:&lt;/strong&gt; Simple grocery list for low-stock pantries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Spot:&lt;/strong&gt; Direct Google Maps link for nearby restaurants serving the dish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast Delivery:&lt;/strong&gt; 1-tap search to order it straight to your door.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;Check out the live project and source code below:&lt;br&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://comfort-food-tawny.vercel.app" rel="noopener noreferrer"&gt;https://comfort-food-tawny.vercel.app&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
  🔑 Click to reveal Judge Access Code to be entered in the lower right corner
  &lt;br&gt;
Use passcode &lt;code&gt;ComfortDev2026&lt;/code&gt; in the app to test live AI generations.&lt;br&gt;


&lt;br&gt;
&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/jboroda/ComfortFood" rel="noopener noreferrer"&gt;github.com/jboroda/ComfortFood&lt;/a&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extra Utilities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Copy Shopping List:&lt;/strong&gt; Formats and copies all ingredients to clipboard.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Text to Myself / Share:&lt;/strong&gt; Sends the recipe directly via SMS or link.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Find Another Recipe:&lt;/strong&gt; Instant re-roll if you want a different suggestion.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Recipe Links:&lt;/strong&gt; Direct search buttons for YouTube, NYT Cooking, and Google.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt; Next.js (App Router), Tailwind CSS, Vercel, and the Google Gen AI SDK (&lt;code&gt;gemini-3.5-flash&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handling Structured Output&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The main frontend challenge was ensuring that the AI responses never broke the recipe cards or tab layouts. I used Gemini's &lt;code&gt;responseSchema&lt;/code&gt; to force strict JSON typing for all six execution pathways, ingredient arrays, and instruction steps before sending the data to the client.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateContent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemini-3.5-flash&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;responseMimeType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;responseSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OBJECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;encouragingWords&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRING&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;heroDish&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OBJECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRING&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;tagline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRING&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;whyItHeals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRING&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tagline&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;whyItHeals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;pathways&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OBJECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;express15Min&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* strict schema */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;deepDive2Hour&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* strict schema */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;friendCook&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* strict schema */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;minimalist5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* strict schema */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;localSpot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* strict schema */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;onlineOrder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* strict schema */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express15Min&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;deepDive2Hour&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;friendCook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;minimalist5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localSpot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;onlineOrder&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;encouragingWords&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;heroDish&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pathways&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  What I Learned &amp;amp; What's Next
&lt;/h3&gt;

&lt;p&gt;Generative AI works best in UI design when it reduces choices rather than multiplying them. Keeping the output focused on a single meal with flexible execution modes makes the interface practical and stress-free.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Pantry Snapshot: Allow users to snap a photo of their fridge so Gemini only suggests meals matching available ingredients.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mood &amp;amp; Comfort History: A simple weekly log showing comfort meal trends over time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React Native / Expo: Port the React components to React Native while keeping the exact same Gemini API prompt logic and schemas.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;This project is open source and available under the &lt;a href="https://github.com/jboroda/ComfortFood" rel="noopener noreferrer"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thank you to the DEV Community and the challenge organizers for hosting this challenge!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
      <category>genai</category>
    </item>
  </channel>
</rss>
