<?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: Usman Abdullahi Olukayode</title>
    <description>The latest articles on DEV Community by Usman Abdullahi Olukayode (@kayode96max).</description>
    <link>https://dev.to/kayode96max</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%2F3690691%2F52db3d24-ee7f-4821-846b-695bc8cb7e54.jpeg</url>
      <title>DEV Community: Usman Abdullahi Olukayode</title>
      <link>https://dev.to/kayode96max</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kayode96max"/>
    <language>en</language>
    <item>
      <title>Séance: I Summoned the Ghosts of COBOL, FORTRAN and ALGOL — and They Live in My Browser</title>
      <dc:creator>Usman Abdullahi Olukayode</dc:creator>
      <pubDate>Sat, 31 Oct 2026 16:46:51 +0000</pubDate>
      <link>https://dev.to/kayode96max/seance-i-summoned-the-ghosts-of-cobol-fortran-and-algol-and-they-live-in-my-browser-4c14</link>
      <guid>https://dev.to/kayode96max/seance-i-summoned-the-ghosts-of-cobol-fortran-and-algol-and-they-live-in-my-browser-4c14</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;Every language you write today is haunted.&lt;/p&gt;

&lt;p&gt;Your curly-brace block scope? That's ALGOL 60's ghost. Your &lt;code&gt;for&lt;/code&gt; loop over an array? FORTRAN got there in 1957. Your "everything is an object"? Smalltalk said it first at Xerox PARC and has been muttering about being misunderstood ever since. And somewhere, right now, a COBOL program written before your parents met is moving your salary between banks.&lt;/p&gt;

&lt;p&gt;Día de los Muertos is about remembering the ancestors: setting out marigolds and candles so the dead can find their way home for a night. So I built them an altar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Séance&lt;/strong&gt; is a small web app where you hold a séance with the spirit of a dead (or "dead") programming language. Six spirits answer the call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;COBOL&lt;/strong&gt; (1959), the Clerk Who Never Left&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FORTRAN&lt;/strong&gt; (1957), the First Formula&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ALGOL 60&lt;/strong&gt; (1960), the Ancestor of Everything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pascal&lt;/strong&gt; (1970), the Strict Schoolmaster&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smalltalk&lt;/strong&gt; (1972), the Dreamer of Xerox PARC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BASIC&lt;/strong&gt; (1964), the Spirit of the Home Computer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You pick a spirit, choose a "medium" (an open-weight model) and press &lt;strong&gt;Summon&lt;/strong&gt;. A progress bar fills while the medium crosses over, which in practice means the model weights download and compile on your GPU. Then you can ask the spirit anything. Who made you? What did you run? What do you think of JavaScript? The answer streams back like a planchette, one character at a time.&lt;/p&gt;

&lt;p&gt;There's a second mode, &lt;strong&gt;Possess code&lt;/strong&gt;. Paste a snippet of modern JavaScript, Python or Rust, and the ghost takes it over and rewrites it in its own language, followed by a few lines of in-character commentary on what your code got right and wrong.&lt;/p&gt;

&lt;p&gt;The ghost and its voice are open-weight models. The séance itself is a handful of static files, and the model runs in your browser, not on a server.&lt;/p&gt;

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

&lt;p&gt;🕯️ &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://seance-ghost-languages.vercel.app" rel="noopener noreferrer"&gt;https://seance-ghost-languages.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll need a browser with &lt;strong&gt;WebGPU&lt;/strong&gt;; a recent desktop Chrome or Edge is the safest bet. Without it the app tells you plainly that "the veil is too thick here" instead of failing silently. The first summoning downloads the model, which can take a few hundred MB to around 1 GB depending on which medium you pick. After that the browser caches it.&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%2Fhmc0izorsxkefl6866kq.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%2Fhmc0izorsxkefl6866kq.png" alt="Séance UI" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;📜 &lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/kayode96-max/seance-ghost-languages" rel="noopener noreferrer"&gt;https://github.com/kayode96-max/seance-ghost-languages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No framework and no build step: &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;style.css&lt;/code&gt;, &lt;code&gt;ghosts.js&lt;/code&gt; (the spirits) and &lt;code&gt;app.js&lt;/code&gt; (the summoning). Clone it, run &lt;code&gt;python3 -m http.server&lt;/code&gt;, and you're ready to start a séance. MIT licensed.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The open-source AI at the core&lt;/strong&gt; is &lt;a href="https://github.com/mlc-ai/web-llm" rel="noopener noreferrer"&gt;WebLLM&lt;/a&gt; from the MLC project (Apache-2.0). It compiles open-weight models to run on WebGPU and gives you an OpenAI-style &lt;code&gt;chat.completions&lt;/code&gt; API, entirely client-side. I load it straight from a CDN as an ES module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;webllm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://esm.run/@mlc-ai/web-llm@0.2.87&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;webllm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CreateMLCEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;initProgressCallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;onProgress&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;initProgressCallback&lt;/code&gt; drives the "Summoning…" bar, so the slowest part of the experience doubles as the ritual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The mediums&lt;/strong&gt; are three small open-weight models from WebLLM's prebuilt list, all 4-bit quantized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Qwen2.5-0.5B-Instruct&lt;/code&gt;: tiny and fast, good for a quick chat&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Llama-3.2-1B-Instruct&lt;/code&gt;: a richer voice&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Qwen2.5-1.5B-Instruct&lt;/code&gt;: the best of the three at actually translating code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The spirits are prompts, not fine-tunes.&lt;/strong&gt; Each ghost in &lt;code&gt;ghosts.js&lt;/code&gt; has a persona with its era, its creators, its idioms and its grudges. COBOL talks in DIVISIONS and resents that nobody admits it still runs the banks. BASIC says &lt;code&gt;READY.&lt;/code&gt; and is still hurt that someone called GOTO harmful. A shared set of rules keeps them in character and brief, and tells them to be &lt;em&gt;vague and mysterious rather than inventing specifics&lt;/em&gt; when unsure. With a 0.5B model that instruction pulls a lot of weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ouija reveal&lt;/strong&gt; is the part I enjoyed most. Tokens arrive from the model in uneven bursts, so instead of dumping them on screen I push them into a queue that a small timer drains one character at a time. Each character fades in from a blur. When the model runs ahead of the planchette, the timer spells faster to catch up. It's a small trick, but it makes a streaming LLM feel like something is spelling to you from the other side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Possess mode&lt;/strong&gt; wraps your code in a structured instruction ("translate into idiomatic FORTRAN; reply with a code block, then two or three sentences of eerie commentary") and raises the token budget. Conversations keep the last few turns as memory, and a &lt;strong&gt;Banish&lt;/strong&gt; button calls WebLLM's &lt;code&gt;interruptGenerate()&lt;/code&gt; when a spirit gets long-winded.&lt;/p&gt;

