<?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.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>Day 3 of building an AI agent that controls a phone.

The agent can now see. Tesseract OCR is running locally in Termux. Screenshots text extraction coordinate mapping.

Tested on WhatsApp. It found a contact by reading the screen. All offline.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Wed, 10 Jun 2026 15:30:38 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-3-of-building-an-ai-agent-that-controls-a-phone-the-agent-can-now-see-tesseract-ocr-is-3177</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-3-of-building-an-ai-agent-that-controls-a-phone-the-agent-can-now-see-tesseract-ocr-is-3177</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-3-the-ai-phone-agent-can-now-see-12lj" class="crayons-story__hidden-navigation-link"&gt;Project Log #3: The AI Phone Agent Can Now See&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.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-3866812" 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.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/project-log-3-the-ai-phone-agent-can-now-see-12lj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 10&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-3-the-ai-phone-agent-can-now-see-12lj" id="article-link-3866812"&gt;
          Project Log #3: The AI Phone Agent Can Now See
        &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/android"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;android&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/buildinpublic"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;buildinpublic&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ocr"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ocr&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-3-the-ai-phone-agent-can-now-see-12lj#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>agents</category>
      <category>ai</category>
      <category>android</category>
      <category>automation</category>
    </item>
    <item>
      <title>Project Log #3: The AI Phone Agent Can Now See</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Wed, 10 Jun 2026 15:29:21 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-3-the-ai-phone-agent-can-now-see-12lj</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-3-the-ai-phone-agent-can-now-see-12lj</guid>
      <description>&lt;p&gt;Day 3. Screen text detection is working. The agent is starting to understand what's on the screen.&lt;/p&gt;

&lt;p&gt;The first two days were about the foundation—getting Gemma 4 to talk to ADB, parsing commands, and creating the repo.&lt;/p&gt;

&lt;p&gt;Today was about solving the hardest problem: how does the agent know what's on the screen?&lt;/p&gt;

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

&lt;p&gt;An AI that can't see is useless. You can tell it "open WhatsApp and message Mom," but once WhatsApp opens, the agent is blind. It doesn't know where the search bar is. It can't find Mom's name. It can't locate the message box.&lt;/p&gt;

&lt;p&gt;I needed a way for the agent to read the screen—offline, on a phone, without cloud APIs.&lt;/p&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;The new &lt;code&gt;vision.py&lt;/code&gt; module is live. It handles screenshot capture, OCR text extraction, and text-to-coordinate mapping.&lt;/p&gt;

&lt;p&gt;Today's Progress&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&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;Installed Tesseract OCR in Termux&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Captured a screenshot via ADB&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extracted text from the screenshot&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mapped text positions to screen coordinates&lt;/td&gt;
&lt;td&gt;🔧 In progress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested on WhatsApp contact list&lt;/td&gt;
&lt;td&gt;✅ First successful read&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;The pipeline is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Capture: ADB takes a screenshot and saves it locally.&lt;/li&gt;
&lt;li&gt;Extract: Tesseract OCR scans the image and returns all text it finds, along with bounding box coordinates.&lt;/li&gt;
&lt;li&gt;Map: A Python script matches the extracted text to known UI elements. If the agent needs to find "Mom," it scans the OCR output for the word "Mom," grabs the coordinates, and tells ADB to tap there.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All of this runs inside Termux. No internet. No cloud vision API. Just open-source OCR on a phone CPU.&lt;/p&gt;

&lt;p&gt;What's Working&lt;/p&gt;

&lt;p&gt;I tested it on WhatsApp. The agent captured the screen, extracted the contact list, found a specific name, and returned the coordinates. It's slow—about 8-12 seconds per screen scan on my device—but it works.&lt;/p&gt;

&lt;p&gt;Na What's Broken&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OCR misreads some text. "Mom" becomes "Morn" or "M0m." I'm working on fuzzy matching.&lt;/li&gt;
&lt;li&gt;Small UI elements (icons, emojis) are invisible to OCR. I'll need image-based detection for those.&lt;/li&gt;
&lt;li&gt;Tesseract is heavy. It takes 3-4 seconds just to load before scanning. I'm looking at lighter alternatives.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Add fuzzy text matching to handle OCR errors&lt;/li&gt;
&lt;li&gt;Write the verification layer: after each action, check if the expected result happened&lt;/li&gt;
&lt;li&gt;Test a full 3-step task: open WhatsApp → find contact → send a message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building something similar or just curious about offline AI agents, follow along. This is Day 3 of the build.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>android</category>
      <category>buildinpublic</category>
      <category>ocr</category>
    </item>
    <item>
      <title>Day 2 of building an AI agent that controls a phone.

