<?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: Techie</title>
    <description>The latest articles on DEV Community by Techie (@techie_753).</description>
    <link>https://dev.to/techie_753</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%2F4147022%2F81349cdc-b988-43ac-a667-7bff86e6b532.jpg</url>
      <title>DEV Community: Techie</title>
      <link>https://dev.to/techie_753</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/techie_753"/>
    <language>en</language>
    <item>
      <title>Ghost Money</title>
      <dc:creator>Techie</dc:creator>
      <pubDate>Sat, 31 Oct 2026 16:25:26 +0000</pubDate>
      <link>https://dev.to/techie_753/ghost-money-1jfd</link>
      <guid>https://dev.to/techie_753/ghost-money-1jfd</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Ghost Money&lt;/strong&gt; is a séance for the opportunities nobody told you about.&lt;/p&gt;

&lt;p&gt;Every year, scholarships, hackathon prizes, paid fellowships, conference travel grants and research placements go unclaimed. They are not secret. They are just buried across hundreds of pages, with different rules, different deadlines and different eligibility. They haunt your profile without you ever knowing.&lt;/p&gt;

&lt;p&gt;You describe yourself once: country of citizenship, where you are in your studies, your field, and optionally your age and household income. You press &lt;strong&gt;Summon the ghosts&lt;/strong&gt;, and the app calls up everything you appear to qualify for, sorted by how soon it closes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎓 Scholarships&lt;/li&gt;
&lt;li&gt;⚡ Hackathons and 🏆 competitions&lt;/li&gt;
&lt;li&gt;🌱 Open source programs &lt;/li&gt;
&lt;li&gt;🧭 Fellowships&lt;/li&gt;
&lt;li&gt;✈️ tech conferences&lt;/li&gt;
&lt;li&gt;🔬 Research placements&lt;/li&gt;
&lt;li&gt;💼 Internships and externships&lt;/li&gt;
&lt;li&gt;🧾 Part-time jobs and 📚 tutoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every result shows the reward, a deadline countdown, &lt;em&gt;why&lt;/em&gt; you matched, what you need to do, and a link to the official page. A running total shows the listed prize pools and stipends you are eligible for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I read the theme:&lt;/strong&gt; the ghost in the machine is the forgotten thing that is still there, still real, still waiting for someone to notice it. Here, that is money and chances left unclaimed. The interface is a candlelit séance, and the button really does say "Summon the ghosts". It is spooky on the outside and practical on the inside.&lt;/p&gt;

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

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

&lt;p&gt;To run it:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;, then &lt;code&gt;uvicorn main:app --reload&lt;/code&gt;, then open &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;. You can also just open &lt;code&gt;static/index.html&lt;/code&gt; in a browser: the matching works without the server, and only the AI advice needs it.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Open-weight model:&lt;/strong&gt; &lt;a href="https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct" rel="noopener noreferrer"&gt;Qwen2.5-1.5B-Instruct&lt;/a&gt;, loaded from Hugging Face with the &lt;code&gt;transformers&lt;/code&gt; library and run locally. You can swap in any other model with the &lt;code&gt;GHOST_MODEL&lt;/code&gt; environment variable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; FastAPI, Hugging Face Transformers, and plain HTML, CSS and JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your profile (never leaves your machine)
        |
        v
Eligibility rules, running in the browser
 country, level, field, age, income, deadlines
        |
        v
Your matches, sorted by deadline
        |
        v
Local Qwen writes one line of advice per top match
        |
        v
Guardrail: any line with a number that is not in the listing is discarded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The design choice I care about most is the split between rules and the model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eligibility is plain code, not AI.&lt;/strong&gt; Whether you qualify for something is a yes or no question with real consequences, so it is decided by readable rules (country lists, level, field, age limits, income caps). Every match comes with the reasons it matched, and cases the rules cannot settle, such as a missing age, show as a warning instead of a guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model only does what it is good at.&lt;/strong&gt; Qwen writes a short, practical sentence of advice for each top result, such as what to start with and how to prioritise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model cannot invent facts.&lt;/strong&gt; It sees only the listing fields (name, reward, deadline, days left, first requirements) and your study level and field. If its answer contains any number that is not in that data, the line is thrown away and the rule-based advice is shown instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything degrades gracefully.&lt;/strong&gt; If the model is still downloading, switched off (&lt;code&gt;GHOST_LLM=0&lt;/code&gt;), or the server is not running, the page still works with rule-based advice. The status badge at the top tells you which mode you are in.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each of the 38 entries carries a source note and a last-checked date. Where a date is an estimate the card says so with a "~" and a note.&lt;/p&gt;

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

&lt;p&gt;The inputs to this app are about as personal as data gets: where you are a citizen, how much your household earns, how old you are, what you study. People in exactly the situations this app is meant for are the ones with the most reason to be careful about who sees that.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your profile stays with you.&lt;/strong&gt; With a closed API, the same advice would mean sending your income and citizenship to a third party. With an open-weight model running locally, nothing leaves the machine. The matching runs in your browser, and the model runs on your own computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; There is no per-token bill, no subscription and no API key. That matters for a tool aimed at people looking for money.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can inspect all of it.&lt;/strong&gt; The eligibility rules are readable code, the prompt is visible, and the guardrail that rejects invented numbers is a few lines you can check. Nobody has to trust a black box about whether they qualify for a scholarship.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can change it.&lt;/strong&gt; Want a bigger model, or one that fits an older laptop? Set one environment variable. Want to add your own country's grants? Add an entry to the list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It will not disappear.&lt;/strong&gt; It is not tied to a service that can change its pricing or shut down. A static page and a model on your disk keep working with the lights off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;Most unclaimed opportunities are not lost because people are unqualified. They are lost because nobody told them they existed. I built Ghost Money for the person who has never been told, who does not have a mentor pointing at a deadline, and who should not have to give up their private details to find out what they are owed.&lt;/p&gt;

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

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Slothbotanist: An AI Drink maker that turns your pantry into a tiny herbal bar</title>
      <dc:creator>Techie</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:58:33 +0000</pubDate>
      <link>https://dev.to/techie_753/slothbotanist-an-ai-drink-maker-that-turns-your-pantry-into-a-tiny-herbal-bar-293o</link>
      <guid>https://dev.to/techie_753/slothbotanist-an-ai-drink-maker-that-turns-your-pantry-into-a-tiny-herbal-bar-293o</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;p&gt;&lt;em&gt;&lt;strong&gt;From Forgotten Pantry to First Sip&lt;/strong&gt;&lt;br&gt;
