<?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: Okeke Chukwudubem</title>
    <description>The latest articles on DEV Community by Okeke Chukwudubem (@okeke_chukwudubem_5f3bf49).</description>
    <link>https://dev.to/okeke_chukwudubem_5f3bf49</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%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg</url>
      <title>DEV Community: Okeke Chukwudubem</title>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/okeke_chukwudubem_5f3bf49"/>
    <language>en</language>
    <item>
      <title>One codebase. Two products.

AccessBuild and AgriMind share the same FastAPI + Supabase + Gemini architecture. Built the foundation once, applied it twice.

AgriMind backend is live. Meta sandbox is the only blocker.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Fri, 02 Oct 2026 11:12:08 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-accessbuild-and-agrimind-share-the-same-fastapi-supabase-gemini-1dik</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-accessbuild-and-agrimind-share-the-same-fastapi-supabase-gemini-1dik</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-heres-how-i-built-both-at-once-5agg" class="crayons-story__hidden-navigation-link"&gt;One Codebase. Two Products. Here's How I Built Both at Once.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
                
              
              &lt;div id="story-author-preview-content-4787101" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-heres-how-i-built-both-at-once-5agg" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 2&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-heres-how-i-built-both-at-once-5agg" id="article-link-4787101"&gt;
          One Codebase. Two Products. Here's How I Built Both at Once.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-heres-how-i-built-both-at-once-5agg" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-heres-how-i-built-both-at-once-5agg#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

&lt;/div&gt;


</description>
      <category>backend</category>
      <category>buildinpublic</category>
      <category>python</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>One Codebase. Two Products. Here's How I Built Both at Once.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Fri, 02 Oct 2026 11:11:36 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-heres-how-i-built-both-at-once-5agg</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/one-codebase-two-products-heres-how-i-built-both-at-once-5agg</guid>
      <description>&lt;p&gt;AccessBuild taught me the pattern. AgriMind is applying it. Both are live.&lt;/p&gt;

&lt;p&gt;If you've been following my build logs, you know the rhythm.&lt;/p&gt;

&lt;p&gt;I was deep into AccessBuild—an AI-powered accessibility audit tool that scores mobile apps from A to F. Day 2 shipped: Supabase integration, UI tree parsing, auto-scanning. The API was live. The scoring engine worked.&lt;/p&gt;

&lt;p&gt;Then I paused it.&lt;/p&gt;

&lt;p&gt;Not because it failed. Because I saw the pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Pattern&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AccessBuild and AgriMind share the exact same architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI backend&lt;/li&gt;
&lt;li&gt;Supabase database&lt;/li&gt;
&lt;li&gt;Google Gemini AI&lt;/li&gt;
&lt;li&gt;Render hosting&lt;/li&gt;
&lt;li&gt;API-first design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every line of code I wrote for AccessBuild's backend was directly reusable for AgriMind. So instead of finishing one and starting the other from scratch, I built the shared foundation once and applied it to both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AgriMind Is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AgriMind is an AI-powered farm advisor on WhatsApp. Farmers send text or photos of sick crops and livestock. The AI replies with diagnosis and treatment advice in their own language.&lt;/p&gt;

&lt;p&gt;Free for 3 questions. ₦8,000/month for unlimited.&lt;/p&gt;

