<?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: Benedicta</title>
    <description>The latest articles on DEV Community by Benedicta (@builtbybenedicta).</description>
    <link>https://dev.to/builtbybenedicta</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%2F1053372%2F8e396324-9269-4de2-8356-cf993683480c.jpeg</url>
      <title>DEV Community: Benedicta</title>
      <link>https://dev.to/builtbybenedicta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/builtbybenedicta"/>
    <language>en</language>
    <item>
      <title>Little Outside: An AI Vocabulary Coach That Starts With Going Outside</title>
      <dc:creator>Benedicta</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:46:56 +0000</pubDate>
      <link>https://dev.to/builtbybenedicta/little-outside-an-ai-vocabulary-coach-that-starts-with-going-outside-3ck7</link>
      <guid>https://dev.to/builtbybenedicta/little-outside-an-ai-vocabulary-coach-that-starts-with-going-outside-3ck7</guid>
      <description>&lt;p&gt;&lt;em&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;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;Little Outside&lt;/strong&gt;, a small AI-powered progressive web app designed to help people spend less time staring at a screen and pay more attention to the physical world around them.&lt;/p&gt;

&lt;p&gt;The idea came from a fairly simple observation that there are already plenty of apps that can tell us to take a break, go for a walk, be present, or spend less time online.&lt;/p&gt;

&lt;p&gt;I didn't want to build another app that asked people to spend more time on a screen in order to learn how to spend less time on one. &lt;/p&gt;

&lt;p&gt;Instead, &lt;strong&gt;Little Outside&lt;/strong&gt; starts by giving you a reason to leave the screen.&lt;/p&gt;

&lt;p&gt;You choose the kind of experience you want, and the app gives you a small real-world mission. &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%2Fv7ptsn9ynl3rofa5aqry.jpeg" 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%2Fv7ptsn9ynl3rofa5aqry.jpeg" alt=" " width="646" height="1280"&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%2Fnsw7zd89jvby06gzecmo.jpeg" 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%2Fnsw7zd89jvby06gzecmo.jpeg" alt=" " width="736" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It could be something as simple as looking for an interesting texture, noticing something you've never paid attention to on your usual route, or finding a detail in your surroundings that tells you something about the place you're in. Then you put the phone away.&lt;/p&gt;

&lt;p&gt;Little Outside asks you to describe what you noticed. Its vocabulary coach then helps you find a more precise word for that observation.&lt;br&gt;
For example, you might come back and write:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There were so many things packed together in the shop that everything looked scattered.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of simply giving you a definition from a dictionary, the vocabulary coach can suggest a word such as &lt;em&gt;cluttered&lt;/em&gt;, explain why that word fits your observation, and then ask you to rewrite your original thought using the new word.&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%2Fj9uqapyib194q423gxzb.jpeg" 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%2Fj9uqapyib194q423gxzb.jpeg" alt=" " width="752" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That creates the loop i wanted:&lt;br&gt;
Choose → Explore → Notice → Reflect → Discover a word → Rewrite → Save&lt;/p&gt;

&lt;p&gt;The vocabulary is therefore not a separate flashcard exercise.&lt;/p&gt;

&lt;p&gt;The real world comes first. The vocabulary comes from what you actually noticed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live Demo: &lt;a href="https://little-outside.onrender.com" rel="noopener noreferrer"&gt;https://little-outside.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The core flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose a mission.&lt;/li&gt;
&lt;li&gt;Go outside and complete it.&lt;/li&gt;
&lt;li&gt;Record what you noticed.&lt;/li&gt;
&lt;li&gt;Ask the vocabulary coach to help you find a better word.&lt;/li&gt;
&lt;li&gt;Rewrite your observation.&lt;/li&gt;
&lt;li&gt;Save the completed adventure to your journal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Demo video:   &lt;/p&gt;
&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/sQFKhBjZQ3M" width="315" height="560"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


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

&lt;p&gt;GitHub Repository: &lt;/p&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/BenedictaUche" rel="noopener noreferrer"&gt;
        BenedictaUche
      &lt;/a&gt; / &lt;a href="https://github.com/BenedictaUche/little-outside" rel="noopener noreferrer"&gt;
        little-outside
      &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;Little Outside&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A small app for getting off your screen, paying attention to the world around you, and finding better words for what you notice.&lt;/p&gt;
