<?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: fab-pe</title>
    <description>The latest articles on DEV Community by fab-pe (@fabpe).</description>
    <link>https://dev.to/fabpe</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%2F1028359%2F0b21e92e-6c30-4da2-9fbf-15ff44c34499.png</url>
      <title>DEV Community: fab-pe</title>
      <link>https://dev.to/fabpe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabpe"/>
    <language>en</language>
    <item>
      <title>Sloth Social: A Week of Content Without the Blank-Page Panic 🦥</title>
      <dc:creator>fab-pe</dc:creator>
      <pubDate>Tue, 27 Oct 2026 00:25:33 +0000</pubDate>
      <link>https://dev.to/fabpe/sloth-social-a-week-of-content-without-the-blank-page-panic-3gl3</link>
      <guid>https://dev.to/fabpe/sloth-social-a-week-of-content-without-the-blank-page-panic-3gl3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Every week, I help create social media content for local businesses. Before anything gets published, there’s a familiar list of decisions: what to talk about, which photos to use, what to write, and how to spread it across the week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sloth Social does the first draft of that work.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enter your business details, audience, tone and weekly focus. Choose how many posts and stories you want, and the app generates a plan across Monday to Sunday.&lt;/p&gt;

&lt;p&gt;You can then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Edit titles, captions and story text directly on the cards.&lt;/li&gt;
&lt;li&gt;Copy individual captions or download the complete week.&lt;/li&gt;
&lt;li&gt;Return to your latest plan, with edits saved in your browser.&lt;/li&gt;
&lt;li&gt;Add photos and ask an open-weight vision model to describe them.&lt;/li&gt;
&lt;li&gt;Correct and approve those descriptions before using them in a new plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s built for small business owners and the people managing their content—especially anyone who has ever opened a social media scheduler and immediately decided to make a coffee instead.&lt;/p&gt;

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

&lt;p&gt;🦥 &lt;strong&gt;&lt;a href="https://social-sloth-a2469c.netlify.app/" rel="noopener noreferrer"&gt;Try Sloth Social&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a quick walkthrough:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter a business profile and weekly focus.&lt;/li&gt;
&lt;li&gt;Choose two posts and seven stories.&lt;/li&gt;
&lt;li&gt;Generate your week.&lt;/li&gt;
&lt;li&gt;Edit a caption, copy it, and download the plan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To try the photo workflow, select a product image, click &lt;strong&gt;Analyse photo&lt;/strong&gt;, review the description and tick the box to include it in your next generation.&lt;/p&gt;

&lt;p&gt;The app creates drafts for review. It doesn’t automatically publish them.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/fabs-pe/sloth-social" rel="noopener noreferrer"&gt;View the source on GitHub&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The frontend uses &lt;strong&gt;React and Vite&lt;/strong&gt;, with a &lt;strong&gt;Node.js and Express&lt;/strong&gt; backend. The website is deployed on Netlify, and the server runs on Render.&lt;/p&gt;

&lt;p&gt;Two open-weight models sit at the centre of the workflow, accessed through OpenRouter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3 32B&lt;/strong&gt; generates the content plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen2.5 VL 72B Instruct&lt;/strong&gt; describes uploaded photos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One useful lesson came from scheduling. Initially, I asked the model to write the content and assign its days. Sometimes it placed two posts on the same day.&lt;/p&gt;

&lt;p&gt;I moved the scheduling into JavaScript. The model writes the drafts; the server checks the requested quantities and distributes each content type across the week.&lt;/p&gt;

&lt;p&gt;Photo testing revealed another issue: a model could recognise a product but add unsupported claims about its quality or ingredients. I tightened the instructions and added an editable review step. Users choose which descriptions enter the planning brief.&lt;/p&gt;

&lt;p&gt;The backend also validates generated data, applies request timeouts and limits requests to the paid AI endpoints. API credentials stay on the server.&lt;/p&gt;

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

&lt;p&gt;The open-weight models do the core work: interpreting photos and turning a business brief into usable content drafts.&lt;/p&gt;

&lt;p&gt;I chose hosted inference because my development Mac has 8 GB of memory. This version sends requests to hosted providers; it doesn’t run offline or keep uploaded photos entirely on the user’s device.&lt;/p&gt;

&lt;p&gt;The benefit of open weights here is flexibility&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Enquiry to Quote: Turning Customer Messages into Less Admin for Tradies</title>
      <dc:creator>fab-pe</dc:creator>
      <pubDate>Sun, 18 Oct 2026 13:21:30 +0000</pubDate>
      <link>https://dev.to/fabpe/enquiry-to-quote-turning-customer-messages-into-less-admin-for-tradies-2ogf</link>
      <guid>https://dev.to/fabpe/enquiry-to-quote-turning-customer-messages-into-less-admin-for-tradies-2ogf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Enquiry to Quote helps Australian trade businesses turn customer messages into organised, editable drafts.&lt;/p&gt;