&lt;p&gt;The goal: instant expert advice for farmers anywhere in the world. No app. No internet beyond WhatsApp. Just a conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FastAPI backend&lt;/td&gt;
&lt;td&gt;✅ Live on Render&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supabase database&lt;/td&gt;
&lt;td&gt;✅ Connected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini AI brain&lt;/td&gt;
&lt;td&gt;✅ Integrated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paystack payment logic&lt;/td&gt;
&lt;td&gt;✅ Built&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta WhatsApp webhook&lt;/td&gt;
&lt;td&gt;✅ Verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Messages subscription&lt;/td&gt;
&lt;td&gt;✅ Active&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The backend is live at: agrimind-api-xm7p.onrender.com&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Shared Stack&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;AccessBuild&lt;/th&gt;
&lt;th&gt;AgriMind&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Design&lt;/td&gt;
&lt;td&gt;REST&lt;/td&gt;
&lt;td&gt;REST&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same bones. Different problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Wall I Hit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meta's test number. It works differently than expected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can't just message it like a contact&lt;/li&gt;
&lt;li&gt;You must receive a template first, then reply to that template&lt;/li&gt;
&lt;li&gt;Only then does the 24-hour conversation window open&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm still debugging this. The backend is ready. The AI is ready. The only blocker is Meta's sandbox restrictions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get the Meta test flow working end-to-end&lt;/li&gt;
&lt;li&gt;Register a real WhatsApp Business number&lt;/li&gt;
&lt;li&gt;Complete Meta business verification&lt;/li&gt;
&lt;li&gt;Launch AgriMind with real farmers&lt;/li&gt;
&lt;li&gt;Return to AccessBuild with the same infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why I'm Sharing This&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because this is what real building looks like. You pause one thing to finish another. You hit walls that have nothing to do with your code. You keep going.&lt;/p&gt;

&lt;p&gt;AccessBuild will be finished. AgriMind is almost there. Both share the same bones.&lt;/p&gt;

&lt;p&gt;That's the advantage of building systems, not just projects.&lt;/p&gt;

&lt;p&gt;Dexter&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>AccessBuild Day 2: From Manual Testing to Real App Scanning</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Thu, 24 Sep 2026 14:58:21 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/accessbuild-day-2-from-manual-testing-to-real-app-scanning-5b90</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/accessbuild-day-2-from-manual-testing-to-real-app-scanning-5b90</guid>
      <description>&lt;p&gt;Added Supabase. Added auto-scanning. Parsed my first real Android UI tree. It scored D.&lt;/p&gt;

&lt;p&gt;Day 2 of AccessBuild. I've been on this chair for hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built Today&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yesterday, AccessBuild could only score elements you pasted in manually. Today, it can scan a real Android app.&lt;/p&gt;

&lt;p&gt;The new &lt;code&gt;/scan&lt;/code&gt; endpoint accepts a raw Android UI tree XML dump. It parses every node, identifies interactive elements, extracts accessibility labels, and scores the screen automatically. Then it saves the result to Supabase.&lt;/p&gt;

&lt;p&gt;No more manual data entry. Real apps. Real screens. Real scores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Stack Grew Up&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day 1&lt;/th&gt;
&lt;th&gt;Day 2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In-memory only&lt;/td&gt;
&lt;td&gt;Supabase database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual element list&lt;/td&gt;
&lt;td&gt;Android UI tree XML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off test&lt;/td&gt;
&lt;td&gt;Persistent, repeatable audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No history&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/audits/recent&lt;/code&gt; endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No stats&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/stats&lt;/code&gt; endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The First Real Scan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran the first auto-scan on a test banking app login screen. Five interactive elements. Only two had labels.&lt;/p&gt;

&lt;p&gt;Result: &lt;strong&gt;D — 40% accessible&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recommendation: &lt;em&gt;"Urgent. Most elements are invisible to screen readers. Immediate fixes required."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the entire point. A real banking app with that score would be unusable by blind customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Broke&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The deploy failed multiple times. First, Render couldn't find the port. Then it couldn't find &lt;code&gt;models.py&lt;/code&gt;. Then the build cache held onto old code. Each error taught me something about how Render handles deployments. I fixed the start command to use &lt;code&gt;$PORT&lt;/code&gt;, created the missing files, cleared the build cache, and redeployed.&lt;/p&gt;

&lt;p&gt;Three hours of debugging. Ten minutes of actual feature work. That's real engineering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Works Now&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/scan&lt;/code&gt; — Auto-scan from Android UI tree XML&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/stats&lt;/code&gt; — Aggregate statistics from Supabase&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/audits/recent&lt;/code&gt; — Recent audit history&lt;/li&gt;
&lt;li&gt;Supabase persistence — Every audit saved&lt;/li&gt;
&lt;li&gt;Full pipeline — Request → Parse → Score → Save → Respond&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's Next (Day 3)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a public dashboard showing all audited apps and scores&lt;/li&gt;
&lt;li&gt;Connect real app scanning to my Phone Agent's UI tree output&lt;/li&gt;
&lt;li&gt;Start scanning Nigerian banking apps for real&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 github.com/Dexter2344/accessbuild-api&lt;/p&gt;