Somewhere in your kitchen, there's a forgotten jar of ginger, a lemon waiting for its moment, and some leftover herbs.....&lt;br&gt;
You could make the same old tea.&lt;br&gt;
Or you could open SlothBotanist.&lt;br&gt;
Enter what you have, choose the kind of drink you're in the mood for, and let your tiny AI apothecary turn everyday ingredients into something more interesting.&lt;br&gt;
Feeling traditional? Try a slow, comforting herbal infusion.&lt;br&gt;
Want something refreshing? Explore a modern cold brew or infused drink.&lt;br&gt;
Have an unfamiliar herb? Start with a photograph.&lt;br&gt;
Need to avoid certain ingredients? Set your restrictions before you begin.&lt;br&gt;
Two drink ideas. Your existing ingredients. One very relaxed sloth.&lt;br&gt;
Meet &lt;strong&gt;SlothBotanist&lt;/strong&gt;, an AI-powered herbal drink maker built with an open-weight Qwen model and a SerpApi-powered ingredient discovery workflow.&lt;br&gt;
Because making something delightful from your pantry shouldn't require a culinary degree, a shopping trip, or seventeen open browser tabs.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;SlothBotanist, an AI-powered herbal drink maker that transforms the ingredients you already have into two distinct drink creations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Heritage Elixir&lt;/strong&gt;&lt;br&gt;
For the traditional soul.&lt;br&gt;
This option focuses on traditional-inspired preparations, such as infusions and slow decoctions. It explores how everyday ingredients can become comforting herbal drinks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Modern Refresh&lt;/strong&gt;&lt;br&gt;
For the experimental soul.&lt;br&gt;
This option explores contemporary preparations, including cold brews, infused water, and smoothies.&lt;br&gt;
Both options start with the same pantry but approach it differently.&lt;br&gt;
The goal is to help users discover new combinations without turning every drink into a shopping list.&lt;/p&gt;
&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Engine Recipe Generation:&lt;/strong&gt; Input your drink goal, shelf ingredients, and allergies to get two distinct drinks (Heritage Elixir and Modern Refresh) created by a local LLM powered by 10 parallel SerpApi search engines. Includes one-click Copy and Print.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete Recipe Intelligence:&lt;/strong&gt; View allergen exclusions, safety cautions, seasonal interest peak charts, picture links, research notes, and a live "Search Crew" dashboard showing the status of all 10 engines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Identification:&lt;/strong&gt; Upload a photo or paste an image link to identify unknown herbs using Google Lens (SerpApi). Pick from top matches and click Add to my shelf directly from an editable input box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distraction-Free Reader:&lt;/strong&gt; Paste any recipe or web article link to strip out ads and clutter, leaving only clean plain text via SerpApi’s Extract API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location Search &amp;amp; Privacy Control:&lt;/strong&gt; Search your city to auto-set local country, language, and Google domain parameters. Features a 2-click browser reset button. All user data (shelf, allergies, location) is kept 100% private in local browser storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;SlothBotanist combines a lightweight frontend, a FastAPI backend, SerpApi integrations, and a local language model.&lt;/p&gt;
&lt;h2&gt;
  
  
  Navigation &amp;amp; App Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1. Brew It (Main Page):&lt;/strong&gt; Input drink goals, available ingredients, and allergies to generate two customized recipes—a traditional Heritage Elixir and a modern Modern Refresh (with Copy/Print actions). Runs 10 SerpApi search engines in parallel for the local LLM to author recipes. Displays allergen exclusion notes, safety cautions, seasonal trend charts, source notes, image links, and a "Search Crew" engine status dashboard.&lt;/li&gt;
&lt;/ul&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%2Fetpytjz9bphmmgpwgi09.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%2Fetpytjz9bphmmgpwgi09.png" alt="brew it" width="800" height="397"&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%2F364toobzs4ro8jbacn2i.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%2F364toobzs4ro8jbacn2i.png" alt="brew it 1" width="799" height="393"&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%2Ffhkwqq52tkh785q9ddoj.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%2Ffhkwqq52tkh785q9ddoj.png" alt="brew it 2" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2. Identify:&lt;/strong&gt; Upload a photo or image URL to identify unknown botanicals via Google Lens (SerpApi). Handles single ("This looks like") or multiple candidate matches, with an editable box to instantly add items to your shelf.&lt;/li&gt;
&lt;/ul&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%2Fhmzxzw8n85y4s9p8u82i.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%2Fhmzxzw8n85y4s9p8u82i.png" alt="identify" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3. Pages:&lt;/strong&gt; Paste any recipe or article link to extract and read clean, clutter-free plain text using SerpApi’s Extract API.&lt;/li&gt;
&lt;/ul&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%2F9pjuul9mhf2p0p3pkt14.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%2F9pjuul9mhf2p0p3pkt14.png" alt="pages" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;4. Ledger:&lt;/strong&gt; Real-time analytics dashboard tracking brews made, searches saved, unique listings, allergen-blocked recipes, and an engine query bar chart (hydrated live from saved search logs).&lt;/li&gt;
&lt;/ul&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%2Fgnhx2wer2hdfguoqs24e.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%2Fgnhx2wer2hdfguoqs24e.png" alt="Ledger" width="799" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5. Settings:&lt;/strong&gt; Localize searches by selecting your city (auto-configures country, language, and Google domain) and manage local data via a two-click browser reset. All user inputs (shelf, allergies, location) are stored 100% locally in your browser for total privacy.&lt;/li&gt;
&lt;/ul&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%2Fog1w80gg24xc7ndq72fa.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%2Fog1w80gg24xc7ndq72fa.png" alt="Settings" width="800" height="386"&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/Coder-432" rel="noopener noreferrer"&gt;
        Coder-432
      &lt;/a&gt; / &lt;a href="https://github.com/Coder-432/slothbotanist" rel="noopener noreferrer"&gt;
        slothbotanist
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      SlothBotanist, an AI-powered herbal drink maker that transforms the ingredients you already have into two distinct drink creations(Heritage Elixir and Modern Refresh).
    &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;SlothBotanist&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;SlothBotanist, an AI-powered herbal drink maker that transforms the ingredients you already have into two distinct drink creations(Heritage Elixir and Modern Refresh).&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/324b4cfa68deb1b9c0008c02e910370ae1e1b7141ce0fe77972b6ea034e7abb7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d3337373641423f7374796c653d666f722d7468652d6261646765266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/324b4cfa68deb1b9c0008c02e910370ae1e1b7141ce0fe77972b6ea034e7abb7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d3337373641423f7374796c653d666f722d7468652d6261646765266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f1089fe65f9ac27d38b03b1b728ac926659fcd1c88dc75269faa736fa95131d3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d3030393638383f7374796c653d666f722d7468652d6261646765266c6f676f3d66617374617069266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/f1089fe65f9ac27d38b03b1b728ac926659fcd1c88dc75269faa736fa95131d3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d3030393638383f7374796c653d666f722d7468652d6261646765266c6f676f3d66617374617069266c6f676f436f6c6f723d7768697465" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/314a37b8dddf7b09719b6a1d95b8d9e7e292ed8df11553c04fa8f0bc6ae54da2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f536572704170692d3030383038303f7374796c653d666f722d7468652d6261646765266c6f676f3d676f6f676c65266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/314a37b8dddf7b09719b6a1d95b8d9e7e292ed8df11553c04fa8f0bc6ae54da2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f536572704170692d3030383038303f7374796c653d666f722d7468652d6261646765266c6f676f3d676f6f676c65266c6f676f436f6c6f723d7768697465" alt="SerpApi"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bca1c0fc9a1a226c057168070219830f89bb0319415ef6ff30ac7c200aab13a8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5177656e5f322e352d2d312e35422d3631356566663f7374796c653d666f722d7468652d6261646765266c6f676f3d68756767696e6766616365266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/bca1c0fc9a1a226c057168070219830f89bb0319415ef6ff30ac7c200aab13a8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5177656e5f322e352d2d312e35422d3631356566663f7374796c653d666f722d7468652d6261646765266c6f676f3d68756767696e6766616365266c6f676f436f6c6f723d7768697465" alt="Qwen"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1cac1c0b7bf6e51eeeb03078852a2049efbca44f461826a42793652734133a3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f48465f5472616e73666f726d6572732d4646443231453f7374796c653d666f722d7468652d6261646765266c6f676f3d68756767696e6766616365266c6f676f436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/1cac1c0b7bf6e51eeeb03078852a2049efbca44f461826a42793652734133a3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f48465f5472616e73666f726d6572732d4646443231453f7374796c653d666f722d7468652d6261646765266c6f676f3d68756767696e6766616365266c6f676f436f6c6f723d626c61636b" alt="Transformers"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d908e7aec0391692119b891fa512870bc72b6cda848f37db25e9e6545c19d57b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f48544d4c355f2f5f435353335f2f5f4a532d4533344632363f7374796c653d666f722d7468652d6261646765266c6f676f3d68746d6c35266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/d908e7aec0391692119b891fa512870bc72b6cda848f37db25e9e6545c19d57b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f48544d4c355f2f5f435353335f2f5f4a532d4533344632363f7374796c653d666f722d7468652d6261646765266c6f676f3d68746d6c35266c6f676f436f6c6f723d7768697465" alt="HTML/CSS/JS"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1830e35c9d0903e882131cd48435cdc95382e74020409f56e55e4ee6227cd703/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7069705f32362e782d3337373641423f7374796c653d666f722d7468652d6261646765266c6f676f3d70797069266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/1830e35c9d0903e882131cd48435cdc95382e74020409f56e55e4ee6227cd703/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7069705f32362e782d3337373641423f7374796c653d666f722d7468652d6261646765266c6f676f3d70797069266c6f676f436f6c6f723d7768697465" alt="pip"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9d6470ab868ac8ac478aceb5e806800200f2aa28540a1adab2794bee464b31b2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e5f756e697474657374732d627269676874677265656e3f7374796c653d666f722d7468652d6261646765266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/9d6470ab868ac8ac478aceb5e806800200f2aa28540a1adab2794bee464b31b2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e5f756e697474657374732d627269676874677265656e3f7374796c653d666f722d7468652d6261646765266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Unit Testing"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/277981430/685961688-484cf183-8960-4db6-aba3-12bbbb72e8a9.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTM5NDUwMTUsIm5iZiI6MTc5Mzk0NDcxNSwicGF0aCI6Ii8yNzc5ODE0MzAvNjg1OTYxNjg4LTQ4NGNmMTgzLTg5NjAtNGRiNi1hYmEzLTEyYmJiYjcyZThhOS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYxMTA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MTEwNlQwNTU4MzVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYWZlNzFiNjdmZTg2YmQ5NTM1ODAyYThhMmJmMDE1YzM0ZmU4NTYxMjZlMDczYTUwYzk1MWQzMDRmYjIzN2U2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.K1s5POZtQwc8oD5rZSSMZL0ZhIsWwA0YLywd-P9YeZ0"&gt;&lt;img width="1408" height="768" alt="Gemini_Generated_Image_1vvzk01vvzk01vvz" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F277981430%2F685961688-484cf183-8960-4db6-aba3-12bbbb72e8a9.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3OTM5NDUwMTUsIm5iZiI6MTc5Mzk0NDcxNSwicGF0aCI6Ii8yNzc5ODE0MzAvNjg1OTYxNjg4LTQ4NGNmMTgzLTg5NjAtNGRiNi1hYmEzLTEyYmJiYjcyZThhOS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYxMTA2JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MTEwNlQwNTU4MzVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iYWZlNzFiNjdmZTg2YmQ5NTM1ODAyYThhMmJmMDE1YzM0ZmU4NTYxMjZlMDczYTUwYzk1MWQzMDRmYjIzN2U2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.K1s5POZtQwc8oD5rZSSMZL0ZhIsWwA0YLywd-P9YeZ0" class="js-gh-image-fallback"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is SlothBotanist?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;SlothBotanist, an AI-powered herbal drink maker that transforms the ingredients you already have into two distinct drink creations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Heritage Elixir&lt;/strong&gt;