Repo is live. First script is working. Gemma 4 + ADB + Python.

No cloud. No API keys. Just a phone that understands commands and executes them.

github.com/Dexter2344/phone-agent</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Tue, 09 Jun 2026 14:57:23 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/day-2-of-building-an-ai-agent-that-controls-a-phone-repo-is-live-first-script-is-working-435l</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/day-2-of-building-an-ai-agent-that-controls-a-phone-repo-is-live-first-script-is-working-435l</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-2-the-ai-phone-agent-has-a-repo-2e05" class="crayons-story__hidden-navigation-link"&gt;Project Log #2: The AI Phone Agent Has a Repo&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.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-3858037" 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.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/project-log-2-the-ai-phone-agent-has-a-repo-2e05" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 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-2-the-ai-phone-agent-has-a-repo-2e05" id="article-link-3858037"&gt;
          Project Log #2: The AI Phone Agent Has a Repo
        &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/android"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;android&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;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemma"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemma&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-2-the-ai-phone-agent-has-a-repo-2e05#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;
            1 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>agents</category>
      <category>ai</category>
      <category>android</category>
      <category>python</category>
    </item>
    <item>
      <title>Project Log #2: The AI Phone Agent Has a Repo</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Tue, 09 Jun 2026 14:56:00 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-2-the-ai-phone-agent-has-a-repo-2e05</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-2-the-ai-phone-agent-has-a-repo-2e05</guid>
      <description>&lt;p&gt;Yesterday I announced I'm building an autonomous AI agent that controls a phone. Today, it has a home on GitHub.&lt;/p&gt;

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

&lt;p&gt;github.com/Dexter2344/phone-wgent&lt;/p&gt;

&lt;p&gt;Right now it's a single Python script. But that script already does three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Talks to Gemma 4&lt;/strong&gt; via Ollama's local API. No cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executes ADB commands&lt;/strong&gt; — opens apps, taps, types text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parses natural language&lt;/strong&gt; commands into structured steps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Today's Progress&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&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;Created the repo&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrote the core &lt;code&gt;agent.py&lt;/code&gt; script&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Added README with full project overview&lt;/td&gt;
&lt;td&gt;✅ Done&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested Ollama connection&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tested ADB connection&lt;/td&gt;
&lt;td&gt;✅ Working&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parsed a test command into JSON steps&lt;/td&gt;
&lt;td&gt;🔧 In progress&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What the Script Does Right Now&lt;/p&gt;

&lt;p&gt;You give it a command like "Open WhatsApp." It sends that to Gemma 4, which breaks it into a step-by-step plan. Then the script executes those steps via ADB.&lt;/p&gt;

&lt;p&gt;It's basic. It's fragile. But the foundation is there.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Add screen text detection using Tesseract OCR&lt;/li&gt;
&lt;li&gt;Write the verification layer that checks if each step succeeded&lt;/li&gt;
&lt;li&gt;Test a full 3-step task: open app → find element → tap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why This Matters&lt;/p&gt;

&lt;p&gt;Most AI agents live in the cloud. This one lives on a phone. No internet. No API keys. No data leaving the device.&lt;/p&gt;

&lt;p&gt;I'm documenting every step publicly. If you're curious about building AI agents, building from a phone, or just watching someone figure it out in real time—follow along.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>android</category>
      <category>automation</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Project Log #1: I'm Building an AI Agent That Controls a Phone</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sun, 07 Jun 2026 21:22:19 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-1-im-building-an-ai-agent-that-controls-a-phone-2865</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/project-log-1-im-building-an-ai-agent-that-controls-a-phone-2865</guid>
      <description>&lt;p&gt;I'm starting a new project. It's the most ambitious thing I've attempted from a phone.&lt;/p&gt;

&lt;p&gt;The goal: an AI agent that controls a smartphone. It opens apps, navigates screens, taps buttons, types text, and completes multi-step tasks. All offline. All local. No cloud.&lt;/p&gt;

&lt;p&gt;This is Day 1 of a public build log. No fluff. Just what I'm building, how it works, and what breaks along the way.&lt;/p&gt;

&lt;p&gt;What I'm Building&lt;/p&gt;

&lt;p&gt;An autonomous AI agent that runs entirely on an Android phone. You give it a command in plain English:&lt;/p&gt;

&lt;p&gt;· "Open WhatsApp and message Mom I'll call later."&lt;br&gt;
· "Search for Kotlin jobs on Wellfound."&lt;br&gt;
· "Open my notes and summarize what I wrote yesterday."&lt;/p&gt;