&lt;p&gt;Day 2 is done. The API has a memory now.&lt;/p&gt;

&lt;p&gt;— Dexter&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>Day 1 of AccessBuild: I built and deployed a working accessibility audit API from scratch. No grant. No funding. Just code.

It scans apps, scores them A-F based on accessibility labels, and shows exactly how inaccessible they are to blind users.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Wed, 16 Sep 2026 22:58:41 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-1-of-accessbuild-i-built-and-deployed-a-working-accessibility-audit-api-from-scratch-no-57l5</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-1-of-accessbuild-i-built-and-deployed-a-working-accessibility-audit-api-from-scratch-no-57l5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/accessbuild-day-1-i-built-an-accessibility-audit-api-from-scratch-2ema" class="crayons-story__hidden-navigation-link"&gt;AccessBuild Day 1: I Built an Accessibility Audit API From Scratch&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image" width="800" height="735"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
                
              
              &lt;div id="story-author-preview-content-4670810" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt="" width="800" height="735"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/accessbuild-day-1-i-built-an-accessibility-audit-api-from-scratch-2ema" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 16&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/accessbuild-day-1-i-built-an-accessibility-audit-api-from-scratch-2ema" id="article-link-4670810"&gt;
          AccessBuild Day 1: I Built an Accessibility Audit API From Scratch
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/accessbuild-day-1-i-built-an-accessibility-audit-api-from-scratch-2ema#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

&lt;/div&gt;


</description>
      <category>a11y</category>
      <category>api</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>AccessBuild Day 1: I Built an Accessibility Audit API From Scratch</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Wed, 16 Sep 2026 22:58:01 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/accessbuild-day-1-i-built-an-accessibility-audit-api-from-scratch-2ema</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/accessbuild-day-1-i-built-an-accessibility-audit-api-from-scratch-2ema</guid>
      <description>&lt;p&gt;No grant. No funding. Just a working API deployed in one day.&lt;/p&gt;

&lt;p&gt;I've been waiting on grant funding for AccessBuild for weeks.&lt;/p&gt;

&lt;p&gt;The deadline passed. The emails went unanswered. So I made a decision: build with what I have.&lt;/p&gt;

&lt;p&gt;Today is Day 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AccessBuild Is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AccessBuild is an AI-powered accessibility audit tool for mobile apps. It scans an app's interface, checks whether interactive elements have proper accessibility labels, and scores the app from A to F.&lt;/p&gt;

&lt;p&gt;If an app scores F, it means visually impaired users literally cannot use it. Screen readers can't read unlabeled buttons. Blind users are locked out.&lt;/p&gt;

&lt;p&gt;I discovered this problem while building my Phone Agent. I tested 30 Nigerian apps. 100% of banking apps scored F.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built Today&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A working FastAPI backend, live on Render.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/audit&lt;/code&gt; endpoint&lt;/td&gt;
&lt;td&gt;✅ Live&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/grades&lt;/code&gt; endpoint&lt;/td&gt;
&lt;td&gt;✅ Live&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A-F scoring logic&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility percentage calculation&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recommendation engine&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;How It Works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You send a list of UI elements from any app screen. Each element has a type (button, input, icon) and an optional accessibility label. The API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Filters out non-interactive elements&lt;/li&gt;
&lt;li&gt;Counts how many interactive elements have labels&lt;/li&gt;
&lt;li&gt;Calculates the accessibility percentage&lt;/li&gt;
&lt;li&gt;Assigns a grade (A through F)&lt;/li&gt;
&lt;li&gt;Returns a recommendation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran the first audit. A fake banking app with 5 interactive elements. Only 2 had labels.&lt;/p&gt;

