<?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: Jirawat Boonkumnerd</title>
    <description>The latest articles on DEV Community by Jirawat Boonkumnerd (@ntsd).</description>
    <link>https://dev.to/ntsd</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%2F363628%2F0701b6fb-0547-4073-bc9f-ae29ffe84c5a.jpeg</url>
      <title>DEV Community: Jirawat Boonkumnerd</title>
      <link>https://dev.to/ntsd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ntsd"/>
    <language>en</language>
    <item>
      <title>ZeroVisual: I Was Too Lazy to Do Manual UI Testing, So I Made Open-Source AI Do It</title>
      <dc:creator>Jirawat Boonkumnerd</dc:creator>
      <pubDate>Fri, 23 Oct 2026 05:00:32 +0000</pubDate>
      <link>https://dev.to/ntsd/zerovisual-i-was-too-lazy-to-do-manual-ui-testing-so-i-made-open-source-ai-do-it-1jei</link>
      <guid>https://dev.to/ntsd/zerovisual-i-was-too-lazy-to-do-manual-ui-testing-so-i-made-open-source-ai-do-it-1jei</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I am lazy to do manual UI testing. Truly, unapologetically lazy.&lt;/p&gt;

&lt;p&gt;There is nothing quite as soul-crushing on a Friday afternoon as manually resizing browser windows, squinting at full-HD screenshots to see which button shifted by 3 pixels, inspecting CSS flexbox margins on three different viewports, or calculating whether a muted gray button passes WCAG 2.1 AA color contrast.&lt;/p&gt;

&lt;p&gt;When Vision LLMs arrived, the promise seemed magical: &lt;em&gt;"Just dump a screenshot into an AI agent and let it review your UI!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Except laziness quickly met reality:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Vision Token Explosion:&lt;/strong&gt; Feeding a single raw 1920×1080 screenshot to a Vision Transformer (ViT) burns 1,000 to 1,600 image tokens. Multiply that across Desktop, Tablet, and Mobile across a 30-test suite, and your CI/CD pipeline burns through hundreds of thousands of tokens per commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 5MB Base64 Payload Pipe Choke:&lt;/strong&gt; Shipping multi-megabyte Base64 image payloads over JSON-RPC or stdio to your local coding agent creates noticeable lag and IPC stalls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas Noise Hallucinations:&lt;/strong&gt; When an LLM looks at an entire webpage canvas, it gets easily distracted by navigation links, avatars, and footer copyrights, often hallucinating defects on pixels that never actually changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sloths have it figured out: move at your own pace, conserve energy, and let the work do itself. So in honor of &lt;strong&gt;International Sloth Day&lt;/strong&gt;, I built &lt;strong&gt;ZeroVisual&lt;/strong&gt;—an open-source, zero-API-key visual regression and automated UI design QA pre-processor that acts as a token-optimizing firewall between browser tests and Vision LLMs.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;ZeroVisual&lt;/strong&gt; is a local pre-processing engine, custom Playwright Reporter, CLI, and Model Context Protocol (MCP) server. It cuts Vision LLM token usage by up to &lt;strong&gt;75% on desktop viewports&lt;/strong&gt; and network payloads by up to &lt;strong&gt;98%&lt;/strong&gt;, without requiring a single external API key.&lt;/p&gt;

&lt;p&gt;It addresses the two most tedious UI tasks developers dread:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automated Visual Regression (&lt;code&gt;zerovisual regression&lt;/code&gt; &amp;amp; Playwright Custom Reporter):&lt;/strong&gt;&lt;br&gt;
Instead of immediately bombarding a vision model with full-page screenshots, ZeroVisual relies on a &lt;strong&gt;Two-Stage Architecture&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stage 1 (0 Tokens):&lt;/strong&gt; Deterministic pixel diffing runs locally for free. If all visual tests pass, 0 AI tokens are consumed and CI completes in milliseconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 2 (Optimized Triage):&lt;/strong&gt; When a test fails, ZeroVisual intercepts the Playwright diff, isolates the failure bounding box (with 32px contextual padding), resizes the crop to match the model's exact Vision Transformer patch grid, scopes the Accessibility Object Model (&lt;code&gt;ariaSnapshot&lt;/code&gt;), and aggregates Desktop, Tablet, and Mobile failures under one &lt;code&gt;testId&lt;/code&gt;. Your AI agent diagnoses the responsive layout bug in a single prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automated Design QA (&lt;code&gt;zerovisual design-qa&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
For developers building web apps without a dedicated UI/UX designer, guessing spacing and accessibility in CSS is exhausting. &lt;code&gt;zerovisual design-qa&lt;/code&gt; audits any localhost URL against mathematical heuristics (8pt spatial grid rhythm, WCAG 2.1 contrast math, 44×44px touch targets) and compares live DOM against open-source &lt;strong&gt;Penpot&lt;/strong&gt; design exports—zero proprietary Figma lock-in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Built-in MCP Server &amp;amp; Agent Skills:&lt;/strong&gt;&lt;br&gt;
ZeroVisual exposes native tools over stdio (&lt;code&gt;list_visual_failures&lt;/code&gt;, &lt;code&gt;get_visual_failure_bundle&lt;/code&gt;, &lt;code&gt;audit_live_ui_design&lt;/code&gt;, &lt;code&gt;optimize_image&lt;/code&gt;) and includes strictly-typed Agent Skills (&lt;code&gt;zerovisual-regression&lt;/code&gt;, &lt;code&gt;zerovisual-design-qa&lt;/code&gt;, &lt;code&gt;zerovisual-optimize&lt;/code&gt;) compatible with Cursor, Claude Code, Antigravity, and custom CI agents.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Stage 1: Deterministic Engine (0 Tokens)]
Playwright Pixel Diff / CSS Heuristic Math / Penpot Token Diff
       │
       ├──► PASS ──► Workflow Ends Immediately (0 AI Tokens Used)
       │
       └──► FAIL / AUDIT ──► Triggers ZeroVisual Pre-Processor
                                    │
[Stage 2: ZeroVisual Optimizer]     ▼
  1. Detects diff bounding box + 32px context padding
  2. Resizes &amp;amp; encodes to WebP based on Model Tile Grid (512px / 504px / 768px / 448px)
  3. Scopes Accessibility Tree (ariaSnapshot) &amp;amp; 14 Computed CSS layout styles
  4. Aggregates Desktop + Tablet + Mobile viewports by testId
                                    │
                                    ▼
              Outputs ./test-results/triage-ready.json
                                    │
            ┌───────────────────────┴───────────────────────┐
            ▼                                               ▼
   [Local IDE via MCP]                             [CI/CD Pipeline CLI]