&lt;em&gt;For the traditional soul.&lt;/em&gt;
This option focuses on traditional-inspired preparations, such as infusions and slow decoctions. It explores how everyday ingredients can become comforting herbal drinks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Modern Refresh&lt;/strong&gt;
&lt;em&gt;For the experimental soul.&lt;/em&gt;
This option explores contemporary preparations, including cold brews, infused water, and smoothies
Both options start with the same pantry but approach it differently.
The goal is to help users discover new combinations without turning every drink into a shopping list.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Key Features&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;1. Multi-Engine Recipe Generation:&lt;/strong&gt; Input your drink goal, shelf ingredients, and allergies to get two distinct drinks (Heritage Elixir and Modern Refresh) created by a local LLM powered…&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/Coder-432/slothbotanist" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python, FastAPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search and ingredient discovery:&lt;/strong&gt; SerpApi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight AI:&lt;/strong&gt; Qwen/Qwen2.5-1.5B-Instruct&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model runtime:&lt;/strong&gt; Hugging Face Transformers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; HTML, CSS and JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Package Management:&lt;/strong&gt; pip 26.x&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; Python unit tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Additional utilities:&lt;/strong&gt; evaluation suite(eval_brews.py) and weekly safety-Watchlist scanner(weekly_scan.py)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Directory Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SlothBotanist/
├── main.py
├── apothecary_core.py
├── test_core.py
├── weekly_scan.py
├── eval_brews.py
├── requirements.txt
├── README.md
└── static/
    ├── index.html
    ├── style.css
    └── app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installation &amp;amp; Running Locally
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;- Install Dependencies:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Set Your SerpApi Key:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SERPAPI_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_serpapi_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Start the FastAPI Backend:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Access the Application:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Run Tests, Evaluations &amp;amp; Safety Scans:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a. Unit &amp;amp; Integration Tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python test_core.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;b. Run Evaluation Suite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python eval_brews.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;c. Run Weekly Safety Watchlist Scan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python weekly_scan.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  System Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+------------------------------------------------------------------+
|                       USER INTERFACE                             |
+------------------------------------------------------------------+
|  Pantry Ingredients | Drink Mood | Allergy Exclusions            |
|  Brew It | Identify | Pages | Ledger | Settings                  |
+------------------------------------------------------------------+
                                |
                                v
+------------------------------------------------------------------+
|                       FASTAPI BACKEND                            |
+------------------------------------------------------------------+
|  Input Processing             |     Search Coordination          |
|  Allergy Filtering            |     Duplicate-Query Filtering    |
|  Drink Generation             |     Output Validation            |
+------------------------------------------------------------------+
                                |
                                v
+------------------------------------------------------------------+
|                  SERPAPI INTEGRATION LAYER                       |
+------------------------------------------------------------------+
|  SEARCH ENGINES                                                  |
|  +------------------------------------------------------------+  |
|  | Google Search          | Recipes and preparation           |  |
|  | DuckDuckGo             | Ingredient discovery              |  |
|  | Google Scholar         | Academic and allergy research     |  |
|  | Google Books           | Traditional herbal sources        |  |
|  | Google Patents         | Extraction methods                |  |
|  | Google News            | Safety warnings and recalls       |  |
|  | YouTube                | Preparation demonstrations        |  |
|  | Google Trends Trending | Current trending topics           |  |
|  | Google Trends          | Search interest over 12 months    |  |
|  | Google Images          | Visual results for the UI         |  |
|  +------------------------------------------------------------+  |
|  ADDITIONAL APIS                                                 |
|  +------------------------------------------------------------+  |
|  | Google Lens            | Photo-based herb discovery        |  |
|  | Extract API            | Recipe-page content               |  |
|  | Search Archive API     | Previous results by search ID     |  |
|  | Locations API          | Supported search locations        |  |
|  | Account API            | Account usage information         |  |
|  +------------------------------------------------------------+  |
|  RELIABILITY                                                     |
|  +------------------------------------------------------------+  |
|  | Successful-search caching in .sloth_cache/                 |  |
|  | HTTP 401/429 handling and 10-second engine cooldown        |  |
|  | Cached-result fallback                                     |  |
|  | Retry without rejected _sasl / _saslop parameters          |  |
|  | SLOTH_OFFLINE=1 for cached research                        |  |
|  +------------------------------------------------------------+  |
+------------------------------------------------------------------+
                                |
                                v
+------------------------------------------------------------------+
|                  SEARCH CONTEXT ASSEMBLY                         |
+------------------------------------------------------------------+
|  Search Results | Ingredient Information | Numbered Sources      |
+------------------------------------------------------------------+
                                |
                                v
+------------------------------------------------------------------+
|                      LOCAL QWEN MODEL                            |
+------------------------------------------------------------------+
|  Model: Qwen/Qwen2.5-1.5B-Instruct                               |
|  Generates: Heritage Elixir + Modern Refresh                     |
+------------------------------------------------------------------+
                                |
                                v
+------------------------------------------------------------------+
|                  APPLICATION VALIDATION                          |
+------------------------------------------------------------------+
|  Allergen Checks | Pantry Checks | Citation Validation           |
|  Regeneration or Withholding When Checks Fail                    |
+------------------------------------------------------------------+
                                |
                                v
+------------------------------------------------------------------+
|                       YOUR TWO BREWS                             |
+------------------------------------------------------------------+
|       HERITAGE ELIXIR         |         MODERN REFRESH           |
+------------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SerpApi: The Secret Ingredient Behind Every Brew
&lt;/h2&gt;

&lt;p&gt;SlothBotanist isn't designed to make users research herbs. It's designed to help them make drinks.&lt;br&gt;
SerpApi works behind the scenes to discover preparation methods, explore ingredients, and find information that can inform drink creation.&lt;/p&gt;

&lt;p&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%2Fqx93waj5tpn8y9mb1nbb.webp" 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%2Fqx93waj5tpn8y9mb1nbb.webp" alt="SerpApi" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is how its capabilities fit into the application.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The Ten Search Engines
&lt;/h3&gt;