&lt;p&gt;Result: &lt;strong&gt;D — 40% accessible&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recommendation: &lt;em&gt;"Urgent. Most elements are invisible to screen readers. Immediate fixes required."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the entire point. A real banking app with that score would be unusable by blind customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FastAPI backend&lt;/li&gt;
&lt;li&gt;Deployed on Render (free tier)&lt;/li&gt;
&lt;li&gt;No environment variables needed&lt;/li&gt;
&lt;li&gt;Pure Python logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's Next (Day 2)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-extract UI elements from real apps&lt;/li&gt;
&lt;li&gt;Store audit results in Supabase&lt;/li&gt;
&lt;li&gt;Build a public dashboard showing app scores&lt;/li&gt;
&lt;li&gt;Expand element types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why I'm Building This Without Funding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the problem is real. 100% of Nigerian banking apps are inaccessible to visually impaired users. That's millions of people locked out of their own money.&lt;/p&gt;

&lt;p&gt;I can't wait for a grant to fix that.&lt;/p&gt;

&lt;p&gt;Day 1 is done. The API is live. Day 2 starts tomorrow.&lt;/p&gt;

&lt;p&gt;— Dexter&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Got Tired of Waiting for Funding. So I Shipped a Live Product.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Wed, 09 Sep 2026 23:01:06 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/i-got-tired-of-waiting-for-funding-so-i-shipped-a-live-product-f66</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/i-got-tired-of-waiting-for-funding-so-i-shipped-a-live-product-f66</guid>
      <description>&lt;p&gt;I planned to be building AccessBuild right now.&lt;/p&gt;

&lt;p&gt;AccessBuild is my AI-powered accessibility audit tool—born from a discovery that hit me hard during the Phone Agent build: 100% of Nigerian banking apps are completely inaccessible to visually impaired users. Not one. Not some. All of them scored F.&lt;/p&gt;

&lt;p&gt;I drafted the business plan. Mapped the revenue model. Defined the target audience. Wrote grant applications. Sent them out.&lt;/p&gt;

&lt;p&gt;And now I wait.&lt;/p&gt;

&lt;p&gt;Here's the plan I set for myself: if funding isn't available by next week, I build with what I have. No more waiting. No more "when the money comes."&lt;/p&gt;

&lt;p&gt;That deadline is almost here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built While Waiting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ApexSignal—a premium multi-page trading dashboard.&lt;/p&gt;

&lt;p&gt;It's not directly related to accessibility. It's not my life's mission. But it's proof of work. It's me refusing to sit still.&lt;/p&gt;

&lt;p&gt;The architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A FastAPI backend deployed on Render&lt;/li&gt;
&lt;li&gt;A multi-page frontend deployed on Vercel&lt;/li&gt;
&lt;li&gt;Full API integration via fetch()&lt;/li&gt;
&lt;li&gt;Real-time WAT clock&lt;/li&gt;
&lt;li&gt;Pair analysis interface&lt;/li&gt;
&lt;li&gt;Market scan endpoint&lt;/li&gt;
&lt;li&gt;Chart upload support&lt;/li&gt;
&lt;li&gt;Premium dark gold aesthetic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two live URLs. A working system. Shipped while waiting for an email that hasn't come.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Lesson&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Funding doesn't define you. Motion does.&lt;/p&gt;

&lt;p&gt;I could have spent these weeks refreshing my inbox, waiting for a grant committee to decide my future. Instead, I built something. It's not perfect. The AI brain still needs wiring. The analysis is placeholder. But the infrastructure is real.&lt;/p&gt;

&lt;p&gt;Backend. Frontend. Deployment. Connection. All done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AccessBuild still gets built—with or without funding. If the grant comes, I scale faster. If it doesn't, I build the MVP myself and bootstrap from there.&lt;/p&gt;

&lt;p&gt;ApexSignal continues too. The next phase is wiring in real AI analysis logic. Then chart screenshot reading. Then possibly auto-execution.&lt;/p&gt;

&lt;p&gt;I'm not waiting anymore.&lt;/p&gt;

