<?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: yousu.be</title>
    <description>The latest articles on DEV Community by yousu.be (@splmdny).</description>
    <link>https://dev.to/splmdny</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%2F575606%2F80e1198a-7436-4b43-96f4-2757d6f6bb82.jpeg</url>
      <title>DEV Community: yousu.be</title>
      <link>https://dev.to/splmdny</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/splmdny"/>
    <language>en</language>
    <item>
      <title>Sarah... Always Forget What She Said Before, So I build "PromiseKeeper" for Her</title>
      <dc:creator>yousu.be</dc:creator>
      <pubDate>Mon, 05 Oct 2026 00:59:13 +0000</pubDate>
      <link>https://dev.to/splmdny/sarah-always-forget-what-she-said-before-so-i-build-promisekeeper-for-her-2l0n</link>
      <guid>https://dev.to/splmdny/sarah-always-forget-what-she-said-before-so-i-build-promisekeeper-for-her-2l0n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built PromiseKeeper for that friend who always says “&lt;em&gt;Sure, I’ll do it&lt;/em&gt;” and then forgets about it.&lt;br&gt;
The idea is pretty simple: instead of manually creating a task, you just write what happened in a conversation.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Sarah asked me to review her portfolio this weekend. I told her I’d do it by Sunday.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;PromiseKeeper picks out the important parts and saves them. Later, you can ask:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“What did I promise Sarah?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And it reminds you.&lt;/p&gt;


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

&lt;p&gt;&lt;a href="https://promisekeeper-q0l3.onrender.com/" rel="noopener noreferrer"&gt;https://promisekeeper-q0l3.onrender.com/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

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


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

&lt;p&gt;The app is built with Next.js, MongoDB Atlas, Gemma 4 31B IT, DigitalOcean Serverless Inference, and Render.&lt;/p&gt;

&lt;p&gt;This was actually my first time using both Gemma and DigitalOcean Serverless Inference, so I wanted to keep the implementation straightforward and focus on getting a working product rather than over-engineering it.&lt;/p&gt;

&lt;p&gt;The interesting part is how the pieces work together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemma 4 31B IT understands natural-language conversations and extracts promises into structured data.&lt;/li&gt;
&lt;li&gt;MongoDB Atlas acts as the app's long-term memory for storing promises and their context.&lt;/li&gt;
&lt;li&gt;DigitalOcean Serverless Inference provides access to Gemma without needing to manage my own GPU infrastructure.&lt;/li&gt;
&lt;li&gt;Next.js API routes keep the AI and database operations on the server, so API keys aren't exposed to the browser.&lt;/li&gt;
&lt;li&gt;Render handles the deployment, and getting the full-stack app online was surprisingly quick.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I intentionally kept the architecture simple so the AI is solving the actual problem instead of adding unnecessary complexity.&lt;/p&gt;


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

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

&lt;p&gt;The user flow is intentionally simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tell PromiseKeeper what happened&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user writes something naturally, for example:&lt;/p&gt;

&lt;p&gt;“Andi asked me to help choose his new laptop this weekend.”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gemma extracts the promise&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemma turns the message into structured information:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Person: Andi&lt;br&gt;
Promise: Help choose a new laptop&lt;br&gt;
Deadline: This weekend&lt;br&gt;
Status: Open&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Confirm and save&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The user reviews the result and confirms it. The promise is then stored in MongoDB Atlas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ask your memory later&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The user can come back and ask:&lt;/p&gt;

&lt;p&gt;“What did I promise Andi?”&lt;/p&gt;

&lt;p&gt;PromiseKeeper searches the user's saved promises and uses Gemma to generate an answer based on those memories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mark it complete&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the promise is fulfilled, the user can mark it as completed.&lt;/p&gt;

&lt;p&gt;So the whole loop is basically:&lt;/p&gt;
&lt;h4&gt;
  
  
  Write what happened → AI understands it → Save the promise → Ask about it later → Keep your promises
&lt;/h4&gt;


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

&lt;p&gt;For me, Gemma isn't just a chatbot added to the project. It's the part that makes PromiseKeeper useful.&lt;/p&gt;

&lt;p&gt;Using an open-weight model gives me more flexibility in how and where the AI runs. I can use serverless inference today, but the application isn't fundamentally tied to one closed AI provider.&lt;/p&gt;