&lt;p&gt;The agent parses the command, plans the steps, and executes them—opening apps, finding the right buttons, typing text, hitting send. No cloud. No API keys. Just a phone that acts on your behalf.&lt;/p&gt;

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

&lt;p&gt;Component Tool&lt;br&gt;
AI Brain Gemma 4 E4B (local, via Ollama)&lt;br&gt;
Runtime Termux (Linux on Android)&lt;br&gt;
Phone Control ADB + UI Automator&lt;br&gt;
Orchestration Python&lt;/p&gt;

&lt;p&gt;Why This Matters&lt;/p&gt;

&lt;p&gt;Most AI agents live in the cloud. They need internet, APIs, and someone else's server. A local agent that runs on a phone means:&lt;/p&gt;

&lt;p&gt;· Privacy: your data never leaves your device.&lt;br&gt;
· Offline: works even without internet.&lt;br&gt;
· Accessible: built for the device billions of people already own.&lt;/p&gt;

&lt;p&gt;The Hard Parts I Already See&lt;/p&gt;

&lt;p&gt;· The agent needs to "see" the screen to know where to tap. Text detection is doable. Image-based buttons are harder.&lt;br&gt;
· Multi-step tasks need verification. If one tap misses, the whole chain fails.&lt;br&gt;
· Android permissions. ADB requires developer mode. A user-facing version would need a workaround.&lt;/p&gt;

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

&lt;p&gt;· Day 2: Create the repo. Set up the project structure. Push the first working script.&lt;br&gt;
· Day 3: Get screen text detection working with OCR.&lt;br&gt;
· Day 4: Test a full 3-step task.&lt;/p&gt;

&lt;p&gt;This is Day 1. The repo goes live tomorrow. Follow along if you want to see something rare get built from scratch.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>android</category>
      <category>automation</category>
      <category>gemma</category>
    </item>
    <item>
      <title>My Gemma 4 Phone Setup Is Now on GitHub</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sat, 06 Jun 2026 16:48:10 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/my-gemma-4-phone-setup-is-now-on-github-13j4</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/my-gemma-4-phone-setup-is-now-on-github-13j4</guid>
      <description>&lt;p&gt;A while back, I wrote a guide on running Gemma 4 locally on an Android phone using Termux and Ollama. It got some traction. People asked for the code.&lt;/p&gt;

&lt;p&gt;There wasn't much code to share—just a setup script and documentation. But I realized that's still worth putting in one place.&lt;/p&gt;

&lt;p&gt;So I did.&lt;/p&gt;

&lt;p&gt;What's in the Repo&lt;/p&gt;

&lt;p&gt;github.com/Dexter2344/gemma4-phone-setup&lt;/p&gt;

&lt;p&gt;· A README explaining the whole project and linking back to the original guide&lt;br&gt;
· A setup.sh script that automates the install process in Termux&lt;br&gt;
· Clear instructions so anyone can replicate what I built&lt;/p&gt;

&lt;p&gt;Why This Matters to Me&lt;/p&gt;

&lt;p&gt;When I wrote the original post, I was just documenting what I learned. I didn't think of it as a "project." But putting it on GitHub changes how I see my own work. It's not just a tutorial anymore. It's a reference. Something someone can clone, run, and build on.&lt;/p&gt;

&lt;p&gt;What Else I've Been Building&lt;/p&gt;

&lt;p&gt;I also shipped a RAG pipeline that runs entirely on a phone—native API calls, persistent memory, upgraded to Gemma 4 E4B. That one has real Python code, a proper README, and setup instructions:&lt;/p&gt;

&lt;p&gt;github.com/Dexter2344/rag-pipeline-phone&lt;/p&gt;

</description>
      <category>github</category>
      <category>ai</category>
      <category>opensource</category>
      <category>software</category>
    </item>
    <item>
      <title>My Phone AI Pipeline Was a Prototype. Now It's a Real Project.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Thu, 04 Jun 2026 18:45:18 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/my-phone-ai-pipeline-was-a-prototype-now-its-a-real-project-17a6</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/my-phone-ai-pipeline-was-a-prototype-now-its-a-real-project-17a6</guid>
      <description>&lt;p&gt;Three upgrades, one repo, and a promise kept.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I wrote about building a RAG pipeline on my phone. It worked. Barely.&lt;/p&gt;

&lt;p&gt;I used subprocess calls to talk to Ollama. Every time I restarted Termux, the bot forgot everything we'd discussed. And I was running the smallest Gemma 4 variant because I was scared the bigger one would crash my device.&lt;/p&gt;