&lt;p&gt;— Dexter&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I asked AI to audit my shipped code. It found a silent bug in 2 minutes that I'd missed for months
No crash. No error. Just wrong output in one edge case
AI isn't just for building faster it's for catching what tired eyes miss
When did a bug last humble u?</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Fri, 04 Sep 2026 21:38:15 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/i-asked-ai-to-audit-my-shipped-code-it-found-a-silent-bug-in-2-minutes-that-id-missed-for-months-4906</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/i-asked-ai-to-audit-my-shipped-code-it-found-a-silent-bug-in-2-minutes-that-id-missed-for-months-4906</guid>
      <description></description>
    </item>
    <item>
      <title>Back from Exam Season. Now I'm Building Something Bigger.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Tue, 25 Aug 2026 21:25:04 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/back-from-exam-season-now-im-building-something-bigger-2jo</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/back-from-exam-season-now-im-building-something-bigger-2jo</guid>
      <description>&lt;p&gt;Exams are done. To the glory of God. Now the real work begins — AccessBuild.&lt;/p&gt;

&lt;p&gt;I've been quiet again. But this time, it was for a good reason.&lt;/p&gt;

&lt;p&gt;Exams are finished. To the glory of God.&lt;/p&gt;

&lt;p&gt;If you've been following my build logs, you know the pattern: I build, I disappear for exams, I come back, I build again. This semester was brutal. Multiple courses. Long nights. The usual stress of being a software engineering student who's also trying to ship real projects.&lt;/p&gt;

&lt;p&gt;But I made it through. And now I have space again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Break Wasn't a Pause on Everything&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even during exam season, I was building in the background. I remade several portfolio sites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A luxury restaurant site (Onyx Dining)&lt;/li&gt;
&lt;li&gt;A premium law firm site (Meridian Law Chambers)&lt;/li&gt;
&lt;li&gt;A car dealership site (AutoLux Motors)&lt;/li&gt;
&lt;li&gt;A salon site (Dexter Salon)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one a full multi-page build. Each one with working forms, professional design, and real attention to detail. My portfolio is sharper now than it was before the break.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Coming Next: AccessBuild&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You might remember my accessibility audit from the Phone Agent build logs. I discovered something that's been sitting in my chest since then:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;100% of Nigerian banking apps are completely inaccessible to visually impaired users.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not one. Not most. ALL of them. Scored F on my audit. Invisible to screen readers. Unusable by millions of people.&lt;/p&gt;

&lt;p&gt;That discovery became an idea. The idea became a plan. And now that exams are done, I have the space to build it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AccessBuild&lt;/strong&gt; is an AI-powered accessibility audit tool for mobile apps. It automatically tests apps, scores them from A to F, and tells developers exactly what to fix. The goal: make African apps accessible to everyone—not just the ones who can see.&lt;/p&gt;

&lt;p&gt;I've already drafted the business plan. The revenue model. The target audience. The grant application. The foundation is ready.&lt;/p&gt;

&lt;p&gt;Now it's time to build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to Expect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'll be documenting the AccessBuild journey the same way I documented the Phone Agent—public build logs, honest challenges, real progress. No hype. Just building.&lt;/p&gt;

&lt;p&gt;The first step: turning the manual audit methodology into an automated engine. The Phone Agent already has the vision system. AccessBuild repurposes it from automation to auditing.&lt;/p&gt;

&lt;p&gt;If you're interested in accessibility, AI, or just watching someone build something meaningful from scratch—stick around. This one's going to be bigger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Phone Agent is still here: github.com/Dexter2344/phone-agent&lt;/p&gt;

&lt;p&gt;AccessBuild gets its own repo soon. I'll share when it's live.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>automation</category>
    </item>
    <item>
      <title>21 build logs. Months of work. One shipped project. An autonomous AI agent that controls a phone. Web interface. Multi-app workflows. 94% accuracy. Full setup guide included so you can run it yourself.