&lt;p&gt;That makes it easier to experiment, self-host, or change the inference setup as the project grows.&lt;/p&gt;


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


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Gemini CLI"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building PromiseKeeper: an AI memory for commitments&lt;/span&gt;
  &lt;/div&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Build a polished PromiseKeeper MVP: an AI memory for promises, using Next.js, MongoDB Atlas, and Gemma through DigitalOcean.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Implemented a complete PromiseKeeper MVP with a responsive dashboard, anonymous browser-scoped user IDs, editable promise extraction, MongoDB persistence, grounded memory questions, status updates, validation, rate limiting, health checks, and server-only environment variables.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Gemma returned HTTP 402 and asking memory failed.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Diagnosed HTTP 402 as DigitalOcean Serverless Inference billing or balance suspension. Added safe local fallbacks for extraction and grounded memory answers so the app remains usable while Gemma is unavailable.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Render could not save promises.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Improved MongoDB connection handling for Render with runtime environment lookup, bounded connection timeouts, retryable connection state, safe server logs, health diagnostics, and deployment documentation covering Render variables and MongoDB Atlas network access.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Update the UI: remove demo controls, restore placeholder-only Person and Deadline fields, and replace the header logo with the supplied pinky-promise hands image.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Removed demo controls, restored blank controlled inputs with muted placeholders, added the supplied local promise-hands.png asset, and updated the PromiseKeeper header logo. Lint, typecheck, and production build passed.&lt;/p&gt;

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

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





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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;li&gt;Best Use of MongoDB Atlas&lt;/li&gt;
&lt;li&gt;Best Use of DigitalOcean&lt;/li&gt;
&lt;li&gt;Best Use of Render&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>So, I Built a Production-Minded Gemini App in Under 12 Hours, I Call It "PriceBack"</title>
      <dc:creator>yousu.be</dc:creator>
      <pubDate>Sun, 06 Sep 2026 15:29:49 +0000</pubDate>
      <link>https://dev.to/splmdny/so-i-built-a-production-minded-gemini-app-in-under-12-hours-i-call-it-priceback-301k</link>
      <guid>https://dev.to/splmdny/so-i-built-a-production-minded-gemini-app-in-under-12-hours-i-call-it-priceback-301k</guid>
      <description>&lt;p&gt;A few days ago, I had a simple thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I know my groceries are getting more expensive… but what actually got more expensive?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I definitely wasn't going to dig through months of receipts to find out.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;PriceBack&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It turns your old shopping receipts into a personal price history, so you can see what changed, what got more expensive, and even what quietly got smaller.&lt;/p&gt;

&lt;p&gt;And I built the first working version in less than 12 hours with Google AI Studio.&lt;/p&gt;

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

&lt;p&gt;How it works&lt;/p&gt;

&lt;p&gt;The flow is pretty simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Upload a receipt&lt;/strong&gt;&lt;br&gt;
Take a photo or upload an old receipt. Old receipts are actually useful because they give PriceBack something historical to compare against.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Gemini reads it&lt;/strong&gt;&lt;br&gt;
It extracts the products, prices, quantities, brands, and package sizes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. You check the result&lt;/strong&gt;&lt;br&gt;
AI isn't always right, so nothing is blindly saved. You can edit the extracted products before confirming them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. PriceBack remembers&lt;/strong&gt;&lt;br&gt;
After a few receipts, you start getting an actual price history:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Eggs&lt;br&gt;
March       $4.19&lt;br&gt;
June        $4.55&lt;br&gt;
September   $4.89&lt;br&gt;
↑ 16.7%&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;h2&gt;
  
  
  My favorite feature: Shrinkflation Detective
&lt;/h2&gt;

&lt;p&gt;Price increases aren't always obvious.&lt;/p&gt;

&lt;p&gt;Sometimes this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;8 oz — $4.49&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;quietly becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;7 oz — $4.49&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same price. Less product.&lt;/p&gt;

&lt;p&gt;PriceBack compares package sizes and unit prices to catch those changes.&lt;/p&gt;

&lt;p&gt;Same price. Less product. Caught.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  You can also ask your receipts with Gemini AI
&lt;/h2&gt;