&lt;p&gt;I promised I'd rebuild it. Today, that rebuild is live.&lt;/p&gt;

&lt;p&gt;What Changed&lt;/p&gt;

&lt;p&gt;Three things I said I'd fix and actually fixed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Native API Instead of Subprocess&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My original code shelled out to Ollama using Python's subprocess module. It worked, but it was janky. The new version uses Ollama's native REST API via requests.post(). Cleaner code. Fewer moving parts. Proper error handling. The model now returns structured JSON instead of raw text I had to parse.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Persistent Memory Across Sessions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This was the big one. My old pipeline had amnesia. Restart Termux, lose everything.&lt;/p&gt;

&lt;p&gt;Now there's a chat_memory.json file that stores a rolling summary of past conversations. The pipeline injects that memory into every prompt, so the model remembers what we talked about even across restarts. If you type memory in the interactive mode, it shows your conversation history.&lt;/p&gt;

&lt;p&gt;It's not a vector database for memory. It's a lightweight JSON log. But it works on a phone without eating RAM. That's the engineering tradeoff.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upgraded to Gemma 4 E4B&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I was running E2B (2.3B params) because I assumed my phone couldn't handle more. I was wrong. The E4B (4.5B params) fits comfortably with quantization. The reasoning quality jump is noticeable especially on multi-step questions where the old model would lose the thread.&lt;/p&gt;

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

&lt;p&gt;Everything is on GitHub now:&lt;/p&gt;

&lt;p&gt;github.com/Dexter2344&lt;/p&gt;

&lt;p&gt;The README explains how to set it up, what dependencies you need, and how to run it. If you've got Termux on Android, you can clone it and have your own offline AI running in under 30 minutes.&lt;/p&gt;

&lt;p&gt;What's Still Hard&lt;/p&gt;

&lt;p&gt;Let me be honest about what I haven't solved:&lt;/p&gt;

&lt;p&gt;· The phone still heats up after 20+ minutes of continuous inference. Thermal throttling is real.&lt;br&gt;
· Android will kill the Ollama process if you switch apps for too long. I haven't found a workaround yet.&lt;br&gt;
· The embedding model is still my lightweight hashing approach, not a real transformer. That's next on the list.&lt;/p&gt;

&lt;p&gt;Why This Matters&lt;/p&gt;

&lt;p&gt;Every time I publish one of these, someone reaches out and says "I didn't know you could do that from a phone." That's the whole point. You don't need a $2,000 laptop or cloud credits to build real AI systems. You need curiosity, patience, and a willingness to break things.&lt;/p&gt;

&lt;p&gt;The code is free. The repo is public. Go build something.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>rag</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>I Took a Break. Here's What I Learned About Burnout as a Student Developer.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Wed, 03 Jun 2026 11:27:49 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/i-took-a-break-heres-what-i-learned-about-burnout-as-a-student-developer-2io6</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/i-took-a-break-heres-what-i-learned-about-burnout-as-a-student-developer-2io6</guid>
      <description>&lt;p&gt;I disappeared for three weeks.&lt;/p&gt;

&lt;p&gt;No posts. No commits. No "learning in public" tweets. Just silence.&lt;/p&gt;

&lt;p&gt;If you've been following my journey, you know I've been grinding hard—building AI pipelines on a phone, writing due diligence reports, trading forex, hunting for internships, and carrying 7 courses at UNIZIK. I was shipping every week. Until I wasn't.&lt;/p&gt;

&lt;p&gt;This post isn't a tutorial. It's what I learned from hitting a wall and actually stepping back.&lt;/p&gt;

&lt;p&gt;The Warning Signs I Ignored&lt;/p&gt;

&lt;p&gt;I didn't wake up one day and decide to stop. It crept in. First, I stopped replying to messages as fast. Then I started doom scrolling instead of coding. Then a whole week went by and I hadn't opened Termux or written a single line.&lt;/p&gt;

&lt;p&gt;I told myself I was just tired. I'd bounce back tomorrow. Tomorrow turned into three weeks.&lt;/p&gt;

&lt;p&gt;Looking back, the signs were there:&lt;/p&gt;

&lt;p&gt;· I'd open my code editor and feel nothing. No excitement. No curiosity. Just blank.&lt;br&gt;
· I was working on 7 different things—Substack, Dev.to, forex, cold outreach, internship apps, school, AI projects—and none of them were getting my full attention.&lt;br&gt;
· I started comparing myself to every other developer I saw online. A guy in my department earns $2,700/month from a US company. Instead of motivating me, it made me feel behind.&lt;/p&gt;