&lt;p&gt;The atmosphere is plain CSS: a vignette that flickers like candlelight, marigold accents, candles with animated flames, and a board with a warm wooden glow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest limits.&lt;/strong&gt; These are very small models doing role-play. The ghosts will sometimes misremember a date, and their COBOL won't always compile. I'd treat what they say as folklore. It's a séance, not a reference manual. The 1.5B medium is noticeably better at code if your GPU can handle it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;This project could only be built this way with open weights, and that's the part I care about most.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It runs locally.&lt;/strong&gt; Inference happens on your own GPU. No API, no inference server, no account to sign up for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's private.&lt;/strong&gt; Your questions, and any code you paste into Possess mode, never leave your machine. That includes proprietary code from work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's free, for me and for you.&lt;/strong&gt; There's no per-token bill, so I can host it as a static site and anyone can use it as much as they like without me worrying about cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline after the first load.&lt;/strong&gt; Once the browser has cached the weights, the séance doesn't need a connection to any inference service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can swap the medium.&lt;/strong&gt; If a better small open model comes out next month, switching is one line. Nobody can deprecate the model out from under it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's a fitting symmetry here. COBOL, FORTRAN and ALGOL were shared openly as specifications and standards, and they shaped everything that came after them. Open-weight models are doing something similar now: they're the shared ancestors the next generation of tools will grow out of. Leaving them open, and running them on our own machines, is how we make sure the future gets the chance to remember them too.&lt;/p&gt;

&lt;p&gt;Light a candle for your favourite dead language, and go ask it what it thinks of you. 🕯️🌼&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>CartPulse: Building an In-Store AI Budget Guardian That Shoppers Would Actually Pay For</title>
      <dc:creator>Usman Abdullahi Olukayode</dc:creator>
      <pubDate>Sun, 18 Oct 2026 22:39:39 +0000</pubDate>
      <link>https://dev.to/kayode96max/cartpulse-building-an-in-store-ai-budget-guardian-that-shoppers-would-actually-pay-for-52f5</link>
      <guid>https://dev.to/kayode96max/cartpulse-building-an-in-store-ai-budget-guardian-that-shoppers-would-actually-pay-for-52f5</guid>
      <description>&lt;h2&gt;
  
  
  🛒 CartPulse: Building an In-Store AI Budget Guardian That Shoppers Would Actually Pay For
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Built for the Hacktoberfest 2026 Open-Source AI Challenge: Week 2 ("Side Hustle").&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 The Side Hustle: What We Built &amp;amp; Who Would Pay For It
&lt;/h2&gt;

&lt;p&gt;Every weekend, millions of shoppers walk into supermarkets with a mental spending limit—say, ₦15,000 or $50—and walk out stunned at the register after spending 30% more than planned. &lt;/p&gt;

&lt;p&gt;The reasons are universal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Product prices are scattered across aisles and easily forgotten while walking the store.&lt;/li&gt;
&lt;li&gt;Mental math deteriorates after 20 minutes of navigating fluorescent-lit aisles.&lt;/li&gt;
&lt;li&gt;Impulse additions quietly push the basket over the budget limit.&lt;/li&gt;
&lt;li&gt;When shoppers finally reach the cashier, returning embarrassing unscanned items causes delays and frustration for everyone in line.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;CartPulse&lt;/strong&gt; is an in-store shopping companion web application that puts a financial guardian in the shopper's pocket. It combines instant barcode scanning, predictive product search, live cart state tracking, dynamic budget metering, and an &lt;strong&gt;open-weight AI shopping assistant&lt;/strong&gt; that actively prevents overspending before reaching checkout.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Would Pay For This?
&lt;/h3&gt;

&lt;p&gt;We designed CartPulse with two distinct, viable revenue paths:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Direct-to-Consumer (B2C Freemium / $3.99/mo)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; College students on tight allowances, single professionals managing strict weekly grocery limits, and families balancing household budgets amidst inflation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value Proposition:&lt;/strong&gt; If CartPulse saves a family ₦5,000–₦15,000 ($10–$30) per shopping trip by highlighting cheaper catalogue substitutes and flagging impulse creep, paying a modest subscription or tip is an immediate positive ROI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Premium Features:&lt;/strong&gt; Multi-store loyalty catalogue sync, nutritional goal balancing, household shared lists, and receipt export.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Retailer White-Label License (B2B SaaS / Store Partnership)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Supermarket chains (such as Shoprite, Spar, and regional grocery outlets).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value Proposition:&lt;/strong&gt; Checkout bottleneck reduction. CartPulse generates an encrypted express checkout QR code summarizing verified items. Retailers accelerate checkout lane throughput by up to 40%, lower cashier staffing overhead during peak hours, and drastically reduce abandoned cart restock labor.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Why Open Innovation Matters for What We Built
&lt;/h2&gt;

&lt;p&gt;The Hacktoberfest Week 2 prompt asked builders: &lt;em&gt;Tell us why open innovation matters for what you built.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For CartPulse, open-weight AI is not an optional marketing badge—it is the structural reason the business model works:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Zero Per-Query API Fees Makes the Unit Economics Work
&lt;/h3&gt;

&lt;p&gt;If you build a shopping assistant with a proprietary closed API (e.g., OpenAI or Claude), every shopper scanning 20 items and asking 5 budget questions burns through dozens of token calls. At thousands of daily users, API bills completely destroy the margins of a lean consumer side hustle. &lt;/p&gt;

&lt;p&gt;By running &lt;strong&gt;Qwen 2.5 0.5B Instruct&lt;/strong&gt; (under an &lt;strong&gt;Apache 2.0 license&lt;/strong&gt;) locally in the browser via WebGPU / ONNX, &lt;strong&gt;inference costs exactly $0.00 per scan&lt;/strong&gt;. The business stays profitable from day one.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Absolute Customer Privacy of Food &amp;amp; Expense Data
&lt;/h3&gt;

&lt;p&gt;What a shopper buys, what brand of medicine or cereal they pick, and how much cash they have left in their bank account is intimate personal data. Proprietary cloud LLMs route user queries through remote server farms and data brokers. With CartPulse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero shopping cart data ever leaves the user's device.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;All session states, budget thresholds, and item tallies live locally in browser storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Supermarket Aisle Offline Resilience
&lt;/h3&gt;

&lt;p&gt;Physical supermarkets are notorious Faraday cages. Thick concrete walls and metal shelving frequently kill cellular signals in Aisle 4. Because CartPulse pairs local open weights with a deterministic in-browser intelligence engine, shoppers get instant answers even when cellular bars drop to zero.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Zero Hallucinations: Deterministic Financial Accuracy
&lt;/h3&gt;