&lt;p&gt;I added Ask PriceBack, where you can ask things like:&lt;/p&gt;

&lt;p&gt;“What got more expensive?”&lt;/p&gt;

&lt;p&gt;“Why did I spend more this month?”&lt;/p&gt;

&lt;p&gt;“Where did I buy eggs cheapest?”&lt;/p&gt;

&lt;p&gt;“Did anything get smaller?”&lt;/p&gt;

&lt;p&gt;Instead of being a generic chatbot, the answers come from the shopping history you've added to your account.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Built with AI, but I still control the code
&lt;/h2&gt;

&lt;p&gt;This was one of my favorite things about building with Google AI Studio.&lt;/p&gt;

&lt;p&gt;I could get from idea → working application incredibly quickly, but I'm not stuck inside a no-code editor.&lt;/p&gt;

&lt;p&gt;I can open the project, edit the code manually, change components, debug things, refactor it, and continue building normally.&lt;/p&gt;

&lt;p&gt;AI helped me move much faster, but I still have control over what I'm building.&lt;/p&gt;

&lt;p&gt;The app uses Gemini + Firebase Authentication + Firestore, with each user's receipts and price history kept separate.&lt;/p&gt;

&lt;p&gt;Less than 12 hours later...&lt;/p&gt;

&lt;p&gt;I went from:&lt;/p&gt;

&lt;p&gt;“I wish I remembered how much this used to cost.”&lt;/p&gt;

&lt;p&gt;to an app that can actually answer that question.&lt;/p&gt;

&lt;p&gt;There's still plenty I want to improve, but that's also why I like having access to the actual code.&lt;/p&gt;

&lt;p&gt;You can try the demo here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://priceback.ai.studio/" rel="noopener noreferrer"&gt;PriceBack Live Demo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>accelerateaiwithcloudrun</category>
      <category>gemini</category>
      <category>ai</category>
    </item>
    <item>
      <title>ClickMapper — A Keyboard-Driven Chrome Extension to Eliminate Repetitive Clicks for Content Moderators</title>
      <dc:creator>yousu.be</dc:creator>
      <pubDate>Mon, 16 Feb 2026 07:36:06 +0000</pubDate>
      <link>https://dev.to/splmdny/clickmapper-a-keyboard-driven-chrome-extension-to-eliminate-repetitive-clicks-for-content-9c5</link>
      <guid>https://dev.to/splmdny/clickmapper-a-keyboard-driven-chrome-extension-to-eliminate-repetitive-clicks-for-content-9c5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;ClickMapper&lt;/strong&gt;, a &lt;em&gt;Chrome extension&lt;/em&gt; designed to help content moderators and reviewers work faster by mapping clickable areas on a webpage and triggering actions using keyboard shortcuts.&lt;/p&gt;

&lt;p&gt;I have experience working as a &lt;strong&gt;content moderator/reviewer&lt;/strong&gt;, and one of the biggest pain points in that role is performing repetitive clicks in the same spots over and over again to review content. This becomes mentally exhausting and inefficient over long sessions. I realized it would be much more productive if these actions could be simplified with keyboard controls instead of constant mouse movement.&lt;/p&gt;

