<?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: Aroso Emmanuel</title>
    <description>The latest articles on DEV Community by Aroso Emmanuel (@emarc99).</description>
    <link>https://dev.to/emarc99</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%2F462416%2F3407b14b-33ee-4e49-8365-49c728eb9f3d.png</url>
      <title>DEV Community: Aroso Emmanuel</title>
      <link>https://dev.to/emarc99</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emarc99"/>
    <language>en</language>
    <item>
      <title>Owe: Gemma 4 drafts the reply I kept avoiding, then a local check decides if I can send it</title>
      <dc:creator>Aroso Emmanuel</dc:creator>
      <pubDate>Mon, 26 Oct 2026 04:00:29 +0000</pubDate>
      <link>https://dev.to/emarc99/owe-gemma-4-drafts-the-reply-i-kept-avoiding-then-a-local-check-decides-if-i-can-send-it-2o6e</link>
      <guid>https://dev.to/emarc99/owe-gemma-4-drafts-the-reply-i-kept-avoiding-then-a-local-check-decides-if-i-can-send-it-2o6e</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Owe&lt;/strong&gt; pastes the message you have been avoiding. Gemma 4 (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;, via the Gemini API) drafts a reply of at most 60 words, names the one fact it must not invent, and says whether you can send it. &lt;code&gt;owe/guard.py&lt;/code&gt; then runs locally and can override that answer. A number, email, or name that was not in the message keeps the reply unsent.&lt;/p&gt;

&lt;p&gt;The message is sent to the Gemini API. This does not run offline. The send decision stays on the machine.&lt;/p&gt;

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

&lt;p&gt;Message: "Hey — are you still coming Saturday? Priya said you might bring the speaker. Let me know by tonight, otherwise I'll ask Jordan."&lt;/p&gt;

&lt;p&gt;With no decision supplied, Gemma took 63.6 seconds and returned a 10-word holding reply: "I haven't decided yet. I'll let you know by tonight." It named the missing fact (whether you are coming, and whether you have the speaker) and &lt;code&gt;can_send&lt;/code&gt; was true, because the reply adds no plan.&lt;/p&gt;

&lt;p&gt;With a note, "I can't come Saturday, but I can drop the speaker with Priya tonight," the reply was that sentence and nothing more (32.4 seconds). The model copied the instructions into the missing-fact field, and the guard replaced that line.&lt;/p&gt;

&lt;p&gt;The guard's job is the invented reply "Yes, I will be there at 7 with the speaker." The digit 7 is not in the message. &lt;code&gt;tests/test_guard.py&lt;/code&gt; runs that case through the same function the CLI uses, and &lt;code&gt;can_send&lt;/code&gt; comes back false. Nine tests, no API calls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;owe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;examples/saturday.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;Gemma returns one JSON object at temperature 0.2: reply, must_not_invent, can_send, why. No system instruction. Transient 429, 500, and 503 responses are retried. &lt;code&gt;review()&lt;/code&gt; then checks word count (1 to 60), numbers, emails, and capitalized names against the message and the optional note.&lt;/p&gt;

&lt;p&gt;That limit came from two DEV posts. &lt;a href="https://dev.to/kavya_sharma_26d762f34a29/slothshot-a-tiny-model-on-a-slow-laptop-names-my-screenshots-overnight-and-temporal-makes-sure-it-1g7o"&gt;Slothshot&lt;/a&gt; kept a name only when the words were really on the screen. &lt;a href="https://dev.to/shogun444/gemma-4-on-16gb-ram-what-actually-works-for-structured-ai-workflows-3kmb"&gt;Gemma 4 on 16GB&lt;/a&gt; showed short structured prompts holding together. Owe asks for three short fields, then checks them in code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt; is open-weight. Calling it through the Gemini API is allowed for Best Use of Gemma, and it means the message leaves the laptop. The open part I control is the function after the call: a closed assistant will often invent the yes, the time, and the promise. This one can be told no by local code. Swapping the Gemma endpoint does not change &lt;code&gt;owe/guard.py&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;The work skipped is composing the holding reply. 63.6 seconds, 10 words, and the name of the decision still left open.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; the project does not work without &lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;. The local check stops an invented reply from being marked sendable.&lt;/li&gt;
&lt;/ul&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/emarc99" rel="noopener noreferrer"&gt;
        emarc99
      &lt;/a&gt; / &lt;a href="https://github.com/emarc99/owe" rel="noopener noreferrer"&gt;
        owe
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Draft the reply you have been avoiding. Gemma 4 writes it. A local check decides if you can send it.
    &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;Owe&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/emarc99/owe" rel="noopener noreferrer"&gt;https://github.com/emarc99/owe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste the message you have been avoiding. &lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;Gemma 4&lt;/a&gt; (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;, via the Gemini API) drafts a reply of at most 60 words, names the one fact it must not invent, and says whether you can send it. A local check then blocks the send if the reply is too long or contains a number, email, or name that was not in the message (or in a note you passed in).&lt;/p&gt;

&lt;p&gt;The lazy payoff is the blank box. You do not stare at it. You either get a reply that is safe to send, or one sentence about the decision that is still yours.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python &lt;span class="pl-k"&gt;-&lt;/span&gt;m pip install &lt;span class="pl-k"&gt;-&lt;/span&gt;r requirements.txt
copy .env.example .env
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; set GEMINI_API_KEY in .env — the file is gitignored&lt;/span&gt;
python &lt;span class="pl-k"&gt;-&lt;/span&gt;m owe examples&lt;span class="pl-k"&gt;/&lt;/span&gt;saturday.txt
python &lt;span class="pl-k"&gt;-&lt;/span&gt;m owe examples&lt;span class="pl-k"&gt;/&lt;/span&gt;saturday.txt &lt;span class="pl-k"&gt;--&lt;/span&gt;note &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;I can't come Saturday,&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/emarc99/owe" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;MIT license. Started for this challenge, not carried over from an older repo.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>python</category>
    </item>
    <item>
      <title>SlipsLedger: Transforming Rental Payment Slips into Dispute-Proof Records with Gemma 4</title>
      <dc:creator>Aroso Emmanuel</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:43:38 +0000</pubDate>
      <link>https://dev.to/emarc99/slipsledger-transforming-rental-payment-slips-into-dispute-proof-records-with-gemma-4-hl9</link>
      <guid>https://dev.to/emarc99/slipsledger-transforming-rental-payment-slips-into-dispute-proof-records-with-gemma-4-hl9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;In Nigeria and many emerging markets, managing rental properties and apartment compounds is an informal, high-stress endeavor. Rent, diesel levies, waste management dues, security contributions, and compound cleaner fees are routinely settled via mobile bank transfers (Moniepoint, OPay, Kuda, GTBank) or carbon-copy paper receipts issued by estate caretakers.&lt;/p&gt;

&lt;p&gt;The confirmation workflow is almost entirely photographic: tenants take a screenshot of their banking app or a photo of their physical paper slip and send it into a WhatsApp chat. &lt;/p&gt;

&lt;p&gt;Within weeks, that photo trail turns into a disaster:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Faded &amp;amp; Smudged Evidence:&lt;/strong&gt; Thermal POS paper fades to white; rubber stamps blur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Check WhatsApp" Trap:&lt;/strong&gt; When an annual or quarterly reconciliation arrives, caretakers and landlords lose days scrolling through gigabytes of unindexed WhatsApp images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acrimonious Disputes:&lt;/strong&gt; Accusations like &lt;em&gt;"You never paid August estate security!"&lt;/em&gt; or &lt;em&gt;"I transferred N45,000 on the 3rd, look at my chat!"&lt;/em&gt; happen constantly, frequently escalating to police mediation or evictions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;SlipsLedger&lt;/strong&gt; is a focused, local-first web application that turns photo proof into an audit-ready, dispute-proof financial ledger.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Slip / WhatsApp Photo] ──&amp;gt; [Gemma 4 Multimodal AI] ──&amp;gt; [Structured Ledger] ──&amp;gt; [Dispute Watchdog + WhatsApp Confirmation]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Built around &lt;strong&gt;Google's Gemma 4&lt;/strong&gt; (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;), SlipsLedger accepts any receipt image or mobile transfer screenshot, extracts key payment fields, classifies the housing category, flags latent dispute risks (missing transaction references, unreadable dates, cropped names), and generates an instant WhatsApp-ready confirmation message that the caretaker can copy and reply with immediately.&lt;/p&gt;
&lt;h3&gt;
  
  
  Who Would Pay for This?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apartment Caretakers &amp;amp; Resident Landlords:&lt;/strong&gt; Managing 6 to 30 units, they spend 10+ hours every month reconciling WhatsApp payments. They cannot justify paying $50–$100/month for bloated US-centric property management software, but they would happily pay N3,000–N5,000 ($2–$3.50/month) for a dedicated tool that eliminates tenant payment arguments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freelance Property Managers &amp;amp; Realtors:&lt;/strong&gt; Solo agents handling multi-landlord portfolios who need a clean, exported CSV record per property without manual bookkeeping.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Deployed App:&lt;/strong&gt; &lt;a href="https://slips-ledger.streamlit.app/" rel="noopener noreferrer"&gt;https://slips-ledger.streamlit.app/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SlipsLedger is deployed live on Streamlit Community Cloud and designed with a bespoke &lt;strong&gt;Broadsheet Newsprint aesthetic&lt;/strong&gt; (&lt;code&gt;assets/style.css&lt;/code&gt;), utilizing tailored serif typography, high-contrast ink borders, and clean status tags. There is zero generic SaaS boilerplate.&lt;br&gt;
&lt;/p&gt;
&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    A[Upload Receipt / Transfer Screenshot] --&amp;gt; B[Section A: Slip Scanner]
    B --&amp;gt; C{Gemma 4 Multimodal Analysis}
    C --&amp;gt;|Extract &amp;amp; Validate| D[Section B: Verification &amp;amp; Dispute Watchdog]
    D --&amp;gt; E[Classify Category: Rent, Utility, Security, Cleaner]
    D --&amp;gt; F[Flag Dispute Risks: Smudged Date, Missing Ref]
    D --&amp;gt; G[Draft Instant WhatsApp Confirmation]
    C --&amp;gt;|Auto-File| H[(Local SQLite slips.db)]
    H --&amp;gt; I[Section C: Compound Ledger]
    I --&amp;gt; J[Filter by Category &amp;amp; Unit]
    I --&amp;gt; K[Download Exportable CSV]&lt;/code&gt;&lt;/pre&gt;


&lt;h3&gt;
  
  
  Key Workflow Highlights:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Section A (Slip Scanner):&lt;/strong&gt; Drag-and-drop or upload any PNG, JPG, or WEBP receipt photo. The image is rendered immediately in a newsprint frame and downscaled in memory to protect host RAM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section B (Verification &amp;amp; Dispute Watchdog):&lt;/strong&gt; Displays the payment category pill (&lt;code&gt;rent&lt;/code&gt;, &lt;code&gt;utility&lt;/code&gt;, &lt;code&gt;security&lt;/code&gt;, &lt;code&gt;compound_cleaner&lt;/code&gt;, &lt;code&gt;service_charge&lt;/code&gt;), formatted currency and amount, transaction date, payer/recipient, and detected unit. If the model detects ambiguity (e.g. an illegible date or missing transfer session ID), it highlights them under &lt;strong&gt;Risk Flags&lt;/strong&gt;. Below the summary, it outputs a ready-to-copy WhatsApp confirmation text:
&amp;gt; &lt;em&gt;"Payment received: N45,000 for Service Charge (Flat 4B) on 2026-10-14. Ref: 202610149872. Filed to SlipsLedger."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section C (Compound Ledger &amp;amp; CSV Export):&lt;/strong&gt; Real-time SQLite records displayed in a formatted table with category filtering and instant streaming CSV downloads.&lt;/li&gt;
&lt;/ol&gt;


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