👉 github.com/Dexter2344/phone-agent</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sun, 09 Aug 2026 09:32:18 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/21-build-logs-months-of-work-one-shipped-project-an-autonomous-ai-agent-that-controls-a-phone-5f2m</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/21-build-logs-months-of-work-one-shipped-project-an-autonomous-ai-agent-that-controls-a-phone-5f2m</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-21-the-grand-finale-we-shipped-plus-full-setup-guide-55ph" class="crayons-story__hidden-navigation-link"&gt;Project Log #21: The Grand Finale. We Shipped. (Plus: Full Setup Guide)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-21-the-grand-finale-we-shipped-plus-full-setup-guide-55ph" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Details jumping from 80% to 94% accuracy&lt;/p&gt;

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

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
                
              
              &lt;div id="story-author-preview-content-4352841" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-21-the-grand-finale-we-shipped-plus-full-setup-guide-55ph" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 9&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-21-the-grand-finale-we-shipped-plus-full-setup-guide-55ph" id="article-link-4352841"&gt;
          Project Log #21: The Grand Finale. We Shipped. (Plus: Full Setup Guide)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-21-the-grand-finale-we-shipped-plus-full-setup-guide-55ph" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-21-the-grand-finale-we-shipped-plus-full-setup-guide-55ph#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Project Log #21: The Grand Finale. We Shipped. (Plus: Full Setup Guide)</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sun, 09 Aug 2026 09:30:30 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-21-the-grand-finale-we-shipped-plus-full-setup-guide-55ph</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-21-the-grand-finale-we-shipped-plus-full-setup-guide-55ph</guid>
      <description>&lt;p&gt;21 build logs. Months of work. One shipped project. Here's the full journey—and how to set up the Phone Agent on your own device.&lt;/p&gt;

&lt;p&gt;The first build log was published months ago. "I'm building an AI agent that controls a phone." No code. No repo. Just an idea and a cracked phone.&lt;/p&gt;

&lt;p&gt;Today, after 21 build logs spread across months, the project is shipped.&lt;/p&gt;

&lt;p&gt;This wasn't a straight line. There were gaps. Weeks where the log went silent—not because the work stopped, but because life doesn't pause for build logs. I took breaks to survive exam season. I paused to ship 9 portfolio websites. I stepped away when the code refused to cooperate and my brain needed rest.&lt;/p&gt;

&lt;p&gt;But every time I came back, the agent was still there. Waiting. And every log picked up where the last one left off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What We Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An autonomous AI agent that controls an Android phone using natural language commands. It can parse your words into actions, read the screen, tap buttons, type text, switch between apps, verify financial data, and serve a web interface—all offline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Timeline&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;What Happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Days 1-4&lt;/td&gt;
&lt;td&gt;Foundation. Gemma 4 + ADB. First working pipeline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Days 5-8&lt;/td&gt;
&lt;td&gt;Vision overhaul. UI tree. OCR. Template matching.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Days 9-12&lt;/td&gt;
&lt;td&gt;Accessibility audit. 30 apps scored.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Days 13-16&lt;/td&gt;
&lt;td&gt;Multi-app workflows. Task memory. Home reset.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Days 17-19&lt;/td&gt;
&lt;td&gt;Financial verification. Accuracy from 80% to 94%.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Breaks&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Exams. Portfolio sites. Life.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Days 20-21&lt;/td&gt;
&lt;td&gt;Web interface. Flask backend. Shipped.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📖 FULL SETUP GUIDE: How to Install and Use the Phone Agent
&lt;/h2&gt;

&lt;p&gt;Follow these steps to get the agent running on your own Android phone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;An Android phone (Android 7 or later)&lt;/li&gt;
&lt;li&gt;At least 6GB of free storage space&lt;/li&gt;
&lt;li&gt;A WiFi connection for the initial download&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Install Termux
&lt;/h3&gt;

&lt;p&gt;Do NOT install Termux from the Google Play Store—that version is outdated. Install it from F-Droid instead.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your phone's browser&lt;/li&gt;
&lt;li&gt;Go to &lt;code&gt;f-droid.org&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Download and install the F-Droid app&lt;/li&gt;
&lt;li&gt;Open F-Droid and search for "Termux"&lt;/li&gt;
&lt;li&gt;Install Termux from F-Droid&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Set Up Termux
&lt;/h3&gt;

&lt;p&gt;Open Termux and run these commands one by one. Wait for each to finish before typing the next.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
pkg update
pkg upgrade
pkg install python git curl wget
pkg install tesseract
pkg install android-tools

Step 3: Install Ollama
Ollama is the tool that runs Gemma 4 locally on your phone.

bash
curl -fsSL https://ollama.com/install.sh | sh
After installation, start Ollama:

bash
ollama serve
Open a new Termux session (swipe from left, tap "New session") and pull the Gemma 4 model:

bash
ollama pull gemma4:4b
This downloads about 2-3GB. Use WiFi. Be patient.

Step 4: Clone the Phone Agent Repository
bash
git clone https://github.com/Dexter2344/phone-agent.git
cd phone-agent
Step 5: Install Python Dependencies
bash
pip install flask flask-cors requests numpy PyPDF2 lancedb
Step 6: Enable Developer Options and ADB
Go to Settings → About Phone

Tap "Build Number" 7 times until you see "You are now a developer"

Go back to Settings → Developer Options

Enable "USB Debugging"

Connect your phone to itself via ADB:

bash
adb devices
You may need to approve a prompt on your phone. Once approved, you'll see your device listed.

Step 7: Start the Phone Agent
Using the Web Interface (Recommended):

bash
python server.py
Then open your phone's browser and go to: http://localhost:5000

You'll see a chat interface. Type commands like:

"Open WhatsApp and send a message to Mom saying I'll call later"

"Copy my bank balance and send it to Mom on WhatsApp"

Using the Terminal (Alternative):

bash
python agent.py
Then type commands directly into the terminal.

Troubleshooting
Problem Fix
"Ollama not found"  Make sure you ran ollama serve in a separate Termux session
"ADB device not found"  Check USB Debugging is enabled. Run adb kill-server then adb devices again
"Module not found"  Run pip install for the missing module
"Tesseract not found"   Run pkg install tesseract
Phone gets hot  Close other apps. The agent is CPU-intensive. Take breaks.
Agent misreads numbers  The verification layer will catch most errors. For financial data, always double-check.
Using the Web Interface
Once server.py is running and you've opened http://localhost:5000:

Status bar: Green dots mean Ollama and ADB are connected. Red dots mean something is wrong.

Command input: Type what you want the agent to do. Be specific.

Example commands: Click any example to auto-fill and send.

History: Your last 20 commands and responses are stored.

The Repo

👉 github.com/Dexter2344/phone-agent

21 build logs. Months of work. One shipped project. Full setup guide included.

Thank You

To everyone who followed this log—through the daily posts and the weeks of silence—thank you. This was never about shipping fast. It was about shipping honestly.

This was Log #1:

"I'm starting a new project. It's the most ambitious thing I've attempted from a phone."

This is Log #21. We shipped.

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

&lt;/div&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>python</category>
      <category>automation</category>
    </item>
    <item>
      <title>Day 20: Hours of debugging. CORS errors. Broken paths. Misspelled IDs. But the Phone Agent finally has a web interface. Flask backend. Chat-style frontend. No more terminal-only.

👉 github.com/Dexter2344/phone-agent</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Tue, 04 Aug 2026 23:30:34 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-20-hours-of-debugging-cors-errors-broken-paths-misspelled-ids-but-the-phone-agent-finally-1mmb</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-20-hours-of-debugging-cors-errors-broken-paths-misspelled-ids-but-the-phone-agent-finally-1mmb</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-20-after-hours-of-screen-time-the-agent-has-a-face-4d8n" class="crayons-story__hidden-navigation-link"&gt;Project Log #20: After Hours of Screen Time, the Agent Has a Face&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" alt="okeke_chukwudubem_5f3bf49 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/okeke_chukwudubem_5f3bf49" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Okeke Chukwudubem
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Okeke Chukwudubem
                
              
              &lt;div id="story-author-preview-content-4316298" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/okeke_chukwudubem_5f3bf49" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3908265%2F586841bb-154e-4de4-a539-b939b3018c48.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Okeke Chukwudubem&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-20-after-hours-of-screen-time-the-agent-has-a-face-4d8n" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-20-after-hours-of-screen-time-the-agent-has-a-face-4d8n" id="article-link-4316298"&gt;
          Project Log #20: After Hours of Screen Time, the Agent Has a Face
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/automation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;automation&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-20-after-hours-of-screen-time-the-agent-has-a-face-4d8n" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/project-log-20-after-hours-of-screen-time-the-agent-has-a-face-4d8n#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

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