Cursor / Claude Code / Antigravity               GitHub Actions / GitLab CI
queries ZeroVisual MCP Server + Skill          reads JSON &amp;amp; posts PR Verdict
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Live Documentation &amp;amp; Interactive Benchmark Explorer:&lt;/strong&gt; &lt;a href="https://zerovisual.hotcode.dev/guides/benchmarks/" rel="noopener noreferrer"&gt;zerovisual.hotcode.dev/guides/benchmarks/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧮 &lt;strong&gt;Interactive Token Calculator:&lt;/strong&gt; Calculate exact ViT token and byte savings directly on the homepage for OpenAI, Anthropic, Gemini, Gemma, and Local models.&lt;/li&gt;
&lt;li&gt;🔬 &lt;strong&gt;Real-World Benchmark Explorer:&lt;/strong&gt; Inspect side-by-side screenshots (Baseline, Actual, Diff, Crop) across live production websites (Wikipedia, Hacker News, GitHub, MDN) and examine actual local VLM reasoning traces (&lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Quick Start in Playwright
&lt;/h3&gt;

&lt;p&gt;Add ZeroVisual as a custom reporter in &lt;code&gt;playwright.config.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// playwright.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;devices&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;testDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./tests&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;projects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Desktop Chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Desktop Chrome&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mobile Safari&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iPhone 14&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;reporter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zerovisual/reporter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;targetProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemma&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// 'gemma' | 'gemini' | 'openai' | 'anthropic' | 'qwen' | 'local'&lt;/span&gt;
      &lt;span class="na"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;// Context padding around diff bounding box&lt;/span&gt;
      &lt;span class="na"&gt;outputDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./test-results&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Run Standalone Design QA on Localhost
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Audit live local UI against 8pt grid, WCAG contrast, and tap targets&lt;/span&gt;
npx zerovisual design-qa &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000 &lt;span class="nt"&gt;--provider&lt;/span&gt; gemma

&lt;span class="c"&gt;# Or compare directly with an open-source Penpot design artboard&lt;/span&gt;
npx zerovisual design-qa &lt;span class="nt"&gt;--url&lt;/span&gt; http://localhost:3000 &lt;span class="nt"&gt;--penpot&lt;/span&gt; ./designs/artboard.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Connect to Coding Agents via MCP
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Register with Claude Code&lt;/span&gt;
claude mcp add zerovisual &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; zerovisual-mcp

&lt;span class="c"&gt;# Or install Agent Skills for Antigravity / Cursor&lt;/span&gt;
npx skills add hotcode-dev/zerovisual
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hotcode-dev" rel="noopener noreferrer"&gt;
        hotcode-dev
      &lt;/a&gt; / &lt;a href="https://github.com/hotcode-dev/zerovisual" rel="noopener noreferrer"&gt;
        zerovisual
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Zero-waste, zero-API-key visual regression and automated UI design QA pre-processor for AI Agents.
    &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;ZeroVisual&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Zero-waste, zero-API-key visual regression and automated UI design QA pre-processor for AI Agents.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opensource.org/licenses/Apache-2.0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5b60841bea9e11d9d0b0950d690c9bc554e06385634056a7d5d62a15d1a4eabe/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4170616368655f322e302d626c75652e737667" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://nodejs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/94b23f81d2dc7346463f6c8d87dc2138745e8618bb202515d6d28231d2e8a832/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652e6a732d25334525334432302e302e302d677265656e2e737667" alt="Node.js"&gt;&lt;/a&gt;
&lt;a href="https://github.com/hotcode-dev/zerovisual#" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/732a6d34e89c5d772ab9fb6e55c27a3e09ab36917817d53db766417053c6b4bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f537461636b2d3130302532352532304f70656e253230536f757263652d6f72616e67652e737667" alt="100% Open Source"&gt;&lt;/a&gt;
&lt;a href="https://hotcode-dev.github.io/zerovisual/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fd2c7eecc48166e3bfe778b8db8490988e17655267f4901a45e2fc0fc18f7c72/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f63732d537461726c696768745f417374726f2d626c756576696f6c65742e737667" alt="Documentation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ZeroVisual&lt;/strong&gt; is a local pre-processing engine, Playwright Custom Reporter, CLI, and Model Context Protocol (MCP) server. It acts as a token-optimizing firewall between your browser tests/UI and your Vision LLMs—reducing vision token consumption by up to &lt;strong&gt;90%&lt;/strong&gt; without requiring a single LLM API key.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🌐 &lt;strong&gt;Full Documentation &amp;amp; Interactive Token Calculator:&lt;/strong&gt; Visit our &lt;a href="https://hotcode-dev.github.io/zerovisual/" rel="nofollow noopener noreferrer"&gt;Astro Documentation Site&lt;/a&gt;. Local dev: &lt;code&gt;npm run docs:dev&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 What Is This For?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;ZeroVisual solves two major pain points in modern software engineering:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. For QA &amp;amp; Full-Stack Engineers: Automated Visual Regression (&lt;code&gt;regression&lt;/code&gt; mode)&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Standard Playwright &lt;code&gt;toHaveScreenshot()&lt;/code&gt; pixel-diffing is fast and free, but fails on harmless sub-pixel font anti-aliasing or minor OS rendering shifts. Conversely, sending raw &lt;code&gt;1920x1080&lt;/code&gt; screenshots across Desktop, Tablet, and Mobile viewports to a Vision LLM to triage failures will burn through your token budget and slow…&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/hotcode-dev/zerovisual" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository is 100% open source under the &lt;strong&gt;Apache-2.0 License&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/hotcode-dev/zerovisual" rel="noopener noreferrer"&gt;github.com/hotcode-dev/zerovisual&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech Stack:&lt;/strong&gt; TypeScript, &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt;, &lt;code&gt;@playwright/test&lt;/code&gt;, &lt;code&gt;sharp&lt;/code&gt;, &lt;code&gt;citty&lt;/code&gt;, &lt;code&gt;zod&lt;/code&gt;, &lt;code&gt;fast-xml-parser&lt;/code&gt;, Astro + Starlight.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;ZeroVisual is designed from the ground up around &lt;strong&gt;open-source AI and local inference&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Local Vision-Language Models (Open-Weight ViTs):&lt;/strong&gt;
We benchmarked and validated ZeroVisual against Google's &lt;strong&gt;&lt;code&gt;google/gemma-4-26B-A4B-it&lt;/code&gt;&lt;/strong&gt; multimodal MoE architecture running completely locally on our workstation via &lt;strong&gt;vLLM&lt;/strong&gt;. Because open-weight vision models (such as Gemma 4, Qwen 2.5/3.8, and PaliGemma) publish their exact Vision Transformer patch dimensions (e.g. 28×28px or 14×14px patch grids), ZeroVisual mathematically fits cropped diffs into the exact minimum patch allocation:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemma / Gemini (&lt;code&gt;gemma&lt;/code&gt; / &lt;code&gt;gemini&lt;/code&gt;):&lt;/strong&gt; 768×768px native tile (or 384×384px in &lt;code&gt;lowTokenMode&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic / Qwen grid (&lt;code&gt;anthropic&lt;/code&gt; / &lt;code&gt;qwen&lt;/code&gt;):&lt;/strong&gt; 504×504px (exact 18×18 grid of 28×28px patches)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI (&lt;code&gt;openai&lt;/code&gt;):&lt;/strong&gt; 512×512px (single tile)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local VLMs (&lt;code&gt;local&lt;/code&gt;):&lt;/strong&gt; 448×448px default (or custom ViT patch dimensions)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Model Vision Grid Reference
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider Setting&lt;/th&gt;
&lt;th&gt;Target Max Bounding Box&lt;/th&gt;
&lt;th&gt;Vision Grid Mechanics&lt;/th&gt;
&lt;th&gt;Approx. Token Cost per Diff&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openai&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;512 × 512 px&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fits inside 1 standard OpenAI &lt;code&gt;512px&lt;/code&gt; tile&lt;/td&gt;
&lt;td&gt;~85 – 255 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;anthropic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;504 × 504 px&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Exact &lt;code&gt;18 × 18&lt;/code&gt; grid of &lt;code&gt;28×28 px&lt;/code&gt; patches&lt;/td&gt;
&lt;td&gt;~28 – 324 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gemma&lt;/code&gt; / &lt;code&gt;gemini&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;768 × 768 px&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fits 1 native Gemma / Gemini multimodal tile&lt;/td&gt;
&lt;td&gt;~258 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;gemma&lt;/code&gt; (&lt;code&gt;lowTokenMode&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;384 × 384 px&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sub-384px single base tile optimization&lt;/td&gt;
&lt;td&gt;~258 tokens (ultra-fast)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;504 × 504 px&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dynamic 2D spatial patch grid (&lt;code&gt;28×28 px&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;~28 – 324 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;local&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;448 × 448 px&lt;/code&gt; (configurable)&lt;/td&gt;
&lt;td&gt;Optimized for local VLMs (&lt;code&gt;28px&lt;/code&gt; / &lt;code&gt;14px&lt;/code&gt; patch ViTs)&lt;/td&gt;
&lt;td&gt;Local compute&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model Context Protocol (MCP) Standard:&lt;/strong&gt;&lt;br&gt;
Built on &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt;, exposing standard tools and prompts over &lt;code&gt;stdio&lt;/code&gt;. Any MCP-compatible agent harness (Claude Code, Cursor, Windsurf, Antigravity) can query test results, inspect failure bundles, and trigger UI audits without custom glue code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deterministic Local Math Pre-Engine:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bounding Box Math:&lt;/strong&gt; Fast pixel difference scan using &lt;code&gt;sharp&lt;/code&gt; buffer analysis with multi-color palette support (Playwright magenta &lt;code&gt;#ff00ff&lt;/code&gt;, rose, and red).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility Scoping:&lt;/strong&gt; Extracts Playwright's &lt;code&gt;ariaSnapshot&lt;/code&gt; YAML only for the failing element subtree, pairing visual evidence with clean semantic hierarchy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS Layout Heuristics:&lt;/strong&gt; Computes WCAG 2.1 contrast ratios and 8pt spatial grid alignment on the live DOM before any AI inference takes place.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Isolated Agent Skills:&lt;/strong&gt;&lt;br&gt;
Ships strictly-typed Agent Skills (&lt;code&gt;zerovisual-regression&lt;/code&gt;, &lt;code&gt;zerovisual-design-qa&lt;/code&gt;, &lt;code&gt;zerovisual-optimize&lt;/code&gt;) that instruct coding models with precise JSON schemas and design rules, preventing instruction dilution.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Open innovation is what makes ZeroVisual fundamentally possible. A closed API approach wouldn't work for three critical reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Privacy &amp;amp; Zero Data Leaks:&lt;/strong&gt;&lt;br&gt;
UI test suites run against staging dashboards, internal admin portals, checkout flows, and unreleased features. Uploading full-resolution screenshots of private company data to commercial cloud APIs violates enterprise security and compliance policies. With open-weight models (Gemma, Qwen) running locally through ZeroVisual, &lt;strong&gt;zero pixels ever leave your local machine or internal CI runner&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ViT Patch Mechanics Transparency:&lt;/strong&gt;&lt;br&gt;
Proprietary vision APIs treat image processing as an opaque black box. In contrast, open-source model architectures expose their exact Vision Transformer tokenization logic (patch sizes, position embeddings, and aspect ratio bucketing). This open transparency allowed us to engineer mathematically optimal cropping algorithms that align pixel boundaries directly with the model's ViT patches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uncapped, Meter-Free Automation:&lt;/strong&gt;&lt;br&gt;
Commercial vision APIs charge between $0.01 and $0.03 per image. In an active development team running hundreds of Playwright visual tests across multiple responsive viewports, running visual AI triage on every PR would incur crippling costs. Open innovation and local inference liberate developers from API meter anxiety—allowing you to run thorough UI testing on every single commit for $0.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Judges and readers can inspect the full interactive agent session trace showing the benchmark execution and triage optimization on local open-weight vision models:&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="Pi"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;ZeroVisual Vision LLM Empirical Benchmark: 87.7% ViT Token Reduction on Local Qwen-27B&lt;/span&gt;
      &lt;span class="agent-session-model-badge"&gt;RadixArk/Qwen3.8-27B-NVFP4&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;Run empirical benchmark comparing Vision LLM visual regression triage with and without ZeroVisual on local Qwen 27B model (RadixArk/Qwen3.8-27B-NVFP4 via SGLang). Measure token consumption, latency, and accuracy across 6 realistic web-UI test cases.&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;Executed empirical evaluation across 6 real-world web UI visual regression scenarios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wikipedia Portal Search Offset (Layout Shift)&lt;/li&gt;
&lt;li&gt;GitHub PR Merge Box Regression (Button Sizing/Shift)&lt;/li&gt;
&lt;li&gt;SaaS Pricing Card Contrast Violation (WCAG 2.1 AA)&lt;/li&gt;
&lt;li&gt;E-Commerce Checkout Collision (Flexbox Overlap)&lt;/li&gt;
&lt;li&gt;Dashboard Stat Overflow &amp;amp; Clipping (Typography/Height)&lt;/li&gt;
&lt;li&gt;Mobile Safari Nav Drawer Overflow (Breakpoint/Z-Index)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Empirical Results Summary:&lt;br&gt;
- Total Tokens Consumed: 11,556 tokens (Raw) vs 5,421 tokens (ZeroVisual) -&amp;gt; 53.1% reduction&lt;br&gt;
- Vision Image Tokens (ViT): 5,252 tokens (Raw) vs 644 tokens (ZeroVisual) -&amp;gt; 87.7% reduction&lt;br&gt;
- Network Bandwidth: 146.6 KB vs 21.7 KB -&amp;gt; 85.2% reduction&lt;br&gt;
- Average Latency: 53.3s vs 36.4s -&amp;gt; 32% faster (up to 3.5x faster on complex viewports)&lt;br&gt;
- Average Triage Accuracy: 76.7% vs 82.5% -&amp;gt; +5.8% accuracy (zero canvas noise hallucinations)&lt;/p&gt;

&lt;p&gt;Core Engine Improvements Implemented:&lt;br&gt;
- Added 'qwen' provider support with native 28x28 patch grid dimension math (504x504 max tile).&lt;br&gt;
- Upgraded defaultDiffPixelMatcher to support Playwright magenta (#ff00ff), rose, and high-saturation pixelmatch reds across arbitrary dark/light themes.&lt;br&gt;
- Added automated benchmark CLI runner and testdata generators.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &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;Direct session link: &lt;a href="https://dev.to/agent_sessions/zerovisual-vision-llm-empirical-benchmark-877-vit-token-reduction-on-local-qwen-27b-pf9ccb"&gt;View on DEV Agent Sessions&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;How much effort does ZeroVisual actually save?&lt;/p&gt;

&lt;p&gt;We ran an empirical benchmark across &lt;strong&gt;11 visual regression scenarios&lt;/strong&gt;—including 5 live production websites (Wikipedia Desktop &amp;amp; Mobile, Hacker News, GitHub Pricing, MDN Web Docs) and 6 synthetic component regressions—comparing raw viewport screenshots against ZeroVisual optimization on local Gemma 4 26B (&lt;code&gt;google/gemma-4-26B-A4B-it&lt;/code&gt; served via vLLM):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Core Metric&lt;/th&gt;
&lt;th&gt;Without ZeroVisual (Raw Viewport)&lt;/th&gt;
&lt;th&gt;With ZeroVisual (Optimized)&lt;/th&gt;
&lt;th&gt;The Lazy Payoff&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vision Image Tokens (ViT)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9,030 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2,838 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-68.6% ViT Token Reduction&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network Payload Transfer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;638.9 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;116.2 KB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-81.8% Bandwidth Reduced&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total Tokens Consumed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7,612 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7,148 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;-6.1% Total Tokens Saved&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average Roundtrip Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.4 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.3 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13% Faster (up to 37% on desktop)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average Triage Accuracy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;59.1%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65.5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+6.4% Accuracy Boost (Zero Canvas Noise)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Real-World Highlights: Live Production Sites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wikipedia Desktop (1280×800):&lt;/strong&gt; Payload shrank from 122.3 KB down to 11.1 KB (&lt;strong&gt;-91.0%&lt;/strong&gt;), and roundtrip triage latency dropped from 11.3s down to 7.2s (&lt;strong&gt;37% faster&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wikipedia Mobile (390×664):&lt;/strong&gt; The raw viewport scored 0% accuracy due to full canvas noise. Cropping to the 370×133 failure bounding box (1.5 KB WebP, &lt;strong&gt;-96.9% payload&lt;/strong&gt;) boosted diagnostic accuracy to &lt;strong&gt;35%&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MDN Web Docs Mobile (390×664):&lt;/strong&gt; Diagnosing a subtle search input contrast defect jumped from 30% accuracy up to &lt;strong&gt;65% accuracy&lt;/strong&gt; (&lt;strong&gt;+35% boost&lt;/strong&gt;) while cutting network payload from 55.1 KB down to 4.7 KB (&lt;strong&gt;-91.5%&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Real Payoff:&lt;/strong&gt; Instead of spending 20 minutes manually reproducing a broken responsive layout and inspecting DevTools styles, ZeroVisual intercepts the failure, hands a token-optimized bundle to the local AI agent, and outputs the exact CSS diff to paste into your pull request.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overall Winner:&lt;/strong&gt; Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady (Rewarding Laziness with Local Open-Source AI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Evaluated and benchmarked ZeroVisual against Google's &lt;code&gt;google/gemma-4-26B-A4B-it&lt;/code&gt; multimodal MoE model running locally via vLLM.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>ZeroCoach: The World's First 100% On-Device AI Athletic Coach</title>
      <dc:creator>Jirawat Boonkumnerd</dc:creator>
      <pubDate>Sun, 18 Oct 2026 14:54:55 +0000</pubDate>
      <link>https://dev.to/ntsd/zerocoach-the-worlds-first-100-on-device-ai-athletic-coach-3ldn</link>
      <guid>https://dev.to/ntsd/zerocoach-the-worlds-first-100-on-device-ai-athletic-coach-3ldn</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;Millions of fitness enthusiasts, runners, and lifters pay &lt;strong&gt;$200 every year&lt;/strong&gt; for personal training subscriptions and commercial coaching apps (Whoop, Future, MyFitnessPal, Fitbod). Yet these commercial services come with three major flaws:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Perpetual Subscription Rent&lt;/strong&gt;: Cancel your subscription, and you lose access to your personalized workout history and coaching insights.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Biometric Privacy Leaks&lt;/strong&gt;: Your most intimate biological markers—heart rate variability (HRV), resting heart rate, sleep architecture, weigh-in history, and photos of every meal you eat—are constantly uploaded and stored on corporate cloud servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Latency &amp;amp; Network Dependency&lt;/strong&gt;: The second you walk into an underground gym basement, run on a mountain trail, or lose cell reception, your AI coach goes dark with infinite loading spinners.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;ZeroCoach&lt;/strong&gt; is the world's first open-source, 100% on-device AI athletic coaching platform. Built with React Native, Expo, and &lt;code&gt;llama.rn&lt;/code&gt;, ZeroCoach runs quantized &lt;strong&gt;Google Gemma 2 2B&lt;/strong&gt; entirely on local device hardware.&lt;/p&gt;

&lt;p&gt;It gives every athlete a world-class training companion with &lt;strong&gt;0 cloud latency, 0 remote API inference fees, and 100% private biometric telemetry&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💬 &lt;strong&gt;Local Conversational Athletic Intelligence&lt;/strong&gt;: Real-time coaching streaming at &lt;strong&gt;~38 tokens/second&lt;/strong&gt; locally on phone silicon, with dual coaching personas (&lt;em&gt;Strict&lt;/em&gt; vs. &lt;em&gt;Comfort&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;🥗 &lt;strong&gt;Multimodal Nutrition &amp;amp; Food Decomposition&lt;/strong&gt;: Instant photo plate decomposition with calorie and macro calculations, plus an expandable 9-micronutrient RDA bio-assay (Vitamins A, C, D, B12, Iron, Calcium, Magnesium, Potassium, Sodium). Also includes USDA Whole Foods database search and live barcode scanning.&lt;/li&gt;
&lt;li&gt;🏋️ &lt;strong&gt;Adaptive Workout Engine&lt;/strong&gt;: 643 science-backed exercises from RepDB with kinetic start/peak animations, personalized volume progression, dynamic movement swapping, and haptic rest countdowns.&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Unified 7-Day Athletic Telemetry&lt;/strong&gt;: Direct local sync with Android Health Connect and Apple HealthKit, computing a holistic 0–100 daily composite performance score balancing CNS recovery (35%), workout volume (35%), and nutrition target accuracy (30%).&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Watch the full 1080p high-production walkthrough demonstrating real on-device Gemma 2 generation, photo food decomposition, and live telemetry on a physical Android device:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Ns-7ikl16K0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Live Website&lt;/strong&gt;: &lt;a href="https://zerocoach.tech" rel="noopener noreferrer"&gt;&lt;strong&gt;zerocoach.tech&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Download Standalone Android APK&lt;/strong&gt;: &lt;a href="https://github.com/ntsd/zerocoach/releases/download/v1.1.0/ZeroCoach-v1.1.0.apk" rel="noopener noreferrer"&gt;&lt;strong&gt;ZeroCoach v1.1.0 APK&lt;/strong&gt;&lt;/a&gt; (&lt;a href="https://github.com/ntsd/zerocoach/releases/tag/v1.1.0" rel="noopener noreferrer"&gt;GitHub Release Page&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;📺 &lt;strong&gt;Direct Video URL&lt;/strong&gt;: &lt;a href="https://youtu.be/Ns-7ikl16K0" rel="noopener noreferrer"&gt;https://youtu.be/Ns-7ikl16K0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;ZeroCoach is completely open source under the &lt;strong&gt;Apache License 2.0&lt;/strong&gt;:&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/ntsd" rel="noopener noreferrer"&gt;
        ntsd
      &lt;/a&gt; / &lt;a href="https://github.com/ntsd/zerocoach" rel="noopener noreferrer"&gt;
        zerocoach
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An open-source, privacy-first AI health coach. Features offline mobile LLM inference, visual nutrition tracking, wearable sync, and adaptive lifestyle.
    &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;ZeroCoach&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://zerocoach.tech" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1e177d42feb181cb3152352e7066e118ee339e7bf977b55cfe68274a44dcc6a7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f576562736974652d7a65726f636f6163682e746563682d3030463046463f7374796c653d666c6174266c6f676f3d617374726f" alt="Website"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ntsd/zerocoach/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8c02e3e2e1fda8da133fdbd28af07de0eec6f64d58aad59d77da702b3f58e204/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6e7473642f7a65726f636f6163683f636f6c6f723d303046304646266c6162656c3d4c617465737425323052656c65617365" alt="GitHub Release"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ntsd/zerocoach/releases/latest/download/ZeroCoach-v1.1.0.apk" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3b4b444326fac569dba893f38e888ac9f1003ea7448289c0e5784a4f995625b8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f776e6c6f61642d416e64726f696425323041504b25323076312e312e302d3030463046463f7374796c653d666c6174266c6f676f3d616e64726f6964" alt="Download APK"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ntsd/zerocoach/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a549a7a30bacba7bfceebdc207a8e86c3f2c02995a2527640dca30048fd2b64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d417061636865253230322e302d626c75652e737667" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ZeroCoach is an open-source, privacy-first mobile fitness and athletic AI coaching application powered entirely by on-device and local AI models. Built with React Native and Expo, it delivers science-backed workout programming, adaptive nutrition targets, and real-time coaching—with zero cloud latency and absolute data privacy.&lt;/p&gt;
&lt;p&gt;Visit the official website at &lt;a href="https://zerocoach.tech" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;zerocoach.tech&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎬 Demo Video&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://youtu.be/Ns-7ikl16K0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/91126a61a34ce97331cfb7bf89a368c82c7ba61b8ddf43876702345b4d72bd25/68747470733a2f2f696d672e796f75747562652e636f6d2f76692f4e732d37696b6c31364b302f6d617872657364656661756c742e6a7067" alt="ZeroCoach Video Demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;▶️ &lt;strong&gt;Watch the Full HD Demo on YouTube&lt;/strong&gt;: &lt;a href="https://youtu.be/Ns-7ikl16K0" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;https://youtu.be/Ns-7ikl16K0&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Featuring on-device Gemma 2 GGUF inference streaming at ~38 tok/s, multimodal food plate vision decomposition &amp;amp; micronutrient analysis, RepDB adaptive workout engine, and unified 7-day athletic telemetry.&lt;/em&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📸 App Preview&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;💬 Coach Chat&lt;/th&gt;
&lt;th&gt;🥗 Nutrition Tracker&lt;/th&gt;
&lt;th&gt;🏋️ Adaptive Workout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ntsd/zerocoach/assets/screenshots/coach_chat.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fntsd%2Fzerocoach%2FHEAD%2Fassets%2Fscreenshots%2Fcoach_chat.png" width="270" alt="Coach Chat"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ntsd/zerocoach/assets/screenshots/nutrition_tracker.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fntsd%2Fzerocoach%2FHEAD%2Fassets%2Fscreenshots%2Fnutrition_tracker.png" width="270" alt="Nutrition Tracker"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ntsd/zerocoach/assets/screenshots/adaptive_workout.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fntsd%2Fzerocoach%2FHEAD%2Fassets%2Fscreenshots%2Fadaptive_workout.png" width="270" alt="Adaptive Workout"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 2 On-Device Coach&lt;/strong&gt;&lt;br&gt;Real-time athletic guidance &amp;amp; dual persona&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Smart Nutrition &amp;amp; Macros&lt;/strong&gt;&lt;br&gt;Gemini Vision, NutriSight &amp;amp; 11 RDAs&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Adaptive Workout Hub&lt;/strong&gt;&lt;br&gt;RepDB 643 exercises &amp;amp; Date Navigation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;br&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;📈 Performance &amp;amp; Trends&lt;/th&gt;
&lt;th&gt;⚙️ On-Device Engine&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ntsd/zerocoach/assets/screenshots/performance_analyze.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fntsd%2Fzerocoach%2FHEAD%2Fassets%2Fscreenshots%2Fperformance_analyze.png" width="270" alt="Performance &amp;amp; Trends"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ntsd/zerocoach/assets/screenshots/model_settings.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fntsd%2Fzerocoach%2FHEAD%2Fassets%2Fscreenshots%2Fmodel_settings.png" width="270" alt="On-Device Engine Settings"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Multi-Domain Analytics&lt;/strong&gt;&lt;br&gt;0–100 composite score &amp;amp; Health Connect&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Hardware Acceleration&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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/ntsd/zerocoach" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The full React Native / Expo mobile application source (&lt;code&gt;/src&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The Astro + Tailwind CSS marketing site (&lt;code&gt;/web&lt;/code&gt;) deployed on Render at &lt;code&gt;zerocoach.tech&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The autonomous machine learning pipeline (&lt;code&gt;/ml&lt;/code&gt;) for LoRA fine-tuning, dataset generation, and vector embeddings.&lt;/li&gt;
&lt;li&gt;Automated hardware test scripts using ADB and Argent (&lt;code&gt;/scripts/demo&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;ZeroCoach is engineered around four sovereign on-device pillars:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. On-Device Gemma 2 Inference via &lt;code&gt;llama.rn&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Rather than relying on expensive, proprietary cloud APIs (like OpenAI or Anthropic) that charge per token and leak user conversations, ZeroCoach embeds &lt;strong&gt;Google Gemma 2 2B Instruct&lt;/strong&gt; quantized to &lt;code&gt;Q4_K_M&lt;/code&gt; (~1.64 GB) running via &lt;code&gt;llama.rn&lt;/code&gt; (React Native C++ bindings for &lt;code&gt;llama.cpp&lt;/code&gt;).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On modern mobile hardware (tested on Snapdragon silicon), Gemma 2 streams responses at &lt;strong&gt;~38 tokens/second&lt;/strong&gt; with &lt;strong&gt;0ms cloud roundtrip latency&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Dual persona coaching prompts are dynamically composed with live wearable biometrics and today's remaining macro budget before generation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Autonomous Fine-Tuning &amp;amp; Vector Retrieval Pipeline (&lt;code&gt;/ml&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;ZeroCoach includes an offline ML pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Synthetic Coaching Dataset&lt;/strong&gt;: 1,075 verified biomechanical coaching pairs (&lt;code&gt;/ml/scripts/generate_dataset.py&lt;/code&gt;) formatted in native Gemma 2 chat tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dense Vector Search&lt;/strong&gt;: Pre-computed 384-dimensional dense vectors (&lt;code&gt;sentence-transformers/all-MiniLM-L6-v2&lt;/code&gt;) across all 643 RepDB movements and USDA items, enabling instantaneous sub-millisecond semantic search and movement swapping offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LoRA Training&lt;/strong&gt;: Parameter-efficient LoRA adapters trained with Apple Silicon MPS (Metal Performance Shaders) acceleration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Multimodal Food Vision &amp;amp; Micronutrient Decomposition
&lt;/h3&gt;

&lt;p&gt;In the Nutrition module, athletes can snap or upload any meal photo. ZeroCoach analyzes the dish, estimates ingredient weights (e.g. 187g Basque burnt cheesecake), decomposes calories and macronutrients (protein, carbs, fat, fiber), and generates a 9-essential micronutrient assay sheet before logging the portion directly to Lunch, Dinner, or Breakfast. For packaged goods, live barcode scanning and NutriSight label parsing provide instant verification.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Unified Health Hub &amp;amp; Telemetry Engine
&lt;/h3&gt;

&lt;p&gt;Using local native bridges to Android Health Connect and Apple HealthKit, ZeroCoach reads resting heart rate, heart rate variability (HRV), and deep sleep architecture with zero third-party cloud aggregators. It translates these into an autoregulated daily readiness score (0–100) that automatically adjusts working set volume and deload suggestions.&lt;/p&gt;




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

&lt;p&gt;Open innovation is not just an ideological choice for ZeroCoach—&lt;strong&gt;it is the core technical architecture that makes the product commercially viable&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;$0 Marginal Inference Cost&lt;/strong&gt;: Closed API services charge ongoing fees for every token sent and received. For an active athlete engaging with their coach multiple times a day, API costs quickly compound. Running open-weight Gemma 2 on device silicon reduces marginal inference cost to &lt;strong&gt;literally $0 forever&lt;/strong&gt;, making a sustainable zero-subscription coaching tool possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Health Data Sovereignty&lt;/strong&gt;: Biometric telemetry is among the most sensitive personal data that exists. Asking users to upload their cardiac trends, sleep cycles, and daily food photos to closed corporate cloud silos is a major privacy barrier. Open-weight models running on-device guarantee that &lt;strong&gt;not a single byte of biometric data ever leaves the user's phone&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience in Real-World Athletic Environments&lt;/strong&gt;: Athletes train in basement gyms, cross-country trails, remote tracks, and while traveling on airplanes. Closed APIs fail completely without internet access. Open-source local models allow athletes to train anywhere on Earth with 100% reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freedom from Vendor Lock-In&lt;/strong&gt;: Closed APIs can deprecate endpoints, change rate limits, or alter subscription pricing overnight. Open-weight models give developers and athletes permanent ownership over their tools.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;I developed and validated ZeroCoach collaboratively using an AI agent workflow that managed local model compilation, on-device ADB testing on a connected Android device, and automated video recording:&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;ZeroCoach: Building the 100% On-Device AI Athletic Coach with Gemma 2 and llama.rn&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 ZeroCoach: an open-source, 100% on-device AI athletic and fitness coach for the DEV Hacktoberfest Week 2 'Side Hustle' challenge. It needs to displace expensive $100-$200/month commercial fitness app subscriptions with zero recurring fees, 100% private biometrics, local Gemma 2 GGUF inference running directly on mobile hardware via llama.rn, multimodal food vision decomposition with micronutrient assays, 643 RepDB movements with adaptive splits, and unified 7-day recovery telemetry.&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;I'm engineering ZeroCoach around four sovereign on-device pillars:&lt;br&gt;
1. &lt;strong&gt;Local LLM Engine&lt;/strong&gt;: We'll embed &lt;code&gt;llama.rn&lt;/code&gt; running quantized Google Gemma 2 2B GGUF with GPU/NPU acceleration. Zero cloud latency and absolute privacy.&lt;br&gt;
2. &lt;strong&gt;Multimodal Food Vision &amp;amp; RDA Assay&lt;/strong&gt;: Dual-mode camera scanner using Gemini Vision plate decomposition and Open Food Facts NutriSight LayoutLMv3 table extraction to track calories, macros, and 11 essential micronutrients (Vitamins A, C, D, B12, Iron, Calcium, Magnesium, Potassium, Sodium, Zinc).&lt;br&gt;
3. &lt;strong&gt;Adaptive Workout Splits&lt;/strong&gt;: RepDB database with 643 science-backed exercises, kinetic start/peak animations, customizable movement swaps, and progressive overload calculations.&lt;br&gt;
4. &lt;strong&gt;Unified Athletic Telemetry&lt;/strong&gt;: Direct bridge to Android Health Connect and Apple HealthKit computing a 0–100 composite performance score from CNS readiness (HRV, RHR, deep sleep), workout volume, and macro compliance. Let's begin the implementation.&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;div class="agent-session-tool-detail"&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;npm i llama.rn zustand react-native-health-connect react-native-health react-native-svg&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Let's deploy the standalone APK to the connected physical device (Xiaomi 25010PN30G) via ADB, test on-device Gemma 2 streaming token speed, verify the food photo plate decomposition review sheet, and record the high-production demo video.&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;Executing automated hardware validation on the connected device. Verifying local Gemma 2 token streaming and multimodal nutrition logging.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runcommand"&gt;run_command&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&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;Device connected: Xiaomi 25010PN30G (e177a07b). Gemma 2 2B GGUF loaded into RAM. Benchmark: ~38 tokens/sec local streaming. Food photo decomposed: 187g Basque burnt cheesecake (204 kcal, 18.5g protein, 15.3g carbs, 6.7g fat, 9 micronutrients logged to Lunch). Full HD pitch demo video composite rendered to scripts/demo/zerocoach_pitch_demo.mp4 (110.89s).&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;The hardware verification and demo video generation completed with 100% fidelity. ZeroCoach is fully operational with zero cloud latency and complete sovereign privacy.&lt;/p&gt;

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

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


&lt;p&gt;You can explore the full interactive transcript of this agent session at:&lt;br&gt;
&lt;a href="https://dev.to/agent_sessions/zerocoach-building-the-100-on-device-ai-athletic-coach-with-gemma-2-and-llamarn-t23on9"&gt;https://dev.to/agent_sessions/zerocoach-building-the-100-on-device-ai-athletic-coach-with-gemma-2-and-llamarn-t23on9&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;The first user was &lt;strong&gt;myself&lt;/strong&gt;—I've never paid for fitness apps and built ZeroCoach for my own daily training (syncing my wearable, tracking nutrition, and generating workout plans on-device).&lt;/p&gt;

&lt;p&gt;Since then, the journey has expanded rapidly: &lt;strong&gt;ZeroCoach is now officially deployed to both the Google Play Store and the Apple App Store!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I’ve shared the milestone across social channels and communities to recruit our first cohort of closed testers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://lnkd.in/p/gQPE7qmG" rel="noopener noreferrer"&gt;My LinkedIn post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lnkd.in/p/gubMErxC" rel="noopener noreferrer"&gt;My friend helping amplify the launch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/jo.ntsd/posts/pfbid0bUBawdLAu2dKfZbJC3ejrK9jTxfZz5Ngp7A8cXJomEjz7EgMwa4wVG8hqh4WEudgl" rel="noopener noreferrer"&gt;Facebook community share&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We've already seen exciting interest from people both &lt;strong&gt;online&lt;/strong&gt; (developers and fitness tech enthusiasts asking to join the closed test) and &lt;strong&gt;offline&lt;/strong&gt; (friends, gym buddies, and colleagues wanting an athletic tracker that respects their privacy without recurring subscription fees). Gathering real-world feedback from these initial testers is helping refine on-device inference speed, UI edge cases, and personalized workout volume.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  🌟 Featured Category: Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;ZeroCoach is built from the ground up around &lt;strong&gt;Google Gemma 2&lt;/strong&gt;. We use &lt;code&gt;gemma-2-2b-it-Q4_K_M.gguf&lt;/code&gt; running locally on mobile hardware via &lt;code&gt;llama.rn&lt;/code&gt;. The model acts as the sovereign on-device coaching brain, analyzing real-time recovery telemetry, formulating nutrition suggestions, and adjusting workout splits at ~38 tokens/second with zero cloud latency.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Partner Category: Best Use of a .tech Domain
&lt;/h3&gt;

&lt;p&gt;The official marketing website, interactive app showcase, feature documentation, and pre-computed ML model artifacts are live and hosted on our custom domain:&lt;br&gt;
&lt;a href="https://zerocoach.tech" rel="noopener noreferrer"&gt;&lt;strong&gt;https://zerocoach.tech&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with passion for Hacktoberfest 2026. Zero Subscriptions. Absolute Privacy. 100% On-Device AI.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Chadodoro: The Stoic GigaChad Pomodoro Coach That Forces You to Touch Physical Grass</title>
      <dc:creator>Jirawat Boonkumnerd</dc:creator>
      <pubDate>Sun, 11 Oct 2026 21:41:30 +0000</pubDate>
      <link>https://dev.to/ntsd/chadodoro-the-stoic-gigachad-pomodoro-coach-that-forces-you-to-touch-physical-grass-c4n</link>
      <guid>https://dev.to/ntsd/chadodoro-the-stoic-gigachad-pomodoro-coach-that-forces-you-to-touch-physical-grass-c4n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;Modern developers face an epidemic of infinite screen-lock: sitting motionless in dark rooms, doom-scrolling Reddit and Twitter during "breaks," and accumulating chronic desk fatigue. We tell ourselves we are resting, but our eyes remain glued to 120Hz glass panels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chadodoro&lt;/strong&gt; (&lt;code&gt;pomodoro-chad&lt;/code&gt;) was built to break this cycle. It is an unapologetic, athletic productivity coach inspired by the stoic GigaChad ethos, engineered around a single physical mandate: &lt;strong&gt;when your work interval ends, you step away from the monitors and touch physical grass.&lt;/strong&gt;&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Circular Countdown Progress Ring:&lt;/strong&gt; Athletic SVG countdown ring displaying &lt;code&gt;MM:SS&lt;/code&gt; with animated stroke dashoffset, instant phase indicators, and reactive glow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three Reactive Reactive Avatars:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Focus Mode (Lock In):&lt;/strong&gt; Cyberpunk deep-work GigaChad with neon emerald laser eyes, HUD reticle targeting lines, and unbroken focus aura.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short Break (Hydrate &amp;amp; Rest):&lt;/strong&gt; Warm acoustic lounge GigaChad taking a mindful breath, holding a steaming ceramic Chad crown mug in golden ambient light.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long Break (Touch Grass):&lt;/strong&gt; Outdoor sunny meadow GigaChad wearing aviator sunglasses, gently caressing lush green grass stalks under natural sunlight.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice Coach Pre-Synthesized by ElevenLabs:&lt;/strong&gt; 16 high-impact coaching lines across &lt;code&gt;START_FOCUS&lt;/code&gt;, &lt;code&gt;SHORT_BREAK&lt;/code&gt;, &lt;code&gt;LONG_BREAK&lt;/code&gt;, and &lt;code&gt;CHAD_MOTIVATION&lt;/code&gt;, delivered in a commanding baritone voice and replayable on-demand via the soundboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"I Touched Grass" Physical Tracker:&lt;/strong&gt; Tactile soundboard button that increments your real-world grass counter, triggers floating clover and grass confetti, and plays audio feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Anthem BGM Engine (YouTube + Git Vault):&lt;/strong&gt; Curated library of 27 viral phonk and motivation tracks (including &lt;em&gt;REVENGE&lt;/em&gt;, &lt;em&gt;MONTAGEM PEGADORA&lt;/em&gt;, &lt;em&gt;GigaChad Theme Phonk House&lt;/em&gt;, &lt;em&gt;MOTIVATION FUNK&lt;/em&gt;, &lt;em&gt;METAMORPHOSIS&lt;/em&gt;, &lt;em&gt;DIA DELÍCIA&lt;/em&gt;, &lt;em&gt;AURA&lt;/em&gt;) with precise start timestamps. Choose between 30s phase-change bursts or continuous play, and switch between Vault Audio Only, YouTube Only, or Hybrid mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Song Attribution &amp;amp; Direct Links:&lt;/strong&gt; Real-time track display with direct links to original artists on YouTube.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Chadodoro Code:&lt;/strong&gt; Three non-negotiable principles displayed on the dashboard:

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;01 Unbroken Focus:&lt;/em&gt; Single-task deep work with zero tab switching.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;02 Radical Screen Break:&lt;/em&gt; Hands off the keyboard and eyes away from screens.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;03 Touch Physical Grass:&lt;/em&gt; Reconnecting with sunlight, earth, and fresh air.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Live Interactive Web App:&lt;/strong&gt; &lt;a href="https://chadodoro.ntsd.dev/" rel="noopener noreferrer"&gt;https://chadodoro.ntsd.dev/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Zero Setup / Zero Latency:&lt;/strong&gt; Instant load directly in any modern browser, fully functional on mobile and desktop.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────┐
│  👑 CHADODORO — LOCK IN &amp;amp; TOUCH GRASS                  │
│                                                        │
│  [ AVATAR: GigaChad Laser Eyes / Meadow Aviators ]     │
│                                                        │
│                     ( 25:00 )                          │
│            [ START ]  [ RESET ]  [ SKIP ]              │
│                                                        │
│  CHADODORO COACH: "Lock in, King. Disconnect the noise"│
│  NOW PLAYING: 🎵 GigaChad Theme (Phonk House Version)  │
│                                                        │
│  🌱 Real Grass Touched: [ 42 ] [ + TOUCH GRASS ]       │
└────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

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

&lt;ul&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/ntsd/pomodoro-chad" rel="noopener noreferrer"&gt;https://github.com/ntsd/pomodoro-chad&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;1-Click Deploy Blueprint:&lt;/strong&gt; Includes native &lt;code&gt;render.yaml&lt;/code&gt; for instant deployment on Render.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  Architecture: Zero-Latency Static Git Voice Vault
&lt;/h3&gt;

&lt;p&gt;Traditional AI web applications make expensive, high-latency API calls to LLMs and speech synthesis services on every user interaction. This introduces loading spinners, billing unpredictable costs, and network vulnerabilities.&lt;/p&gt;

&lt;p&gt;Chadodoro completely decouples AI synthesis from user runtime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  ┌────────────────────────────────────────────────────────┐
                  │                 BUILD / PIPELINE TIME                  │
                  └────────────────────────────────────────────────────────┘
                                              │
                      ┌───────────────────────┴───────────────────────┐
                      ▼                                               ▼
         [Open-Source AI Brain]                              [Voice Synthesis]
      google/gemma-4-26B-A4B-it                             ElevenLabs API
    (spark.ntsd.dev:8001/v1)                               (Adam - Deep Baritone)
                      │                                               │
                      └───────────────────────┬───────────────────────┘
                                              │
                                              ▼
                                 [scripts/generate_vault.py]
                                              │
                                              ▼
                            ┌──────────────────────────────────────────────┐
                            │           PUBLIC GIT VOICE VAULT             │
                            │  public/vault/manifest.json                  │
                            │  public/vault/scripts/&amp;lt;id&amp;gt;/&amp;lt;id&amp;gt;.{json,mp3}   │
                            │  public/vault/themes/&amp;lt;id&amp;gt;/&amp;lt;id&amp;gt;.{json,mp3}    │
                            └──────────────────────────────────────────────┘
                                              │
                     ═════════════════════════╪═══════════════════════════
                                              │ (Committed to Git)
                  ┌───────────────────────────┴────────────────────────────┐
                  │                     RUNTIME (RENDER)                   │
                  │   - 100% Static HTML / CSS / JS (Astro)                │
                  │   - 0ms API Latency                                    │
                  │   - Zero Runtime Secrets / Zero API Costs              │
                  │   - Edge Cached Audio Assets (/vault/*)                │
                  │   - Native Web Speech API Fallback                     │
                  └────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source AI Core:&lt;/strong&gt; Coaching lines are generated at pipeline time by &lt;code&gt;google/gemma-4-26B-A4B-it&lt;/code&gt; hosted on an open-weight inference node (&lt;code&gt;https://spark.ntsd.dev:8001/v1&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs Audio Synthesis:&lt;/strong&gt; The generated transcripts are synthesized into punchy, resonant baritone speech using ElevenLabs API (voices Adam, Harry, Brian).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Committed into Git:&lt;/strong&gt; Both the transcript metadata (&lt;code&gt;.json&lt;/code&gt;) and compressed audio (&lt;code&gt;.mp3&lt;/code&gt;) are committed directly to &lt;code&gt;public/vault/&lt;/code&gt; alongside &lt;code&gt;manifest.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static Astro Delivery:&lt;/strong&gt; Built with Astro and pure vanilla CSS/JS. Assets are pre-rendered into &lt;code&gt;dist/&lt;/code&gt; and served with zero server-side compute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge Caching on Render:&lt;/strong&gt; Deployed as a static site on Render with custom immutable cache headers (&lt;code&gt;Cache-Control: public, max-age=31536000, immutable&lt;/code&gt;) for instant audio streaming.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero Runtime API Dependency &amp;amp; Cost Freedom:&lt;/strong&gt; By combining an open-weight model (&lt;code&gt;google/gemma-4-26B-A4B-it&lt;/code&gt;) with a Git-based artifact vault, the application runs forever with &lt;strong&gt;0 API bills&lt;/strong&gt; and &lt;strong&gt;0 runtime keys exposed&lt;/strong&gt;. Anyone can fork the repository and host it without an API key or credit card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Privacy &amp;amp; Self-Sovereignty:&lt;/strong&gt; All timer data, grass counter metrics, and audio preferences live in browser &lt;code&gt;localStorage&lt;/code&gt;. No user tracking, no backend database, and no telemetry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility &amp;amp; Customization:&lt;/strong&gt; Developers can run &lt;code&gt;scripts/generate_vault.py&lt;/code&gt; with their own local or self-hosted LLM endpoints (Ollama, vLLM, sparkrun) to generate new personas, voice scripts, and motivational quotes.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;All coach transcripts and stoic motivational lines were generated by running &lt;strong&gt;Gemma&lt;/strong&gt; (&lt;code&gt;google/gemma-4-26B-A4B-it&lt;/code&gt;) through an automated pipeline workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stoic Persona Prompting:&lt;/strong&gt; Gemma was prompted with strict character constraints: uncompromising discipline, high-impact brevity, tough-love accountability, and mandatory real-world outdoors/grass reminders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Content Generation:&lt;/strong&gt; Gemma parsed phase contexts (&lt;code&gt;START_FOCUS&lt;/code&gt;, &lt;code&gt;SHORT_BREAK&lt;/code&gt;, &lt;code&gt;LONG_BREAK&lt;/code&gt;, &lt;code&gt;CHAD_MOTIVATION&lt;/code&gt;) to produce structured transcript metadata and text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Pipeline Integration:&lt;/strong&gt; The Gemma outputs were automatically fed into &lt;code&gt;scripts/generate_vault.py&lt;/code&gt; to synthesize audio clips, validate duration thresholds, and compile &lt;code&gt;manifest.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  🎙️ Best Use of ElevenLabs
&lt;/h3&gt;

&lt;p&gt;Chadodoro utilizes ElevenLabs' speech synthesis to give the GigaChad coach an authoritative, ultra-realistic baritone voice. 16 distinct audio assets across 4 timer phases were synthesized using ElevenLabs voices (Adam, Harry, Brian) and baked into the Git Voice Vault. The app triggers these clips on phase transitions and features an instant replay soundboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Best Use of Render
&lt;/h3&gt;

&lt;p&gt;The application is deployed on Render via a declarative &lt;a&gt;&lt;code&gt;render.yaml&lt;/code&gt;&lt;/a&gt; blueprint. Render builds the Astro static bundle and serves both the single-page application and static audio assets with custom HTTP Cache-Control headers (&lt;code&gt;public, max-age=31536000, immutable&lt;/code&gt;), ensuring sub-millisecond edge response times worldwide.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Motivational scripts and Stoic Touch Grass reminders were generated using the open-weight &lt;code&gt;google/gemma-4-26B-A4B-it&lt;/code&gt; model running on an OpenAI-compatible self-hosted inference cluster, demonstrating how open-weight LLMs can drive automated creative production pipelines.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;“Discipline equals freedom, King. Step outside and touch physical grass.”&lt;/em&gt; 👑🌱&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>elevenlabs</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Zero Market Radar: A Stock-News Dashboard and Voice Alerts for a Friend</title>
      <dc:creator>Jirawat Boonkumnerd</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:33:30 +0000</pubDate>
      <link>https://dev.to/ntsd/building-a-sub-second-stock-news-alert-bot-for-a-friend-with-typesafe-ai-elevenlabs-and-render-21hk</link>
      <guid>https://dev.to/ntsd/building-a-sub-second-stock-news-alert-bot-for-a-friend-with-typesafe-ai-elevenlabs-and-render-21hk</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;My friend Alex follows a small stock watchlist, but financial news makes even a small watchlist feel like a full-time job. Earnings announcements sit beside speculative listicles. Yesterday's recap looks as urgent as today's material business update. More articles do not necessarily mean more useful information.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Zero Market Radar&lt;/strong&gt; to answer a narrower question: &lt;strong&gt;what happened to the companies Alex follows, and which headlines deserve his attention?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It combines a browsable news dashboard with optional Telegram notifications and short spoken alerts. TypeSafe AI's Jev evaluates an article's directional sentiment and materiality; ordinary TypeScript decides how to store, rank, display, and deliver that result. It is a news-triage tool, not an automated trading system or a promise of investment returns.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://zeromarketradar.com" rel="noopener noreferrer"&gt;zeromarketradar.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;MIT-licensed source:&lt;/strong&gt; &lt;a href="https://github.com/ntsd/zero-market-radar" rel="noopener noreferrer"&gt;ntsd/zero-market-radar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The current default watchlist is &lt;strong&gt;AAPL, MSFT, NVDA, GOOGL, AMZN, META, TSLA, AMD, TSM, and BABA&lt;/strong&gt;. I reduced the original broader list to keep the product focused and removed the China/HK preset; BABA remains an individually selectable ticker.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  A dashboard for browsing, not another notification feed
&lt;/h3&gt;

&lt;p&gt;Open the &lt;a href="https://zeromarketradar.com" rel="noopener noreferrer"&gt;public dashboard&lt;/a&gt; and:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select individual tickers or the &lt;strong&gt;Mega Tech&lt;/strong&gt; and &lt;strong&gt;Semis&lt;/strong&gt; presets. Choices persist in the browser.&lt;/li&gt;
&lt;li&gt;Browse the top four impact-ranked headlines for your selected companies.&lt;/li&gt;
&lt;li&gt;Switch between &lt;strong&gt;24H&lt;/strong&gt;, &lt;strong&gt;3D&lt;/strong&gt;, &lt;strong&gt;7D&lt;/strong&gt;, or a custom date range within the recent seven-day window.&lt;/li&gt;
&lt;li&gt;Filter the feed by breaking signals, notable catalysts, bullish sentiment, or bearish sentiment; sort by impact, date, or confidence.&lt;/li&gt;
&lt;li&gt;Click a ticker badge to open its dedicated quote, price chart, and paginated news view.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The symbol chart offers &lt;strong&gt;24-hour and seven-day views&lt;/strong&gt; using real Yahoo price candles. Breaking and catalyst articles appear as chart dots; selecting a dot jumps to the corresponding article. The dots show news timing alongside prices—not proof that an article caused a price movement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Voice where it is useful
&lt;/h3&gt;

&lt;p&gt;For Alex's commute, &lt;strong&gt;breaking-critical articles&lt;/strong&gt; can become ElevenLabs voice dispatches, delivered through Telegram or played from the dashboard. Notable catalysts use text notifications rather than voice. Routine commentary stays available to browse without automatically becoming a spoken alert.&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%2Fridl9b24m1vujwuxq9t1.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%2Fridl9b24m1vujwuxq9t1.png" alt="Telegram text and voice alert example" width="800" height="876"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Telegram is optional. Finnhub and TypeSafe API keys are the two required keys for dashboard-only operation; MongoDB, ElevenLabs, Telegram, and Sentry add persistence, speech, notifications, and tracing. The repository includes an &lt;a href="https://github.com/ntsd/zero-market-radar/blob/main/API_KEYS.md" rel="noopener noreferrer"&gt;API key setup guide&lt;/a&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Two typed AI judgments, one request
&lt;/h3&gt;

&lt;p&gt;I did not need a model to write an investment essay. I needed two structured judgments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment:&lt;/strong&gt; bullish or bearish, with confidence and choice probabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority:&lt;/strong&gt; breaking-critical, notable catalyst, or routine noise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://github.com/ntsd/zero-market-radar/blob/main/src/services/jev.ts" rel="noopener noreferrer"&gt;Jev service&lt;/a&gt; sends the ticker, headline, summary, source, and publication time through a single &lt;code&gt;systemOne&lt;/code&gt; request containing both choice questions. It validates the returned answer types before persisting a prediction.&lt;/p&gt;

&lt;p&gt;Impact ranking uses this explicit weighting of the priority probabilities:&lt;/p&gt;

&lt;p&gt;$$&lt;br&gt;
\text{urgencyScore} = P(\text{breaking critical}) + 0.5\,P(\text{notable catalyst})&lt;br&gt;
$$&lt;/p&gt;

&lt;p&gt;This is a ranking heuristic, not a calibrated probability of a future price move. The service retains the source headline and link so Alex can read the underlying report instead of relying on a generated explanation.&lt;/p&gt;

&lt;p&gt;Jev is a hosted System 1 decision-model API. Fast inference is useful, but &lt;strong&gt;I am not claiming sub-second end-to-end alerts&lt;/strong&gt;: provider publication delays, round-robin polling, retries, and optional speech generation all contribute to delivery time.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Persistence without fake historical predictions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MongoDB Atlas&lt;/strong&gt; stores article evaluations, per-symbol sync ranges, quotes, price candles, and generated audio. Verified predictions carry &lt;code&gt;evaluatedBy: 'jev'&lt;/code&gt;; a redeploy warms the in-memory deduplicator from those verified records for the active watchlist.&lt;/p&gt;

&lt;p&gt;The news history setting defaults to &lt;strong&gt;seven days&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HISTORY_SYNC_DAYS=1..7&lt;/code&gt; bounds historical fetching and downtime catch-up.&lt;/li&gt;
&lt;li&gt;On a symbol's first turn after startup, stored unverified articles inside that window are evaluated through the same Jev path, silently.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HISTORY_SYNC_DAYS=0&lt;/code&gt; skips historical reevaluation and fetches today's live news only.&lt;/li&gt;
&lt;li&gt;Failed evaluation or storage does not advance the successful sync checkpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Older archive records are preserved, not silently relabeled as genuine model decisions. Historical processing is notification-silent; articles older than 24 hours also avoid Telegram pushes.&lt;/p&gt;

&lt;p&gt;This reduces repeated work, but it is &lt;strong&gt;not an exactly-once notification guarantee&lt;/strong&gt;. Coordinating multiple workers and atomically recording delivery are separate problems.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Cache per ticker; filter in the browser
&lt;/h3&gt;

&lt;p&gt;The most useful dashboard optimization was changing what the browser asks for.&lt;/p&gt;

&lt;p&gt;Instead of a Mongo query for every date change or pagination click, &lt;code&gt;/api/home-news?symbol=AAPL&lt;/code&gt; returns a complete bounded news snapshot for one watched symbol, without cached audio data. The server shares snapshots for &lt;strong&gt;30 seconds&lt;/strong&gt;, coalesces concurrent loads, and serves previous results during refresh. Failed refreshes preserve successful cached data and retry after five seconds.&lt;/p&gt;

&lt;p&gt;The browser shares each ticker's snapshot between the spotlight and feed. &lt;strong&gt;Date, signal, sort, and page controls operate locally.&lt;/strong&gt; Periodic refreshes revalidate the snapshots; a newly selected ticker or new UTC day loads the appropriate data.&lt;/p&gt;

&lt;p&gt;An isolated browser check confirmed that switching &lt;strong&gt;24H → 7D → next page generated zero API requests&lt;/strong&gt;. That verifies the filtering behavior, not production network latency.&lt;/p&gt;

&lt;p&gt;Equity summaries are aggregated inside MongoDB rather than transferring the historical article collection to Node.js. Audio is fetched separately for playback, and quote reads are scoped to the relevant symbols.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Speech is a delivery feature, not a second analyst
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/ntsd/zero-market-radar/blob/main/src/services/elevenlabs.ts" rel="noopener noreferrer"&gt;ElevenLabs integration&lt;/a&gt; uses &lt;code&gt;eleven_turbo_v2_5&lt;/code&gt; to read a deterministic script containing the ticker, original headline, directional label, and confidence. It does not invent extra market commentary.&lt;/p&gt;

&lt;p&gt;Generated audio is cached in MongoDB. Replay reuses the cached clip, and the audio endpoint enforces breaking-critical eligibility even if an older non-breaking article happens to have cached audio.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Deployment details that mattered
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Render&lt;/strong&gt; hosts the Node.js service and dashboard behind the custom domain. The &lt;a href="https://github.com/ntsd/zero-market-radar/blob/main/render.yaml" rel="noopener noreferrer"&gt;Blueprint&lt;/a&gt; defines the build, start command, environment, and &lt;code&gt;/health&lt;/code&gt; check.&lt;/p&gt;

&lt;p&gt;Operational safeguards include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;shared Finnhub request limiter&lt;/strong&gt;: at most 50 request starts per minute, at least 1.2 seconds apart, with a cooldown after HTTP 429. Quote and news calls use the same limiter.&lt;/li&gt;
&lt;li&gt;A sequential scheduler that waits two seconds &lt;strong&gt;after a symbol's work finishes&lt;/strong&gt;, rather than overlapping slow backfills.&lt;/li&gt;
&lt;li&gt;A 10,000-entry, 48-hour TTL deduplication cache.&lt;/li&gt;
&lt;li&gt;Fail-fast startup when a configured Mongo connection cannot initialize, rather than silently serving an empty in-memory dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry custom spans and exception capture&lt;/strong&gt; around inference, provider calls, storage, and audio. This implementation does not claim automatic token or cost reporting.&lt;/li&gt;
&lt;li&gt;Graceful shutdown when Render sends &lt;code&gt;SIGTERM&lt;/code&gt; during instance replacement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A free Render web service can sleep after 15 minutes without inbound traffic. Outbound polling does not prevent that, so continuous unattended alerts need an always-on deployment. In-memory response caches also reset when the process restarts; Mongo history does not.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Learned—and What Still Needs Work
&lt;/h2&gt;

&lt;p&gt;The latest local build passes &lt;strong&gt;95 tests&lt;/strong&gt;, including retry/checkpoint behavior, historical notification suppression, cached audio eligibility, pagination, UTC date boundaries, and browser-side cache filtering.&lt;/p&gt;

&lt;p&gt;Two data-model limitations are worth being explicit about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A successful sync range does not prove Finnhub returned every article in that range. Broad provider requests can miss items; per-day historical reconciliation is a future improvement.&lt;/li&gt;
&lt;li&gt;Predictions currently use a global article ID and one stored symbol. A story appearing under multiple tickers needs better association handling; counts should not be presented as exhaustive company-news coverage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lesson was to make a small, honest tool for Alex—not to describe a weekend prototype as an institutional trading terminal. The most valuable improvements were quieter alerts, readable source links, reliable state, and controls that do not keep hitting the database.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Open Innovation Matters
&lt;/h2&gt;

&lt;p&gt;The application code is &lt;strong&gt;MIT-licensed&lt;/strong&gt;, with TypeScript, native Node.js HTTP, reproducible configuration, and visible decision rules. Alex can inspect the filters, change the watchlist, self-host the service, or modify the delivery channels instead of depending on an opaque news app.&lt;/p&gt;

&lt;p&gt;There is an important boundary: &lt;strong&gt;this implementation calls hosted Jev, Finnhub, Yahoo, and ElevenLabs services; it does not run an open-weight AI model locally or work fully offline.&lt;/strong&gt; Open application code is not the same as open model weights. That distinction matters when evaluating the challenge's open-source-AI requirement, and I do not want to imply a model integration the project does not have.&lt;/p&gt;
&lt;h2&gt;
  
  
  Community Wisdom
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🌐 &lt;a href="https://dev.to/137foundry/idempotency-in-data-pipelines-how-to-prevent-duplicate-records-1ek2"&gt;Idempotency in Data Pipelines: How to Prevent Duplicate Records&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://dev.to/137foundry"&gt;137Foundry&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;programming&lt;/code&gt;, &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;productivity&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Stable record identities, upserts, and explicit checkpoints make overlapping retries safer. That supports the storage design here, without turning it into an exactly-once delivery claim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/137foundry/idempotency-in-data-pipelines-how-to-prevent-duplicate-records-1ek2"&gt;Read Full Discussion&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;The original scaffolding session is embedded below. It records the early build; the implementation has since evolved, including the reduced watchlist and caching changes described above.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Gemini CLI"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building stock-news-alert with TypeSafe AI Jev, Finnhub, and Render&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 a production-ready Node.js backend service called "stock-news-alert" in TypeScript. It polls Finnhub company-news, deduplicates articles, classifies sentiment via TypeSafe AI Jev (System 1 Decision Model) into binary 0/1 with confidence, and sends Telegram alerts. Deploy to Render for the Hacktoberfest Weekend Challenge: Build for a Friend.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I will critique the setup as a Principal Engineer, address rate-limit distribution across N symbols without drift, implement a dual-eviction LRU cache to prevent memory leaks, solve the cold-start alert storm, and build a turnkey Render Blueprint deployment with native health checks.&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;The solution uses a drift-compensated self-scheduling tick at 1200ms (~50 req/min), an LRU cache with 48h TTL, strict HTML escaping for Telegram, TypeSafe Jev Choice primitive inference, and a render.yaml blueprint with /health monitoring. All 5 unit tests pass and live API calls succeeded.&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;
        3 of 3 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Partner Integrations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Render:&lt;/strong&gt; deployed Node.js backend, web dashboard, custom domain, Blueprint, and health endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs:&lt;/strong&gt; breaking-news narration, optional Telegram voice delivery, and cached browser playback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas:&lt;/strong&gt; durable evaluations, sync coverage, quotes, candles, and audio storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry:&lt;/strong&gt; custom performance spans and exception capture; a trace screenshot would strengthen evidence for the Agent Tracing category.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;AI assistance disclosure: AI tools helped develop the project and revise this write-up. The implementation and limitations above are grounded in the current source and local checks.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>render</category>
    </item>
    <item>
      <title>Auto Request Changes review when the job failed using Github Action</title>
      <dc:creator>Jirawat Boonkumnerd</dc:creator>
      <pubDate>Sun, 21 Nov 2021 17:19:00 +0000</pubDate>
      <link>https://dev.to/ntsd/auto-request-changes-review-when-the-job-failed-using-github-action-41cc</link>
      <guid>https://dev.to/ntsd/auto-request-changes-review-when-the-job-failed-using-github-action-41cc</guid>
      <description>&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;The Github Action is forked from &lt;a href="https://github.com/hmarr/auto-approve-action" rel="noopener noreferrer"&gt;hmarr/auto-approve-action&lt;/a&gt;. The action will automatically create a &lt;code&gt;Request Changes&lt;/code&gt; pull request review. A use case is to create a request changes review when a workflow job failed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthy53zlz4uvhuqljg3k2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthy53zlz4uvhuqljg3k2.png" alt="auto-request-changes-action" width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The action support 3 input parameters. You can use with &lt;a href="https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#jobsjob_idstepswith" rel="noopener noreferrer"&gt;jobs..steps[*].with&lt;/a&gt; to add the input parameters.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;github-token&lt;/code&gt;: The Github token. By default, it will using &lt;code&gt;${{ github.token }}&lt;/code&gt; to use the repo token.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;comment-body&lt;/code&gt;: The comment body to create a request changes review. The &lt;code&gt;comment-body&lt;/code&gt; also support markdown text by Github. The default is &lt;code&gt;Some actions are not successful, please fix it&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;pull-request-number&lt;/code&gt;: (optional) The ID of a pull request to auto-request-changes. By default, this action tries to use the pull_request event payload.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example use
&lt;/h3&gt;

&lt;p&gt;you can use with &lt;code&gt;if&lt;/code&gt; to avoid no pull request event and run only when the job failed. &lt;/p&gt;

&lt;p&gt;*for more &lt;a href="https://docs.github.com/en/actions/learn-github-actions/contexts" rel="noopener noreferrer"&gt;Github Action Context&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Auto request changes
on: pull_request_target

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: ntsd/auto-request-changes-action@v2
        if: ${{ github.event.pull_request &amp;amp;&amp;amp; failure() }}
        with:
          comment-body: "The job ran failed please fix it."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also use it with &lt;code&gt;auto-approve-action&lt;/code&gt; to make it auto approve when the job success.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Auto request changes
on: pull_request_target

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: ntsd/auto-request-changes-action@v2
        if: ${{ github.event.pull_request &amp;amp;&amp;amp; failure() }}
        with:
          comment-body: "The job ran failed please fix it."
      - uses: hmarr/auto-approve-action@v2
        if: ${{ github.event.pull_request &amp;amp;&amp;amp; success() }}
        with:
          github-token: "${{ secrets.GITHUB_TOKEN }}"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Maintainer Must-Haves&lt;/p&gt;
&lt;h3&gt;
  
  
  Yaml File or Link to Code
&lt;/h3&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/ntsd" rel="noopener noreferrer"&gt;
        ntsd
      &lt;/a&gt; / &lt;a href="https://github.com/ntsd/auto-request-changes-action" rel="noopener noreferrer"&gt;
        auto-request-changes-action
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      👍 GitHub Action for automatically request changes GitHub pull requests
    &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;Auto Request Changes GitHub Action&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;This action is a fork from &lt;a href="https://github.com/hmarr/auto-approve-action" rel="noopener noreferrer"&gt;hmarr/auto-approve-action&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;ntsd/auto-request-changes-action&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Automatically request changes GitHub pull requests. The &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; secret will default provided as the &lt;code&gt;github-token&lt;/code&gt; input for the action to work. otherwise you can add a token to &lt;code&gt;github-token&lt;/code&gt; input.&lt;/p&gt;

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

&lt;p&gt;Because sometimes you want to automate create request changes review. for example, create a request changes review when a lint or testing workflow is failed.&lt;/p&gt;

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

&lt;p&gt;Create a workflow file (e.g. &lt;code&gt;.github/workflows/auto-request-changes.yml&lt;/code&gt;) that contains a step that &lt;code&gt;uses: ntsd/auto-request-changes-action@v3&lt;/code&gt;. Here's an example workflow file:&lt;/p&gt;

&lt;p&gt;for all github action contexts check &lt;a href="https://docs.github.com/en/actions/learn-github-actions/contexts" rel="noopener noreferrer"&gt;https://docs.github.com/en/actions/learn-github-actions/contexts&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;name&lt;/span&gt;: &lt;span class="pl-s"&gt;Auto request changes&lt;/span&gt;
&lt;span class="pl-ent"&gt;on&lt;/span&gt;: &lt;span class="pl-s"&gt;pull_request_target&lt;/span&gt;

&lt;span class="pl-ent"&gt;jobs&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;build&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;runs-on&lt;/span&gt;: &lt;span class="pl-s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="pl-ent"&gt;permissions&lt;/span&gt;:
      &lt;span class="pl-ent"&gt;pull-requests&lt;/span&gt;: &lt;span class="pl-s"&gt;write&lt;/span&gt;
    &lt;span class="pl-ent"&gt;steps&lt;/span&gt;:
      - &lt;span class="pl-ent"&gt;uses&lt;/span&gt;: &lt;span class="pl-s"&gt;ntsd/auto-request-changes-action@v3&lt;/span&gt;
        &lt;span class="pl-ent"&gt;with&lt;/span&gt;:
          &lt;span class="pl-ent"&gt;github-token&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;${{ secrets.GITHUB_TOKEN }}&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
          &lt;span class="pl-ent"&gt;review-message&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;custom review message body&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Combine with an &lt;code&gt;if&lt;/code&gt; can only auto-request-changes with…&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/ntsd/auto-request-changes-action" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/ntsd/auto-request-changes-action" rel="noopener noreferrer"&gt;Auto Request Changes Action Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/marketplace/actions/auto-request-changes" rel="noopener noreferrer"&gt;Auto Request Changes Action Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hmarr/auto-approve-action" rel="noopener noreferrer"&gt;Auto Approve Action Repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/actions/learn-github-actions/contexts" rel="noopener noreferrer"&gt;Github Action Context&lt;/a&gt;&lt;/p&gt;

</description>
      <category>actionshackathon21</category>
      <category>github</category>
      <category>opensource</category>
      <category>action</category>
    </item>
  </channel>
</rss>