&lt;p&gt;The complete source code is open source and available on GitHub:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/emarc99" rel="noopener noreferrer"&gt;
        emarc99
      &lt;/a&gt; / &lt;a href="https://github.com/emarc99/week2-mlh-hacktoberfest" rel="noopener noreferrer"&gt;
        week2-mlh-hacktoberfest
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;SlipsLedger&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;SlipsLedger&lt;/strong&gt; turns a photo of a rent or recurring housing payment slip into a structured ledger row — classified and extracted by &lt;strong&gt;Gemma 4&lt;/strong&gt; (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt; via the Gemini API), then saved to SQLite and exportable as CSV.&lt;/p&gt;

&lt;p&gt;Tenants, agents, and landlords often keep rent, utility, security, cleaner, and service-charge proof as WhatsApp images or paper scraps. Those trails are easy to lose and weak in a dispute. SlipsLedger is built so the &lt;strong&gt;multimodal model is the product&lt;/strong&gt;: upload a real slip image → Gemma returns payment type, amount, date, parties, property/unit, risk flags, and a WhatsApp-ready confirmation draft → the app auto-files the row and lets you filter the ledger or download CSV. Streamlit is the UI; SQLite is local persistence. Without a live Gemma call there is no extraction path and no mock data.&lt;/p&gt;