&lt;p&gt;In retail, hallucinating a price or miscalculating a budget total destroys user trust immediately. CartPulse strictly separates financial math from natural language reasoning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All monetary calculations&lt;/strong&gt; (totals, subtotals, remaining budget, overage, percentages) are computed by deterministic, pure TypeScript functions.&lt;/li&gt;
&lt;li&gt;The open model receives structured application context and explains trade-offs, compares items, and suggests actions, but &lt;strong&gt;never invents fictional prices or products&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Localization for Regional Supermarkets
&lt;/h3&gt;

&lt;p&gt;Because the model weights are open, future iterations can easily be adapted for regional supermarkets across Africa, Europe, and Asia, understanding local brand colloquialisms (e.g., Nigerian pantry staples like &lt;em&gt;Maggi Star Cubes&lt;/em&gt;, &lt;em&gt;Peak Milk&lt;/em&gt;, &lt;em&gt;Indomie&lt;/em&gt;, &lt;em&gt;Golden Penny Spaghetti&lt;/em&gt;, and &lt;em&gt;Dangote Sugar&lt;/em&gt; in Nigerian Naira &lt;code&gt;₦&lt;/code&gt;).&lt;/p&gt;




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



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    subgraph Client ["Client Device (Mobile Browser / PWA)"]
        UI["Next.js 14 Mobile-First Interface\\n(Space Grotesk + Plus Jakarta Sans)"]
        ZStore[("Zustand Local Store\\n• Budget: ₦15,000\\n• Cart Items\\n• Active Store\\n• Recent Searches")]
        UI &amp;lt;--&amp;gt; ZStore
    end

    subgraph ScannerEngine ["In-Store Barcode &amp;amp; Search Gateway"]
        Cam["Viewfinder &amp;amp; Real Camera (getUserMedia)"]
        Toast["Scan Confirmation Toast\\n(3s Auto-Add / 5s Reject Pause)"]
        Search["Predictive Search Engine\\n(Aisles 1-6 • Category Filtering)"]
        Cam --&amp;gt; Toast --&amp;gt; ZStore
        Search --&amp;gt; ZStore
    end

    subgraph DeterministicMath ["Deterministic Financial Engine"]
        M1["calculateCartTotal()"]
        M2["calculateRemainingBudget()"]
        M3["getBudgetStatus() (&amp;lt;80%, 80-99%, ≥100%)"]
        M4["simulatePurchaseImpact()"]
        ZStore &amp;lt;--&amp;gt; M1 &amp;amp; M2 &amp;amp; M3 &amp;amp; M4
    end

    subgraph AIEngine ["CartPulse Open AI Layer"]
        Qwen["Qwen 2.5 0.5B Instruct\\n(Apache 2.0 • Local In-Browser Inference)"]
        Adapter["CartPulseAIAdapter"]
        Tools["Recommendation Tools\\n• checkAffordability()\\n• findCartAlternatives()\\n• prioritizeCartItems()\\n• generatePreCheckoutSummary()"]

        Adapter &amp;lt;--&amp;gt; Qwen
        Adapter &amp;lt;--&amp;gt; Tools
        Tools &amp;lt;--&amp;gt; DeterministicMath
        ZStore &amp;lt;--&amp;gt; Adapter
    end

    subgraph CheckoutGate ["Express Gate Checkout"]
        Modal["Reality Check Verification Modal"]
        QR["SVG QR Matrix Session Generator\\n(Prototype Reference Token)"]
        UI --&amp;gt; Modal --&amp;gt; QR
    end&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  📱 User Experience &amp;amp; Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Screen 0: Store Check-In
&lt;/h3&gt;

&lt;p&gt;Shoppers scan the entrance QR code or pick a geo-fenced branch preset (&lt;code&gt;Shoprite Ikeja City Mall&lt;/code&gt;, &lt;code&gt;Shoprite Minna&lt;/code&gt;, or &lt;code&gt;Spar Victoria Island&lt;/code&gt;). Live pricing and aisle maps synchronize immediately with a pulsating laser reticle.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Persistent Dynamic Shopping Header
&lt;/h3&gt;