&lt;p&gt;SlothBotanist is designed around ten SerpApi search-engine configurations. Each has a distinct purpose, query construction, and parameter configuration.&lt;/p&gt;

&lt;p&gt;Search requests are dispatched concurrently using asyncio.gather so that all ten engine searches in a brew go out at the same time without waiting for each one to finish sequentially, while run_in_threadpool runs each blocking SerpApi call in its own worker thread to keep the main event loop completely free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search requests are dispatched simultaneously across ten SerpApi configurations&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.1 Google Search — Recipe Discovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; google&lt;/p&gt;

&lt;p&gt;Google Search looks for recipes and preparation methods that match the user's goal and available ingredients.&lt;br&gt;
This helps locate practical recipes rather than relying entirely on a generated suggestion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.2 DuckDuckGo — An Additional Search Perspective&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; duckduckgo&lt;/p&gt;

&lt;p&gt;DuckDuckGo provides a secondary search index for discovering additional drink ideas and preparation information.&lt;br&gt;
The results may differ from Google Search, providing another set of pages to inspect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.3 Google Scholar — Research and Evidence Discovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; google_scholar&lt;/p&gt;

&lt;p&gt;Google Scholar searches for research relevant to the ingredients and the user's intended drink.&lt;br&gt;
When allergy restrictions exist, the application can also construct an allergy-focused research query.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.4 Google Books — Traditional Herbal References&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; google_books&lt;/p&gt;

&lt;p&gt;Google Books is intended to locate books and traditional herbal references relevant to the ingredients and drink style. This source is particularly relevant to Heritage Elixir.&lt;br&gt;
Live support and successful results from the configured Google Books engine must be verified in the actual integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.5 Google Patents — Extraction and Preparation Techniques&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; google_patents&lt;/p&gt;

&lt;p&gt;Google Patents can discover documents describing various ingredients, extraction methods and related preparation techniques.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.6 Google News — Safety Signals and Current Reporting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; google_news&lt;/p&gt;

&lt;p&gt;Google News searches for reporting that may identify warnings, recalls, ingredient interactions, or emerging safety concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.7 YouTube Search — Preparation Demonstrations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; youtube&lt;/p&gt;

&lt;p&gt;YouTube Search discovers demonstrations that can help users understand preparation techniques.&lt;br&gt;
The integration uses the search_query parameter for the search phrase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.8 Google Trends Trending Now — Current Interest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; google_trends_trending_now&lt;/p&gt;

&lt;p&gt;This engine is intended to discover current trending topics that may provide context for contemporary drink ideas.&lt;/p&gt;

&lt;p&gt;The integration uses the geo parameter to select the country or geographic scope. It does not construct a conventional recipe search query for this request.&lt;/p&gt;

&lt;p&gt;Trends indicate interest, not evidence of health benefits or recipe quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.9 Google Trends — Historical Interest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; google_trends&lt;/p&gt;

&lt;p&gt;This configuration examines interest over time rather than only current trending topics.&lt;br&gt;
The application can compare interest in ingredients and identify a peak month.&lt;br&gt;
For example, if the returned data supports it, the generation context might say that interest in elderberry peaks in October.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.10 Google Images — Visual Discovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Engine:&lt;/em&gt;&lt;/strong&gt; google_images&lt;/p&gt;

&lt;p&gt;Google Images provides visual results that can support the user interface.&lt;br&gt;
Visual results is displayed separately from the textual sources used for recipe generation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Google Search — Recipe Discovery
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; herbal tea recipe &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 2. DuckDuckGo — Additional Search Perspective
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duckduckgo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; home remedy &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; drink&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Google Scholar — Research and Evidence
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_scholar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; herbal clinical evidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Google Books — Traditional Herbal References
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_books&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;traditional herbal decoction &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 5. Google Patents — Extraction Techniques
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_patents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;herbal infusion extraction &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 6. Google News — Safety Signals
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_news&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; herbal safety interaction warning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 7. YouTube — Preparation Demonstrations
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;youtube&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;how to make &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; drink&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 8. Google Trends Trending Now — Current Interest
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_trends_trending_now&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;geo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hl&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 9. Google Trends — Historical Interest
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_trends&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TIMESERIES&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;today 12-m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 10. Google Images — Visual Discovery
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_images&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; herbal drink&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# Concurrent Search Execution
&lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;run_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Inside run_engine(), blocking SerpApi calls are executed using:
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;serp_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Different Drinks, Different Source Perspectives
&lt;/h3&gt;

&lt;p&gt;The two drink formats are designed to use different combinations of search evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.1 Heritage Elixir&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Heritage Elixir focuses on traditional-inspired preparation methods and references.&lt;/p&gt;

&lt;p&gt;Its intended source emphasis includes:&lt;/p&gt;

&lt;p&gt;Google Books for traditional herbal references.&lt;br&gt;
Google Patents for extraction and preparation techniques.&lt;br&gt;
Google Scholar for research discovery.&lt;br&gt;
Relevant web and recipe results where available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.2 Modern Refresh&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modern Refresh focuses on contemporary drink formats and practical preparation ideas.&lt;/p&gt;

&lt;p&gt;Its intended source emphasis includes:&lt;/p&gt;

&lt;p&gt;Google Trends and Google Trends Trending Now for interest patterns.&lt;br&gt;
YouTube for preparation demonstrations.&lt;br&gt;
Google Search and DuckDuckGo for recipes and web information.&lt;br&gt;
Google News when current safety information is relevant.&lt;/p&gt;

&lt;p&gt;These are source-selection priorities, not guarantees that every engine returns useful evidence for every request. The sources available to the generator should depend on the current request and the successful search results.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Google Trends &amp;amp; Trending Now
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_trends&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_trends&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_trends_trending_now&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_trends_trending_now&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 2. YouTube Preparation Demonstrations
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;youtube&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;youtube&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Google Search &amp;amp; DuckDuckGo
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duckduckgo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;duckduckgo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Google News for Current Safety Information
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_news&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_news&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Allergy-Focused Search Integration (google_scholar &amp;amp; google_news)
&lt;/h3&gt;

&lt;p&gt;In addition to recipe discovery, SerpApi directly supports SlothBotanist's allergy-aware architecture by fetching external context for excluded items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Academic Cross-Reactivity (google_scholar):&lt;/strong&gt; When allergy exclusions (such as ragweed, birch pollen, tree nuts, or soy) are active, SerpApi queries academic and clinical literature to surface research regarding botanical cross-reactivity and potential allergen relationships.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety Signals &amp;amp; Recalls (google_news):&lt;/strong&gt; Pulls real-time news reporting, warnings, and recall signals for specific herbs or ingredients.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Academic Cross-Reactivity (google_scholar)
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_scholar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; herbal clinical evidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;allergies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;allergy_words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allergies&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_scholar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; allergy cross-reactivity &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;allergy_words&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Safety Signals &amp;amp; Recalls (google_news)
&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_news&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; herbal safety interaction warning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;allergies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_news&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; allergy &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;allergy_words&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Trend and Seasonality Analysis
&lt;/h3&gt;

&lt;p&gt;Queries search interest over time and processes weekly timelines into monthly averages and peak months to track trend patterns and seasonality Analysis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Trend Analysis
&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_trends&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;serp_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Seasonality Analysis
&lt;/span&gt;&lt;span class="n"&gt;timeline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;interest_over_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timeline_data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="n"&gt;by_query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;timeline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromtimestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;tz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;values&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[]:&lt;/span&gt;
        &lt;span class="n"&gt;by_query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;extracted_value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Additional SerpApi Features
&lt;/h3&gt;