&lt;p&gt;What the Break Actually Taught Me&lt;/p&gt;

&lt;p&gt;The guilt was the worst part. Every day I didn't post, I felt like I was losing momentum. Like I was letting myself down. Like three weeks of silence would undo months of work.&lt;/p&gt;

&lt;p&gt;But here's what I realized: the work was still there when I came back.&lt;/p&gt;

&lt;p&gt;My Substack posts were still live. My Dev.to articles were still getting reads. The Gemma 4 challenge entry was still competing. My portfolio didn't vanish because I took a break. It waited for me.&lt;/p&gt;

&lt;p&gt;What I'm Doing Differently Now&lt;/p&gt;

&lt;p&gt;I'm not coming back to the same grind. I'm coming back with rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;One platform per day. Not all three. Monday is Substack. Wednesday is Dev.to. Friday is X. The others get rest.&lt;/li&gt;
&lt;li&gt;No more 7-way multitasking. I pick two priorities max per week. This week: Substack comeback post + one Wellfound application. That's it.&lt;/li&gt;
&lt;li&gt;Rest is part of the schedule, not a punishment. I used to feel guilty for watching a movie or playing a game. Now I know those moments are what keep the engine from exploding.&lt;/li&gt;
&lt;li&gt;Comparison is a compass, not a weapon. That guy earning $2,700? He's proof the path exists. He's not proof that I'm failing. There's a difference.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What I'm Building Next&lt;/p&gt;

&lt;p&gt;I'm revisiting my local AI pipeline—the RAG system I built on my phone using Gemma 4. Google dropped an update while I was gone, and the new model variants fix some of the exact pain points I hit in my original build. Smaller footprint. Better context handling. Apache 2.0 license.&lt;/p&gt;

&lt;p&gt;I'll be documenting the rebuild. Not as a perfect tutorial. As a real, messy, "let me figure this out" series.&lt;/p&gt;

&lt;p&gt;If You're in the Dip Right Now&lt;/p&gt;

&lt;p&gt;You're not lazy. You're not falling behind. You're just human, and humans need rest.&lt;/p&gt;

&lt;p&gt;The code will still be there. The portfolio will still be there. The opportunities will still be there. Take the break before the break takes you.&lt;/p&gt;

&lt;p&gt;See you in the next post. 🚀&lt;/p&gt;

</description>
      <category>burnout</category>
      <category>learning</category>
      <category>softwareengineering</category>
      <category>nigeria</category>
    </item>
    <item>
      <title>Revisiting My Phone AI After Gemma 4: The Upgrade I Didn't Know I Needed</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sun, 24 May 2026 23:02:27 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/revisiting-my-phone-ai-after-gemma-4-the-upgrade-i-didnt-know-i-needed-51i6</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/revisiting-my-phone-ai-after-gemma-4-the-upgrade-i-didnt-know-i-needed-51i6</guid>
      <description>&lt;p&gt;Two weeks ago, I built a RAG pipeline on my phone. Termux. Gemma 4 E2B. A Python script that took my lecture notes and turned them into a private AI tutor I could interrogate offline. It worked. It was slow. It was fragile. But it worked.&lt;/p&gt;

&lt;p&gt;Then Google dropped an entire family update, and I realized I'd been running the equivalent of a beta test.&lt;/p&gt;

&lt;p&gt;After digging through the architecture docs and benchmarks that have come out since the release, I revisited my original build to answer one question: if I were starting fresh today, what would I actually do differently?&lt;/p&gt;

&lt;p&gt;What's New Under the Hood&lt;/p&gt;

&lt;p&gt;The Gemma 4 family now has four variants, and the architecture decisions baked into them directly address the pain points I hit in my original build .&lt;/p&gt;

&lt;p&gt;The E2B model I used runs on something called Per-Layer Embeddings (PLE). Instead of one massive lookup table sitting at the start of the model eating up RAM, PLE distributes compressed mini-lookups across every decoder layer . The result is a 2.3B effective parameter model that fits in under 1.5GB of RAM with aggressive quantization . On a phone with 4GB RAM, that's the difference between a model that runs and one that crashes mid-inference.&lt;/p&gt;

&lt;p&gt;The context window on my E2B was 128K tokens. That was enough for one textbook chapter, but not a full semester. The new 26B MoE and 31B Dense variants push to 256K—enough to drop an entire codebase or all seven of my course materials into a single prompt . And they achieved this without the quality cliff that plagued earlier long-context attempts, scoring 66.4% on the RULER benchmark compared to Gemma 3's 13.5% .&lt;/p&gt;