&lt;p&gt;There are existing automation tools like AutoHotkey, but in many companies those tools are banned due to security concerns (malware risks, false positives, or policy restrictions). Additionally, those tools are often not beginner-friendly and require scripting knowledge. Because of that gap, I decided to build ClickMapper as a safe, browser-based moderator companion that works within company restrictions while remaining easy to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This project focuses on improving productivity, reducing repetitive strain, and making moderation workflows more efficient without requiring advanced technical setup.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Project Link: &lt;a href="https://github.com/splmdny/chrome_ClickBinding" rel="noopener noreferrer"&gt;github.com/splmdny&lt;/a&gt;&lt;br&gt;
[Update 2/22/26] Official Chrome Store Link: &lt;a href="https://chromewebstore.google.com/detail/dnajkjbjlcbbibijanlpakkfkjgehkak?utm_source=item-share-cb" rel="noopener noreferrer"&gt;https://chromewebstore.google.com/detail/dnajkjbjlcbbibijanlpakkfkjgehka&lt;/a&gt;&lt;br&gt;
Video Demo: &lt;a href="https://youtu.be/s2wMHisA7O8" rel="noopener noreferrer"&gt;https://youtu.be/s2wMHisA7O8&lt;/a&gt;&lt;br&gt;
Screenshots:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz21e8dg25t1seja5mgvw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz21e8dg25t1seja5mgvw.jpg" alt="Step-by-step to use it - 1" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnvkvk8jyfafypdp7klt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnvkvk8jyfafypdp7klt.jpg" alt="Step-by-step to use it - 2" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot CLI played a major role in accelerating development. I used it to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate Chrome Extension Manifest v3 structure&lt;/li&gt;
&lt;li&gt;Scaffold content scripts and background logic&lt;/li&gt;
&lt;li&gt;Quickly prototype DOM-mapping and event-handling functions&lt;/li&gt;
&lt;li&gt;Debug permission issues and refine code patterns&lt;/li&gt;
&lt;li&gt;Explore alternative implementation approaches through prompt-driven iteration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The biggest impact was speed. Instead of spending time searching documentation or writing boilerplate manually, I could describe what I wanted in natural language and iterate rapidly. It felt like having a pair-programming assistant that understood both the architecture and the intent behind the feature.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;However, from my experience, Copilot still requires manual adjustment—especially when creating UI that is truly usable and favorable for the builder’s specific needs. While it can generate good starting points, refining layout, interaction details, and overall user experience still depends on human decisions and iteration.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Copilot CLI also helped reduce context switching, allowing me to stay focused on solving the actual workflow problem for moderators rather than getting stuck on setup details.&lt;/p&gt;

&lt;p&gt;Overall, it significantly improved productivity and made experimentation much easier throughout the build process.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Who’s That Pokémon? – The Twist!</title>
      <dc:creator>yousu.be</dc:creator>
      <pubDate>Mon, 15 Sep 2025 07:06:01 +0000</pubDate>
      <link>https://dev.to/splmdny/whos-that-pokemon-the-twist-26nf</link>
      <guid>https://dev.to/splmdny/whos-that-pokemon-the-twist-26nf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-ai-studio-2025-09-03"&gt;Google AI Studio Multimodal Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;*&lt;em&gt;Who’s That Pokémon? *&lt;/em&gt;– The Twist! is a fun and challenging Pokémon quiz game built with React, TypeScript, and the Google Gemini API.&lt;/p&gt;

&lt;p&gt;Can you guess the Pokémon from its silhouette? Careful—the silhouette might not be the Pokémon you think it is!&lt;/p&gt;

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

&lt;p&gt;GitHub repo: &lt;a href="https://github.com/splmdny/whos-that-pokemon-with-google-ai" rel="noopener noreferrer"&gt;WhosThatPokemon repo&lt;/a&gt;&lt;br&gt;
Google AI studio: &lt;a href="https://aistudio.google.com/apps/drive/1zd5jIM-GQmYnCRM6BdLYrwcn4oDHSXb0?showPreview=true&amp;amp;showAssistant=true&amp;amp;resourceKey=" rel="noopener noreferrer"&gt;WhosThatPokemon&lt;/a&gt;&lt;br&gt;
Image: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrvgi44mnpg869j9jsdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrvgi44mnpg869j9jsdk.png" alt="pokemon beginning" width="710" height="818"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

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

&lt;h2&gt;
  
  
  How I Used Google AI Studio
&lt;/h2&gt;

&lt;p&gt;I leveraged Google Gemini API with multimodal inputs to create the core twist mechanic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gemini-2.5-flash-image-preview → for morphing Pokémon, reshaping one into another’s silhouette.&lt;/li&gt;
&lt;li&gt;gemini-2.5-flash → for progressive AI clue generation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app sends multiple modalities (text instructions + Pokémon images) to Gemini:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text Prompt → Explains the morphing rules (e.g., “Take source Pokémon’s colors/texture and apply to silhouette shape”).&lt;/li&gt;
&lt;li&gt;Image 1 → Source Pokémon (for colors and texture).&lt;/li&gt;
&lt;li&gt;Image 2 → Target Pokémon silhouette (for shape).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Output: Gemini processes them together to generate a unique AI morphed Pokémon—a perfect example of multimodality in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multimodal Features
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Image + Text Fusion → Combines text prompts with Pokémon images for morphing.&lt;/li&gt;
&lt;li&gt;AI-Generated Silhouette Morphing → Creates unpredictable twists in gameplay.&lt;/li&gt;
&lt;li&gt;Progressive AI Clue System → AI adapts hints based on player performance.&lt;/li&gt;
&lt;li&gt;Downloadable Artwork → Save and share AI-generated Pokémon creations.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Team
&lt;/h2&gt;