&lt;p&gt;Built for the DEV Hacktoberfest 2026 &lt;strong&gt;“Touch Grass”&lt;/strong&gt; challenge.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Little Outside?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;It is surprisingly easy to spend an entire day looking at a screen without really noticing what is happening around you. Little Outside gives you a reason to step away.&lt;/p&gt;
&lt;p&gt;Instead of telling you to "go outside and relax," it gives you a small, specific adventure to try. You might be asked to notice five different sounds, find something that has changed with age, or take a short walk and pay attention to the things you normally pass by.&lt;/p&gt;
&lt;p&gt;The fun part is &lt;strong&gt;finding the right words for what you experienced.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;Choose what you want
        ↓
Get a small outdoor mission
        ↓
Go outside
        ↓
Write about what you noticed&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/BenedictaUche/little-outside" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The project is built as an open-source Next.js application. The repository contains the application code, local mission and vocabulary data, AI integration, PWA configuration, and the persistence layer used for the journal.&lt;/p&gt;

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

&lt;p&gt;I built Little Outside with Next.js, TypeScript, Tailwind CSS, Serwist, and IndexedDB.&lt;/p&gt;

&lt;p&gt;There are two important architectural decisions behind the project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The real-world missions don't depend on AI. I deliberately kept the mission system local and deterministic. When a user starts an adventure, the app can generate an appropriate mission from its local mission data instead of asking an AI model to invent one every time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That matters because the most important part of the application is not the AI. It is getting the user outside. The AI should enhance that experience rather than become a dependency for every part of it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gemma handles the vocabulary coaching The AI portion of the application uses Google's Gemma open-weight model, accessed through OpenRouter.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The request flow looks roughly 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;User reflection
      ↓
Mission page
      ↓
/api/vocabulary
      ↓
Vocabulary service
      ↓
Gemma via OpenRouter
      ↓
Structured vocabulary response
      ↓
Word + definition + explanation + example + rewrite prompt

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser never talks directly to OpenRouter. The API key remains on the server, and the application validates the model response before passing it back to the client. The vocabulary response is structured around the actual reflection rather than being a generic word of the day.&lt;/p&gt;

&lt;p&gt;The model is asked to provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a useful word for the observation&lt;/li&gt;
&lt;li&gt;its meaning&lt;/li&gt;
&lt;li&gt;why it fits the user's description&lt;/li&gt;
&lt;li&gt;an example&lt;/li&gt;
&lt;li&gt;a prompt for rewriting the original observation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How the AI fits in
&lt;/h3&gt;

&lt;p&gt;I used Google's Gemma through OpenRouter to help users find more precise words for things they notice outside. When a user submits an observation, the app sends it to a server-side API route, which handles the vocabulary request.&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%2Flcx7yrmo8jdbmwehz07c.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%2Flcx7yrmo8jdbmwehz07c.png" alt=" " width="800" height="877"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also wanted the experience to remain useful when the AI provider or network is unavailable, so the app includes a local vocabulary fallback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local fallback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also didn't want a temporary network or AI failure to completely destroy the experience. The vocabulary system has a curated local dataset that can be used when the online AI provider is unavailable.&lt;br&gt;
The application also keeps the missions and journal experience local.&lt;/p&gt;

&lt;p&gt;Completed adventures are persisted using IndexedDB, which means the journal isn't dependent on a remote database just to remember what the user has done. This is because the goal of the application is to encourage people to disconnect from the internet for a while.&lt;/p&gt;

&lt;p&gt;It would be slightly ironic if the app itself became unusable the moment the connection disappeared.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Progressive Web App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Little Outside is also configured as a PWA using Serwist.&lt;br&gt;
The application has a web app manifest, application icons, and a service worker setup so that it can behave more like an installable application.&lt;br&gt;
The local mission data, vocabulary fallback, and journal persistence are particularly important here because they give the application useful behavior beyond simply loading a webpage.&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%2Fvpavj5a502iog08itv4d.jpeg" 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%2Fvpavj5a502iog08itv4d.jpeg" alt=" " width="744" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;For Little Outside, using an open-weight model matters because i didn't want the AI component to become the entire product.&lt;br&gt;
The core experience belongs to the application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the missions&lt;/li&gt;
&lt;li&gt;the reflection flow&lt;/li&gt;
&lt;li&gt;the vocabulary structure&lt;/li&gt;
&lt;li&gt;the local fallback&lt;/li&gt;
&lt;li&gt;the journal&lt;/li&gt;
&lt;li&gt;the PWA experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemma is one component inside that system.&lt;/p&gt;