&lt;p&gt;But the single biggest change? The license. Gemma 4 is now Apache 2.0 . No usage restrictions. No commercial ambiguity. I can build a product on this and sell it without a lawyer on retainer. That's not a technical detail—that's a business unlock.&lt;/p&gt;

&lt;p&gt;What I'd Build Differently Today&lt;/p&gt;

&lt;p&gt;My original RAG pipeline was a single Python script with hardcoded file paths and no persistent memory. Every time I restarted Termux, it forgot everything. If I were rebuilding today, here's what I'd change:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I'd use Ollama's native API instead of spawning subprocesses.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My original build shelled out to Ollama via Python's subprocess module. It worked, but it was janky. The proper approach—documented in the Haystack cookbook—is to use OllamaChatGenerator directly with think=False for RAG queries, which disables extended reasoning to keep answers fast . Cleaner code. Fewer moving parts.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I'd add persistent memory across sessions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One of the best technical breakdowns I found is a guide to adding genuine cross-session memory to a local AI setup using LM Studio and a plugin called Big RAG . The concept is simple: maintain a chat_memory.json file that stores summaries of past interactions, and inject them into the prompt alongside retrieved document chunks. The implementation involves modifying a promptPreprocessor.ts file to pull recent conversation history and past session summaries before assembling the final prompt . If I were rebuilding my phone pipeline, I'd port this concept to Python—a simple JSON file that remembers what I've asked across sessions. The code wouldn't be trivial, but the principle is sound.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I'd target the E4B model instead of E2B.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The E4B has 4.5B effective parameters and fits in 4-6GB of RAM . On a phone with 8GB RAM, that leaves room for the OS and background apps while delivering meaningfully better reasoning than the E2B I used. The hardware decision tree from the Dev.to comparison piece is clear: if you're on mobile, go E2B. If you're on a laptop CPU, go E4B . For my use case—a dedicated Android device running Termux—the E4B is the sweet spot.&lt;/p&gt;

&lt;p&gt;What's Still Hard&lt;/p&gt;

&lt;p&gt;Let me be honest about what hasn't changed. Running any model locally on a phone generates heat. After 20 minutes of continuous inference, my device throttles. Android's memory management is aggressive—if you switch away from Termux for too long, the OS kills the Ollama process. And the setup isn't plug-and-play. You're compiling packages, configuring webhooks, debugging Python scripts in a terminal on a 6-inch screen.&lt;/p&gt;

&lt;p&gt;That friction is real. But so is the payoff: a private AI that runs offline, costs nothing per query, and doesn't send your data anywhere.&lt;/p&gt;

&lt;p&gt;The Bigger Picture&lt;/p&gt;

&lt;p&gt;Gemma 4's Apache 2.0 license signals something important: Google is serious about local-first, commercially-viable open models . They're not just releasing a research artifact. They're releasing infrastructure for builders who can't afford cloud API bills.&lt;/p&gt;

&lt;p&gt;For anyone building in Nigeria, India, Brazil—anywhere the internet is unreliable or expensive this matters. The tools are getting smaller, faster, and legally safer to build on.&lt;/p&gt;