&lt;p&gt;Yusup Almadani&lt;br&gt;
Github : &lt;a href="https://github.com/splmdny" rel="noopener noreferrer"&gt;https://github.com/splmdny&lt;/a&gt;&lt;br&gt;
Website : &lt;a href="https://splmdny.vercel.app/" rel="noopener noreferrer"&gt;https://splmdny.vercel.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>FitThat.Me – AI-Powered Virtual Try-On</title>
      <dc:creator>yousu.be</dc:creator>
      <pubDate>Mon, 15 Sep 2025 06:45:12 +0000</pubDate>
      <link>https://dev.to/splmdny/fitthatme-ai-powered-virtual-try-on-id</link>
      <guid>https://dev.to/splmdny/fitthatme-ai-powered-virtual-try-on-id</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-ai-studio-2025-09-03"&gt;Google AI Studio Multimodal Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;FitThat.Me is an AI-powered virtual dressing room that helps you try on clothes anytime, anywhere — no changing room required.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a full-body photo of yourself.&lt;/li&gt;
&lt;li&gt;Add images of clothing items.&lt;/li&gt;
&lt;li&gt;Instantly see how the outfit fits your style.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This app solves the hassle of online shopping uncertainty and makes it easier for users to visualize outfits before purchase. Whether you’re at home, commuting, or traveling, you can try on clothes on-the-go.&lt;/p&gt;

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

&lt;p&gt;Web deploy: &lt;a href="https://fitthatme.netlify.app/" rel="noopener noreferrer"&gt;https://fitthatme.netlify.app/&lt;/a&gt; (I'm still fixed it, free tier - out of quota)&lt;br&gt;
GitHub repo: &lt;a href="https://github.com/splmdny/fitThat.me" rel="noopener noreferrer"&gt;FitThat.Me repo&lt;/a&gt;&lt;br&gt;
Google AI studio: &lt;a href="https://aistudio.google.com/apps/drive/1It8AbyotR5va0SrcK76uvI0AfueFFWNN?showAssistant=true&amp;amp;resourceKey=&amp;amp;showCode=true" rel="noopener noreferrer"&gt;FitThat.Me&lt;/a&gt;&lt;br&gt;
Image: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpz5bol74vk68ujut0gyc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpz5bol74vk68ujut0gyc.png" alt="fitting processed" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Google AI Studio
&lt;/h2&gt;

&lt;p&gt;I leveraged Google AI Studio with the Gemini 2.5 multimodal APIs to build the try-on experience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gemini 2.5 Flash Image Preview → for image editing &amp;amp; composition, merging clothing onto the user’s uploaded photo.&lt;/li&gt;
&lt;li&gt;Imagen 4.0 Generate 001 → for generating placeholder product images (in case users don’t have high-quality clothing photos).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These APIs made it possible to handle realistic image overlays while keeping the system lightweight and responsive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multimodal Features
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Image Understanding&lt;/strong&gt; → Detects user body shape and clothing alignment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image Editing &amp;amp; Composition&lt;/strong&gt; → Fits clothes naturally onto uploaded photos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Generated Clothing Previews&lt;/strong&gt; → Fills in missing product visuals with AI-generated placeholders.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Together, these multimodal features create a personalized, interactive fitting experience that enhances confidence in styling choices and online shopping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team
&lt;/h2&gt;

&lt;p&gt;Yusup Almadani&lt;br&gt;
Github : &lt;a href="https://github.com/splmdny" rel="noopener noreferrer"&gt;https://github.com/splmdny&lt;/a&gt;&lt;br&gt;
Website : &lt;a href="https://splmdny.vercel.app/" rel="noopener noreferrer"&gt;https://splmdny.vercel.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