&lt;p&gt;The ten search-engine configurations are only part of the integration. SlothBotanist also includes workflows for ingredient discovery, page extraction, search reproducibility, account information, and geographic localization.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Lens Workflow (google_lens):&lt;/strong&gt; Accepts an image URL, retrieves visual matches, and extracts candidate plant names from knowledge-graph titles to help identify unfamiliar pantry items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract API Workflow (engine=extract):&lt;/strong&gt; Accepts a recipe URL and returns text_content for deep inspection of specific source pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search Archive API / Ledger Workflow:&lt;/strong&gt; Uses search_metadata.id from search responses to retrieve archived search receipts for result reproducibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account API:&lt;/strong&gt; Fetches plan details and remaining credit counts to monitor search capacity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Locations API:&lt;/strong&gt; Configures geographic search parameters (location, gl, hl, google_domain) for localized queries.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Google Lens Workflow
&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_lens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image_url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;serp_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;candidate_names_from_lens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Extract API Workflow
&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;engine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;extract&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;serp_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;extracted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Search Archive API / Ledger
&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serp_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_archive&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;search_id&lt;/span&gt;&lt;span class="p"&gt;})))&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://serpapi.com/searches/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;search_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SERPAPI_KEY&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Account API &amp;amp; Locations API
&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serp_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;account&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serp_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get_account&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;acct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://serpapi.com/locations.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Search Processing, Response Normalization, Deduplication &amp;amp; Citation Ingestion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Normalization Layer:&lt;/strong&gt; Converts disparate engine response structures (organic_results, news_results, video_results, trending_searches, images_results) into a uniform Source record format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request-Scoped URL Deduplication:&lt;/strong&gt; Normalizes and deduplicates URLs within the current request prior to citation mapping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Isolation:&lt;/strong&gt; Guarantees source registries strictly belong to their individual requests.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Normalization Layer
&lt;/span&gt;&lt;span class="n"&gt;_EXTRACTORS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;organic_results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;snippet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,)),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;google_news&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;news_results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;snippet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;youtube&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;video_results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;snippet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Request-Scoped URL Deduplication
&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_norm_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\W+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Numbered Sources &amp;amp; Citation Validation
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;S&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_CITE_RE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cleaned&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cited&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Source Registry &amp;amp; Citation Ingestion
&lt;/span&gt;&lt;span class="n"&gt;sources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dedupe_sources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_sources&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# per request, never global
&lt;/span&gt;
&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;citations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cited&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all_sources&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;archive_ledger_ids&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;archive_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. SerpApi Resilience, Caching, and Error Handling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Key Rejection Guard (401 Handling):&lt;/strong&gt; If an invalid or rejected API key returns a 401 Unauthorized response, searches immediately halt and the app displays: “SerpApi rejected the API key. Check SERPAPI_KEY, then restart the server.” to protect resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-Engine Cooldown:&lt;/strong&gt; HTTP 429 rate limits trigger a 10-second cooldown for the affected engine while other engines and cache fulfill requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request-Parameter Fallback:&lt;/strong&gt; Automatically retries requests once without internal parameters (_sasl=1, _saslop=1) if initially rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;no_cache Parameter:&lt;/strong&gt; By default, SerpApi serves cached search results if an identical query was recently run (saving your monthly search quota). However, when fresh real-time information or breaking news signals are needed, the application can opt to pass no_cache=true to force SerpApi to fetch a brand-new, live result directly from the search engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;zero_trace Parameter:&lt;/strong&gt; For high-privacy or enterprise-tier configurations, the zero_trace=true option tells SerpApi's infrastructure to skip storing search parameters, metadata, or search files on their servers entirely, leaving no trace of the request logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Disk Caching (.sloth_cache/):&lt;/strong&gt; To prevent burning through API limits during development, testing, or offline coding sessions, the application automatically saves successful SerpApi JSON responses locally inside a .sloth_cache/ directory on disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline Replay Mode (SLOTH_OFFLINE=1):&lt;/strong&gt; When you set the environment variable SLOTH_OFFLINE=1, the application short-circuits live external calls entirely. Instead, it reads directly from the local .sloth_cache/ archive. This allows you to run full end-to-end drink generation tests, demo the UI, or run evaluation scripts offline without active internet connectivity or consuming API credits.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. API Key Rejection Guard (401 Handling)
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_auth_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auth_failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;  &lt;span class="c1"&gt;# stop calling until restart
&lt;/span&gt;
&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SerpApi rejected the API key. Check SERPAPI_KEY, then restart the server.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Per-Engine Cooldown (HTTP 429)
&lt;/span&gt;&lt;span class="n"&gt;cooldowns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CooldownLedger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nf"&gt;is_rate_limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;cooldowns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 429s are never retried
&lt;/span&gt;
&lt;span class="c1"&gt;# 3. Request-Parameter Fallback
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SASL_FLAGS&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;is_param_rejection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;))):&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt;
&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_sasl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_saslop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run_in_threadpool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;serp_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# 4. Caching, Privacy &amp;amp; Offline Replay
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ZERO_TRACE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zero_trace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;NO_CACHE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no_cache&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DiskCache&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# stores responses in .sloth_cache/
&lt;/span&gt;&lt;span class="n"&gt;cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;OFFLINE&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;serp_client&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cache_hit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cached&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;offline_miss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why SlothBotanist?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Standard Botanical &amp;amp; Recipe Apps&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;SlothBotanist&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search Coverage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic single-source web search&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Multi-Source Discovery:&lt;/strong&gt; Cross-references search engines, scientific papers, historical books, patents, trend data, news, and video tutorials.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Privacy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Query histories and personal searches saved on third-party servers&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Strict Privacy First:&lt;/strong&gt; Enforces privacy parameters to ensure query data isn't logged or persistent upstream.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recipe Customization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generic, one-size-fits-all recommendations&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Dual-Format Intelligence:&lt;/strong&gt; Tailors queries specifically for traditional heritage elixirs versus modern craft drinks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Safety &amp;amp; Verification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Standard databases that miss recent recalls&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Real-Time Safety Checks:&lt;/strong&gt; Automatically scans current news for product recalls and checks medical literature for plant cross-reactivities.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Seasonal Sourcing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Static seasonal calendars&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Live Market Demand:&lt;/strong&gt; Tracks real-time interest shifts to identify peak seasonal availability for herbs and ingredients.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slow loading times or crashes when databases go down&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Always Available:&lt;/strong&gt; Runs searches seamlessly in parallel and includes built-in offline modes when connectivity is lost.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Output Quality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Made-up ingredients or broken source links&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Verified Information:&lt;/strong&gt; Filters out fake citations and cleans up web sources before generating recipes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;At its core, SlothBotanist is a pantry-first herbal drink generator that helps users transform everyday kitchen ingredients into tailored infusions (Heritage Elixirs and Modern Refreshes).&lt;/p&gt;

&lt;p&gt;Because SlothBotanist handles wellness suggestions and dietary preferences, open innovation is not just a philosophy—it is the foundation of user safety, transparency, and accessible knowledge.&lt;/p&gt;

&lt;p&gt;Relying on closed, proprietary "black-box" models to generate health or dietary recipes creates critical risks. Open innovation solves this by putting complete control and visibility back into the hands of the user and developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Verifiable Evidence &amp;amp; Transparency:&lt;/em&gt;&lt;/strong&gt; Closed AI models frequently hallucinate health claims or invent fake sources with authoritative confidence. Open innovation enables us to pair a lightweight, open-weight language model (Qwen/Qwen2.5-1.5B-Instruct) with transparent, multi-engine retrieval via SerpApi. Because our prompt structures, source-normalization layer, and retrieval code are fully open-source, users can verify exactly where every drink recommendation comes from and trace every citation ([S1], [S2]) directly to live web or scholarly evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Privacy-First Allergen Exclusions:&lt;/em&gt;&lt;/strong&gt; Dietary restrictions (such as tree nuts, dairy, gluten, soy, or pollen cross-reactivities) are personal health data. SlothBotanist uses an open, local-first architecture where allergen filtering and input sanitization run directly in the user's browser (localStorage) before search queries are ever dispatched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Vendor Lock-In or Paywalled Wellness:&lt;/strong&gt; Open-weight models combined with standardized API integrations mean that exploring herbal traditions remains accessible to anyone on modest local hardware, without requiring paywalls or expensive cloud subscriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Community-Driven Safety &amp;amp; Auditability:&lt;/em&gt;&lt;/strong&gt; Open source allows the community to audit our automated safety evaluation scripts (eval_brews.py) and weekly recall scanners (weekly_scan.py). Anyone can inspect how safety rules are enforced or contribute updated ingredient guidelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Reproducible Herbal Discovery:&lt;/em&gt;&lt;/strong&gt; By leveraging open retrieval logic alongside SerpApi's Search Archive Ledger (search_metadata.id), every search query and source set is permanently archived, making drink recommendations fully reproducible and verifiable over time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By keeping the application, language models, and search pipelines open, SlothBotanist turns AI from an opaque black box into a reliable, community-verifiable tool for everyday wellness.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;The true spirit of SlothBotanist is that you can do the sipping while the app does all the thinking.&lt;/p&gt;