&lt;p&gt;I'm rebuilding my pipeline this week. E4B. Persistent memory. Native API calls. I'll report back with what breaks.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gemma</category>
      <category>mobile</category>
      <category>rag</category>
    </item>
    <item>
      <title>Two weeks ago, I built a private AI brain on my phone using Gemma 4. Yesterday, Google dropped a new variant that made everything I built feel like a beta test. 256M parameters. MoE architecture. Apache 2.0 license. I broke down what changed and why it mat</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sun, 24 May 2026 22:52:36 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/two-weeks-ago-i-built-a-private-ai-brain-on-my-phone-using-gemma-4-yesterday-google-dropped-a-4cl1</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/two-weeks-ago-i-built-a-private-ai-brain-on-my-phone-using-gemma-4-yesterday-google-dropped-a-4cl1</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/google-just-made-gemma-4-feel-like-a-beta-test-heres-the-real-upgrade-9nc" class="crayons-story__hidden-navigation-link"&gt;Google Just Made Gemma 4 Feel Like a Beta Test. Here's the Real Upgrade.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/okeke_chukwudubem_5f3bf49/google-just-made-gemma-4-feel-like-a-beta-test-heres-the-real-upgrade-9nc" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Gemma 4 Challenge: Write about Gemma 4 Submission&lt;/p&gt;

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

          &lt;a href="/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.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-3743722" 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.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/google-just-made-gemma-4-feel-like-a-beta-test-heres-the-real-upgrade-9nc" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 24&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/google-just-made-gemma-4-feel-like-a-beta-test-heres-the-real-upgrade-9nc" id="article-link-3743722"&gt;
          Google Just Made Gemma 4 Feel Like a Beta Test. Here's the Real Upgrade.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gemmachallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gemmachallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/google"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;google&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/rag"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;rag&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/nigeria"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;nigeria&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/google-just-made-gemma-4-feel-like-a-beta-test-heres-the-real-upgrade-9nc" 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/google-just-made-gemma-4-feel-like-a-beta-test-heres-the-real-upgrade-9nc#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;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

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

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Google Just Made Gemma 4 Feel Like a Beta Test. Here's the Real Upgrade.</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Sun, 24 May 2026 22:49:44 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/google-just-made-gemma-4-feel-like-a-beta-test-heres-the-real-upgrade-9nc</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/google-just-made-gemma-4-feel-like-a-beta-test-heres-the-real-upgrade-9nc</guid>
      <description>&lt;p&gt;Two weeks ago, I wrote about building a private AI brain on my phone using Gemma 4. It was wild—a full RAG pipeline running locally via Termux and Ollama, serving context-aware answers from my lecture notes. No cloud. No API keys. Just a phone and a stubborn refusal to accept that AI development requires a data center.&lt;/p&gt;

&lt;p&gt;Then Google dropped an update that made everything I built feel like version 0.1.&lt;/p&gt;

&lt;p&gt;They didn't release a new model. They released a correction. And it's the most developer-friendly move they've made in months.&lt;/p&gt;

&lt;p&gt;What Actually Dropped&lt;/p&gt;

&lt;p&gt;Google just released Gemma 4 256M, a new variant in the Gemma 4 family. At 256 million parameters, it's even smaller than the Slim variant I covered in my last post. It's designed for edge devices, phones, Raspberry Pi boards—the hardware developers in constrained environments actually have access to.&lt;/p&gt;

&lt;p&gt;But the real story isn't the size. It's the architecture decisions baked into this release.&lt;/p&gt;

&lt;p&gt;First, it uses a Mixture-of-Experts (MoE) design, where only a fraction of the model's total parameters are active at any given time. This means it delivers reasoning quality that punches far above its weight class while keeping memory usage and latency low. For a phone with 4GB of RAM, this is the difference between a model that runs and a model that crashes.&lt;/p&gt;

&lt;p&gt;Second, the context window is 32K tokens. That's enough to drop in a full semester's lecture notes, a complete contract, or an entire codebase. On a 256M model. Running locally. On a phone.&lt;/p&gt;

&lt;p&gt;Third—and this is the part that matters most to developers like me—they released it under Apache 2.0. No custom license. No "research only" restrictions. You can build. You can modify. You can commercialize. You can deploy. This is the license developers have been begging for.&lt;/p&gt;

&lt;p&gt;Why This Matters More Than Benchmarks&lt;/p&gt;

&lt;p&gt;The AI industry is obsessed with benchmarks. Can the model score 90% on some math dataset? Can it beat GPT on a reasoning test? That's noise for people building in the real world.&lt;/p&gt;

&lt;p&gt;What matters is: can it run on the hardware I actually have? Can I deploy it without paying per token? Can I build a business on it without a lawyer reviewing the license?&lt;/p&gt;

&lt;p&gt;Gemma 4 256M answers all three questions with a yes. And that's rarer than a high benchmark score.&lt;/p&gt;

&lt;p&gt;What I'm Building Next&lt;/p&gt;

&lt;p&gt;With this new variant, I'm revisiting my RAG pipeline. The smaller model footprint means I can load more documents into memory simultaneously. The 32K context means longer source materials get processed in fewer chunks. The Apache license means I can think about commercial applications without anxiety.&lt;/p&gt;

&lt;p&gt;I'm prototyping a version of my study assistant that can hold an entire semester's course materials in context at once—not just one PDF at a time, but all seven courses I'm taking this semester. Offline. On a phone. With zero cloud costs.&lt;/p&gt;

&lt;p&gt;That's the promise of local AI. Not beating benchmarks. Building things that work where the cloud doesn't reach.&lt;/p&gt;

&lt;p&gt;The Bigger Picture&lt;/p&gt;

&lt;p&gt;Google's move signals something important. The market for AI isn't just cloud APIs sold to enterprises. It's also edge devices, offline environments, and developers in places where internet is unreliable or expensive. The Apache 2.0 license tells you they're serious about the second market.&lt;/p&gt;