&lt;p&gt;Using an open-weight model also gives the vocabulary layer a replaceable boundary. The application doesn't have to be designed around one permanently closed AI provider.&lt;/p&gt;

&lt;p&gt;The provider is separated from the rest of the vocabulary logic, which means the application can change how the model is served without having to redesign the entire user experience.&lt;br&gt;
More importantly, open models make it possible to think about applications where AI is small, specific, and useful, rather than putting a chatbot in front of every problem.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Best Use of Gemma&lt;br&gt;
Little Outside uses Google Gemma as the vocabulary coach at the heart of its reflection experience. It receives the user's real-world observation and helps turn that observation into a more precise piece of writing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Best Use of Render&lt;br&gt;
Little Outside is deployed using Render, which hosts the production Next.js application and its server-side AI API routes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check it out
&lt;/h2&gt;

&lt;p&gt;If you'd like to try Little Outside or see how it was built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live app: &lt;a href="https://little-outside.onrender.com" rel="noopener noreferrer"&gt;https://little-outside.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/BenedictaUche/little-outside" rel="noopener noreferrer"&gt;https://github.com/BenedictaUche/little-outside&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built a Food Research Tool for My Friend. She Told Me She Wouldn't Use It.</title>
      <dc:creator>Benedicta</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:42:05 +0000</pubDate>
      <link>https://dev.to/builtbybenedicta/i-built-a-food-research-tool-for-my-sister-she-told-me-she-wouldnt-use-it-2l3n</link>
      <guid>https://dev.to/builtbybenedicta/i-built-a-food-research-tool-for-my-sister-she-told-me-she-wouldnt-use-it-2l3n</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;I built Gastronomical, an AI-powered research and content creation tool for food creators. I built it for my friend, Amasco, who creates food content mainly through carousels.&lt;/p&gt;

&lt;p&gt;Her workflow usually starts with a basic idea. Maybe she wants to make a post about chili recipes or desserts without added sugar. She starts with a research of finding recipes, comparing different versions, checking measurements and serving sizes, finding the right images, and eventually turning everything into a carousel. Since she doesn't have a content manager, she has to do all of this herself.&lt;/p&gt;

&lt;p&gt;I thought i could solve that by building a better research tool.&lt;/p&gt;

&lt;p&gt;My first version was basically a research dashboard. It searched for sources and images and used AI to analyze what it found. Technically, it worked. Then i showed it to my friend, and she told me she wasn't going to read through all of that. That was useful feedback.&lt;/p&gt;

&lt;p&gt;She wanted the actual recipes, measurements, serving sizes, useful comparisons, relevant images, and something that could help her get to a finished carousel faster. So i changed the product around her actual workflow.&lt;/p&gt;

&lt;p&gt;Now, Gastronomical takes a food idea, finds relevant recipes and sources, extracts the useful information, and turns the research into creator-ready content and a carousel.&lt;/p&gt;

&lt;p&gt;The goal is to do less research and more creating.&lt;/p&gt;

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

&lt;p&gt;The live application is available here: &lt;a href="https://gastronomical.onrender.com/" rel="noopener noreferrer"&gt;Gastronomical&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also recorded a short demo showing the complete workflow from searching for a food topic to generating a carousel:   &lt;iframe src="https://www.youtube.com/embed/HBoqlcyiqt4" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The most important part of the demo is the actual creator workflow. I wanted to show that Gastronomical isn't just an AI research interface. The point is to go from a food idea to usable content with as little repetitive work as possible.&lt;/p&gt;

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

&lt;p&gt;There are a few parts of the codebase that I found particularly interesting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Searching the web with SerpApi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gastronomical uses SerpApi for Google Search and Google Images. I wanted the application to work with current web information rather than asking an AI model to rely entirely on what it already knows. The search results become the evidence that the rest of the research pipeline works from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extracting recipes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When Gastronomical finds a recipe page, it first looks for structured recipe data such as JSON-LD. That gives me access to information such as ingredients, instructions, cooking time, and yield when the website provides it. If that structured data isn't available, the application falls back to extracting useful page content.&lt;/p&gt;