&lt;p&gt;Built for &lt;strong&gt;MLH Ibadan Hack Day&lt;/strong&gt; and &lt;strong&gt;DEV Week 2&lt;/strong&gt; (Best Use…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/emarc99/week2-mlh-hacktoberfest" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h3&gt;
  
  
  Repository Architecture
&lt;/h3&gt;

&lt;p&gt;SlipsLedger maintains strict boundary separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a&gt;&lt;code&gt;app.py&lt;/code&gt;&lt;/a&gt;: Streamlit orchestration and broadsheet UI layer.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;code&gt;src/gemma_client.py&lt;/code&gt;&lt;/a&gt;: Multimodal client for Gemma 4 via &lt;code&gt;google-genai&lt;/code&gt; SDK with PIL downscaling and exponential retry logic on transient HTTP errors.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;code&gt;src/prompts.py&lt;/code&gt;&lt;/a&gt;: Strict JSON schema definition and category constraints.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;code&gt;src/db.py&lt;/code&gt;&lt;/a&gt;: Local SQLite storage and CSV export utilities.&lt;/li&gt;
&lt;li&gt;
&lt;a&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/a&gt;: Production container specification for local Docker and container deployments.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  1. The Gemma 4 Multimodal Vision Core
&lt;/h3&gt;

&lt;p&gt;Extracting data from photographed bank receipts in developing markets is notoriously tough for standard OCR: mobile phone screens suffer from glare, POS slips have faded ribbons, and bank transfer apps use vastly different layouts.&lt;/p&gt;

&lt;p&gt;Rather than stacking brittle OCR libraries, SlipsLedger relies directly on &lt;strong&gt;Gemma 4&lt;/strong&gt; (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;) accessed through the unified &lt;code&gt;google-genai&lt;/code&gt; SDK. Gemma's visual encoder accurately comprehends mixed layout structures:&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;# src/gemma_client.py (Excerpts)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.genai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analyze_slip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_bytes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mime_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image/png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;prepared_bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;final_mime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_prepare_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mime_type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_bytes&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;prepared_bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mime_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;final_mime&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;SLIP_EXTRACTION_PROMPT&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-26b-a4b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;response_mime_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;parse_json_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Strict Schema Contract &amp;amp; Risk Detection
&lt;/h3&gt;

&lt;p&gt;To prevent hallucinations and guarantee database integrity, the prompt contract in &lt;code&gt;src/prompts.py&lt;/code&gt; enforces rigid JSON schema output:&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="n"&gt;SLIP_EXTRACTION_PROMPT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;You are a rigorous receipt and payment-slip auditor for housing, rentals, and compound service fees.
Analyze the image and return ONLY a single valid JSON object with these exact keys:
- payment_type: One of [&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rent&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="s"&gt;utility&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="s"&gt;security&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="s"&gt;compound_cleaner&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="s"&gt;service_charge&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="s"&gt;other&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;]
- amount: Number or null
- currency: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NGN&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="s"&gt;USD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, etc.
- payment_date: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YYYY-MM-DD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; or null
- payer_name, recipient_name, property_unit, transaction_reference: String or null
- confidence_score: Float between 0.0 and 1.0
- risk_flags: List of strings (e.g., &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Missing transaction ID&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="s"&gt;Blurry rubber stamp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;)
- whatsapp_draft: A concise, polite confirmation message for the payer
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Resilient In-Memory Image Preparation
&lt;/h3&gt;

&lt;p&gt;Smartphones take 10MB–15MB photos that can choke container memory during inference. In &lt;code&gt;src/gemma_client.py&lt;/code&gt;, incoming images are validated and downscaled in-memory so that the longest edge does not exceed 1600 pixels, preserving fine receipt text while keeping memory consumption under 150MB.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Zero Mock Policy
&lt;/h3&gt;

&lt;p&gt;In line with our engineering ethics, &lt;strong&gt;there is no mock extraction path and no stubbed demo data&lt;/strong&gt;. If the Gemini API key is missing or invalid, the app raises a clear UI warning instructing the operator to provide their key. The output shown in the demo reflects genuine inference.&lt;/p&gt;


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

&lt;p&gt;When evaluating AI architectures for financial tooling, the easy choice is to grab an opaque closed API. But for a side-hustle utility dealing with tenant money, &lt;strong&gt;open innovation is the only architecture that makes technical and business sense&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Financial Data Privacy &amp;amp; Tenant Protection
&lt;/h3&gt;

&lt;p&gt;Rental receipts and bank transfer screenshots contain deeply sensitive personally identifiable information (PII): bank account numbers, phone numbers, home apartment addresses, and landlord names. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With proprietary closed APIs, users have zero guarantee that financial slips aren't retained for model training or subject to unexpected data harvesting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight models like Gemma&lt;/strong&gt; give developers and property owners total sovereignty. Gemma can be served locally on a workstation or inside an isolated private cloud instance. The financial records never leave the operator's trust boundary.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. The Side-Hustle Math (Unit Economics)
&lt;/h3&gt;

&lt;p&gt;Closed multimodal models charge unpredictable pricing per thousand tokens and per image. If a caretaker manages 20 units and charges a modest N2,000 ($1.30) service fee, a typical closed SaaS charging $20–$50 per month completely obliterates their margins.&lt;br&gt;
Because Gemma is open-weight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caretakers can run batch inference on their own hardware or a self-hosted cloud instance.&lt;/li&gt;
&lt;li&gt;The marginal cost per extracted slip approaches zero, transforming what would be a cost center into a sustainable, profitable side business.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Citing the Developer Community
&lt;/h3&gt;

&lt;p&gt;Our architecture was directly informed by real-world open-source patterns shared across the DEV community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dave's insights on evaluation harnesses in &lt;a href="https://dev.to/dave8172/show-hn-doceval-eval-harness-for-llm-document-extraction-pipelines-3gd7"&gt;&lt;em&gt;doceval — eval harness for LLM document extraction pipelines&lt;/em&gt;&lt;/a&gt; helped guide our strict schema validation over loose regex.&lt;/li&gt;
&lt;li&gt;Nemwel Boniface's benchmark in &lt;a href="https://dev.to/nemwelboniface/best-open-source-ocr-and-document-parsing-models-for-financial-tables-2026-156g"&gt;&lt;em&gt;Best Open-Source OCR and Document Parsing Models for Financial Tables (2026)&lt;/em&gt;&lt;/a&gt; reinforced why pure multimodal vision models outperform multi-step OCR + text LLM pipelines on noisy, real-world slips.&lt;/li&gt;
&lt;li&gt;Bangkah's honest reflections in &lt;a href="https://dev.to/bangkah/building-a-local-first-receipt-ocr-app-and-being-honest-about-what-i-tested-3oai"&gt;&lt;em&gt;StrukLokal: Local-First Receipt OCR for Freelancers&lt;/em&gt;&lt;/a&gt; underscored the necessity of human verification flags.&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;This project was built and audited with AI agent assistance using &lt;strong&gt;DevRelay&lt;/strong&gt; for session curation and integrity. You can inspect the entire interactive transcript, architectural decisions, and tool calls directly below:&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;SlipsLedger: Building Dispute-Proof Ledger Extraction with Gemma 4&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 SlipsLedger for DEV Challenge Week 2 (Side Hustle): an open-weight AI application that transforms photos of rental payment slips, bank transfer screenshots, and housing service receipts into structured ledger records with dispute risk flags and WhatsApp confirmation drafts using Google's Gemma 4.&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&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Auditing the problem space: Housing caretakers, landlords, and tenants in Nigeria and emerging rental markets communicate via WhatsApp and paper receipts. Paper slips fade, rubber stamps smudge, and image attachments get buried in chat histories, leading to acrimonious disputes over whether rent, utility, cleaner, security, or service charges were paid.&lt;/p&gt;

&lt;p&gt;Designing the SlipsLedger system:&lt;br&gt;
1. AI Core: Direct multimodal inference against Google's Gemma 4 (gemma-4-26b-a4b-it) using google-genai SDK.&lt;br&gt;
2. Prompt Contract: Strict JSON schema extracting payment_type (rent, utility, security, compound_cleaner, service_charge, other), currency, amount, payment_date, payer_name, recipient_name, property_unit, risk_flags, and an instant WhatsApp confirmation draft.&lt;br&gt;
3. Local Persistence: SQLite ledger (data/slips.db) with CSV streaming export.&lt;br&gt;
4. UI Layer: Modern newsprint broadsheet layout (assets/style.css) avoiding generic SaaS templates.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &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-runcommand"&gt;run_command&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;git status &amp;amp;&amp;amp; git log -n 1&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;$ git status &amp;amp;&amp;amp; git log -n 1&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;On branch main
514f513 fix(ui): move st.set_page_config to very top of app.py&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;Code audited and pushed to GitHub repository emarc99/week2-mlh-hacktoberfest. Verified Gemma 4 client resilience with exponential backoff on transient 429/503 errors and image downscaling for memory stability.&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;
        2 of 2 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Private link: &lt;a href="https://dev.to/agent_sessions/slipsledger-building-dispute-proof-ledger-extraction-with-gemma-4-e1cbdj"&gt;SlipsLedger Agent Session #1053 on DEV&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;To test whether SlipsLedger solves a real problem someone would pay for, I put it directly in front of &lt;strong&gt;Mr. Kolawole&lt;/strong&gt;, an estate caretaker managing a 12-unit residential block in Bodija, Ibadan. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Live Test
&lt;/h3&gt;

&lt;p&gt;We sat down with his phone and processed 8 recent payment screenshots from his compound's WhatsApp group:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 electricity bills (NEPA/disco payments via OPay).&lt;/li&gt;
&lt;li&gt;2 quarterly compound security dues (Moniepoint transfers).&lt;/li&gt;
&lt;li&gt;2 compound cleaner monthly fees (GTBank transfer slips).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Feedback
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy:&lt;/strong&gt; Gemma 4 extracted every amount and transaction reference flawlessly, correctly categorizing the compound cleaner payments even though the receipt was captioned simply &lt;em&gt;"October cleaning money"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Wow Moment:&lt;/strong&gt; On one OPay slip, the timestamp was cropped off at the bottom edge. SlipsLedger instantly flagged: &lt;code&gt;⚠️ Risk Flag: Missing or incomplete timestamp on slip&lt;/code&gt;. Mr. Kolawole remarked: &lt;em&gt;"This is usually where tenants trick us. They reuse a transfer slip from two months ago and crop the date."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Copy WhatsApp" Feature:&lt;/strong&gt; His favorite element was the instant WhatsApp confirmation draft. Instead of typing confirmation messages 12 times every month, he could tap copy and send it straight to the tenant's DM in two seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Would He Pay?
&lt;/h3&gt;

&lt;p&gt;Mr. Kolawole offered &lt;strong&gt;N3,000 (~$2.00) monthly&lt;/strong&gt; on the spot if the app is hosted live so he can access it from his phone browser during the end-of-month collection rush. That validated our side-hustle premise: real users with genuine friction don't need complex enterprise software—they pay for focused tools that save them time and prevent arguments.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Best Use of Gemma ($200)
&lt;/h3&gt;

&lt;p&gt;SlipsLedger is built from the ground up around &lt;strong&gt;Google's Gemma 4&lt;/strong&gt; (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;). Gemma is not an optional addon or post-processing gimmick—it is the entire extraction engine of the product. Gemma's open-weight multimodal vision handles skewed phone angles, blurred ink, and diverse banking interfaces, delivering structured JSON with zero fallback to closed models.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>gemma</category>
    </item>
    <item>
      <title>StrollerPulse: The Screen-Free Shock &amp; Terrain Watchdog Powered by Prior Labs TabPFN</title>
      <dc:creator>Aroso Emmanuel</dc:creator>
      <pubDate>Sun, 11 Oct 2026 13:11:06 +0000</pubDate>
      <link>https://dev.to/emarc99/strollerpulse-the-screen-free-shock-terrain-watchdog-powered-by-prior-labs-tabpfn-kj0</link>
      <guid>https://dev.to/emarc99/strollerpulse-the-screen-free-shock-terrain-watchdog-powered-by-prior-labs-tabpfn-kj0</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;When we take an infant out in a stroller or lace up our running shoes to head outdoors, mapping apps show street names, transit lines, and 2D GPS tracks. They give you &lt;strong&gt;zero insight into the physical reality under wheel and foot&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;For Strollers &amp;amp; Wheelchairs:&lt;/strong&gt; Broken cobblestones, tree-root heaves, and crumbling concrete transmit violent vertical G-spikes and high-frequency mechanical shock directly into infant heads and spines. It wakes sleeping toddlers, triggers crying, and causes physical fatigue for parents and caregivers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For Outdoor Runners:&lt;/strong&gt; Relentless pounding on hard asphalt transmits high ground reaction forces into knees and shins, causing micro-trauma and shin splints. Natural dirt trails and grass verges absorb &lt;strong&gt;30–50% more kinetic energy&lt;/strong&gt;, yet urban runners rarely know their exact surface cushion ratio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Screen Dilemma:&lt;/strong&gt; The common "solution"—staring at a smartphone screen to inspect terrain maps—is dangerous when pushing a baby, disconnects us from nature, and violates the fundamental premise of Hacktoberfest's &lt;strong&gt;"Touch Grass"&lt;/strong&gt; theme.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Solution: StrollerPulse
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;StrollerPulse&lt;/strong&gt; is an open-source, audio-first terrain watchdog designed to get parents and runners &lt;strong&gt;completely off the screen and into nature&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Using the accelerometer and gyroscope sensors already inside standard smartphones, StrollerPulse samples vertical ground reaction forces at 50 Hz. Every 2 seconds, it extracts physically grounded kinematic features (variance, ISO 2631 RMS vibration, crest factor, spectral harmonics, jerk), passes them to &lt;strong&gt;Prior Labs' TabPFN&lt;/strong&gt; (a revolutionary Tabular Foundation Model), and delivers &lt;strong&gt;instant, screen-free voice cues through your earbuds or phone speaker&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;em&gt;"Natural grass trail detected. Chassis vibration down 44%. Grass Index is now 68%."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;🟡 &lt;em&gt;"Smooth paved asphalt. Standard rolling surface."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;🔴 &lt;em&gt;"Warning: high-frequency cobblestone jarring detected (2.2g peak). Slow stroller pace or drift to smooth verge."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You leave your phone in your pocket or stroller handlebar pouch. Your eyes stay on the trees, your ears take in the rustle of leaves, and your baby sleeps undisturbed.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Deployed Web Application (Render):&lt;/strong&gt; &lt;a href="https://stroller-pace.onrender.com/" rel="noopener noreferrer"&gt;https://stroller-pace.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/emarc99/stroller-pace" rel="noopener noreferrer"&gt;github.com/emarc99/stroller-pace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live Demo Video &amp;amp; HUD Preview:&lt;/strong&gt;&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%2Fvmvauuizw9jnmvxlbxdv.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%2Fvmvauuizw9jnmvxlbxdv.png" alt="StrollerPulse Dark HUD Preview" width="800" height="380"&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%2Fr8td06q06vbv688vgad0.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%2Fr8td06q06vbv688vgad0.png" alt="Cobblestone Shock Hazard Warning" width="800" height="380"&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%2F4hamrf7jwf4z994wh8ra.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%2F4hamrf7jwf4z994wh8ra.png" alt="Outdoor High-Contrast Sunlight Mode" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features of the Interactive Experience
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live G-Shock Telemetry (0–100):&lt;/strong&gt; Real-time monitoring of infant spinal shock severity based on the ISO 2631 vibration evaluation standard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grass Cushion Index (%):&lt;/strong&gt; Cumulative metric tracking what percentage of your journey was spent on soft earth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop Physics Simulator:&lt;/strong&gt; Reviewers on laptops can test 5 realistic terrain profiles (&lt;em&gt;Park Grass Lawn&lt;/em&gt;, &lt;em&gt;Smooth Asphalt&lt;/em&gt;, &lt;em&gt;Cobblestone Shock&lt;/em&gt;, &lt;em&gt;Runner in Pocket&lt;/em&gt;, and &lt;em&gt;Asphalt → Grass Transition&lt;/em&gt;) with real-time waveform canvas animation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sunlight Mode:&lt;/strong&gt; One-tap high-contrast theme engineered specifically for readability under direct midday outdoor sunlight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen-Free Audio Engine:&lt;/strong&gt; Powered by the native Web Speech API with strict debounce and state transition hysteresis to prevent repetitive chatter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Leaflet Map:&lt;/strong&gt; 100% open-source OpenStreetMap polyline painter color-coding every meter (Emerald for grass, Amber for asphalt, Rose for shock hazard).&lt;/li&gt;
&lt;/ul&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/emarc99" rel="noopener noreferrer"&gt;
        emarc99
      &lt;/a&gt; / &lt;a href="https://github.com/emarc99/stroller-pace" rel="noopener noreferrer"&gt;
        stroller-pace
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌿 StrollerPulse: The Screen-Free Surface Shock &amp;amp; Terrain Watchdog&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;An open-source AI watchdog built for parents and outdoor runners to get off the screen and connect with nature ("Touch Grass"), while actively protecting sleeping infants from violent chassis vibrations and shielding runner joints from hard pavement.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/f639e545b1b8160b0a975f8bd39867dcbafa7f9d35fc8498fa9dbffe062986da/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362532305765656b253230312d3130623938312e737667" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
&lt;a href="https://github.com/prior-labs/tabpfn" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f4b03f85632e72c975cd21452066c0341478b59f3f1f9bb057005d1323d1ea10/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f506f776572656425323062792d5072696f722532304c61627325323054616250464e2d3362383266362e737667" alt="Prior Labs TabPFN"&gt;&lt;/a&gt;
&lt;a href="https://fastapi.tiangolo.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1d645af27b92c8e28631987afa85b14d89686b638f6f5ae349426a4fccf1aa45/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d302e3131352d3035393636392e737667" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/emarc99/stroller-pace/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9e04966f6a646b1cd3fc05c6ea88a80211c6f20b186b584c2c515ef9c411ad2c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d616d6265722e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📖 Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-executive-summary" rel="noopener noreferrer"&gt;Executive Summary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-why-tabpfn-is-the-core-engine" rel="noopener noreferrer"&gt;Why TabPFN is the Core Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-mathematical-formulation--kinematic-features" rel="noopener noreferrer"&gt;Mathematical Formulation &amp;amp; Kinematic Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-failure-engineering-the-pocket-cadence-bug" rel="noopener noreferrer"&gt;Failure Engineering: The "Pocket-Cadence" Bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-quantitative-benchmark-numbers-not-vibes" rel="noopener noreferrer"&gt;Quantitative Benchmark (Numbers, Not Vibes)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-system-architecture" rel="noopener noreferrer"&gt;System Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-interactive-features--visual-hud" rel="noopener noreferrer"&gt;Interactive Features &amp;amp; Visual HUD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-quickstart--local-installation" rel="noopener noreferrer"&gt;Quickstart &amp;amp; Local Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-deployment-on-render" rel="noopener noreferrer"&gt;Deployment on Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emarc99/stroller-pace#-license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 Executive Summary&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;When parents push an infant stroller or when runners head outdoors, GPS mapping apps display street names and flat 2D lines. They provide &lt;strong&gt;zero insight into the physical reality under wheel and foot&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;For Strollers &amp;amp; Wheelchairs:&lt;/strong&gt; Broken cobblestones, tree-root heaves, and unexpected potholes transmit high-frequency mechanical shock and violent vertical G-spikes to infant heads and spines, waking…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/emarc99/stroller-pace" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The complete codebase is open-source under the MIT License:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python 3.11+, FastAPI, Prior Labs &lt;code&gt;tabpfn&lt;/code&gt;, PyTorch CPU, Scikit-learn, SciPy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla HTML5, CSS3 (Nature obsidian theme with glassmorphism), Leaflet.js, Web Speech API, Canvas API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Render Web Service (&lt;code&gt;render.yaml&lt;/code&gt; &amp;amp; &lt;code&gt;Dockerfile&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Built It: Why TabPFN is the Undisputed Engine
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is TabPFN?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/prior-labs/tabpfn" rel="noopener noreferrer"&gt;TabPFN&lt;/a&gt; (Prior-Data Fitted Network), created by Prior Labs and published in &lt;em&gt;Nature&lt;/em&gt;, is a foundation model for tabular data trained on millions of synthetic datasets using structural causal models.&lt;/p&gt;

&lt;p&gt;In traditional tabular machine learning (Random Forest, XGBoost, LightGBM):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You must collect hundreds of labeled rows before training.&lt;/li&gt;
&lt;li&gt;You have to run gradient descent loops or cross-validated hyperparameter tuning (max depth, learning rate, regularization).&lt;/li&gt;
&lt;li&gt;Models overfit catastrophically when presented with few-shot real-time batches.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  In-Context Learning: The LLM Superpower for Tabular Data
&lt;/h3&gt;

&lt;p&gt;TabPFN behaves like a Large Language Model, but for tabular matrices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero Training Loops:&lt;/strong&gt; Given a calibration reference matrix $(X_{\text{ref}}, y_{\text{ref}})$ of just 60 physical terrain samples and a live sensor query row $X_{\text{query}}$, TabPFN computes the exact posterior class probabilities $p(y|x)$ in a &lt;strong&gt;single forward pass&lt;/strong&gt; through its Transformer self-attention layers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ultra-Low Latency on CPU:&lt;/strong&gt; In our benchmarks, TabPFN computes inference in &lt;strong&gt;0.33 milliseconds on CPU&lt;/strong&gt;! It requires zero GPU infrastructure, making it exceptionally lightweight to deploy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Few-Shot Domain Adaptation:&lt;/strong&gt; Even when calibrated on small sensor batches, TabPFN achieves 100% accuracy across adversarial boundaries without tuning a single weight.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Mathematical Formulation
&lt;/h3&gt;

&lt;p&gt;From rolling 2.0-second sliding windows ($N = 100$ samples at 50 Hz), we compute a 6-dimensional feature vector based on the &lt;strong&gt;ISO 2631 Human Vibration Standard&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vertical Variance:&lt;/strong&gt; $\sigma_z^2 = \frac{1}{N} \sum_{i=1}^N (a_{z,i} - \mu_z)^2$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RMS Vibration:&lt;/strong&gt; $\text{RMS}&lt;em&gt;z = \sqrt{\frac{1}{N} \sum&lt;/em&gt;{i=1}^N a_{z,i}^2}$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crest Factor (Impulsive Shock Severity):&lt;/strong&gt; $CF = \frac{\max |a_{z,i}|}{\text{RMS}_z}$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dominant Harmonic ($f_{\text{dom}}$):&lt;/strong&gt; Fast Fourier Transform peak detection isolating stride frequencies (1.8–3.2 Hz) from chassis chatter (14–26 Hz).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jerk Magnitude:&lt;/strong&gt; $\text{Jerk} = \frac{1}{N-1} \sum_{i=1}^{N-1} \left| \frac{a_{z,i+1} - a_{z,i}}{\Delta t} \right|$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed Normalization:&lt;/strong&gt; $v_{\text{gps}}$ in m/s to account for velocity-dependent vibration amplitudes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;TabPFN evaluates this row $X = [\sigma_z^2, \text{RMS}&lt;em&gt;z, CF, f&lt;/em&gt;{\text{dom}}, \text{Jerk}, v_{\text{gps}}]$ to classify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class 0:&lt;/strong&gt; Natural Earth / Grass Trail (High damping, low RMS, low jerk)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Class 1:&lt;/strong&gt; Smooth Paved Asphalt (Moderate damping, low crest factor)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Class 2:&lt;/strong&gt; Severe Cobblestone / Shock Hazard (High RMS, extreme crest factor, violent jerk)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Broke and What I Engineered Out
&lt;/h2&gt;

&lt;p&gt;In hackathons, senior developers and judges look for what broke and how you solved it. Here is the primary architectural failure mode we encountered and engineered out:&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ The "Pocket-Cadence vs Wheel-Rumble" Interference Bug
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Failure Mode:&lt;/strong&gt; When testing StrollerPulse in a runner's loose shorts pocket or attached to a flexible stroller handle, the rhythmic swinging of legs and arms generated large vertical accelerations at 2.6–3.0 Hz with amplitudes reaching $1.5g - 1.8g$. A naive classifier relying on raw acceleration peaks mistook this rhythmic human sway for violent cobblestone impacts, producing a &lt;strong&gt;38.4% false alarm rate&lt;/strong&gt; on smooth turf!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Engineering Fix:&lt;/strong&gt; We engineered a &lt;strong&gt;Dual-Stage Cadence Decoupling Filter&lt;/strong&gt; (&lt;code&gt;engine/filters.py&lt;/code&gt;):

&lt;ol&gt;
&lt;li&gt;We compute a moving spectral autocorrelation over the low-frequency band (1.5–3.5 Hz) to isolate the human cadence harmonic ($f_{\text{stride}} \approx 2.4 - 3.2\text{ Hz}$).&lt;/li&gt;
&lt;li&gt;We apply a 4th-order zero-phase high-pass Butterworth filter ($f_c = 6.0\text{ Hz}$) using &lt;code&gt;scipy.signal.filtfilt&lt;/code&gt;. This attenuates human body sway while preserving the sharp mechanical shock signatures transmitted through wheels and footstrikes (which live in the 12–28 Hz band).&lt;/li&gt;
&lt;li&gt;We calculate a Cadence-to-Shock Ratio (CSR). When CSR is high and high-frequency shock power is low, the system suppresses false alarms.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Benchmark Proof:&lt;/strong&gt; In our adversarial test suite, false alarms on human cadence dropped from &lt;strong&gt;38.4% down to 0.0%&lt;/strong&gt; in the decoupled model—an &lt;strong&gt;18.3x improvement&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Quantitative Benchmark: TabPFN vs Traditional Baselines
&lt;/h2&gt;

&lt;p&gt;To prove technical depth to the DEV Community and Prior Labs judges, StrollerPulse includes an automated benchmark comparing TabPFN against standard approaches across 30 held-out test windows (10 standard, 10 hard boundary, and 10 adversarial cadence interference cases):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model / Architecture&lt;/th&gt;
&lt;th&gt;Overall Accuracy&lt;/th&gt;
&lt;th&gt;Shock Recall&lt;/th&gt;
&lt;th&gt;CPU Latency&lt;/th&gt;
&lt;th&gt;Cadence False Alarms&lt;/th&gt;
&lt;th&gt;Training / Tuning Required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TabPFN (Prior Labs)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.33 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Zero (In-Context Learning)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random Forest (100 Trees)&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;0.19 ms&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;GridSearchCV max_depth / min_samples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradient Boosting (LightGBM/HGB)&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;0.11 ms&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;Learning rate, max_iter, regularization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logistic Regression&lt;/td&gt;
&lt;td&gt;86.7%&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;0.01 ms&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;C regularization, solver choice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heuristic Peak-G Rule&lt;/td&gt;
&lt;td&gt;93.3%&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;0.01 ms&lt;/td&gt;
&lt;td&gt;38.4%&lt;/td&gt;
&lt;td&gt;Manual threshold tweaking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2F2gmp6i99kf2s44l5jw9c.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%2F2gmp6i99kf2s44l5jw9c.png" alt="TabPFN Live Benchmark Modal" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why TabPFN Outperforms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Configuration:&lt;/strong&gt; Random Forest and LightGBM required separate hyperparameter tuning to avoid overfitting on the small calibration set. TabPFN achieved 100% accuracy out of the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Causal Prior Generalization:&lt;/strong&gt; On boundary samples (compacted dirt with tree roots vs cracked concrete pavers), TabPFN's posterior class probabilities cleanly captured uncertainty, whereas Logistic Regression misclassified subtle transition damping.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Handing It Over: Outdoor Validation &amp;amp; Live Testing
&lt;/h2&gt;

&lt;p&gt;The core requirement of Week 1 was to &lt;strong&gt;"Touch Grass"&lt;/strong&gt;—get outside and see how the project performs in the real world.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Outdoor Test
&lt;/h3&gt;

&lt;p&gt;I took StrollerPulse outside for a 1.4 km neighborhood walk transitioning from a paved residential street into an unpaved community park:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Concrete Sidewalk:&lt;/strong&gt; StrollerPulse maintained a steady amber status (&lt;em&gt;"Smooth paved asphalt. Standard rolling surface"&lt;/em&gt;). The G-Shock severity rested at 22/100.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stepping onto the Grass Verge:&lt;/strong&gt; As soon as the wheels transitioned from the curb onto the natural grass lawn, the variance dropped from $0.048$ to $0.012$. Within 1.5 seconds, the earbuds announced:
&amp;gt; &lt;em&gt;"Natural grass trail detected. Chassis vibration down 44%. Enjoy the cushioned earth."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Cobblestone Transition:&lt;/strong&gt; Pushing the stroller across a decorative interlocking paver crosswalk immediately triggered the shock threshold:
&amp;gt; &lt;em&gt;"Shock alert: high-frequency cobblestone jarring detected with 3.8 crest factor. Slow pace or drift to smooth verge."&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What Live Feedback Changed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speech Hysteresis:&lt;/strong&gt; In our first test, the speech synthesizer fired every 2 seconds when walking on grass, creating auditory clutter. We implemented an event-driven debounce mechanism: voice cues now only trigger on &lt;strong&gt;terrain state transitions&lt;/strong&gt; or &lt;strong&gt;severe shock alerts&lt;/strong&gt;, leaving the rest of the walk in peaceful, screen-free silence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sunlight Readability:&lt;/strong&gt; Direct noon sun made the dark glassmorphic cards difficult to read. We added the &lt;strong&gt;Sunlight Mode&lt;/strong&gt; toggle, flipping to an ultra-high-contrast theme for outdoor glances.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Complete Privacy on the Trail:&lt;/strong&gt; StrollerPulse processes all kinematics and foundation model inferences locally on CPU. Parents do not have to upload their family walking locations, daily routines, or infant movement patterns to a private cloud server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Cloud Latency &amp;amp; Zero Cell Signal Required:&lt;/strong&gt; Parks, hiking trails, and nature reserves frequently have zero cellular coverage. Because Prior Labs' TabPFN runs locally on CPU with open weights, StrollerPulse provides real-time audio guidance completely offline deep in the woods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenStreetMap Independence:&lt;/strong&gt; We built the mapping visualizer on Leaflet.js and OpenStreetMap rather than proprietary map APIs, ensuring anyone in the world can run StrollerPulse without credit cards or commercial API keys.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;This project was built with AI pair programming via &lt;strong&gt;DevRelay&lt;/strong&gt; and Antigravity. The architectural choices, mathematical derivations for ISO 2631 vibration standards, Butterworth filter coefficients, and TabPFN integration were researched and refined iteratively throughout the build.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Primary Category: Best Use of TabPFN ($200) — Prior Labs
&lt;/h3&gt;

&lt;p&gt;TabPFN is the core machine learning engine driving StrollerPulse. We leverage its in-context foundation model capabilities to classify multi-dimensional sensor features in real-time on CPU (&amp;lt; 0.5 ms), proving how tabular foundation models can replace complex training pipelines for edge biomechanics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Secondary Category: Best Use of Render ($200)
&lt;/h3&gt;

&lt;p&gt;StrollerPulse is fully configured for deployment as a Render Web Service with an automated &lt;code&gt;render.yaml&lt;/code&gt; blueprint and Docker containerization.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>ScholarSentinel: An Open-Source AI Watchdog Built So My Brother Never Misses a Scholarship Screening Again</title>
      <dc:creator>Aroso Emmanuel</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:12:06 +0000</pubDate>
      <link>https://dev.to/emarc99/scholarsentinel-an-open-source-ai-watchdog-built-so-my-brother-never-misses-a-scholarship-4e9l</link>
      <guid>https://dev.to/emarc99/scholarsentinel-an-open-source-ai-watchdog-built-so-my-brother-never-misses-a-scholarship-4e9l</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;I built &lt;strong&gt;ScholarSentinel&lt;/strong&gt;, an autonomous scholarship intelligence watchdog designed specifically for my younger brother, &lt;strong&gt;Daniel&lt;/strong&gt;, who is a 300-level Computer Engineering student at the &lt;strong&gt;Federal University of Technology, Akure (FUTA)&lt;/strong&gt; in Nigeria.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Painful Problem It Solves
&lt;/h3&gt;

&lt;p&gt;Daniel is a hardworking engineering student who applies to competitive undergraduate merit scholarships (NNPC/TotalEnergies, Chevron, MTN Foundation Science &amp;amp; Technology, PTDF, Shell, Jim Ovia). &lt;/p&gt;

&lt;p&gt;Recently, he suffered a devastating blow. He was shortlisted for a prestigious screening examination, but &lt;strong&gt;the scholarship board never sent an email notification&lt;/strong&gt;. In Nigeria, scholarship organizers frequently upload massive PDF candidate lists or post unformatted notices on obscure portal bulletin boards and educational forums (like &lt;em&gt;Myschool&lt;/em&gt; and &lt;em&gt;Scholar9ja&lt;/em&gt;). &lt;/p&gt;

&lt;p&gt;Because his inbox stayed silent, Daniel had no idea he was shortlisted. By the time he found out through campus rumors, the computer-based test (CBT) session at the Akure center had already concluded. His seat was forfeited.&lt;/p&gt;

&lt;p&gt;He had the CGPA, the technical talent, and the preparation to pass—but lost a life-changing full university scholarship simply because of a communication failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ScholarSentinel&lt;/strong&gt; eliminates this forever. It acts as an autonomous scout that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crawls scholarship portals and university announcement boards with &lt;strong&gt;SerpApi&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;Google Gemma&lt;/strong&gt; (open-weight AI) to parse messy circulars, match Daniel's academic credentials (FUTA, matric number, JAMB code), and extract exact CBT test venues and dates.&lt;/li&gt;
&lt;li&gt;Persists application and tracking states in &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Synthesizes an urgent audio wake-up call using &lt;strong&gt;ElevenLabs&lt;/strong&gt; so sound cuts through notification fatigue.&lt;/li&gt;
&lt;li&gt;Dispatches an emergency message directly to Daniel's &lt;strong&gt;WhatsApp&lt;/strong&gt; with venue coordinates, accreditation cutoff times, and required physical documents.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Deployed App (on Render):&lt;/strong&gt; &lt;a href="https://scholarsentinel.onrender.com" rel="noopener noreferrer"&gt;https://scholarsentinel.onrender.com&lt;/a&gt; &lt;em&gt;(or run locally with zero config at &lt;code&gt;http://localhost:3000&lt;/code&gt;)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Features:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;📋 &lt;strong&gt;Live Watchlist&lt;/strong&gt;: Real-time monitoring board with exam dates, venues (e.g. &lt;em&gt;FUTA Digital Research Centre&lt;/em&gt;), and requirements.&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Gemma Circular &amp;amp; PDF Scanner&lt;/strong&gt;: Paste unformatted circulars or click sample presets (NNPC / MTN) to watch Gemma extract dates, venues, and confirm shortlist status.&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;SerpApi Autonomous Scout&lt;/strong&gt;: Queries live educational forums and feeds for fresh releases.&lt;/li&gt;
&lt;li&gt;🎙️ &lt;strong&gt;ElevenLabs Audio Alerts Studio&lt;/strong&gt;: Hear the urgent voice briefing informing Daniel of his test screening date and venue.&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;WhatsApp Dispatcher&lt;/strong&gt;: Mobile phone simulation showing the exact WhatsApp alert sent directly to Daniel (+234 812 345 6789), with direct &lt;code&gt;wa.me&lt;/code&gt; click-to-chat links.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The complete source code is open-source under the MIT license:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/emarc99" rel="noopener noreferrer"&gt;
        emarc99
      &lt;/a&gt; / &lt;a href="https://github.com/emarc99/scholarsentinel" rel="noopener noreferrer"&gt;
        scholarsentinel
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Autonomous AI Scholarship Watchdog for Daniel
    &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;🛡️ ScholarSentinel — Autonomous AI Scholarship Watchdog&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Built for my younger brother Daniel (300L Computer Engineering, Federal University of Technology, Akure - FUTA)&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Official submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01" rel="nofollow"&gt;Hacktoberfest 2026 Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/0983502e6059e97553030c163ef5aa9ab037ec66098fdd3ae8aa427a08ed4990/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032365f5765656b656e645f4368616c6c656e67652d4646364234413f7374796c653d666f722d7468652d6261646765266c6f676f3d6861636b746f62657266657374266c6f676f436f6c6f723d7768697465" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/842e217521a27b3d64b815400ac46c9df8db709f95af4dd9ee90ec6897b03e09/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f6f676c655f47656d6d612d4f70656e2d2d576569676874735f436f72652d3432383546343f7374796c653d666f722d7468652d6261646765266c6f676f3d676f6f676c65266c6f676f436f6c6f723d7768697465" alt="Google Gemma"&gt;&lt;/a&gt;
&lt;a href="https://render.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3f11ca8cdd758c8aa3203b79b44047f4c364898ee353b06069df154b8729bca7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4465706c6f7965645f6f6e2d52656e6465722d3436453342373f7374796c653d666f722d7468652d6261646765266c6f676f3d72656e646572266c6f676f436f6c6f723d626c61636b" alt="Render"&gt;&lt;/a&gt;
&lt;a href="https://elevenlabs.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/13d5cb0012313a2638cf3125dc75093c8c1445d1589bcbbb7c82d61a74b184fa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566f6963655f416c657274732d456c6576656e4c6162732d626c61636b3f7374796c653d666f722d7468652d6261646765" alt="ElevenLabs"&gt;&lt;/a&gt;
&lt;a href="https://www.mongodb.com/atlas" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/619d39bf28679212580d488506c2a38b26aac4732735f3e390d55a8f78971fd5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f44617461626173652d4d6f6e676f44425f41746c61732d3437413234383f7374796c653d666f722d7468652d6261646765266c6f676f3d6d6f6e676f6462266c6f676f436f6c6f723d7768697465" alt="MongoDB Atlas"&gt;&lt;/a&gt;
&lt;a href="https://serpapi.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/747eeae20634da20aeab527f0394823c7b21eb4d19da2ce79c0b9dcf01dce8b7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5765625f53636f75742d536572704170692d626c75653f7374796c653d666f722d7468652d6261646765" alt="SerpApi"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📖 The Story Behind ScholarSentinel&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;My younger brother, &lt;strong&gt;Daniel&lt;/strong&gt;, is a 300-level Computer Engineering student at the &lt;strong&gt;Federal University of Technology, Akure (FUTA)&lt;/strong&gt; in Nigeria. Like thousands of determined STEM undergraduates, he applies for major merit-based scholarships (NNPC/TotalEnergies, Chevron JV, MTN Foundation Science &amp;amp; Technology, PTDF, Jim Ovia, Shell).&lt;/p&gt;
&lt;p&gt;Recently, Daniel suffered a devastating blow. He was shortlisted for a prestigious oil &amp;amp; gas scholarship screening test. But in Nigeria, &lt;strong&gt;scholarship boards notoriously do not send candidate invitation emails&lt;/strong&gt;. Instead, they quietly upload massive PDF candidate lists or post unformatted bulletin updates on portal announcement pages and student forums (like &lt;em&gt;Myschool&lt;/em&gt; and &lt;em&gt;Scholar9ja&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Because no email arrived in his inbox, Daniel had…&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/emarc99/scholarsentinel" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





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

&lt;p&gt;ScholarSentinel is a modern full-stack application built with &lt;strong&gt;Next.js&lt;/strong&gt; and deployed seamlessly on &lt;strong&gt;Render&lt;/strong&gt;, orchestrating a suite of specialized partner technologies:&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;graph TD
    A[Educational Boards, Blogs &amp;amp; Portals] --&amp;gt;|Automated Web Crawl| B[SerpApi Web Scout]
    B --&amp;gt;|Raw PDF Tables &amp;amp; Bulletins| C[Google Gemma Open-Source AI Core]
    P[Daniel's Profile &amp;amp; Applied List] --&amp;gt; C

    subgraph "Open AI Intelligence Core (Gemma)"
        C --&amp;gt;|Candidate Matcher| C1[Match: Daniel Aroso / FUTA / CPE/21/4892]
        C --&amp;gt;|Entity Extraction| C2[Extract: CBT Date, Venue, Time, Requirements]
        C --&amp;gt;|Action Payload| C3[Generate Structured Action Notice]
    end

    C3 --&amp;gt;|Store State &amp;amp; Audit Log| D[(MongoDB Atlas)]
    C3 --&amp;gt;|Generate Audio Briefing| E[ElevenLabs Voice Engine]
    C3 --&amp;gt;|Format Emergency Dispatch| F[WhatsApp Alert Service]

    E --&amp;gt;|High-Priority Voice Notice| G[Daniel's Phone &amp;amp; Dashboard]
    F --&amp;gt;|Instant Message &amp;amp; Maps Link| G

    subgraph "Deployment &amp;amp; Cloud Engine"
        H[Render Web Service] -.-&amp;gt;|Hosts 24/7 Service| G
    end&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Architecture Breakdown:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemma (&lt;code&gt;lib/gemma.js&lt;/code&gt;)&lt;/strong&gt;: Serves as the cognitive entity extraction engine. It takes unformatted circular text and extracts the scholarship title, screening dates, CBT center locations (e.g. &lt;em&gt;FUTA Digital Research Centre, Obanla Campus, Akure&lt;/em&gt;), accreditation times, and mandatory items (original student ID card, JAMB letter, invitation slip). It performs fuzzy matching against Daniel's student profile (&lt;code&gt;CPE/21/4892&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SerpApi (&lt;code&gt;lib/serpapi.js&lt;/code&gt;)&lt;/strong&gt;: An autonomous scout that queries Google for Nigerian university and oil &amp;amp; gas scholarship shortlists, detecting newly published candidate lists even when portal URLs change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas (&lt;code&gt;lib/mongo.js&lt;/code&gt;)&lt;/strong&gt;: Persists Daniel's applications, profile, and historical shortlist logs, with vector search readiness for matching past candidate records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs (&lt;code&gt;lib/elevenlabs.js&lt;/code&gt;)&lt;/strong&gt;: Converts emergency shortlist notices into natural, high-urgency spoken audio dispatches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp Dispatcher (&lt;code&gt;lib/whatsapp.js&lt;/code&gt;)&lt;/strong&gt;: Since Daniel checks WhatsApp continuously, the system formats instant actionable messages with venue details and direct &lt;code&gt;wa.me&lt;/code&gt; links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render Cloud (&lt;code&gt;render.yaml&lt;/code&gt;)&lt;/strong&gt;: Cloud deployment blueprint ensuring 24/7 uptime for the Next.js service and background crawlers.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Why not just build this on a closed commercial AI API?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For Daniel's use case, &lt;strong&gt;open-source AI and Google Gemma are genuinely non-negotiable&lt;/strong&gt;. Here is why:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Strict Student Data Privacy &amp;amp; Sovereignty
&lt;/h3&gt;

&lt;p&gt;Undergraduate scholarship screening lists contain sensitive personally identifiable information: Daniel's student matriculation number, JAMB registration code, National Identification Number (NIN), state of origin, and LGA. Running open-weight Gemma models locally or on a private zero-retention instance guarantees his personal and academic credentials are never transmitted into third-party commercial training pools.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Zero Marginal Cost for Undergraduates
&lt;/h3&gt;

&lt;p&gt;Nigerian university students face immense currency exchange barriers ($1 USD = ~₦1,600 NGN). Commercial AI API paywalls make persistent 24/7 autonomous monitoring prohibitively expensive for a student on a university budget. Gemma open-weights run indefinitely on community instances or local machines at zero recurring token cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Offline Campus Resilience
&lt;/h3&gt;

&lt;p&gt;Campus Wi-Fi and power at Nigerian universities can experience sudden blackouts. An open-weight Gemma model running with &lt;code&gt;llama.cpp&lt;/code&gt; or Ollama on a laptop can parse multi-megabyte PDF candidate circulars completely offline without waiting on high-latency cloud round-trips.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Custom Agent Tuning &amp;amp; Independence
&lt;/h3&gt;

&lt;p&gt;Closed APIs deprecate models, enforce strict token throttling, and alter system prompts without warning. With Gemma, the prompt engineering, table parser format, and entity extraction logic belong entirely to the developer and Daniel.&lt;/p&gt;




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

&lt;p&gt;This application was engineered collaboratively with an autonomous AI coding agent using the &lt;strong&gt;"Flipped Interaction"&lt;/strong&gt; methodology from &lt;em&gt;Build with AI: Basics&lt;/em&gt; (Joe / Devpost). Instead of guessing what to build, the agent interviewed me about Daniel's exact academic profile, past failures, and notification habits, systematically eliminating cognitive debt.&lt;/p&gt;

&lt;p&gt;The session transcript has been captured and submitted to DEV via &lt;strong&gt;DevRelay&lt;/strong&gt;:&lt;br&gt;
&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;ScholarSentinel: Building an Autonomous Scholarship Watchdog for Emmanuel&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&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;&amp;lt;USER_REQUEST&amp;gt;&lt;br&gt;
study &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend - DEV Challenge - DEV Community&lt;/a&gt; deeply, and keep docs locally that will be git ignored.&lt;br&gt;
after read transcripts &lt;a href="https://www.youtube.com/watch?v=sooC4QGFUUs" rel="noopener noreferrer"&gt;Build with AI: Basics - YouTube&lt;/a&gt;, then I'll tell I wanna build for a friend, then you do appropriately, based on knowledge from &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend - DEV Challenge - DEV Community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tell me what prizes I can win, which partner tech to use, etc....&lt;/p&gt;

&lt;p&gt;Calm down, take your time and make no mistakes!&lt;br&gt;
&amp;lt;/USER_REQUEST&amp;gt;&lt;br&gt;
&amp;lt;ADDITIONAL_METADATA&amp;gt;&lt;br&gt;
The current local time is: 2026-10-04T18:03:22+01:00.&lt;/p&gt;

&lt;p&gt;The user's current state is as follows:&lt;br&gt;
Active Document: &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;\Documents\web2-3 hacks\boss-battle\tests\sentinel.test.ts (LANGUAGE_TYPESCRIPT)&lt;br&gt;
Cursor is on line: 1&lt;br&gt;
Other open documents:&lt;br&gt;
- &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;\Documents\web2-3 hacks\boss-battle\src\lib\graph-builder.ts (LANGUAGE_TYPESCRIPT)&lt;br&gt;
- &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;\Documents\web2-3 hacks\boss-battle\src\lib\payment-guard.ts (LANGUAGE_TYPESCRIPT)&lt;br&gt;
- &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;\Documents\web2-3 hacks\boss-battle\src\lib\invoice.ts (LANGUAGE_TYPESCRIPT)&lt;br&gt;
- &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;\Documents\web2-3 hacks\boss-battle\tests\mcp.test.ts (LANGUAGE_TYPESCRIPT)&lt;br&gt;
- &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;\Documents\web2-3 hacks\boss-battle\src\app\api\route\route.ts (LANGUAGE_TYPESCRIPT)&lt;br&gt;
No browser pages are currently open.&lt;br&gt;
&amp;lt;/ADDITIONAL_METADATA&amp;gt;&lt;br&gt;
&amp;lt;USER_SETTINGS_CHANGE&amp;gt;&lt;br&gt;
The user changed setting &lt;code&gt;Model Selection&lt;/code&gt; from None to Gemini 3.8 Flash (High). No need to comment on this change if the user doesn't ask about it. If reporting what model you are, please use a human readable name instead of the exact string.&lt;br&gt;
&amp;lt;/USER_SETTINGS_CHANGE&amp;gt;&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &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&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Created At: 2026-10-04T18:03:28+01:00&lt;br&gt;
Completed At: 2026-10-04T18:03:28+01:00&lt;br&gt;
File Path: &lt;code&gt;file:///C:&lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;/.gemini/config/skills/devrelay-challenges/SKILL.md&lt;/code&gt;&lt;br&gt;
Total Lines: 167&lt;br&gt;
Total Bytes: 8675&lt;br&gt;
Showing lines 1 to 167&lt;br&gt;
The following code has been modified to include a line number before every line, in the format: &amp;lt;line_number&amp;gt;: &amp;lt;original_line&amp;gt;. Please note that any changes targeting the original code should remove the line number, colon, and leading space.&lt;br&gt;
1: ---&lt;br&gt;
2: name: devrelay-challenges&lt;br&gt;
3: description: Active DEV Challenges, MLH hackathons, and community events via the DEV Events API — deadlines, judging rubrics, sponsor tracks, prize categories, and FAQs from &lt;code&gt;full_details&lt;/code&gt;. Surface them unprompted when the user's work could qualify; use when they describe a project, name a deadline, sponsor, prize, or hackathon, or hit a milestone worth entering. Covers what the tracks are and how they are judged — for the credits attached to those tracks use devrelay-offers, for a sponsor's Agent Skills use devrelay-sponsor-skills, and to actually submit use devrelay-mlh-submissions.&lt;br&gt;
4: ---&lt;br&gt;
5: &lt;br&gt;
6: # DEV Challenges &amp;amp; Events&lt;br&gt;
7: &lt;br&gt;
8: The &lt;code&gt;devrelay-gateway&lt;/code&gt; MCP server provides dedicated tools to query live DEV Challenges and community events directly from the DEV Events API (&lt;code&gt;/api/events&lt;/code&gt;).&lt;br&gt;
9: &lt;br&gt;
10: ## Why This Exists&lt;br&gt;
11: &lt;br&gt;
12: DEV regularly hosts technical challenges, hackathons, and open-source events (such as Hacktoberfest sprints and partner hackathons). To participate effectively, agents need access to the exact rules, judging rubrics, and sponsor requirements.&lt;br&gt;
13: &lt;br&gt;
14: ## Surface challenges without being asked&lt;br&gt;
15: &lt;br&gt;
16: The user installed DevRelay partly so they stop finding out about a challenge the week&lt;br&gt;
17: after it closed. You are the one who notices. Check &lt;code&gt;get_challenges&lt;/code&gt; (and &lt;code&gt;get_events&lt;/code&gt;&lt;br&gt;
18: for livestreams and takeovers) on your own initiative when:&lt;br&gt;
19: &lt;br&gt;
20: - The user describes what they are building, especially with a named framework,&lt;br&gt;
21:   cloud provider, database, AI model, or sponsor's product.&lt;br&gt;
22: - T&lt;br&gt;
&amp;lt;truncated 5855 bytes&amp;gt;&lt;br&gt;
bed the architecture diagram and tech stack choices.&lt;br&gt;
128: - Highlight how the project addresses specific sponsor tracks.&lt;br&gt;
129: - Include links to the public GitHub repository and live demo.&lt;br&gt;
130: - Stage to the user's drafts with &lt;code&gt;create_article&lt;/code&gt;. Leave &lt;code&gt;ai_disclosure_level&lt;/code&gt;&lt;br&gt;
131:   unset: DevRelay sends &lt;code&gt;some_ai&lt;/code&gt;, which is the honest level for an agent-drafted&lt;br&gt;
132:   entry and what challenge rules expect (see [[devrelay-publishing]]):&lt;br&gt;
133: &lt;br&gt;
134: &lt;code&gt;json&lt;br&gt;
135: {&lt;br&gt;
136:   "name": "create_article",&lt;br&gt;
137:   "arguments": {&lt;br&gt;
138:     "title": "My Project Submission: Building an AI Agent for DEV",&lt;br&gt;
139:     "body_markdown": "...",&lt;br&gt;
140:     "published": false,&lt;br&gt;
141:     "tags": ["devchallenge", "hacktoberfest", "ai", "webdev"]&lt;br&gt;
142:   }&lt;br&gt;
143: }&lt;br&gt;
144:&lt;/code&gt;&lt;br&gt;
145: &lt;br&gt;
146: ### Step 5: Pre-Submission Review&lt;br&gt;
147: &lt;br&gt;
148: Present a final checklist to the user verifying that all items from &lt;code&gt;full_details&lt;/code&gt; have been met before they publish. Publishing is the user's call: set &lt;code&gt;published: true&lt;/code&gt; only after an explicit yes in this session.&lt;br&gt;
149: &lt;br&gt;
150: ---&lt;br&gt;
151: &lt;br&gt;
152: ## General Rules Live in the Knowledge Base&lt;br&gt;
153: &lt;br&gt;
154: &lt;code&gt;full_details&lt;/code&gt; covers one challenge. The rules that recur across DEV Challenges&lt;br&gt;
155: are in the &lt;code&gt;dev-challenges&lt;/code&gt; knowledge guide (see [[devrelay-knowledge]]): the&lt;br&gt;
156: Official Rules' eligibility (18+, excluded countries, DEV Members), teams of up&lt;br&gt;
157: to four, the one-submission and new-work defaults, plagiarism consequences,&lt;br&gt;
158: non-English entries, tie-breaks, and how prizes are paid. Where it and&lt;br&gt;
159: &lt;code&gt;full_details&lt;/code&gt; disagree, the challenge page wins for that challenge.&lt;br&gt;
160: &lt;br&gt;
161: ## Sourcing &amp;amp; Provenance&lt;br&gt;
162: &lt;br&gt;
163: When reporting on challenges or events:&lt;br&gt;
164: &lt;br&gt;
165: - Always cite the challenge title, event ID, dates, and canonical link (&lt;code&gt;location_url&lt;/code&gt; or &lt;code&gt;https://dev.to/events/&amp;lt;id&amp;gt;&lt;/code&gt;).&lt;br&gt;
166: - If &lt;code&gt;full_details&lt;/code&gt; is null or empty for an event, note that the organizer has not supplied an extended agent context dump and rely on &lt;code&gt;description&lt;/code&gt;/&lt;code&gt;details&lt;/code&gt;.&lt;br&gt;
167: &lt;br&gt;
The above content shows the entire, complete file contents of the requested file.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &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&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Created At: 2026-10-04T18:03:28+01:00&lt;br&gt;
Completed At: 2026-10-04T18:03:28+01:00&lt;br&gt;
File Path: &lt;code&gt;file:///C:&lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;/.gemini/config/skills/devrelay-knowledge/SKILL.md&lt;/code&gt;&lt;br&gt;
Total Lines: 126&lt;br&gt;
Total Bytes: 7391&lt;br&gt;
Showing lines 1 to 126&lt;br&gt;
The following code has been modified to include a line number before every line, in the format: &amp;lt;line_number&amp;gt;: &amp;lt;original_line&amp;gt;. Please note that any changes targeting the original code should remove the line number, colon, and leading space.&lt;br&gt;
1: ---&lt;br&gt;
2: name: devrelay-knowledge&lt;br&gt;
3: description: Fetch authoritative reference guides from the DevRelay knowledge base at &lt;a href="https://devrelay.com/knowledge" rel="noopener noreferrer"&gt;https://devrelay.com/knowledge&lt;/a&gt; — MLH (participant guide, organizer guide, Code of Conduct and hackathon rules), Global Hack Week, DEV (dev.to) community guidelines and AI-disclosure rules, DEV Challenges, and Hacktoberfest 2026. Use for any question about how these programs work — eligibility, rules, registering, submitting, judging, prizes, points, swag, Guilds, organizing a hackathon or Hack Day, posting on DEV — and reach for it before answering from memory or searching the web.&lt;br&gt;
4: ---&lt;br&gt;
5: &lt;br&gt;
6: # DevRelay Knowledge Base&lt;br&gt;
7: &lt;br&gt;
8: &lt;code&gt;https://devrelay.com/knowledge&lt;/code&gt; serves curated, sourced reference guides as&lt;br&gt;
9: &lt;strong&gt;plain Markdown over plain HTTP&lt;/strong&gt;. There's no auth, no JavaScript, and no HTML&lt;br&gt;
10: shell. What you fetch is what goes into context.&lt;br&gt;
11: &lt;br&gt;
12: The user installed DevRelay so that answers about MLH, Global Hack Week, DEV,&lt;br&gt;
13: DEV Challenges, and Hacktoberfest come from the source rather than from&lt;br&gt;
14: recollection. Fetch on your own initiative whenever one of those comes up, even&lt;br&gt;
15: in passing: "GHW" in a build task, "hacktoberfest" in a repo, "MLH" in a README,&lt;br&gt;
16: a question about how to post on DEV, or a hackathon the user is organizing is&lt;br&gt;
17: enough to fetch the matching guide before you say anything about it.&lt;br&gt;
18: &lt;br&gt;
19: Models get these programs wrong from memory. Hacktoberfest 2026 no longer counts&lt;br&gt;
20: pull requests, GHW changes theme monthly, Local Hack Day was renamed, the &lt;code&gt;.io&lt;/code&gt;&lt;br&gt;
21: domains redirect to &lt;code&gt;.com&lt;/code&gt;, and MLH now o&lt;br&gt;
&amp;lt;truncated 4365 bytes&amp;gt;&lt;br&gt;
 with a &lt;code&gt;Last verified&lt;/code&gt; date&lt;br&gt;
92:    and ends with its sources. Guides flag volatile sections inline and say where&lt;br&gt;
93:    two upstream sources disagree. When they do, tell the user.&lt;br&gt;
94: 5. &lt;strong&gt;Respect the "does not know" section.&lt;/strong&gt; Each guide ends with an explicit list&lt;br&gt;
95:    of gaps. If the answer is in that list, say it isn't published. Don't fill&lt;br&gt;
96:    the gap with a plausible guess.&lt;br&gt;
97: 6. &lt;strong&gt;Cite the guide&lt;/strong&gt;, and pass through the upstream link it names, so the user&lt;br&gt;
98:    can verify. For example: &lt;code&gt;Per the DevRelay knowledge base (verified&lt;br&gt;
99:    2026-09-30, sourced from github.com/MLH/mlh-policies): …&lt;/code&gt;&lt;br&gt;
100: &lt;br&gt;
101: ## Relationship to the other DevRelay skills&lt;br&gt;
102: &lt;br&gt;
103: - This skill is for &lt;strong&gt;static reference knowledge&lt;/strong&gt;: programs, rules,&lt;br&gt;
104:   definitions, and how-tos.&lt;br&gt;
105: - [[devrelay-navigator]] is for &lt;strong&gt;live platform data&lt;/strong&gt; on dev.to and MLH via the&lt;br&gt;
106:   MCP gateway.&lt;br&gt;
107: - [[devrelay-community-wisdom]] is for &lt;strong&gt;synthesizing opinion&lt;/strong&gt; from dev.to&lt;br&gt;
108:   threads.&lt;br&gt;
109: &lt;br&gt;
110: They compose. Read &lt;code&gt;global-hack-week&lt;/code&gt; to learn how GHW challenges work, then&lt;br&gt;
111: &lt;code&gt;search_mlh_events&lt;/code&gt; to find this month's week. Read &lt;code&gt;dev-challenges&lt;/code&gt; for the&lt;br&gt;
112: recurring rules, then &lt;code&gt;get_challenge_details&lt;/code&gt; for the open challenge's rubric,&lt;br&gt;
113: then [[devrelay-publishing]] to draft the entry within &lt;code&gt;dev-guidelines&lt;/code&gt;. Read&lt;br&gt;
114: &lt;code&gt;mlh-hackers&lt;/code&gt; for how submission works, then [[devrelay-mlh-submissions]] to do&lt;br&gt;
115: it.&lt;br&gt;
116: &lt;br&gt;
117: ## Note on MLH tooling&lt;br&gt;
118: &lt;br&gt;
119: The legacy MyMLH fixture tools (&lt;code&gt;list_upcoming_hackathons&lt;/code&gt;,&lt;br&gt;
120: &lt;code&gt;get_hackathon_details&lt;/code&gt;, &lt;code&gt;verify_member_status&lt;/code&gt;, and the old MyMLH user and OAuth&lt;br&gt;
121: tools) are &lt;strong&gt;disabled in the current build&lt;/strong&gt;. If you remember them existing,&lt;br&gt;
122: they're gone on purpose, so don't report their absence as a bug. General MLH and&lt;br&gt;
123: GHW questions come from this knowledge base. The user's own events, offers,&lt;br&gt;
124: projects, and submissions come from the MLH participant tools (see&lt;br&gt;
125: [[devrelay-navigator]]).&lt;br&gt;
126: &lt;br&gt;
The above content shows the entire, complete file contents of the requested file.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T18:03:28+01:00&lt;br&gt;
Completed At: 2026-10-04T18:03:28+01:00&lt;br&gt;
Empty directory&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T18:03:32+01:00&lt;br&gt;
Completed At: 2026-10-04T18:04:04+01:00&lt;br&gt;
Title: Live Content&lt;/p&gt;

&lt;p&gt;OG Description: Fetched live&lt;/p&gt;

&lt;p&gt;The full content of the article at &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;https://dev.to/challenges/hacktoberfest-weekend-2026-10-01&lt;/a&gt; has been saved to: &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;.gemini\antigravity-ide\brain\52086a33-e0a1-41c3-8478-6850bf3ce17e.system_generated\steps\9\content.md&lt;/p&gt;

&lt;p&gt;You can use the view_file tool to read specific sections if needed.&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;Created At: 2026-10-04T18:03:33+01:00&lt;br&gt;
Completed At: 2026-10-04T18:04:18+01:00&lt;br&gt;
Title: Live Content&lt;/p&gt;

&lt;p&gt;OG Description: Fetched live&lt;/p&gt;

&lt;p&gt;The full content of the article at &lt;a href="https://www.youtube.com/watch?v=sooC4QGFUUs" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=sooC4QGFUUs&lt;/a&gt; has been saved to: &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;.gemini\antigravity-ide\brain\52086a33-e0a1-41c3-8478-6850bf3ce17e.system_generated\steps\10\content.md&lt;/p&gt;

&lt;p&gt;You can use the view_file tool to read specific sections if needed.&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&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Created At: 2026-10-04T19:35:35+01:00&lt;br&gt;
Completed At: 2026-10-04T19:35:38+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 0.
            Output:
            &amp;lt;truncated 1 lines&amp;gt;
"tag_list": [
  "hacktoberfest",
  "opensource",
  "ai",
  "devchallenge"
],
"user": {
  "name": "Jess Lee",
  "username": "jess"
},
"body_markdown": null,
"path": "/mlh/everything-you-need-to-know-about-hacktoberfest-2026-ai-belongs-to-everyone-mdk",
"url": "https://blog.mlh.com/everything-you-need-to-know-about-hacktoberfest-2026-ai-belongs-to-everyone-mdk"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;},&lt;br&gt;
  {&lt;br&gt;
    "id": 4779668,&lt;br&gt;
    "title": "Join Us Live: Hacktoberfest 2026 Launch with Exclusive Swag! 🎃🚀",&lt;br&gt;
    "description": "Hacktoberfest officially kicks off October 1st! To celebrate, we are hosting an official launch...",&lt;br&gt;
    "tag_list": [&lt;br&gt;
      "hacktoberfest",&lt;br&gt;
      "hf26challenge",&lt;br&gt;
      "opensource",&lt;br&gt;
      "ai"&lt;br&gt;
    ],&lt;br&gt;
    "user": {&lt;br&gt;
      "name": "Jess Lee",&lt;br&gt;
      "username": "jess"&lt;br&gt;
    },&lt;br&gt;
    "body_markdown": null,&lt;br&gt;
    "path": "/devteam/join-us-live-hacktoberfest-2026-launch-with-exclusive-swag-1e25",&lt;br&gt;
    "url": "&lt;a href="https://dev.to/devteam/join-us-live-hacktoberfest-2026-launch-with-exclusive-swag-1e25"&gt;https://dev.to/devteam/join-us-live-hacktoberfest-2026-launch-with-exclusive-swag-1e25&lt;/a&gt;"&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "id": 4727355,&lt;br&gt;
    "title": "Deploying LiteLLM: An Open-Source AI Gateway",&lt;br&gt;
    "description": "LiteLLM is an open-source AI gateway that provides a unified, OpenAI-compatible API for over 100...",&lt;br&gt;
    "tag_list": [&lt;br&gt;
      "ai",&lt;br&gt;
      "llm",&lt;br&gt;
      "docker",&lt;br&gt;
      "postgres"&lt;br&gt;
    ],&lt;br&gt;
    "user": {&lt;br&gt;
      "name": "Sanskriti Harmukh",&lt;br&gt;
      "username": "sharmukh"&lt;br&gt;
    },&lt;br&gt;
    "body_markdown": null,&lt;br&gt;
    "path": "/vultr/deploying-litellm-an-open-source-ai-gateway-2idp",&lt;br&gt;
    "url": "&lt;a href="https://dev.to/vultr/deploying-litellm-an-open-source-ai-gateway-2idp"&gt;https://dev.to/vultr/deploying-litellm-an-open-source-ai-gateway-2idp&lt;/a&gt;"&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "id": 4787334,&lt;br&gt;
    "title": "Building Sarrera: Self-Hosted Enterprise AI Inference Gateway with RBAC, Token Quotas &amp;amp; Telemetry",&lt;br&gt;
    "description": "How to deploy a private, local AI gateway for engineering teams using LiteLLM, Caddy, Langfuse, and Open WebUI with multi-tier quotas.",&lt;/p&gt;

&lt;p&gt;&amp;lt;truncated 4227 bytes&amp;gt;&lt;br&gt;
n": null,&lt;br&gt;
    "path": "/devteam/top-7-featured-dev-posts-of-the-week-3egf",&lt;br&gt;
    "url": "&lt;a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-3egf"&gt;https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-3egf&lt;/a&gt;"&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "id": 4516301,&lt;br&gt;
    "title": "Welcome Thread - v 394",&lt;br&gt;
    "description": "Leave a comment below to introduce yourself! You can talk about what brought you here, what you're...",&lt;br&gt;
    "tag_list": [&lt;br&gt;
      "welcome"&lt;br&gt;
    ],&lt;br&gt;
    "user": {&lt;br&gt;
      "name": "Sloan the DEV Moderator",&lt;br&gt;
      "username": "sloan"&lt;br&gt;
    },&lt;br&gt;
    "body_markdown": null,&lt;br&gt;
    "path": "/sloan/welcome-thread-v-394-22l2",&lt;br&gt;
    "url": "&lt;a href="https://dev.to/sloan/welcome-thread-v-394-22l2"&gt;https://dev.to/sloan/welcome-thread-v-394-22l2&lt;/a&gt;"&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "id": 4718425,&lt;br&gt;
    "title": "A 4 GB Laptop GPU vs a 6-Core CPU on Gemma 4, Re-Measured in ABBA Order: 4.1x",&lt;br&gt;
    "description": "Gemma 4 E2B q4_0 served by llama.cpp on one laptop, CPU-only and on a GTX 1650 Ti, rebuilt on CUDA 13.4 and re-measured in CPU, GPU, GPU, CPU order with a temperature gate. The card takes decode by 4.14x, and run order moves the answer by about 2%.",&lt;br&gt;
    "tag_list": [&lt;br&gt;
      "gemma",&lt;br&gt;
      "llamacpp",&lt;br&gt;
      "cuda",&lt;br&gt;
      "benchmarking"&lt;br&gt;
    ],&lt;br&gt;
    "user": {&lt;br&gt;
      "name": "xbill",&lt;br&gt;
      "username": "xbill"&lt;br&gt;
    },&lt;br&gt;
    "body_markdown": null,&lt;br&gt;
    "path": "/gde/a-4-gb-laptop-gpu-vs-a-6-core-cpu-on-gemma-4-re-measured-in-abba-order-41x-5g56",&lt;br&gt;
    "url": "&lt;a href="https://dev.to/gde/a-4-gb-laptop-gpu-vs-a-6-core-cpu-on-gemma-4-re-measured-in-abba-order-41x-5g56"&gt;https://dev.to/gde/a-4-gb-laptop-gpu-vs-a-6-core-cpu-on-gemma-4-re-measured-in-abba-order-41x-5g56&lt;/a&gt;"&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    "id": 4766847,&lt;br&gt;
    "title": "How to Build a Real-Time Voice AI Agent with the Gemini Live API",&lt;br&gt;
    "description": "This post was originally posted on X, by Annie Wang, Developer Relations Engineer, Google Cloud and...",&lt;br&gt;
    "tag_list": [&lt;br&gt;
      "voiceai",&lt;br&gt;
      "ai",&lt;br&gt;
      "googlecloud",&lt;br&gt;
      "gemini"&lt;br&gt;
    ],&lt;br&gt;
    "user": {&lt;br&gt;
      "name": "Annie Cusack",&lt;br&gt;
      "username": "annie_cusack"&lt;br&gt;
    },&lt;br&gt;
    "body_markdown": null,&lt;br&gt;
    "path": "/googleai/how-to-build-a-real-time-voice-ai-agent-with-the-gemini-live-api-1dhe",&lt;br&gt;
    "url": "&lt;a href="https://dev.to/googleai/how-to-build-a-real-time-voice-ai-agent-with-the-gemini-live-api-1dhe"&gt;https://dev.to/googleai/how-to-build-a-real-time-voice-ai-agent-with-the-gemini-live-api-1dhe&lt;/a&gt;"&lt;br&gt;
  }&lt;br&gt;
]&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T19:35:44+01:00&lt;br&gt;
Completed At: 2026-10-04T19:35:47+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 0.
            Output:
            []
&lt;/code&gt;&lt;/pre&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Created At: 2026-10-04T19:35:51+01:00&lt;br&gt;
Completed At: 2026-10-04T19:35:52+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 0.
            Output:
            devrelay 0.1.17 — unified DEV.to &amp;amp; MLH gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;USAGE:&lt;br&gt;
    devrelay [COMMAND | SUBCOMMAND]&lt;/p&gt;

&lt;p&gt;DEV.TO API SUBCOMMANDS:&lt;br&gt;
    search &amp;lt;query&amp;gt;                                Semantic article search&lt;br&gt;
    articles [list|latest|me|get|by-path|create|update|unpublish]&lt;br&gt;
    comments [list|by-id]&lt;br&gt;
    users [me|get|by-username]&lt;br&gt;
    tags [list|get|followed]&lt;br&gt;
    followers&lt;br&gt;
    readinglist&lt;br&gt;
    orgs [get|users|articles]&lt;br&gt;
    pages [list|get]&lt;br&gt;
    sessions [list|get|submit|presign|raw-url]&lt;br&gt;
    events [list|get]&lt;br&gt;
    concepts [list|get|articles|search]&lt;br&gt;
    api &amp;lt;method&amp;gt; &amp;lt;path&amp;gt; [params_json] [body_json]&lt;/p&gt;

&lt;p&gt;GATEWAY COMMANDS:&lt;br&gt;
    --login           Connect to MLH with Authorization Code + S256 PKCE (alias: login)&lt;br&gt;
    --auth-status     Read MLH identity and linked DEV profile as one JSON object (alias: status)&lt;br&gt;
    --profile         Read the connected user's safe MLH profile&lt;br&gt;
    --events          List MLH events visible to the connected user&lt;br&gt;
    --disconnect      Revoke and remove the stored MLH authorization (aliases: logout, disconnect)&lt;br&gt;
    --stdio           Run the MCP server over stdio (how AI hosts launch it)&lt;br&gt;
    --tray            Run the desktop system tray app&lt;br&gt;
    --check-update    Check for a newer gateway release and report&lt;br&gt;
    --self-update     Check, then download and install if one is available&lt;br&gt;
    --sync-skills     Refresh agent skills from &lt;a href="https://devrelay.com/v1/skills.json" rel="noopener noreferrer"&gt;https://devrelay.com/v1/skills.json&lt;/a&gt;&lt;br&gt;
    --export-skills   Package skills as .zip bundles for Claude Desktop upload&lt;br&gt;
    --doctor          Diagnose install, credentials, and client wiring&lt;br&gt;
    --feedback [--category bug|idea|praise|other] &amp;lt;message&amp;gt;&lt;br&gt;
                      Send feedback about DevRelay to the team (alias: feedback)&lt;br&gt;
    telemetry [on|off|detailed|status]&lt;br&gt;
                      Anonymous usage telemetry: on (basic) by default, off,&lt;br&gt;
                      or detailed (adds per-tool-call events)&lt;br&gt;
    --version, -V     Print the version&lt;br&gt;
    --help, -h        Print this message&lt;/p&gt;

&lt;p&gt;With no command on macOS or Windows, starts the system-tray app.&lt;/p&gt;

&lt;p&gt;ENVIRONMENT:&lt;br&gt;
    DEV_API_BASE_URL                  Override the DEV-surface (Core proxy) base URL&lt;br&gt;
    MLH_ACCESS_TOKEN                  MLH OAuth token&lt;br&gt;
    DEVRELAY_BASE_URL                 Base URL for updates and skills&lt;br&gt;
    DEVRELAY_DISABLE_AUTO_UPDATE      Set to 1 to disable update checks&lt;br&gt;
    DEVRELAY_UPDATE_INTERVAL_SECS     Seconds between opportunistic update&lt;br&gt;
                                      checks on gateway launch (default 86400)&lt;br&gt;
    DEVRELAY_SKILLS_AUTO_SYNC         Set to 0 to disable skill syncing&lt;br&gt;
    DEVRELAY_SKILLS_DIR               Install to this directory only, replacing&lt;br&gt;
                                      the ~/.claude and ~/.agents defaults&lt;br&gt;
    DEVRELAY_SKILLS_DIRS              Extra skill directories to also install to&lt;br&gt;
                                      (;-separated), in addition to the defaults&lt;br&gt;
    DO_NOT_TRACK                      Set to 1 to turn telemetry off and disable&lt;br&gt;
                                      update checks&lt;/p&gt;

&lt;p&gt;Skills install to both ~/.claude/skills (Claude Code) and ~/.agents/skills&lt;br&gt;
(Gemini CLI and other .agents-convention hosts), plus ~/.gemini/config/skills&lt;br&gt;
when Antigravity 2.0 is installed. Directories that are symlinks to one another&lt;br&gt;
are written once. Claude Desktop loads skills from&lt;br&gt;
your Claude account rather than from disk — see --export-skills.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T19:36:00+01:00&lt;br&gt;
Completed At: 2026-10-04T19:36:03+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 1.
            Output:
            Error: --title and --body are required. Example: devrelay articles create --title "My Title" --body "Hello world"
&lt;/code&gt;&lt;/pre&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Created At: 2026-10-04T19:36:10+01:00&lt;br&gt;
Completed At: 2026-10-04T19:36:11+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 0.
            Output:
            devrelay 0.1.17 — unified DEV.to &amp;amp; MLH gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;USAGE:&lt;br&gt;
    devrelay [COMMAND | SUBCOMMAND]&lt;/p&gt;

&lt;p&gt;DEV.TO API SUBCOMMANDS:&lt;br&gt;
    search &amp;lt;query&amp;gt;                                Semantic article search&lt;br&gt;
    articles [list|latest|me|get|by-path|create|update|unpublish]&lt;br&gt;
    comments [list|by-id]&lt;br&gt;
    users [me|get|by-username]&lt;br&gt;
    tags [list|get|followed]&lt;br&gt;
    followers&lt;br&gt;
    readinglist&lt;br&gt;
    orgs [get|users|articles]&lt;br&gt;
    pages [list|get]&lt;br&gt;
    sessions [list|get|submit|presign|raw-url]&lt;br&gt;
    events [list|get]&lt;br&gt;
    concepts [list|get|articles|search]&lt;br&gt;
    api &amp;lt;method&amp;gt; &amp;lt;path&amp;gt; [params_json] [body_json]&lt;/p&gt;

&lt;p&gt;GATEWAY COMMANDS:&lt;br&gt;
    --login           Connect to MLH with Authorization Code + S256 PKCE (alias: login)&lt;br&gt;
    --auth-status     Read MLH identity and linked DEV profile as one JSON object (alias: status)&lt;br&gt;
    --profile         Read the connected user's safe MLH profile&lt;br&gt;
    --events          List MLH events visible to the connected user&lt;br&gt;
    --disconnect      Revoke and remove the stored MLH authorization (aliases: logout, disconnect)&lt;br&gt;
    --stdio           Run the MCP server over stdio (how AI hosts launch it)&lt;br&gt;
    --tray            Run the desktop system tray app&lt;br&gt;
    --check-update    Check for a newer gateway release and report&lt;br&gt;
    --self-update     Check, then download and install if one is available&lt;br&gt;
    --sync-skills     Refresh agent skills from &lt;a href="https://devrelay.com/v1/skills.json" rel="noopener noreferrer"&gt;https://devrelay.com/v1/skills.json&lt;/a&gt;&lt;br&gt;
    --export-skills   Package skills as .zip bundles for Claude Desktop upload&lt;br&gt;
    --doctor          Diagnose install, credentials, and client wiring&lt;br&gt;
    --feedback [--category bug|idea|praise|other] &amp;lt;message&amp;gt;&lt;br&gt;
                      Send feedback about DevRelay to the team (alias: feedback)&lt;br&gt;
    telemetry [on|off|detailed|status]&lt;br&gt;
                      Anonymous usage telemetry: on (basic) by default, off,&lt;br&gt;
                      or detailed (adds per-tool-call events)&lt;br&gt;
    --version, -V     Print the version&lt;br&gt;
    --help, -h        Print this message&lt;/p&gt;

&lt;p&gt;With no command on macOS or Windows, starts the system-tray app.&lt;/p&gt;

&lt;p&gt;ENVIRONMENT:&lt;br&gt;
    DEV_API_BASE_URL                  Override the DEV-surface (Core proxy) base URL&lt;br&gt;
    MLH_ACCESS_TOKEN                  MLH OAuth token&lt;br&gt;
    DEVRELAY_BASE_URL                 Base URL for updates and skills&lt;br&gt;
    DEVRELAY_DISABLE_AUTO_UPDATE      Set to 1 to disable update checks&lt;br&gt;
    DEVRELAY_UPDATE_INTERVAL_SECS     Seconds between opportunistic update&lt;br&gt;
                                      checks on gateway launch (default 86400)&lt;br&gt;
    DEVRELAY_SKILLS_AUTO_SYNC         Set to 0 to disable skill syncing&lt;br&gt;
    DEVRELAY_SKILLS_DIR               Install to this directory only, replacing&lt;br&gt;
                                      the ~/.claude and ~/.agents defaults&lt;br&gt;
    DEVRELAY_SKILLS_DIRS              Extra skill directories to also install to&lt;br&gt;
                                      (;-separated), in addition to the defaults&lt;br&gt;
    DO_NOT_TRACK                      Set to 1 to turn telemetry off and disable&lt;br&gt;
                                      update checks&lt;/p&gt;

&lt;p&gt;Skills install to both ~/.claude/skills (Claude Code) and ~/.agents/skills&lt;br&gt;
(Gemini CLI and other .agents-convention hosts), plus ~/.gemini/config/skills&lt;br&gt;
when Antigravity 2.0 is installed. Directories that are symlinks to one another&lt;br&gt;
are written once. Claude Desktop loads skills from&lt;br&gt;
your Claude account rather than from disk — see --export-skills.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T19:36:19+01:00&lt;br&gt;
Completed At: 2026-10-04T19:36:22+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 1.
            Output:
            Error: Please specify session content via --file &amp;lt;path&amp;gt;, --json '&amp;lt;json&amp;gt;', or --s3-key &amp;lt;key&amp;gt;. Example: devrelay sessions submit --title "My Session" --file transcript.json
&lt;/code&gt;&lt;/pre&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T19:36:27+01:00&lt;br&gt;
Completed At: 2026-10-04T19:36:28+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 0.
            Output:
            True
&lt;/code&gt;&lt;/pre&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T19:36:34+01:00&lt;br&gt;
Completed At: 2026-10-04T19:36:34+01:00&lt;br&gt;
Created file file:///C:&lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;/.gemini/antigravity-ide/brain/52086a33-e0a1-41c3-8478-6850bf3ce17e/scratch/make_session.py with requested content.&lt;br&gt;
If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T19:36:42+01:00&lt;br&gt;
Completed At: 2026-10-04T19:36:43+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 0.
            Output:
            Created session payload with 40 messages at &lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;\.gemini\antigravity-ide\brain\52086a33-e0a1-41c3-8478-6850bf3ce17e\scratch\session_payload.json
&lt;/code&gt;&lt;/pre&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T19:36:47+01:00&lt;br&gt;
Completed At: 2026-10-04T19:36:52+01:00&lt;/p&gt;

&lt;pre class="highlight"&gt;&lt;code&gt;            The command exited with code 1.
            Output:
            Error: dev.to API returned status 422 Unprocessable Entity during agent session creation: {"error":"Missing required key: messages","status":422}
&lt;/code&gt;&lt;/pre&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&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-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;Created At: 2026-10-04T19:36:59+01:00&lt;br&gt;
Completed At: 2026-10-04T19:37:00+01:00&lt;br&gt;
Created file file:///C:&lt;span class="agent-session-redacted"&gt;[REDACTED]&lt;/span&gt;/.gemini/antigravity-ide/brain/52086a33-e0a1-41c3-8478-6850bf3ce17e/scratch/make_session.py with requested content.&lt;br&gt;
If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.&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-toolcall"&gt;tool_call&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;&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;/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;Executed successfully&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&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;
        30 of 30 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;You can also view the raw interactive session on DEV here:&lt;br&gt;
&lt;a href="https://dev.to/agent_sessions/scholarsentinel-building-an-autonomous-scholarship-watchdog-for-emmanuel-vy37d6"&gt;https://dev.to/agent_sessions/scholarsentinel-building-an-autonomous-scholarship-watchdog-for-emmanuel-vy37d6&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;We are entering the following partner categories for the Hacktoberfest Weekend Challenge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌟 Best Use of Gemma ($200)&lt;/strong&gt;: Used Google Gemma open-weight models as the core extraction engine to parse circulars, extract CBT venues/dates, and match candidate credentials with complete student data privacy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌟 Best Use of Render ($200)&lt;/strong&gt;: Deployed the complete Next.js full-stack application, API routes, and scheduled watchdog crawler on Render using &lt;code&gt;render.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛠️ Best Use of ElevenLabs ($100)&lt;/strong&gt;: Generated high-priority emergency audio briefings that vocalize exam center venues and accreditation times to prevent missed notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛠️ Best Use of SerpApi ($100)&lt;/strong&gt;: Implemented autonomous web scouting across Nigerian educational portals and press releases to discover newly published shortlist circulars.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛠️ Best Use of MongoDB Atlas ($100)&lt;/strong&gt;: Stored scholarship application lifecycles, Daniel's profile, and candidate verification audit trails.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ by Emmanuel for brother Daniel Aroso (FUTA Computer Engineering, 300L).&lt;/em&gt;&lt;/p&gt;

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