&lt;p&gt;A customer enquiry might arrive as an email, text message or notes from a phone call. Before preparing a quote, the business owner needs to understand the job, identify missing details and write a reply.&lt;/p&gt;

&lt;p&gt;My app takes that message and generates four sections:&lt;/p&gt;

&lt;p&gt;Job summary: the key facts from the enquiry.&lt;/p&gt;

&lt;p&gt;Missing information: questions to help assess the work.&lt;/p&gt;

&lt;p&gt;Customer reply: an editable response to the customer.&lt;/p&gt;

&lt;p&gt;Quote scope: a provisional starting point for a quote.&lt;/p&gt;

&lt;p&gt;Each section has its own text box and Copy button. The business owner reviews and edits everything before using it.&lt;/p&gt;

&lt;p&gt;The first version focuses on electricians. For example, someone might request three ceiling fan installations, mention that they have already purchased the fans, and ask about next Friday. The app organises those details without confirming a booking or inventing a price.&lt;/p&gt;

&lt;p&gt;Who would pay for it? My target customer is a small trade business handling its own enquiries and quoting. The value I want to test is whether reducing this repetitive admin makes a paid service worthwhile.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://enquiry-to-quote.netlify.app/" rel="noopener noreferrer"&gt;👉 Try Enquiry to Quote&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Try an example, then Generate draft. Review the four sections, edit the wording and copy what you need.&lt;/p&gt;

&lt;p&gt;The public demo allows five generation requests per IP address every 15 minutes. The backend uses Render’s free hosting, so the first request after a period of inactivity may take longer.&lt;/p&gt;

&lt;p&gt;Please use sample enquiries and avoid entering sensitive information. Generation uses hosted third-party AI providers.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/fabs-pe/enquiry-to-quote" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project has two main folders:&lt;/p&gt;

&lt;p&gt;client: React interface built with Vite.&lt;/p&gt;

&lt;p&gt;server: Express API, model request and response validation.&lt;/p&gt;

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

&lt;p&gt;The AI at the core is Meta’s open-weight Llama 3.3 70B Instruct, accessed through OpenRouter.&lt;/p&gt;

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

&lt;p&gt;React sends the enquiry to my Express backend.&lt;/p&gt;

&lt;p&gt;Express validates the input and checks the request limit.&lt;/p&gt;

&lt;p&gt;The backend sends the enquiry and task instructions to the model.&lt;/p&gt;

&lt;p&gt;A JSON schema defines the four expected output fields.&lt;/p&gt;

&lt;p&gt;The backend parses and validates the response.&lt;/p&gt;

&lt;p&gt;React displays the drafts for editing and copying.&lt;/p&gt;

&lt;p&gt;The model does the central work: interpreting an unstructured message, identifying gaps and drafting useful text.&lt;/p&gt;

&lt;p&gt;I wrote the instructions around Australian English and the practical limits of the product. The model is told not to invent prices, promise availability, confirm bookings or provide electrical installation instructions. Unconfirmed work should be marked as subject to confirmation.&lt;/p&gt;

&lt;p&gt;The idea grew out of my work building a website for AVP Electrical, a small electrical business in Forster, NSW. I wanted to explore a tool that could help a business like theirs spend less time organising enquiries and preparing replies.&lt;/p&gt;

&lt;p&gt;AVP is the first business I’d like to test it with. The app is working, but its usefulness and willingness to pay still need to be validated with real users.&lt;/p&gt;

&lt;p&gt;The frontend is deployed on Netlify, and the backend runs on Render. The API key stays on the backend.&lt;/p&gt;

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

&lt;p&gt;For this project, the benefit is choice and a path to running the model elsewhere.&lt;/p&gt;

&lt;p&gt;Using an open-weight model means I can evaluate the same model through different hosting arrangements, or explore self-hosting later, subject to its licence and hardware requirements. I’m not limited to accessing the model through one company’s closed API.&lt;/p&gt;

&lt;p&gt;The model name is configured through an environment variable. The app’s interface works with four defined fields, so I can test another compatible model without redesigning the frontend. Any replacement would still need testing for output quality and instruction-following.&lt;/p&gt;

&lt;p&gt;That matters for a small side hustle. Inference costs, response quality and provider availability all affect whether the service is practical to sell.&lt;/p&gt;

&lt;p&gt;This version uses hosted inference: it isn’t offline, it isn’t free to operate, and enquiries leave the user’s device. Open weights give me more options for how the product could evolve.&lt;/p&gt;

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

&lt;p&gt;One useful debugging lesson came when the interface appeared to be generating forever. A direct request using curl showed that the backend and model were working—the draft returned in around 11 seconds.&lt;/p&gt;