&lt;p&gt;One important rule is that Gastronomical does not turn incomplete information into a complete recipe. If a source doesn't provide a measurement, the application doesn't invent one. If a page isn't actually a recipe, it remains a source rather than being presented as one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Giving the AI structured output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the research has been collected, it is passed to &lt;strong&gt;Qwen&lt;/strong&gt; through &lt;strong&gt;OpenRouter&lt;/strong&gt;. Instead of asking the model for one large block of text, i ask it for structured information:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commonIngredients"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"differences"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"techniques"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"observations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That makes the output much easier for the application to work with and keeps the AI layer separate from the presentation layer.&lt;/p&gt;

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

&lt;p&gt;The basic architecture looks like this:&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%2Fkr3pezapw6ch3tqadtx7.jpg" 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%2Fkr3pezapw6ch3tqadtx7.jpg" alt=" " width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The frontend is built with Next.js, React, TypeScript, and Tailwind CSS.&lt;/p&gt;

&lt;p&gt;When a creator searches for a food topic, the application sends the request to the research API. SerpApi handles the Google Search and Google Images requests, and the returned pages are normalized into a common structure.&lt;/p&gt;

&lt;p&gt;For recipe pages, i prioritize structured recipe data before falling back to page content. This is important because I want the application to preserve what the source actually says rather than having an AI model reconstruct a recipe from a vague snippet.&lt;/p&gt;

&lt;p&gt;The collected evidence is then passed to Qwen, an open-weight model accessed through OpenRouter.&lt;/p&gt;

&lt;p&gt;The AI is instructed to work only with the supplied sources. It should not invent ingredients, measurements, techniques, or cultural information that aren't supported by the research.&lt;/p&gt;

&lt;p&gt;One of the design decisions I made was to keep AI-generated content separate from visual design.&lt;/p&gt;

&lt;p&gt;The model generates the information for the carousel, but React controls how the carousel looks. The slides use a fixed 1080 × 1350 format, with the food image covering the slide and the content layered over it.&lt;/p&gt;

&lt;p&gt;I then use html-to-image to turn the rendered carousel into downloadable PNGs.&lt;/p&gt;

&lt;p&gt;That means i can completely change the visual design without changing the AI generation logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying with Render&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I deployed Gastronomical with Render so i could test it as an actual production application rather than only running it locally.&lt;/p&gt;

&lt;p&gt;The deployed application connects the frontend to the same research and AI workflow, with API credentials kept in environment variables rather than exposed in the client.&lt;/p&gt;

&lt;p&gt;Render made it possible to get the application online quickly without spending the hackathon building infrastructure instead of the product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring with Sentry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gastronomical also depends on several external services. A search request can fail, a recipe page can be unavailable, or an AI provider can return an error. I added Sentry so i can see what happens in production when something goes wrong.&lt;/p&gt;

&lt;p&gt;That is particularly useful for a product like this because an external service failing shouldn't simply look to the creator like the app doesn't work.&lt;/p&gt;

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

&lt;p&gt;Gastronomical isn't built around the idea that one AI model should know everything about food.&lt;/p&gt;

&lt;p&gt;The application retrieves information from the web first, then gives that evidence to an open-weight model to reason over. That separation gives me much more flexibility. I can change the model without rebuilding the rest of the application, and i can control what information the model is allowed to use.&lt;/p&gt;

&lt;p&gt;It also makes experimentation possible. If another open model performs better at recipe comparison or content generation, i can test it against the same research pipeline instead of rebuilding the product around a proprietary model.&lt;/p&gt;

&lt;p&gt;For this project, open innovation is what makes the AI layer replaceable and gives me control over how the product uses AI.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of SerpApi&lt;/strong&gt;: SerpApi powers the live web and image research used to ground Gastronomical's AI workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Render&lt;/strong&gt;: Render hosts the deployed production application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Sentry Agent Tracing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try Gastronomical&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gastronomical.onrender.com/" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/BenedictaUche/gastronomical" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/HBoqlcyiqt4" rel="noopener noreferrer"&gt;Demo Video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building this for my friend reminded me that the person using the product doesn't care how interesting the technology is if it gives them more work.&lt;/p&gt;

&lt;p&gt;My first version was built around what i thought was interesting. The second version was built around what she actually needed.&lt;/p&gt;

&lt;p&gt;That's my biggest takeaway from building for a friend.&lt;/p&gt;

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