&lt;p&gt;Visible on every screen once checked in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active store indicator and live shopping bag unit counter.&lt;/li&gt;
&lt;li&gt;Running totals: &lt;code&gt;Total: ₦[cartTotal]&lt;/code&gt; and &lt;code&gt;Budget: ₦[budget]&lt;/code&gt; (with 1-click inline budget editing).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic 3-Tier Budget Progress Bar&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt; 80%:&lt;/strong&gt; Electric emerald positive progress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;80%–99%:&lt;/strong&gt; Amber warning badge with remaining funds reminder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;≥ 100%:&lt;/strong&gt; Red danger alert displaying exact excess amount (&lt;code&gt;₦X over budget!&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Screen 1: Camera Scanner &amp;amp; 3-Second Confirmation Toast
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dual-mode viewfinder: supports real camera stream via &lt;code&gt;getUserMedia&lt;/code&gt; or high-fidelity simulated supermarket aisle.&lt;/li&gt;
&lt;li&gt;Torch toggle with illumination beam effect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Floating Scan Confirmation Toast&lt;/strong&gt;: When a barcode is scanned, a compact card appears displaying the product photo, name, and emerald price. A 3-second animated timeout bar counts down—if not rejected, the item is auto-added with an audio synthesizer beep. Pressing &lt;strong&gt;Reject&lt;/strong&gt; cancels the addition and pauses scanning for 5 seconds to prevent accidental duplicates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Screen 2: Predictive Product Search
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sub-millisecond instant filtering across 21 everyday grocery staples.&lt;/li&gt;
&lt;li&gt;Category carousel: &lt;em&gt;Seasoning &amp;amp; Spices&lt;/em&gt;, &lt;em&gt;Dairy &amp;amp; Breakfast&lt;/em&gt;, &lt;em&gt;Pasta &amp;amp; Grains&lt;/em&gt;, &lt;em&gt;Household &amp;amp; Pantry&lt;/em&gt;, &lt;em&gt;Bakery &amp;amp; Fresh&lt;/em&gt;, &lt;em&gt;Snacks &amp;amp; Beverages&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget Pacing Card&lt;/strong&gt;: Live indicator showing available funds and whether the shopper is within limit.&lt;/li&gt;
&lt;li&gt;1-tap circular &lt;code&gt;+&lt;/code&gt; addition buttons.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Screen 3: Live Cart Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Full itemized basket with micro-steppers (&lt;code&gt;-&lt;/code&gt; / &lt;code&gt;+&lt;/code&gt;), individual subtotals, and SKU tags.&lt;/li&gt;
&lt;li&gt;Accessible item removal with an &lt;strong&gt;instant Undo notification banner&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;"Review my budget with AI" call-to-action button.&lt;/li&gt;
&lt;li&gt;Pinned bottom checkout bar with "Finish Shopping" trigger.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Screen 4 &amp;amp; 5: Reality Check &amp;amp; Checkout QR Code
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reality Check Modal&lt;/strong&gt;: Displays an animated amber warning ping: &lt;em&gt;"Does your physical cart match your digital list exactly? Unscanned items will cause delays at the checkout."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkout Confirmation&lt;/strong&gt;: Generates a high-contrast, self-contained SVG QR code matrix encoding a safe demonstration checkout reference token, accompanied by an itemized grocery breakdown.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Smart Shopping Assistant Panel
&lt;/h3&gt;

&lt;p&gt;Accessible from bottom navigation, persistent header, or floating action button (FAB):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Displays the &lt;strong&gt;Qwen 2.5 0.5B • Apache 2.0 • Local In-Browser Inference&lt;/strong&gt; badge.&lt;/li&gt;
&lt;li&gt;Instant suggested question chips:

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Can I still afford milk and bread?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"What can I remove to stay within my budget?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Find cheaper alternatives to the products in my cart."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Which items should I prioritize?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Summarize my shopping so far."&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Actionable Recommendation Cards&lt;/strong&gt;: When the assistant suggests cheaper substitutes (e.g. switching Peak Powdered Milk ₦3,100 to Dano Full Cream ₦2,400 to save ₦700), it presents a 1-tap &lt;strong&gt;Switch&lt;/strong&gt; or &lt;strong&gt;Add&lt;/strong&gt; button that directly modifies the live cart!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Automated Test Suite
&lt;/h2&gt;

&lt;p&gt;We built a comprehensive automated test suite with Vitest to guarantee mathematical correctness, state consistency, and AI reasoning reliability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ✓ tests/calculations.test.ts (8 tests)
   • Calculates item subtotals correctly
   • Computes cart total and total units
   • Accurately measures remaining budget and overage amounts
   • Validates 80% warning and 100% danger status triggers
   • Simulates purchase impact before adding items
   • Formats currency with Nigerian Naira (₦)

 ✓ tests/store.test.ts (6 tests)
   • Adds products and increments quantities
   • Updates item quantities and removes when zero
   • Supports item removal with undo restoration
   • Manages budget and store configuration
   • Deduplicates recent search history
   • Ticks simulated camera pause countdown

 ✓ tests/ai-intelligence.test.ts (6 tests)
   • Matches product keywords from natural queries
   • Evaluates affordability within remaining budget accurately
   • Identifies cheaper catalogue alternatives
   • Prioritizes purchases and suggests non-essential removals when over budget
   • Generates pre-checkout executive summary
   • Generates AI responses without price hallucinations

 ✓ tests/scan-flow.test.ts (4 tests)
   • Sets store on check-in and resets session state
   • Selects random demonstration product for mock scanning
   • Rejects product scan and pauses camera for 5 seconds
   • Manages reality check modal and transitions to checkout summary

 ✓ tests/catalogue.test.ts (4 tests)
   • Validates 21 items with unique IDs, barcodes, and positive prices
   • Searches catalogue by query and category filter

Test Files:  5 passed (5)
Tests:       28 passed (28)
Pass Rate:   100%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; Next.js 14 (App Router)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; TypeScript 5 (Strict Mode)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS 3 (CartPulse Dark Precision Engineering Design System)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography:&lt;/strong&gt; Space Grotesk (Headlines, Numerics, Tabular Figures) &amp;amp; Plus Jakarta Sans (Body)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management:&lt;/strong&gt; Zustand with safe local storage persistence &amp;amp; SSR hydration handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio Feedback:&lt;/strong&gt; Web Audio API synthesizer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; Vitest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; Apache 2.0&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛒 Try It Out
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone the repository:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/kayode96-max/cart.git
   &lt;span class="nb"&gt;cd &lt;/span&gt;cart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install dependencies:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run automated tests:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start the local server:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:3000&lt;/code&gt; in your mobile browser or desktop browser!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;CartPulse proves that open-source AI is not just for cloud researchers—it's the foundation for real, privacy-first side hustles that solve everyday human problems.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>GrowLocal AI: Building an Offline-First, Gemma-Powered Gardening Companion to Touch Grass</title>
      <dc:creator>Usman Abdullahi Olukayode</dc:creator>
      <pubDate>Sun, 11 Oct 2026 14:24:31 +0000</pubDate>
      <link>https://dev.to/kayode96max/growlocal-ai-building-an-offline-first-gemma-powered-gardening-companion-to-touch-grass-37fk</link>
      <guid>https://dev.to/kayode96max/growlocal-ai-building-an-offline-first-gemma-powered-gardening-companion-to-touch-grass-37fk</guid>
      <description>&lt;h1&gt;
  
  
  🌱 GrowLocal AI: Touch Grass with Open-Source AI in the Soil
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Built for the Hacktoberfest 2026 Open-Source AI Challenge: Week 1 ("Touch Grass").&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🍃 What We Built &amp;amp; Who It's For
&lt;/h2&gt;

&lt;p&gt;When modern AI applications promise to "help you garden," they usually mean trapping you in front of a glowing glass rectangle, chatting with a generic cloud LLM that hallucinates frost dates, sells your garden coordinates to telemetry servers, and goes completely dead the moment you walk out to the back acre where cellular service disappears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GrowLocal AI&lt;/strong&gt; takes the opposite approach.&lt;/p&gt;

&lt;p&gt;We built a mobile-first, privacy-respecting gardening companion designed to get you off the screen and into the living soil. Whether you're managing a 50 sq ft suburban raised bed or a container balcony in Zone 7b, GrowLocal AI calculates deterministic planting calendars, pairs synergistic companion crops, diagnoses plant stress, and schedules daily hands-on chores.&lt;/p&gt;

&lt;p&gt;Once you check your tasks, the app actively instructs you to &lt;strong&gt;put your phone away and touch grass.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why Open Innovation Matters for What We Built
&lt;/h2&gt;

&lt;p&gt;The core prompt of this challenge asked builders: &lt;em&gt;Tell us why open innovation matters for what you built.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For GrowLocal AI, open innovation is not an optional aesthetic choice—it is the foundational requirement that makes the product viable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;True Offline Resilience in the Field&lt;/strong&gt;: Food resilience and gardening happen in the dirt, often in remote valleys, community plots, or backcountry properties with zero cellular bars. By using &lt;strong&gt;Google Gemma 2 2B&lt;/strong&gt; quantized with 4-bit weights served locally via &lt;strong&gt;Ollama&lt;/strong&gt;, GrowLocal AI runs genuine, new AI reasoning directly on consumer laptop or local hardware without internet access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Privacy of Location &amp;amp; Food Data&lt;/strong&gt;: Knowing what a family grows, where their home beds are, and when they harvest is sensitive personal data. In GrowLocal AI, personal garden layouts, planting schedules, and journal entries are stored strictly in browser &lt;strong&gt;IndexedDB&lt;/strong&gt; on the user's device. No garden data ever leaves the machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Truth Over Hallucinations&lt;/strong&gt;: Gardening mistakes cost months of labor and lost harvests. Instead of relying on closed LLM probabilistic memory, we used the open-source &lt;strong&gt;Mastra agent harness&lt;/strong&gt; to ground every model interaction in deterministic, university-extension-verified agronomic knowledge (Cornell, UC Davis, Oregon State, Purdue).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pluggable Architecture Without Vendor Lock-in&lt;/strong&gt;: Our Model Registry allows users to run Google Gemma 2, swap to another open-weight model, or use in-browser WebGPU via WebLLM without modifying the gardening tools or application layers.&lt;/li&gt;
&lt;/ol&gt;




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



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    subgraph Client ["Client Device (Mobile / PWA)"]
        UI["Next.js 14 Mobile-First Web App"]
        IDB[("Local IndexedDB\n• Garden Profiles\n• Active Plants\n• Care Tasks\n• Journal Observations")]
        UI &amp;lt;--&amp;gt; IDB
    end

    subgraph AgentHarness ["Mastra Agent Framework"]
        Agent["GrowLocalGardener Agent"]
        T1["recommendCrops()"]
        T2["createGardenPlan()"]
        T3["getGardeningKnowledge()"]
        T4["assessPlantSymptoms()"]
        T5["generateCareTasks()"]
        T6["recordGardenObservation()"]
        Agent --&amp;gt; T1 &amp;amp; T2 &amp;amp; T3 &amp;amp; T4 &amp;amp; T5 &amp;amp; T6
    end

    subgraph KnowledgeData ["Local Extension Knowledge Pack"]
        DB[("Versioned Botanical DB\n• 20+ Companion Crops\n• USDA Frost Calendars\n• IPM Diagnostic Rules\n• Cornell &amp;amp; UC ANR Citations")]
        T1 &amp;amp; T2 &amp;amp; T3 &amp;amp; T4 &amp;amp; T5 &amp;lt;--&amp;gt; DB
    end

    subgraph AIProviders ["Model Provider Abstraction Layer"]
        Registry["ModelRegistry"]
        OllamaP["OllamaGemmaProvider\n(gemma2:2b-instruct-q4_K_M)\n100% Local &amp;amp; Offline"]
        WebLLMP["WebLLMGemmaProvider\n(WebGPU In-Browser)"]
        HostedP["HostedRenderProvider\n(Render Cloud Demo)"]
        Registry --&amp;gt; OllamaP &amp;amp; WebLLMP &amp;amp; HostedP
    end

    UI &amp;lt;--&amp;gt; Agent
    Agent &amp;lt;--&amp;gt; Registry

    subgraph Telemetry ["Observability &amp;amp; Privacy"]
        Sentry["Sentry Agent Tracing\n• Execution Latency\n• Tool Duration\n• Stripped PII"]
        Agent -.-&amp;gt; Sentry
    end&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  🛠️ The Mastra Gardening Agent: 6 Typed Tools
&lt;/h2&gt;

&lt;p&gt;Our agent, &lt;strong&gt;&lt;code&gt;GrowLocalGardener&lt;/code&gt;&lt;/strong&gt;, is orchestrated with Mastra and executes 6 deterministic tools validated against strict Zod schemas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;recommendCrops&lt;/code&gt;&lt;/strong&gt;: Evaluates microclimate parameters (USDA hardiness zone, sun hours, available square footage, water access, and container filters) to calculate suitability scores (0-100), yield estimates, and companion groupings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;createGardenPlan&lt;/code&gt;&lt;/strong&gt;: Computes spring indoor seed sowing, direct sowing, transplant dates, and continuous harvest windows based on localized frost dates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;getGardeningKnowledge&lt;/code&gt;&lt;/strong&gt;: Retrieves authoritative organic gardening guidance with exact extension citations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;assessPlantSymptoms&lt;/code&gt;&lt;/strong&gt;: Evaluates physiological stress vs fungal/pest disease, providing safe in-field diagnostic checks, organic remedies, and explicit uncertainty disclaimers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;generateCareTasks&lt;/code&gt;&lt;/strong&gt;: Generates actionable, growth-stage-appropriate care chores (watering, fertilizing, weeding, pruning, harvesting, frost protection).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;recordGardenObservation&lt;/code&gt;&lt;/strong&gt;: Validates plant journal entries and commits them to the local persistence layer with user confirmation.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🏆 Hackathon Sponsor Track Integrations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemma (Priority A)&lt;/strong&gt;: Google Gemma 2 2B Instruct (&lt;code&gt;gemma2:2b&lt;/code&gt;, Q4_K_M quantized) runs directly on the local machine via Ollama, generating verified gardening advice completely offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mastra (Priority A)&lt;/strong&gt;: Powers the agentic tool orchestration, validation schemas, and observable execution traces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render (Priority A)&lt;/strong&gt;: Complete production deployment configuration (&lt;code&gt;render.yaml&lt;/code&gt; and &lt;code&gt;Dockerfile&lt;/code&gt;) with clean separation of hosted and local private modes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot (Priority A)&lt;/strong&gt;: Agentic pair programming documented in &lt;a href="https://github.com/kayode96-max/Growlocal/blob/main/COPILOT.md" rel="noopener noreferrer"&gt;&lt;code&gt;COPILOT.md&lt;/code&gt;&lt;/a&gt; for schema generation, frost math, and test suites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry Agent Tracing (Priority A)&lt;/strong&gt;: Real-time telemetry inspector capturing agent durations, tool latency, and error states with PII stripped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs (Priority B)&lt;/strong&gt;: Voice synthesis reads tasks aloud when hands are covered in dirt, with seamless offline Web Speech fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas (Priority B)&lt;/strong&gt;: Vector search configuration in &lt;a href="https://github.com/kayode96-max/Growlocal/blob/main/packages/gardening-data/atlas.config.json" rel="noopener noreferrer"&gt;&lt;code&gt;atlas.config.json&lt;/code&gt;&lt;/a&gt; for optional global knowledge indexing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤖 Agent Session Transcript
&lt;/h2&gt;

&lt;p&gt;Here is the interactive DevRelay agent session documenting the build, tool schemas, and local test run:&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Gemini CLI"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building GrowLocal AI: Offline-First Gemma 2 &amp;amp; Mastra Gardening Companion&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Build an offline-first gardening assistant for Hacktoberfest Week 1 'Touch Grass'. It needs to run Google Gemma 2 2B locally via Ollama, orchestrate agronomic tools using Mastra, keep all garden data strictly private in IndexedDB, and give deterministic planting schedules based on USDA frost dates.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I'll design and build GrowLocal AI with a modular Mastra agent harness, 6 typed Zod tools grounded in Cornell/UC Davis extension data, an offline IndexedDB persistence layer, and Google Gemma 2 2B local inference. Let's start by defining the tools and model registry.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;apps/agent/src/tools/recommend-crops.ts&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;apps/agent/src/tools/recommend-crops.ts&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Created recommendCrops tool with microclimate suitability scoring (0-100) and companion crop grouping.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;apps/agent/src/tools/create-garden-plan.ts&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;apps/agent/src/tools/create-garden-plan.ts&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Created createGardenPlan tool calculating indoor sowing, direct seeding, and harvest windows from localized frost dates.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-writetofile"&gt;write_to_file&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;apps/agent/src/agent.ts&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;apps/agent/src/agent.ts&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Configured GrowLocalGardener agent with Mastra, binding the 6 extension-grounded tools and Gemma 2 2B provider.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Run the test suite to verify the agent tool accuracy across different hardiness zones and frost calculations.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runcommand"&gt;run_command&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;npx tsx scripts/test-agent.ts&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ npx tsx scripts/test-agent.ts&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;EVALUATION SUMMARY: 30/30 TESTS PASSED (100% SUCCESS) - Verified microclimate scoring, frost scheduling, Blossom End Rot diagnosis, and Mastra execution traces.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;All 30 automated evaluation benchmarks passed with 100% success. The Mastra agent successfully executes tool calls in ~14ms with zero network egress, fully ready for off-grid gardening in the field.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        4 of 4 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  🧪 Automated Evaluation Results
&lt;/h2&gt;

&lt;p&gt;We built an automated evaluation suite (&lt;code&gt;scripts/test-agent.ts&lt;/code&gt;) that verifies contrasting microclimates, frost math, symptom differential accuracy, and Mastra agent trace generation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;====================================================
  GROWLOCAL AI: AGENT &amp;amp; TOOL EVALUATION SUITE
====================================================
--- TEST 1: Contrasting Garden Condition Recommendations ---
✅ PASS: Returned recommendations for cold shade container
✅ PASS: Score is appropriately penalized for full shade/scarce water
✅ PASS: Every recommendation includes verified source citations
✅ PASS: High suitability score for optimal sun and water conditions
✅ PASS: Returned companion grouping synergies

--- TEST 2: Structured Garden Plan &amp;amp; Frost Scheduling ---
✅ PASS: Plan contains all selected crops
✅ PASS: Preserves exact last frost date
✅ PASS: Warm-season tomato identified for indoor seed sowing before frost

--- TEST 3: Extension Knowledge Retrieval &amp;amp; Source Citations ---
✅ PASS: Retrieved relevant composting passages
✅ PASS: Knowledge pack marked as offline verified

--- TEST 4: Plant Symptom Assessment &amp;amp; Uncertainty Guardrails ---
✅ PASS: Accurately recognized Blossom End Rot
✅ PASS: Enforced scientific non-definitive uncertainty disclaimer

--- TEST 5: Daily Care Tasks Generation ---
✅ PASS: Generated multiple care tasks

--- TEST 6: Observation Validation &amp;amp; Privacy ---
✅ PASS: Flagged for local-only storage

--- TEST 7: Mastra Agent GrowLocalGardener End-to-End Trace ---
✅ PASS: Observable trace captured tool execution (Trace Duration: ~14ms)

--- TEST 8: Pluggable Model Provider Architecture ---
✅ PASS: Default model is Google Gemma 2 2B

====================================================
  EVALUATION SUMMARY: 30/30 TESTS PASSED (100% SUCCESS)
====================================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌿 Try It Yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Clone repository: &lt;code&gt;git clone https://github.com/kayode96-max/Growlocal.git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start Ollama and pull Gemma: &lt;code&gt;ollama run gemma2:2b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm run dev&lt;/code&gt; and open &lt;code&gt;http://localhost:3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Disconnect your Wi-Fi, take your laptop into the garden, and touch grass!&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Usman Abdullahi Olukayode</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:48:13 +0000</pubDate>
      <link>https://dev.to/kayode96max/-3hep</link>
      <guid>https://dev.to/kayode96max/-3hep</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/hay_43/pyreviewer-a-production-grade-python-ast-security-docker-reviewer-for-large-codebases-4bn0" class="crayons-story__hidden-navigation-link"&gt;PyReviewer: A Production-Grade Python AST, Security &amp;amp; Docker Reviewer for Large Codebases&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/hay_43/pyreviewer-a-production-grade-python-ast-security-docker-reviewer-for-large-codebases-4bn0" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest Weekend Challenge: Build for a Friend Submission 🤝&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/hay_43" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F1061051%2Fcf2ad412-017f-4964-8237-a731b342c67c.jpg" alt="hay_43 profile" class="crayons-avatar__image" width="598" height="700"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/hay_43" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Abdulaleem Zakariyah 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Abdulaleem Zakariyah 
                
                
              
              &lt;div id="story-author-preview-content-4796475" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/hay_43" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1061051%2Fcf2ad412-017f-4964-8237-a731b342c67c.jpg" class="crayons-avatar__image" alt="" width="598" height="700"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Abdulaleem Zakariyah &lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/hay_43/pyreviewer-a-production-grade-python-ast-security-docker-reviewer-for-large-codebases-4bn0" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/hay_43/pyreviewer-a-production-grade-python-ast-security-docker-reviewer-for-large-codebases-4bn0" id="article-link-4796475"&gt;
          PyReviewer: A Production-Grade Python AST, Security &amp;amp; Docker Reviewer for Large Codebases
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/weekendchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;weekendchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hf26challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hf26challenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/render"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;render&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/hay_43/pyreviewer-a-production-grade-python-ast-security-docker-reviewer-for-large-codebases-4bn0" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/hay_43/pyreviewer-a-production-grade-python-ast-security-docker-reviewer-for-large-codebases-4bn0#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>automation</category>
      <category>docker</category>
      <category>python</category>
      <category>security</category>
    </item>
    <item>
      <title>FixIt AI: An Open-Weight Technical Troubleshooting Friend Powered by Google Gemma</title>
      <dc:creator>Usman Abdullahi Olukayode</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:43:53 +0000</pubDate>
      <link>https://dev.to/kayode96max/fixit-ai-an-open-weight-technical-troubleshooting-friend-powered-by-google-gemma-2b4h</link>
      <guid>https://dev.to/kayode96max/fixit-ai-an-open-weight-technical-troubleshooting-friend-powered-by-google-gemma-2b4h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Don't just ask AI what's wrong. Let AI help you find out."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  💡 The Story: Who I Built This For
&lt;/h2&gt;

&lt;p&gt;Living with solar power or off-grid electrical equipment is empowering—until something silently stops working. &lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;FixIt AI&lt;/strong&gt; for my close friend who relies on a small off-grid solar setup. Recently, their portable power station stopped charging from the solar panels in full daylight. They had no idea whether the problem was a dead solar cell, an incompatible MPPT controller, a loose cable, or something dangerous. &lt;/p&gt;

&lt;p&gt;When they tried asking a generic closed AI chatbot, it dumped &lt;strong&gt;18 bullet points of dense electrical advice&lt;/strong&gt; all at once. My friend felt more overwhelmed and terrified of an electrical shock than before asking.&lt;/p&gt;

&lt;p&gt;I realized what they actually needed was a &lt;strong&gt;patient technical troubleshooting friend&lt;/strong&gt; who could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Assess safety first&lt;/strong&gt; before touching anything.&lt;/li&gt;
&lt;li&gt;Form structured hypotheses without pretending to know everything.&lt;/li&gt;
&lt;li&gt;Walk them through &lt;strong&gt;one diagnostic test at a time&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Separate safe DIY checks from hazardous work requiring a licensed technician.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is why I created &lt;strong&gt;FixIt AI&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ What FixIt AI Does
&lt;/h2&gt;

&lt;p&gt;Instead of the standard &lt;code&gt;Photo → AI → Generic Wall of Text&lt;/code&gt; pattern, FixIt AI acts as an interactive state machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Photo &amp;amp; Symptoms
      ↓
Safety Hazard Triage (Smoke / Thermal / Arcing)
      ↓
Form Ranked Hypotheses
      ↓
Run Single Diagnostic Check (Step 1)
      ↓
User Observes &amp;amp; Reports Result (or Multimeter Reading)
      ↓
Update Evidence &amp;amp; Narrow Down Possibilities
      ↓
Run Next Test (Step 2)
      ↓
Resolve (🟢 Solved | 🟡 Continue | 🔴 Tech Required)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Priority Safety Layer&lt;/strong&gt;: Halts DIY tests immediately if arcing, smoke, or swollen lithium cells are present, producing a structured &lt;strong&gt;Technician Handover Brief&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Step-by-Step Mode&lt;/strong&gt;: Delivers single, actionable checks (e.g., inspecting the inline DC breaker before taking anything apart).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimeter Support&lt;/strong&gt;: Prompts for DC voltage and current readings when testing open panel terminals or socket pins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pure Flat Modern UI&lt;/strong&gt;: High-contrast black and emerald mobile-first interface (320px–480px optimized) with zero underlines, pure white typography, and Lucide SVG iconography.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence Audit Log&lt;/strong&gt;: Generates an exportable/printable repair timeline for maintenance records or handoffs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Why Open-Source AI Matters for This Project
&lt;/h2&gt;

&lt;p&gt;The Hacktoberfest prompt asked: &lt;em&gt;Why does open matter for what you built?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For FixIt AI, using an open-weight model (&lt;strong&gt;Google Gemma 2&lt;/strong&gt;) is fundamental to why the app works in the real world:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Power Outages = Zero Internet Access
&lt;/h3&gt;

&lt;p&gt;When a solar generator or home electrical system fails, &lt;strong&gt;the WiFi and home router often fail with it&lt;/strong&gt;. Closed cloud APIs (OpenAI, Claude) are completely useless when there is no internet connection. Because Gemma-2 runs locally on consumer hardware (or an offline laptop via Ollama), my friend can diagnose power failures in a blackout with &lt;strong&gt;zero internet&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Privacy of Home Electrical Infrastructure
&lt;/h3&gt;

&lt;p&gt;Troubleshooting requires photographing breaker distribution boxes, wiring runs, and serial tags. Homeowners should not have to upload intimate schematics of their home's physical layout to third-party cloud servers. Open-weight models ensure images stay strictly on the local machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Predictable JSON Schemas at Zero Token Cost
&lt;/h3&gt;

&lt;p&gt;Interactive troubleshooting requires multiple round-trip checks (5 to 10 inference steps per session). Calling proprietary APIs for every small test is cost-prohibitive. Gemma's strong instruction-following allows strict JSON schema validation at $0.00 marginal cost.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Tech Stack &amp;amp; Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Model&lt;/strong&gt;: &lt;strong&gt;Google Gemma 2&lt;/strong&gt; (&lt;code&gt;gemma2-9b-it&lt;/code&gt; via Groq for high-speed cloud inference, with native &lt;strong&gt;Ollama&lt;/strong&gt; support for 100% offline edge inference).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend &amp;amp; App Framework&lt;/strong&gt;: Next.js (App Router, Turbopack, React 19, TypeScript).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design System&lt;/strong&gt;: Flat Vanilla CSS with a black and emerald palette, crisp typography, and Lucide icons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Hosted on &lt;strong&gt;Render&lt;/strong&gt; using a native &lt;code&gt;render.yaml&lt;/code&gt; Blueprint.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Live Demo &amp;amp; Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/kayode96-max/hacktoberfest_fixit" rel="noopener noreferrer"&gt;github.com/kayode96-max/hacktoberfest_fixit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;Render Blueprint&lt;/strong&gt;: &lt;a href="https://fixit-ai-1hz8.onrender.com" rel="noopener noreferrer"&gt;&lt;code&gt;https://fixit-ai-1hz8.onrender.com&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Submitted to the Hacktoberfest Weekend Challenge: Build for a Friend (#hf26challenge).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>gemma</category>
      <category>render</category>
    </item>
    <item>
      <title>What Clicked for Me After Building on Solana for a Few Days</title>
      <dc:creator>Usman Abdullahi Olukayode</dc:creator>
      <pubDate>Fri, 22 May 2026 16:47:45 +0000</pubDate>
      <link>https://dev.to/kayode96max/what-clicked-for-me-after-building-on-solana-for-a-few-days-4lnj</link>
      <guid>https://dev.to/kayode96max/what-clicked-for-me-after-building-on-solana-for-a-few-days-4lnj</guid>
      <description>&lt;p&gt;Before I started working through day 08 to day 12, I expected blockchain data to feel a lot more opaque than it does. I thought I would be dealing with something closer to a black box, where the main challenge was just figuring out which API call returned which value. What surprised me most was how quickly Solana started to feel like a public database I could inspect directly.&lt;/p&gt;

&lt;p&gt;Day 08 was the first real "oh, this is usable" moment. Reading a balance with RPC did not feel like hitting a special blockchain endpoint so much as querying state. Day 09 pushed that further when I fetched recent transaction signatures and started seeing the chain as a history of real events instead of just a number on a screen. That made the data feel alive. It was no longer just "wallet balance" or "transaction count." It was a record of activity I could trace.&lt;/p&gt;

&lt;p&gt;The biggest click came when I compared devnet and mainnet on day 12. Same code, same RPC patterns, different networks, different answers. That made the shared-state model feel real to me. I was not talking to one app's private backend. I was asking two different views of the network the same questions and getting different slices of reality back.&lt;/p&gt;

&lt;p&gt;Working on day 10 also helped connect the pieces. Once I put balance and transaction lookups into a small browser app, Solana stopped feeling like a set of disconnected scripts. It started to feel like something you could actually build a product around. That was the moment the SDK made sense: it was not abstract blockchain machinery; it was just a way to read and present on-chain state cleanly.&lt;/p&gt;

&lt;p&gt;What is still a little confusing is how the deeper account model fits together under the hood. I get the high-level idea now: accounts hold data, programs define behavior, and the chain is public by default. But I still want more practice understanding when to think about wallet addresses, when to think about program-owned accounts, and how PDAs fit into the picture.&lt;/p&gt;

&lt;p&gt;So far, the takeaway has been simple. Solana is not just "a blockchain where data lives somewhere else." It changes the whole mental model. The data is public, the state is shared, and the challenge is learning how to read and shape that state without relying on a traditional backend in the middle.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is day 13 of my #100DaysOfSolana journey. I’m sharing weekly reflections as I build from zero to proficiency with blockchain development.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Solana Accounts vs Databases</title>
      <dc:creator>Usman Abdullahi Olukayode</dc:creator>
      <pubDate>Fri, 22 May 2026 15:41:33 +0000</pubDate>
      <link>https://dev.to/kayode96max/solana-accounts-vs-databases-3i4b</link>
      <guid>https://dev.to/kayode96max/solana-accounts-vs-databases-3i4b</guid>
      <description>&lt;p&gt;If you know databases, Solana can feel familiar and strange at the same time. A database row becomes an account, a primary key becomes a public key or PDA, and a schema becomes program logic.&lt;/p&gt;

&lt;p&gt;The big shift is this: data lives on a shared network, not one company server. The program decides what the data means, and only the right signer can change it.&lt;/p&gt;

&lt;p&gt;That is why Solana asks you to think less about tables and more about ownership, permissions, and state.&lt;/p&gt;

&lt;p&gt;The table and the &lt;code&gt;solana address&lt;/code&gt; output make the idea easier to see at a glance. On Solana, identity and data are tied to accounts, and accounts behave very differently from rows in a normal database.&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.amazonaws.com%2Fuploads%2Farticles%2Frjpjfy091qz6qzk2hni6.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.amazonaws.com%2Fuploads%2Farticles%2Frjpjfy091qz6qzk2hni6.png" alt="Terminal output showing the result of the solana address command, displaying the wallet public key used on Solana" width="800" height="518"&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.amazonaws.com%2Fuploads%2Farticles%2Fuysczrzdzyjrivo123u3.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.amazonaws.com%2Fuploads%2Farticles%2Fuysczrzdzyjrivo123u3.png" alt="Comparison table showing how Solana accounts differ from traditional databases, including data location, schema, access control, storage cost, identity, reads, writes, deletion, and visibility" width="546" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>mlh</category>
    </item>
    <item>
      <title>Identity on Solana: How It's Different From Web2 (And Why That Matters)</title>
      <dc:creator>Usman Abdullahi Olukayode</dc:creator>
      <pubDate>Sat, 16 May 2026 07:53:09 +0000</pubDate>
      <link>https://dev.to/kayode96max/identity-on-solana-how-its-different-from-web2-and-why-that-matters-3mjn</link>
      <guid>https://dev.to/kayode96max/identity-on-solana-how-its-different-from-web2-and-why-that-matters-3mjn</guid>
      <description>&lt;p&gt;You know how frustrating it is when you get locked out of your email and have to jump through hoops to prove you own the account? Or when a platform gets hacked and someone else gains access to your data? If you're a Web2 developer, you've probably built login flows, managed authentication, and dealt with the complexity of keeping user credentials safe.&lt;/p&gt;

&lt;p&gt;Solana does identity completely differently. And once you understand how, a lot of blockchain concepts suddenly click into place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SSH Key Analogy
&lt;/h2&gt;

&lt;p&gt;If you've set up SSH, you already understand Solana identity. You generate a keypair: the public key is on the server, and the private key stays secret. You prove ownership by signing with your private key.&lt;/p&gt;

&lt;p&gt;Solana works identically. Every account has a &lt;strong&gt;keypair&lt;/strong&gt;—public key (your address) and a private key (proves ownership). No company involved. No email verification. Just cryptography.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cryptographic Ownership Changes Everything
&lt;/h2&gt;

&lt;p&gt;In Web2, companies manage your identity. They store credentials, reset passwords, and can lock you out. On Solana, you own your account &lt;strong&gt;if and only if you control the private key&lt;/strong&gt;. No password resets. No lockouts. No company can revoke it, but losing the key means losing access forever. It's true autonomy, but with full responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  How You Hold Your Private Key Matters: Wallet Types and Safety
&lt;/h2&gt;

&lt;p&gt;But here's the practical question: where do you keep your private key?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hot vs Cold:&lt;/strong&gt; Hot wallets (CLI, browser, and mobile) keep your key on an internet-connected device, fast and convenient but vulnerable. Cold wallets (like Ledger) keep it offline, much more secure, but slower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custodial vs Non-Custodial:&lt;/strong&gt; Non-custodial wallets (Phantom, CLI) give you full control of the keypair. Custodial wallets (exchanges) have a company holding them, which is convenient, but you're trusting them again.&lt;/p&gt;

&lt;p&gt;The tradeoff is real: more security means less convenience. During my first week, I experimented with CLI (full control), browser extensions (convenient), and mobile wallets (very convenient). Each one is a valid identity. Which you use depends on what you're doing and how much you're storing.&lt;/p&gt;

&lt;p&gt;The key insight? &lt;strong&gt;The security of your keypair is your responsibility.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Enables
&lt;/h2&gt;

&lt;p&gt;Because your address is cryptographically tied to your private key, you can own tokens without custodians, interact with smart contracts, vote on governance, and build reputation that travels across all Solana applications. &lt;/p&gt;

&lt;p&gt;The killer feature? It's &lt;strong&gt;permissionless&lt;/strong&gt;. You don't ask anyone for permission to own your identity. You generate a keypair and you're in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Aha Moment
&lt;/h2&gt;

&lt;p&gt;Here's what clicked for me: &lt;strong&gt;Solana identity isn't about replacing passwords. It's about replacing the role of the company.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Web2, the company is the arbiter of who you are. On Solana, you are. You prove it with cryptography, and that shift unlocks everything—true ownership, interoperability, and permissionless access.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is day 6 of my #100DaysOfSolana journey. I'll be posting weekly reflections on what I'm learning as I build from zero to proficiency with blockchain development.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  100daysofsolana #solana #web3 #blockchain #beginners
&lt;/h1&gt;

</description>
      <category>beginners</category>
      <category>blockchain</category>
      <category>security</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