&lt;p&gt;Chrome’s console revealed the actual problem: my React handler referenced data before it was defined. The error occurred outside the request’s error-handling block, leaving the loading state active.&lt;/p&gt;

&lt;p&gt;Fixing the handler taught me more than simply getting the button working. I learned to trace a request across the frontend, backend and model provider, and to use evidence to isolate the failure.&lt;/p&gt;

&lt;p&gt;We also refined the model instructions after an early draft assumed existing light fittings would be removed. That was a reminder that correctly formatted AI output still needs human review.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Daylight ☀️ Less Scrolling, More Outside | with Open AI</title>
      <dc:creator>fab-pe</dc:creator>
      <pubDate>Sat, 10 Oct 2026 12:00:30 +0000</pubDate>
      <link>https://dev.to/fabpe/daylight-less-scrolling-more-outside-with-open-ai-2i0d</link>
      <guid>https://dev.to/fabpe/daylight-less-scrolling-more-outside-with-open-ai-2i0d</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;☀️ Daylight — Less scrolling. More outside.&lt;/p&gt;

&lt;p&gt;Daylight helps you turn a spare 10, 20, or 30 minutes into an outdoor walking break.&lt;/p&gt;

&lt;p&gt;It’s for anyone who spends too much time at a desk and needs a little encouragement to step outside. Describe how you’re feeling, choose your time and walking intensity, and Daylight uses an open model to match you with a suitable walking session.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;“I've been studying all day and need some fresh air.”&lt;/p&gt;

&lt;p&gt;Once you have your plan, start the timer and put your phone away. When you return, confirm your outdoor minutes and save your break.&lt;/p&gt;

&lt;p&gt;Daylight includes:&lt;/p&gt;

&lt;p&gt;🌿 AI matching with curated walking sessions.&lt;/p&gt;

&lt;p&gt;⏱️ A timer that catches up when you return to the page.&lt;/p&gt;

&lt;p&gt;📒 An outdoor journal and today’s total minutes.&lt;/p&gt;

&lt;p&gt;💾 Browser storage to restore unfinished breaks.&lt;/p&gt;

&lt;p&gt;☀️ An optional local UV forecast check.&lt;/p&gt;

&lt;p&gt;The goal is to make the screen the shortest part of the experience.&lt;/p&gt;

&lt;p&gt;Daylight records self-confirmed outdoor time, including time in shade. It doesn’t measure sunlight exposure or vitamin D.&lt;/p&gt;

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

&lt;p&gt;Try it here: &lt;a href="https://dev.tourl"&gt;trackdaylight.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter what you need from a break, choose your time and intensity, and select Plan my break.&lt;/p&gt;

&lt;p&gt;The first match may take a little longer while the AI model downloads. After that, try starting a break, refreshing the page, and returning to your timer.&lt;/p&gt;

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

&lt;p&gt;GitHub repository: &lt;a href="https://dev.tourl"&gt;fabs-pe/daylight&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The README includes local setup instructions, how the matching works, and details about browser storage and location use.&lt;/p&gt;

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

&lt;p&gt;built Daylight with React and Vite, styled it with CSS, and deployed it on Netlify.&lt;/p&gt;

&lt;p&gt;The AI runs in the browser using Transformers.js and the open-weight Xenova/all-MiniLM-L6-v2 embedding model.&lt;/p&gt;

&lt;p&gt;Here’s how the matching works:&lt;/p&gt;

&lt;p&gt;Daylight filters its curated walking sessions by the selected intensity.&lt;/p&gt;

&lt;p&gt;The model converts your request and the session descriptions into embeddings.&lt;/p&gt;

&lt;p&gt;Similarity scores identify the closest match.&lt;/p&gt;

&lt;p&gt;Your selected duration determines the length of the walking plan.&lt;/p&gt;

&lt;p&gt;The model interprets the meaning of your request; the walking instructions come from a curated collection. It doesn’t generate exercise advice.&lt;/p&gt;

&lt;p&gt;Inference runs in a Web Worker using WebAssembly and a quantized model. This keeps the AI processing separate from the main interface.&lt;/p&gt;

&lt;p&gt;The timer uses timestamps so it can catch up after you return to the page. The journal and unfinished break are saved in localStorage.&lt;/p&gt;

&lt;p&gt;For the UV card, Daylight requests location permission when you press the check button, then sends rounded coordinates to Open-Meteo. It displays the forecast daily maximum UV index, rather than a live reading or personal exposure measurement.&lt;/p&gt;

&lt;p&gt;I’m a junior developer, and I wanted to build this myself as practice. Working through state, effects, storage, workers, model loading, and deployment taught me a lot more than simply getting a finished app.&lt;/p&gt;

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

&lt;p&gt;Open AI makes browser-based matching practical for this project.&lt;/p&gt;