&lt;p&gt;When you're ready to unwind, deciding what to drink shouldn't feel like hard work. Figuring out which flavors mesh, guessing what works, checking for sensitivities, and mastering the prep takes all the relaxation out of the ritual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SlothBotanist turns that whole hassle into a 30-second cozy ritual:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Use What You Have:&lt;/em&gt;&lt;/strong&gt; No special shopping trips required. Just type in whatever is already sitting in your kitchen cabinet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Match Your mood and goals:&lt;/em&gt;&lt;/strong&gt; Select your current mood with a single tap—whether you need "Morning energy", "Gentle digestion", or a "Calm before sleep".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Two Instant Drink Choices:&lt;/em&gt;&lt;/strong&gt; Get straight to the good part. You receive two ready-to-make drink ideas right away: a cozy Heritage Elixir and a crisp Modern Refresh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Peace of Mind:&lt;/em&gt;&lt;/strong&gt; Save your dietary exclusions once, and the app quietly filters out anything you need to avoid automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Bottom Line:&lt;/strong&gt;&lt;br&gt;
Zero guesswork, zero effort, and zero stress. You just pick your pantry ingredients, kick back, and instantly get to enjoying your cup.&lt;/p&gt;

&lt;h2&gt;
  
  
  🍵 Your Next Brew Awaits: Time to Take a Sip
&lt;/h2&gt;

&lt;p&gt;Next time you look into your kitchen and see a wedge of lime, half a cucumber, or a pod of green cardamom, don't just reach for a plain mug of hot water.&lt;br&gt;
Let the sloth do the heavy lifting. Discover what your pantry has been trying to tell you all along. Delightfully effortless—your next favorite elixir is already sitting on your counter.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;"Pantry odds, perfect brews."⭐&lt;br&gt;
"Slow down, brew up."✨&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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%2Fwqdmqoqzjq8hgn1ninmg.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%2Fwqdmqoqzjq8hgn1ninmg.png" alt="Slothbotanistglass" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of SerpApi
&lt;/h3&gt;

&lt;p&gt;In SlothBotanist, SerpApi is not an auxiliary add-on, a side widget, or a simple wrapper—it is the core architectural engine that powers the entire system. While standard applications rely on single-endpoint web lookups, SerpApi is Architectural Backbone of SlothBotanist.&lt;/p&gt;

&lt;h4&gt;
  
  
  Architectural Highlights:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High-Performance Concurrency &amp;amp; Ecosystem Workflows:&lt;/strong&gt; Search requests execute simultaneously using asyncio.gather while run_in_threadpool runs blocking SerpApi calls in worker threads to keep the main event loop unblocked. The 10 integrated engines are &lt;em&gt;Google Search (google), DuckDuckGo (duckduckgo), Google Scholar (google_scholar), Google Books (google_books), Google Patents (google_patents), Google News (google_news), YouTube (youtube), Google Trends Trending Now (google_trends_trending_now), Google Trends (google_trends), _and _Google Images (google_images)&lt;/em&gt;. Beyond search, it incorporates &lt;em&gt;Google Lens (google_lens),Extract API (engine=extract), Search Archive API (search_metadata.id),&lt;/em&gt; Account API, and &lt;em&gt;Locations API (location, gl, hl, google_domain)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual-Format Intelligence Routing:&lt;/strong&gt; Prioritizes Books, Patents, and Scholar for traditional Heritage Elixirs, while routing Trends, YouTube, News, and Web Search for contemporary Modern Refreshes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allergy Safety Layer:&lt;/strong&gt; Automates &lt;em&gt;google_scholar&lt;/em&gt; botanical cross-reactivity checks (ragweed, birch, soy, tree nuts etc) and &lt;em&gt;google_news&lt;/em&gt; recall sweeps prior to recipe generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trend &amp;amp; Seasonality Analysis:&lt;/strong&gt; Aggregates weekly interest data into monthly averages and peak demand months.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Normalization &amp;amp; Citation Integrity:&lt;/strong&gt; Request-scoped URL deduplication, isolates source registries per request, and strips hallucinated citations ([S99]) via &lt;em&gt;resolve_citations&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production Resilience &amp;amp; Offline Mode:&lt;/strong&gt; Features 401 key protection, 429 rate-limit cooldowns, parameter fallbacks, explicit no_cache / zero_trace flags, disk caching (.sloth_cache/), and zero-quota offline replay (SLOTH_OFFLINE=1).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Thanks for reading!&lt;/em&gt;&lt;/strong&gt; 🦥🌿&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>serpapi</category>
    </item>
    <item>
      <title>WELLSPRING: The Privacy-First Offline Wellbeing App That Told Me To Close My Devices</title>
      <dc:creator>Techie</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:40:48 +0000</pubDate>
      <link>https://dev.to/techie_753/wellspring-the-privacy-first-offline-wellbeing-app-that-told-me-to-close-my-devices-1peh</link>
      <guid>https://dev.to/techie_753/wellspring-the-privacy-first-offline-wellbeing-app-that-told-me-to-close-my-devices-1peh</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;Modern technology traps us in a digital loop—endless doomscrolling, blue-light exhaustion, and constant notification overload that drains our mental well-being and physical vitality.&lt;/p&gt;

&lt;p&gt;For the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass, I wanted to build something that actively pushes back against screen addiction. Meet WELLSPRING: a 100% offline, privacy-first wellness sanctuary application designed around one core philosophy—screen time should take seconds, so real life can take hours.&lt;/p&gt;