&lt;p&gt;For anyone building in Nigeria, India, Brazil, Southeast Asia—anywhere the cloud has never been a reliable partner—this matters. The tools are getting smaller, faster, and legally safer to build on.&lt;/p&gt;

&lt;p&gt;The walled gardens of proprietary AI are growing taller. But the open-source, local-first garden just got a new tree. And it's bearing fruit.&lt;br&gt;
I&lt;/p&gt;

</description>
      <category>gemmachallenge</category>
      <category>google</category>
      <category>rag</category>
      <category>nigeria</category>
    </item>
    <item>
      <title>Pointers in C: The Concept That Almost Broke Me (And How I Finally Got It)</title>
      <dc:creator>Okeke Chukwudubem</dc:creator>
      <pubDate>Thu, 14 May 2026 23:16:51 +0000</pubDate>
      <link>https://dev.to/okeke_chukwudubem_5f3bf49/pointers-in-c-the-concept-that-almost-broke-me-and-how-i-finally-got-it-52nl</link>
      <guid>https://dev.to/okeke_chukwudubem_5f3bf49/pointers-in-c-the-concept-that-almost-broke-me-and-how-i-finally-got-it-52nl</guid>
      <description>&lt;p&gt;Some concepts in programming slide into your brain smoothly. You read the definition, look at an example, and think, "Okay, I get it."&lt;/p&gt;

&lt;p&gt;Pointers are not that concept.&lt;/p&gt;

&lt;p&gt;For weeks, pointers felt like a wall I couldn't climb. Every explanation sounded the same: "A pointer stores a memory address." Cool. But why? When? What problem does this actually solve?&lt;/p&gt;

&lt;p&gt;This post is for anyone staring at int *ptr and wondering if they're just not cut out for this. You are. The problem isn't you. The problem is that most explanations skip the "why" and jump straight to the syntax.&lt;/p&gt;

&lt;p&gt;The Real Question: Why Do Pointers Exist?&lt;/p&gt;

&lt;p&gt;Imagine you're a chef. You have a recipe book (your program) and a kitchen full of ingredients (your computer's memory).&lt;/p&gt;

&lt;p&gt;Without pointers, every time a function needs an ingredient, you photocopy the entire recipe and hand over a duplicate of everything. Need to modify one onion? Here's a copy of the whole kitchen. This is slow, wasteful, and the original onion stays untouched.&lt;/p&gt;

&lt;p&gt;With pointers, you don't hand over a copy. You hand over a note with the exact shelf and position where the onion lives. The function goes straight to the source, works on the original onion, and leaves.&lt;/p&gt;

&lt;p&gt;That's what pointers do. They pass addresses instead of copies.&lt;/p&gt;

&lt;p&gt;The Syntax Demystified&lt;/p&gt;

&lt;p&gt;Let's break down the three things that confused me the most.&lt;/p&gt;

&lt;p&gt;int x = 10; — This is a normal variable. It holds a value.&lt;/p&gt;

&lt;p&gt;int *ptr = &amp;amp;x; — This is a pointer. &amp;amp;x means "give me the address of x." *ptr means "ptr is a variable that stores an address." So ptr now holds the memory location where x lives.&lt;/p&gt;

&lt;p&gt;*ptr = 20; — This is dereferencing. *ptr means "go to the address stored in ptr and access the value there." So this line changes x to 20 without ever typing x.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// ptr holds the address of x&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// x is now 20&lt;/span&gt;
&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// prints 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Moment It Clicked&lt;/p&gt;

&lt;p&gt;It didn't click from reading. It clicked when I wrote a tiny, useless program and watched it fail.&lt;/p&gt;

&lt;p&gt;I tried to write a function that swaps two numbers. Without pointers, nothing happened. The values stayed the same. With pointers, the swap worked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This does NOT work&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// This works&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;swap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&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;p&gt;The first version copies the values. The second version goes to the addresses and changes the originals. That was the moment. Not elegant theory. A broken function that pointers fixed.&lt;/p&gt;

&lt;p&gt;What I'd Tell My Past Self&lt;/p&gt;

&lt;p&gt;Stop trying to memorize the syntax. Write a program that breaks. Use pointers to fix it. The understanding doesn't come from reading. It comes from watching your program fail and knowing exactly why pointers would have saved it.&lt;/p&gt;

&lt;p&gt;You're not bad at this. Pointers are just one of those things that takes longer to click than the tutorials admit.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>beginners</category>
      <category>softwareengineering</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