&lt;p&gt;Your request stays on your device for inference. Daylight processes what you write in your browser rather than sending it to a hosted AI inference service.&lt;/p&gt;

&lt;p&gt;There’s no AI API key or paid inference service to maintain. The model runs on the visitor’s device, which lets me deploy the app as a static site without a dedicated AI backend.&lt;/p&gt;

&lt;p&gt;I can inspect and change the matching behaviour. I can improve the session descriptions, add new walking options, or experiment with another compatible model. The curated plans also give me control over the guidance people receive.&lt;/p&gt;

&lt;p&gt;A closed API could provide matching, but it would introduce remote inference, credentials, and an ongoing service dependency. The open approach lets this small project do its core AI work directly in the browser.&lt;/p&gt;

&lt;p&gt;It isn’t completely offline: the app and model need an initial download, and the UV forecast needs internet access. But the matching itself runs locally once the model is loaded.&lt;/p&gt;

&lt;p&gt;My favourite part is that the AI has a small, useful job: help someone choose a break, then let them get on with being outside. 🌿&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Meal Mate: Less Deciding, More Dinner.Built for My Daughter with Local AI</title>
      <dc:creator>fab-pe</dc:creator>
      <pubDate>Mon, 05 Oct 2026 00:33:56 +0000</pubDate>
      <link>https://dev.to/fabpe/meal-mate-less-deciding-more-dinnerbuilt-for-my-daughter-with-local-ai-12oc</link>
      <guid>https://dev.to/fabpe/meal-mate-less-deciding-more-dinnerbuilt-for-my-daughter-with-local-ai-12oc</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 Meal Mate for my daughter to help her decide what to cook after a long day at work and university.&lt;/p&gt;

&lt;p&gt;She enters the ingredients she already has, chooses 10, 20 or 30 minutes, and can select dairy-free or gluten-free preferences. Meal Mate suggests one simple meal for one person, with quantities and cooking instructions.&lt;/p&gt;

&lt;p&gt;I chose to return just one meal to make the decision easier. There is also a Copy Recipe button so she can keep the instructions handy.&lt;/p&gt;

&lt;p&gt;She tried the app and said it would save her time and effort after a long day at work and uni. That was exactly the everyday problem I wanted to help with.&lt;/p&gt;

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

&lt;p&gt;The screenshots shows Meal Mate running locally on my Mac, generating a recipe from available ingredients and copying the result.&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%2F3cdqsu10eoy5s65b9hyu.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%2F3cdqsu10eoy5s65b9hyu.png" alt="Starter Screen" width="800" height="616"&gt;&lt;/a&gt;&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%2Fjxl4keliyqhkmlu0ecf6.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%2Fjxl4keliyqhkmlu0ecf6.png" alt="Loading Bar" width="800" height="154"&gt;&lt;/a&gt;&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%2F164rabs3cyihp6gyza73.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%2F164rabs3cyihp6gyza73.png" alt="Ready Message" width="800" height="170"&gt;&lt;/a&gt;&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%2Fsvy1da8h448924slrsaz.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%2Fsvy1da8h448924slrsaz.png" alt="Final Outcome" width="800" height="2304"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/fabs-pe/meal-mate" rel="noopener noreferrer"&gt;Meal Mate on GitHub&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The frontend uses React and Vite, with Express handling recipe requests. The backend sends a prompt to Gemma 3 4B through Ollama, running locally on my machine.&lt;/p&gt;

&lt;p&gt;The prompt includes the available ingredients, time limit and dietary preferences. It asks for realistic quantities, minimal extra ingredients and five consistent recipe sections.&lt;/p&gt;

&lt;p&gt;Testing helped me improve the instructions. One early result listed dry rice but told the user to reheat it. I refined the prompt to distinguish uncooked ingredients from leftovers and to check consistency between the ingredient list and cooking steps.&lt;/p&gt;

&lt;p&gt;I also added input validation, loading states, error handling, Markdown rendering and a responsive layout.&lt;/p&gt;

&lt;p&gt;Recipes are AI-generated suggestions, so the interface reminds users to check ingredients, cooking instructions and product labels.&lt;/p&gt;

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

&lt;p&gt;Local inference is at the centre of Meal Mate. The recipe request goes to Ollama on my machine rather than a hosted AI service.&lt;/p&gt;

&lt;p&gt;That means no hosted inference API key is required, and ingredient inputs do not need to leave the computer for recipe generation. Once the model and dependencies are installed, local generation can run without an internet connection.&lt;/p&gt;

&lt;p&gt;Using an open-weight model also gives me room to experiment. I can swap models and adjust the instructions as I learn what works best for my daughter.&lt;/p&gt;

&lt;p&gt;There is a trade-off: generation speed depends on the computer running the model. For this small project, that was a useful way to learn about local AI while building something for someone I care about.&lt;/p&gt;

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