&lt;p&gt;🍃 &lt;strong&gt;What is WELLSPRING?&lt;/strong&gt;&lt;br&gt;
Instead of engaging you in long screen time, endless feeds, or gamified addiction loops, WELLSPRING acts as a lightning-fast digital pitstop. You quickly record your movement, receive a brief calming reflection from a local AI, close your screen, and step straight back into the physical world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features &amp;amp; Unique Innovations&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1.&lt;/strong&gt;🛡️ &lt;strong&gt;100% Offline, No Sign-Ups &amp;amp; Absolute Privacy&lt;/strong&gt;: Zero account creations, zero sign-ups, and zero cloud logins required. Your raw thoughts, feelings, mood ratings, and activity histories live exclusively in a local SQLite file on your hard drive with absolute zero third-party data exposure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;⚡ &lt;strong&gt;Anti-Screen Interface&lt;/strong&gt;: Built explicitly to minimize screen glare and cognitive load. Interactions are brisk and purposeful, designed to eject you from your monitor immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;🎨 &lt;strong&gt;Soothing Multi-Hue Pastel Aesthetic&lt;/strong&gt;: Replaces dark-mode developer tropes and high-contrast, anxiety-inducing interfaces with a tranquil palette of soft pastel lavender (#C8B6E2), pistachio green, rose, peach, and alabaster cream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt;🤖 &lt;strong&gt;Offline Gemma Intelligence via Ollama&lt;/strong&gt;: Leverages Google's lightweight, open-weights Gemma model running directly on local device memory—yielding fast, zero-latency, private reflections without Wi-Fi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt;🌟 &lt;strong&gt;The Unique Core Feature&lt;/strong&gt; — The Sanctuary Guide (#tab-assistant): Unlike standard chat interfaces that trap users in endless conversational loops, the Sanctuary Guide is WELLSPRING’s signature off-grid AI intelligence tab. It queries your local SQLite database to pull your recent movement, energy, and mood logs, passes them securely to Google's open-weights Gemma model via Ollama, and instantly synthesizes deep, personalized mental and physical health reflections.&lt;/p&gt;

&lt;p&gt;🏛️ &lt;strong&gt;Sanctuary Pages &amp;amp; Navigation&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;1.&lt;/strong&gt;📊 &lt;strong&gt;Dashboard (#tab-dashboard):&lt;/strong&gt; Aggregates all your recorded health activities, movement duration, and mood metrics into one unified view so you can assess your well-being at a single glance before shutting your laptop.&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%2F7uyst8vu3xbyxq7mz1s0.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%2F7uyst8vu3xbyxq7mz1s0.png" alt="Dashboard" width="800" height="764"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;📚 &lt;strong&gt;Activity Journal (#tab-tracker)&lt;/strong&gt;: Your personal offline logging interface allowing you to quickly log walks, workouts, stretching sessions, or rest blocks alongside your mood and energy scores (1–5 scale).&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%2Fq6uykpsp6hyj5s5u5snp.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%2Fq6uykpsp6hyj5s5u5snp.png" alt="Activity Journal one" width="800" height="415"&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%2F1zwc25l16qoyoweh0ibe.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%2F1zwc25l16qoyoweh0ibe.png" alt="Activity Journal two" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;🌊 &lt;strong&gt;Reflection Analytics (#tab-analytics)&lt;/strong&gt;: An offline pattern-recognition utility that scans your local database entries to reveal behavioral trends—such as how physical movement directly correlates with higher energy levels—without keeping you stuck reading long reports.&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%2Fbtnbc54eshvs1y0r53pb.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%2Fbtnbc54eshvs1y0r53pb.png" alt="Reflection Analytics" width="799" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt;🔬 &lt;strong&gt;Habit Lab (#tab-experiment)&lt;/strong&gt;: A micro-experimentation sandbox introducing structured, science-backed lifestyle hypotheses—such as morning light strolls, screen-free digital sunsets, or hydration rituals—designed to be read once and practiced entirely away from screens.&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%2Frsgdk1uz5ijkwqfk874i.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%2Frsgdk1uz5ijkwqfk874i.png" alt="Habit Lab" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt;💡 &lt;strong&gt;Health &amp;amp; Reflection Tips (#tab-tips)&lt;/strong&gt;: An evidence-based educational library breaking down physiological principles (like circadian light absorption, breathing pauses, and cellular hydration) into brief, skimmable advice cards.&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%2Ffpqnj0q74qjlnq3k63xv.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%2Ffpqnj0q74qjlnq3k63xv.png" alt="Health &amp;amp; Reflection Tips" width="799" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt;💬 &lt;strong&gt;Sanctuary Guide (#tab-assistant)&lt;/strong&gt;: The unique special feature tab providing deep, personalized mental and physical health reflections by synthesizing your recent journal entries into concise, supportive feedback through local Google Gemma intelligence.&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%2Fmjp8wp6xj2i51odenvmi.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%2Fmjp8wp6xj2i51odenvmi.png" alt="Sanctuary Guide" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;WELLSPRING is built entirely around an offline-first architecture leveraging open-source AI frameworks and local model execution, completely eliminating external network dependencies and cloud sync.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Local AI Intelligence Engine (Google Gemma via Ollama)&lt;/strong&gt;&lt;br&gt;
At the core of WELLSPRING's signature feature—the Sanctuary Guide—is Google's open-weights Gemma model running locally via the Ollama runtime (&lt;a href="http://localhost:11434" rel="noopener noreferrer"&gt;http://localhost:11434&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Instead of keeping users trapped in chat loops, the app queries the local SQLite database to compile recent user activity metrics (movement logs, energy ratings, and moods).&lt;/p&gt;

&lt;p&gt;It passes this structured context locally to Gemma, which uses its instruction-following alignment to synthesize a short, compassionate reflection that grounds the user and explicitly directs them to close their screen and head outside.&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%2Fiad1q7ggm3hkjdird125.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%2Fiad1q7ggm3hkjdird125.png" alt="Gemma" width="447" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Development Workflow with GitHub Copilot&lt;/strong&gt;&lt;br&gt;
The application's backend architecture and pipeline were built efficiently using multi-faceted capabilities in GitHub Copilot:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inline Completions&lt;/em&gt;: Handled repetitive boilerplate code and standard endpoint structures during initial layout creation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chat Edit Mode&lt;/em&gt;: Allowed for targeted, single-file refactoring when establishing thread-safe SQLite connection pooling (check_same_thread=False) and asynchronous context managers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Chat Agent Mode&lt;/em&gt;: Provided high-level workspace context across files to coordinate the local Ollama REST payload serialization (urllib), JSON headers, and strict query limiters (LIMIT 15) to maintain low RAM usage.&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%2F7ughntfitkd0iq3k1ors.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%2F7ughntfitkd0iq3k1ors.jpg" alt="GitHub Copilot" width="447" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📋 &lt;strong&gt;System Requirements:&lt;/strong&gt;&lt;br&gt;
To run WELLSPRING locally with complete off-grid capabilities, ensure your hardware and software environment meets the following baseline specifications:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;strong&gt;Operating System&lt;/strong&gt;: macOS, Linux, or Windows (with WSL2 or native Python support).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;strong&gt;Python&lt;/strong&gt;: Version 3.10 or higher for asynchronous runtime execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;strong&gt;Ollama Runtime&lt;/strong&gt;: Installed locally to manage and serve local open-weights model inference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;strong&gt;AI Model&lt;/strong&gt;: Google's open-weights Gemma model pulled locally via terminal (ollama pull gemma).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; &lt;strong&gt;Hardware Memory&lt;/strong&gt;: Minimum of 4GB of RAM available to host local inference smoothly on device memory without triggering external swaps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚙️ System Architecture &amp;amp; Engineering Flow&lt;/strong&gt;&lt;br&gt;
WELLSPRING utilizes a decoupled, local-first architecture where every tier executes entirely on the host hardware, guaranteeing zero telemetry, zero external network dependency, and absolute privacy.&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%2F75aaag9j1toyj8f76xuw.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%2F75aaag9j1toyj8f76xuw.png" alt="Wellspring Architecture" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The technology stack is structured into distinct functional layers:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;strong&gt;Frontend Presentation Layer&lt;/strong&gt;: Built using HTML5, Tailwind CSS, and Chart.js, styled explicitly with a multi-hue pastel palette to minimize user visual fatigue and eye strain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;strong&gt;Backend Application Layer&lt;/strong&gt;: Powered by FastAPI (Python 3.10+) for lightweight, ultra-fast asynchronous request routing and endpoint management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;strong&gt;Persistence Layer&lt;/strong&gt;: Built on SQLite (wellspring.db) via Python's built-in sqlite3 library, providing zero-configuration, secure, serverless local data persistence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;strong&gt;Intelligence Layer&lt;/strong&gt;: Anchored by Google's open-weights Gemma model served locally via Ollama (&lt;a href="http://localhost:11434" rel="noopener noreferrer"&gt;http://localhost:11434&lt;/a&gt;), acting as the offline reflection engine.&lt;/p&gt;

&lt;p&gt;Developing this architecture cleanly involved leaning on built-in workflows within GitHub Copilot. Early on, GitHub Copilot inline completions helped quickly draft routine endpoint structures and boilerplate layout. For organizing database context managers, utilizing GitHub Copilot Chat edit mode allowed for targeted file adjustments. Furthermore, GitHub Copilot Chat agent mode provided high-level workspace context to coordinate thread-safe database connection pooling (check_same_thread=False) and structure the local Ollama payload pipeline. At the intelligence core, Google's open-weights Gemma model parses local SQLite activity summaries via Ollama, translating historical mood and energy metrics into custom, compassionate reflections that actively instruct users to close their screens and touch grass.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt;🌲 &lt;strong&gt;True Offline Independence&lt;/strong&gt;: Open-weights local inference via Google's Gemma means the model runs directly on your device's RAM, giving you an AI reflection companion anywhere on Earth without Wi-Fi or cellular signal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;🛡️ &lt;strong&gt;Uncompromising Privacy&lt;/strong&gt;: 100% of your personal notes, energy scores, and emotional trends stay on your hard drive. No sign-ups required, no cloud tracking, and no telemetry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;💸 &lt;strong&gt;Zero Subscription Traps&lt;/strong&gt;: Open-weight models cost zero dollars to run, providing free, unlimited mental health tracking forever without needing your screen time to monetize.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt;🎨 &lt;strong&gt;Screen-Minimizing Persona Alignment&lt;/strong&gt;: Google's Gemma lets developers enforce precise system prompts, adopting WELLSPRING's soothing tone naturally—delivering short, grounding reflections that explicitly tell you to put down your device and step outside.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision Factor&lt;/th&gt;
&lt;th&gt;Traditional Wellbeing Apps&lt;/th&gt;
&lt;th&gt;Why WELLSPRING?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Ownership&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stored on third-party servers, vulnerable to breaches&lt;/td&gt;
&lt;td&gt;100% owned by you in a local SQLite file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subscription / Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Recurring monthly fees or paywalled features&lt;/td&gt;
&lt;td&gt;Completely free and open-source forever&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privacy &amp;amp; Tracking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Embedded ad trackers, behavioral profiling&lt;/td&gt;
&lt;td&gt;Zero trackers, zero analytics, air-gapped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Availability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Breaks without internet connection&lt;/td&gt;
&lt;td&gt;Works anywhere—in parks, flight mode, off-grid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Transparency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Closed-source models with opaque data usage&lt;/td&gt;
&lt;td&gt;Runs open local weights (Google Gemma via Ollama)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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/Coder-432" rel="noopener noreferrer"&gt;
        Coder-432
      &lt;/a&gt; / &lt;a href="https://github.com/Coder-432/WELLSPRING" rel="noopener noreferrer"&gt;
        WELLSPRING
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A offline, privacy-first wellness sanctuary application designed to cut screen time short, protect your mental health, and return you to the physical world.
    &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;WELLSPRING&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A offline, privacy-first wellness sanctuary application designed to cut screen time short, protect your mental health, and return you to the physical world.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌿 ABOUT WELLSPRING&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A privacy-first, 100% offline personal wellbeing app that encourages digital detox and mindfulness.&lt;/p&gt;
&lt;p&gt;WELLSPRING uses a local AI model to provide personal grounding reflections based on your journal entries—without sending a single byte of data to external servers or cloud providers. Built with the assistance of GitHub Copilot and powered locally by Google Gemma.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🏛️ Architecture &amp;amp; System Design&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The architecture of WELLSPRING is designed around a fully offline, decoupled local ecosystem. At the presentation tier, a lightweight client interface is rendered using server-side Jinja2 templates styled with Tailwind CSS, serving as a clean local dashboard inside your browser. This communicates directly with a FastAPI backend server running locally on Python, which handles HTTP routing, business logic, and transaction management. For data persistence…&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/Coder-432/WELLSPRING" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  🌲 Field Test: Taking WELLSPRING Outside
&lt;/h2&gt;

&lt;p&gt;I took WELLSPRING out for a real-world spin by walking away from my desk, stepping outside, and trying to use it in the wild. Here is how it actually went:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Setup&lt;/strong&gt;: I made sure my Wi-Fi was completely turned off to test the true air-gapped promise. Since FastAPI, SQLite, and Ollama run locally, the app spun up instantly via &lt;code&gt;uvicorn&lt;/code&gt; without needing any internet connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using It Outside&lt;/strong&gt;: Sitting on a park bench with no signal, I opened the dashboard, logged a 30-minute walk into the offline Activity Journal, and noted how refreshing it felt to track movement without popups, notifications, or cloud distractions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Local AI Check-in&lt;/strong&gt;: I ran the offline Gemma model via Ollama to generate a grounding reflection based on my recent local SQLite entry. Within seconds, it synthesized a short, reassuring note telling me to log off and enjoy the fresh air.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Verdict&lt;/strong&gt;: Building an app that actively forces you to close your laptop and look at the real world—and proving it works completely offline on a park bench—was an awesome exercise. It reinforced why local-first, privacy-focused software is so powerful: it serves you, then immediately gets out of your way so you can go live your life.&lt;/li&gt;
&lt;/ol&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%2Fd9p132tn1umjvlpzurli.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%2Fd9p132tn1umjvlpzurli.png" alt="WELLSPRING" width="799" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🍃 &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;WELLSPRING brings together local intelligence, complete privacy, and an anti-distraction design into a quiet digital sanctuary. By letting open-weight Gemma run entirely offline on your own machine, it provides the insights you need without keeping you tethered to a display.&lt;/p&gt;

&lt;p&gt;After you finish going out and experiencing real life, you simply return to enter your log for a few minutes—and that is all it takes. By actively helping to lower screen fatigue, clear mental clutter, and foster mindful daily habits, WELLSPRING redefines how personal technology can support true mental health wellness and a balanced, grounded lifestyle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Take a deep breath, log your moment quickly, close your laptop, and go touch grass. 🌿&lt;/p&gt;

&lt;p&gt;Disconnect from the noise, reconnect with yourself—touch grass, not glass. 🌟&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;1. Best Use of Gemma&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Role&lt;/em&gt;: Powers both the reflection engine and the offline health guide inside WELLSPRING.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Function&lt;/em&gt;: It reads your raw journal entries from wellspring.db and writes soothing, grounding advice encouraging you to close your screen and go outside. Runs on your CPU/GPU via Ollama, It operates 100% offline with zero sign-up required, guaranteeing data privacy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Best Use of GitHub Copilot&lt;/strong&gt; &lt;br&gt;
&lt;em&gt;Role&lt;/em&gt;: The developer assistant that built the app.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Function&lt;/em&gt;:&lt;br&gt;
Refactored API routes and structured async SQLite connection logic — Chat Edit Mode&lt;/p&gt;

&lt;p&gt;Coordinated multi-file logic between FastAPI endpoints, HTML/Tailwind frontend templates, and the local Ollama pipeline — Chat Agent Mode&lt;/p&gt;

&lt;p&gt;Audited project dependencies and configured privacy exclusions like .gitignore — Workspace Setup&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>DataBugBench: Benchmarking LLMs on Silent Python Data Science Bugs</title>
      <dc:creator>Techie</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:34:24 +0000</pubDate>
      <link>https://dev.to/techie_753/databugbench-benchmarking-llms-on-silent-python-data-science-bugs-5eo2</link>
      <guid>https://dev.to/techie_753/databugbench-benchmarking-llms-on-silent-python-data-science-bugs-5eo2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I created DataBugBench, a benchmark designed to evaluate how accurately modern Large Language Models diagnose and correct subtle runtime and logical errors in Python Data Science code (Pandas, NumPy, and Scikit-Learn).&lt;/p&gt;

&lt;p&gt;While LLMs perform exceptionally well on synthetic LeetCode-style problems, real-world data science pipelines frequently fail due to silent logical errors rather than outright syntax bugs. I specifically benchmarked 5 pervasive data engineering pitfalls:&lt;/p&gt;

&lt;p&gt;Pandas SettingWithCopyWarning Mutations&lt;/p&gt;

&lt;p&gt;Groupby Aggregation Missing Keys&lt;/p&gt;

&lt;p&gt;NumPy Implicit Broadcasting Dimension Mismatches&lt;/p&gt;

&lt;p&gt;Data Leakage in Feature Scaling&lt;/p&gt;

&lt;p&gt;Index Discontinuity after NaN Dropping&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;I evaluated five state-of-the-art models (Claude 3.5 Sonnet, GPT-4o, Gemini 1.5 Pro, Qwen 2.5 Coder 32B, and Llama 3.3 70B) to measure how code specialization affects debugging precision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;p&gt;Silent Logical Errors Are Hardest: Models easily fix explicit syntax errors, but often miss data leakage bugs where code runs without crashing but yields incorrect analytical results.&lt;/p&gt;

&lt;p&gt;Specialization Matters: Code-focused models punch well above their weight class on complex array shape and broadcasting errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Results Summary&lt;/strong&gt;&lt;br&gt;
Claude 3.5 Sonnet: 5/5 passed (100.0% accuracy)&lt;/p&gt;

&lt;p&gt;GPT-4o: 4/5 passed (80.0% accuracy)&lt;/p&gt;

&lt;p&gt;Qwen 2.5 Coder 32B: 4/5 passed (80.0% accuracy)&lt;/p&gt;

&lt;p&gt;Gemini 1.5 Pro: 3/5 passed (60.0% accuracy)&lt;/p&gt;

&lt;p&gt;Llama 3.3 70B: 3/5 passed (60.0% accuracy)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
DataBugBench demonstrates that while frontier LLMs excel at standard code generation, resolving silent data pipeline bugs requires a deeper understanding of implicit state, memory views, and data leakage. Moving forward, evaluating models on non-crashing logic bugs will be critical to building truly reliable AI data science assistants.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