&lt;/div&gt;


</description>
      <category>backend</category>
      <category>buildinpublic</category>
      <category>flask</category>
      <category>python</category>
    </item>
    <item>
      <title>Project Log #20: After Hours of Screen Time, the Agent Has a Face</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Tue, 04 Aug 2026 23:29:31 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-20-after-hours-of-screen-time-the-agent-has-a-face-4d8n</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-20-after-hours-of-screen-time-the-agent-has-a-face-4d8n</guid>
      <description>&lt;p&gt;Day 20. I stared at my screen until my eyes burned. But the web interface is live. Flask backend connected. The agent is finally usable.&lt;/p&gt;

&lt;p&gt;I've been staring at this screen for hours.&lt;/p&gt;

&lt;p&gt;Not the productive kind of staring. The frustrating kind. The kind where you write 50 lines of code, test it, watch it break, rewrite it, test it again, and repeat until you forget what time it is.&lt;/p&gt;

&lt;p&gt;Today was that kind of day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Got Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After hours of debugging, I shipped two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Flask server&lt;/strong&gt; (&lt;code&gt;server.py&lt;/code&gt;) that wraps the agent in a REST API. Three endpoints: &lt;code&gt;/status&lt;/code&gt; checks if Ollama and ADB are connected. &lt;code&gt;/command&lt;/code&gt; sends a natural language command to the agent and returns the result. &lt;code&gt;/history&lt;/code&gt; returns the last 20 commands.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A web interface&lt;/strong&gt; (&lt;code&gt;interface.html&lt;/code&gt;) that looks like a chat app. Dark terminal theme. Gold accents. Type a command. See the agent respond. Real-time status indicators showing whether Ollama and ADB are alive.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The interface talks to Flask on &lt;code&gt;localhost:5000&lt;/code&gt;. Flask talks to the agent. The agent talks to the phone. Everything local. No cloud. No external servers. Just a phone running its own AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Grind&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what the polished build log doesn't show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flask refused to serve the HTML file for 45 minutes because I forgot &lt;code&gt;send_file&lt;/code&gt; needs an absolute path.&lt;/li&gt;
&lt;li&gt;The status endpoint kept returning false for ADB because I was checking the wrong string in the output.&lt;/li&gt;
&lt;li&gt;The interface looked like a developer's debug page until the third redesign.&lt;/li&gt;
&lt;li&gt;CORS errors because I forgot &lt;code&gt;flask-cors&lt;/code&gt;. Ten minutes of confusion for a one-line fix.&lt;/li&gt;
&lt;li&gt;The send button wasn't working because I misspelled &lt;code&gt;getElementById&lt;/code&gt;. Thirty minutes. One missing character.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the real build log. Not the clean version. The "I need to step away from this screen before I throw my phone" version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The interface works. It's not beautiful yet. The design will evolve. But you can type a command in a browser, hit enter, and watch the agent execute it on the phone. That's the milestone.&lt;/p&gt;

&lt;p&gt;Status bar at the top. Chat display in the middle. Input area at the bottom. Example commands you can click. Loading states. Error messages. All the basics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Still Needs Work&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The setup process is still manual. Install Termux. Pull Ollama. Configure ADB. Run the server. Open the browser. Too many steps. A setup script is next.&lt;/li&gt;
&lt;li&gt;The interface needs polish. Animations are basic. The design is functional but not premium. I'll iterate.&lt;/li&gt;
&lt;li&gt;End-to-end testing hasn't happened yet. The agent works in controlled tests. Real-world reliability is the next frontier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's Next&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Day 21: Write the setup script. One command. Full install.&lt;/li&gt;
&lt;li&gt;Day 22: End-to-end testing. Fix everything that breaks.&lt;/li&gt;
&lt;li&gt;Day 23: Ship v1.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;github.com/Dexter2344/phone-agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;server.py&lt;/code&gt; is live. &lt;code&gt;interface.html&lt;/code&gt; is live. README is updated. The project has a face.&lt;/p&gt;

&lt;p&gt;This is Day 20. My eyes hurt. But the agent is no longer trapped in a terminal.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>python</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
