<?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: Anna Villarreal</title>
    <description>The latest articles on DEV Community by Anna Villarreal (@annavi11arrea1).</description>
    <link>https://dev.to/annavi11arrea1</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%2F1467610%2F6ede9a19-775f-483a-b3b8-2bb47e8f954b.jpg</url>
      <title>DEV Community: Anna Villarreal</title>
      <link>https://dev.to/annavi11arrea1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/annavi11arrea1"/>
    <language>en</language>
    <item>
      <title>I Love Watching the Storms Roll In</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Fri, 27 Mar 2026 02:06:12 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/i-love-watching-the-storms-roll-in-166m</link>
      <guid>https://dev.to/annavi11arrea1/i-love-watching-the-storms-roll-in-166m</guid>
      <description>&lt;p&gt;I have always liked the weather radar. First of all, it's rainbow. Second of all, the weather is mysterious and constantly changing. I like the visual aid of seeing what's about to head my way, and making the connection of what the radar looks like versus what is happening outside. I am not a meteorologist. I am a curious observer. I've been building this fun and simple app for myself and to share with students to get them excited about science and weather. Hey it's storm season after all!&lt;/p&gt;

&lt;p&gt;I've included the live stream of one of my favorite storm crew's when they go live - the ya'll squad. I obviously take no credit for any of their videos, but I enjoy shoring it with others. &lt;/p&gt;

&lt;p&gt;I am using publicly available API keys of free services like NOAA/NWS for radar images. I am Using another free one for air quality information. I hope to set up a weather bug or something of the sort so we can have live data for our location, potentially sharing our data for the greater good. This is one of my latest side projects. Just wanted to share the fun colors. &lt;/p&gt;

&lt;p&gt;What weather related apps have you created? I may look into some other radars, but this one is working and I am happy with it for now. If you would like to see the actual site you are welcome to visit it on github pages here: &lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://annavi11arrea1.github.io/school_weather/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;annavi11arrea1.github.io&lt;/span&gt;
          

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


&lt;p&gt;SECRET: Click the "Weather Station" title at the top to use it in your location. Let me know what you think!&lt;/p&gt;

&lt;p&gt;SIDE NOTE: The video only plays when the stream is live. Otherwise, it displays current info.&lt;/p&gt;

</description>
      <category>weather</category>
      <category>webdev</category>
      <category>api</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The Ultimate Job Finding-Management Tool</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Tue, 24 Mar 2026 03:05:20 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/the-ultimate-job-finding-managment-tool-522i</link>
      <guid>https://dev.to/annavi11arrea1/the-ultimate-job-finding-managment-tool-522i</guid>
      <description>&lt;p&gt;I need to go to bed but I want to share my excitement before I crash. I built a tool finally to help me find jobs. I save the description and have ollama check the alignment with my current skills, which gives it a star rating of 1 to 5 stars. This list is then sorted.&lt;/p&gt;

&lt;p&gt;Now I can easily collect relevant jobs and apply to the ones that are most aligned to my skill set!&lt;/p&gt;

&lt;p&gt;This is a chrome extension built quickly with copilot CLI and local ollama. Fighting automation with semi automation! Haha.&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%2Fyqbg6pj249z5f7chbv1p.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%2Fyqbg6pj249z5f7chbv1p.png" alt="Full view" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;
Full view option






&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%2F3d82w0xouc5ibuwxdo6t.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%2F3d82w0xouc5ibuwxdo6t.png" alt="chrome extension" width="475" height="655"&gt;&lt;/a&gt;&lt;/p&gt;
Extension pop-out






&lt;p&gt;This was both fun and exciting! I'm probably not done playing with this, I really like it a lot. I have future plans for sure. &lt;/p&gt;

&lt;p&gt;I love it also because it's neon and fun and completely personalized. &lt;/p&gt;

&lt;p&gt;What do you think? Have you tried something like this?&lt;/p&gt;




&lt;p&gt;Edit 3-25-2026:&lt;/p&gt;

&lt;p&gt;You guys have me so flattered! It convinced me to take action. I made a database version on main and a local storage version on dev which you are welcome to branch/fork and poke at if you really want to lol.&lt;/p&gt;

&lt;p&gt;You guys are literally awesome. Thank you for making my day. &lt;/p&gt;

&lt;p&gt;If you like it, give it a star! &amp;lt;3&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/AnnaVi11arrea1/job_seeker/tree/dev" rel="noopener noreferrer"&gt;Job Seeker Repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webscraping</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Path of Discovery</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Tue, 17 Mar 2026 01:12:55 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/path-of-discovery-1aoi</link>
      <guid>https://dev.to/annavi11arrea1/path-of-discovery-1aoi</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Echoes of Experience&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A bit personal, a bit all over. Sharing pieces of my uncomfortable journey in the working world.&lt;/p&gt;


 
&lt;h3&gt;
  
  
  Illusions of Society
&lt;/h3&gt;

&lt;p&gt;Why is there a glass ceiling if a woman must pay as much as a man for things? &lt;/p&gt;

&lt;p&gt;I make 20% less to my male equivalent, but life expenses are the same (if not more if you include the “pink” tax)  as what the man would pay. In 2023, that number was precisely 21.8 percent &lt;a href="https://www.epi.org/blog/gender-wage-gap-persists-in-2023-women-are-paid-roughly-22-less-than-men-on-average/" rel="noopener noreferrer"&gt;according to this source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I was once told to not get fat because I'm “not married yet”. &lt;/p&gt;

&lt;p&gt;At one of my first jobs, the person that interviewed me told me he thought I was going to be Mexican. Since I look white, you would never guess I was half Mexican.&lt;/p&gt;

&lt;p&gt;At a place where I had training, a peer asked me: “Why would anyone want to hire you? You don’t even have a computer science degree.” I looked at the person, knowing that I had built a computer, repaired many others, and he did not. Everything I knew to that point was largely self-taught. What an arrogant fool. I said nothing, because I had nothing productive to say to him at that moment. &lt;/p&gt;

&lt;p&gt;Does not having a C.S. degree negate the 10 + years of other work experience? Am I completely incompetent because I hold a science degree currently, not in computers? &lt;/p&gt;

&lt;p&gt;I once had an IT position where the clients were often surprised that I was not a man. I was a tomboy as a kid, but sheesh. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.techtarget.com/sustainability/feature/Business-driving-reasons-why-diverse-teams-are-smarter" rel="noopener noreferrer"&gt;This article&lt;/a&gt; briefly summarizes some of the benefits of diversity in the workplace. &lt;/p&gt;

&lt;p&gt;Diversity should be embraced, not avoided.&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%2F15xqans2wnnmzdp2tc1v.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%2F15xqans2wnnmzdp2tc1v.png" alt="woman in a mans world" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  Productivity Buffs
&lt;/h3&gt;

&lt;p&gt;If I must work, I want to do something I like. &lt;/p&gt;

&lt;p&gt;I used to think programming was for some smart people in a distant land way over there —-------------------------------&amp;gt;&lt;/p&gt;

&lt;p&gt;A recent book I read called “How to Think Like a Monk” by Jay Shetty, reminded me that everything is a variable. The only thing that is truly with you your whole life is your breath. If that’s the case, then anything is possible. My current financial status, my relationships, everything, variable.&lt;/p&gt;

&lt;p&gt;There is no task too difficult that cannot be achieved by small, easy to digest steps. (Thank you Monks) This must be how reverse engineers think. &lt;/p&gt;

&lt;p&gt;Reverse engineering. That sounds cool. I purchased a reverse engineering book from the local bookstore and added it to my pile of growing programming books, somewhere between my CompTIA A+ book and SQL Programming Guide. One day.&lt;/p&gt;

&lt;p&gt;I do not know where I am going, but I know that I am building. Since I have changed my thinking and begun to get a better grasp of the briefness of human existence, I have been able to put aside all the things that do not serve me (for the most part) and pay attention more to those things that will help take me places to achieve my goals. Learning programming and computer science the last three years has allowed me to stop focusing on all of my supposed problems and slightly uncomfortable reality, and focus on things that are more productive. &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%2F25g9hirv94e7bs1ze2vg.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%2F25g9hirv94e7bs1ze2vg.png" alt="woman thinking about things" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  General Life
&lt;/h3&gt;

&lt;p&gt;Some people have written about how coding jobs can be stressful, and while I can see that, I’m a workhorse with a non-existent social life. Pretty sure I’d be right at home. (I have had my fair share of social-butterflying.)&lt;/p&gt;

&lt;p&gt;I wake up, I go to work, I come home and go to my remote class, I work on projects, I have my daughter on the weekends, I help my parents with random house things (you know, simple woman stuff like repairing the garage door in the freezing cold and family cybersecurity… mom… why did you click that… -.-)&lt;/p&gt;

&lt;p&gt;Despite society trying to stuff me into some cute little predefined bundle, I have been just about everything but the expected. &lt;/p&gt;

&lt;p&gt;I’ve avoided developing a wrinkle on my forehead by actively trying to not frown my whole life. Some call this OCD. Some call this determination. &lt;/p&gt;



&lt;h3&gt;
  
  
  Closing Statements
&lt;/h3&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%2Fmyoq5byx5arssiom9uk7.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%2Fmyoq5byx5arssiom9uk7.png" alt="woman talking to crowd" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You decide what matters. You set the bar. Make sure you always ask the question: “According to whose standards?” Is it your standards, or someone else’s? Do you blindly follow, or do you think for yourself? Every being should have the freedom to express themselves and live their life in a way that suits them so long as it does not cause harm to others. Help actually, if you are able. &amp;lt;3&lt;/p&gt;

&lt;p&gt;Our challenges make us stronger when we come out the other side. Do not be mad the universe gave you challenges, but instead thank it for seeing you as a worthy champion. &lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>wecoded</category>
      <category>dei</category>
      <category>career</category>
    </item>
    <item>
      <title>Dream/Nightmare: What Kind of Malware is That? 🥶</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Sat, 07 Mar 2026 13:10:43 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/dreamnightmare-what-kind-of-malware-is-that-201j</link>
      <guid>https://dev.to/annavi11arrea1/dreamnightmare-what-kind-of-malware-is-that-201j</guid>
      <description>&lt;p&gt;Another computer dream!&lt;/p&gt;

&lt;p&gt;Backstory: The previous day, I had experienced chaos in an environment where many users were receiving emails from a hacked account. This was from a person that many people knew and trusted, however an external account. (Red flag!) The point is basically that non-techies do not have the skills needed to keep themselves safe. If you recognize the name, how likely are you to just trust and click? &lt;/p&gt;

&lt;p&gt;If it invokes immediate panic or uncertainty... DO NOT CLICK! --&amp;gt; This is what they want!&lt;/p&gt;

&lt;p&gt;I literally got a nightmare from this. Hundreds if not thousands effected. Infected devices. Spread unknown.&lt;/p&gt;

&lt;p&gt;The hard truth is that we cannot save people from themselves.&lt;/p&gt;



&lt;h2&gt;
  
  
  The Dream 🌌
&lt;/h2&gt;

&lt;p&gt;Looming over my own desk, I see a terminal open. I am aware that someone is on the other side. I do not know what they want. I try to befriend them, and of course it doesn't work. After some back and forth communication, I knew this person was weird. &lt;/p&gt;

&lt;p&gt;Suddenly, a download starts happening in my browser. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;PANIC&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I abruptly stop and cancel the download. Another one pops up, followed by another. I can see the percentage completion of each download with a tiny progress bar, and who knows if that was even accurate. Could be a game to make me close the one that looks the most downloaded first, leaving the other ones actually downloading. The more I click, the faster more appear at the top of my browser, trying to download to my computer! More and more kept appearing until they spread nearly all the way across. &lt;/p&gt;

&lt;p&gt;I couldn't keep up. I started to actually panic. I ran to the back of my pc, ripping out the power cord and ethernet cable. They can't touch me if there is no connection, right?&lt;/p&gt;

&lt;p&gt;I paused for a moment, shocked (no, not electrocuted, LOL). I couldn't believe what just happened. &lt;/p&gt;

&lt;p&gt;Not having a computer anymore, I just hopped on over to my boyfriend's PC. The first thing I sense is that person in the terminal again. I could feel the evil laugh a million miles away. The downloads started again. This became a double panic because now I have jeopardized my boyrfriend's PC. What will I tell him I did to his computer? Being responsible for destroying someone else's important things is not a scuff I want on my relationship. &lt;/p&gt;

&lt;p&gt;My heart sank, and I felt stupid and useless. Then I FINALLY woke up.&lt;/p&gt;



&lt;h2&gt;
  
  
  Share
&lt;/h2&gt;

&lt;p&gt;Have you had strange computer dreams? This post is a safe space for sharing. Also, if anyone can give me any insight as to if this is a real world scenario or not, I'd love to hear from your experiences or knowledge! Love you all!!&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>📨 Pop-out Messaging Extension: Dev Whisper</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Sun, 01 Mar 2026 21:39:45 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/pop-out-messaging-extension-dev-whisper-4bma</link>
      <guid>https://dev.to/annavi11arrea1/pop-out-messaging-extension-dev-whisper-4bma</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the fastest I've ever made something functional.&lt;/p&gt;

&lt;p&gt;- b r e a t h e s -&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;For the past couple years, I have actively used dev as a resource. Learning, discovering, and trying things way out of my league. Because of this, I have learned more than I would have on my own with no other support. When you enter the realm of web development and you don't really have anyone close to you doing it, it's the wild west. Dev has provided a place for all walks of life to learn and push forward to discover new things. For this reason, I chose Dev as my community!&lt;/p&gt;

&lt;p&gt;The one thing I noticed about dev is there there was no p2p chat. I thought it would be cool if users could send simple messages together about cool projects, ect. If the chat is implemented by way of an optional extension, then we are never forcing people to deal with the chat. It's truly a personal decision. &lt;/p&gt;

&lt;p&gt;Thinking from a community standpoint - I wanted to include all the meme monday memes inside the gif picker in the chat. YES you can probably find your meme you posted 2 months ago. This way, I'm using community data, for the community, to continue enhancing the experience. &lt;/p&gt;



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

&lt;p&gt;A free open source messaging app for dev members to communicate with each other without having to share personal information. It's shipped as an extension but has a pop-out option for ease of use. &lt;/p&gt;



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

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/4RGimHksJgY"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;



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

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/AnnaVi11arrea1" rel="noopener noreferrer"&gt;
        AnnaVi11arrea1
      &lt;/a&gt; / &lt;a href="https://github.com/AnnaVi11arrea1/dev_messages" rel="noopener noreferrer"&gt;
        dev_messages
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      3rd party messaging app that works with Dev.to
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Dev.to Messages (Unofficial 3rd Party Extension)&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A Chrome extension that adds private direct messaging to &lt;a href="https://dev.to" rel="nofollow"&gt;Dev.to&lt;/a&gt;, with built-in link safety, spam reporting, and a first-contact approval system.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;File Structure&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;dev_messages/
├── manifest.json          MV3 manifest
├── background.js          Service worker – updates unread badge
├── content.js             Injected into dev.to – detects user, adds Message buttons
├── popup.html             All UI views &amp;amp; modals
├── popup.css              Dev.to-inspired styles (380px popup)
├── popup.js               Full SPA app logic
├── js/
│   ├── storage.js         chrome.storage.local wrapper
│   ├── eligibility.js     Dev.to API eligibility check
│   └── linkSafety.js      URL spoofing detection + safe renderer
└── icons/                 16 / 48 / 128 px PNG icons
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Account eligibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks &lt;code&gt;joined_at&lt;/code&gt; &amp;amp; &lt;code&gt;articles_count&lt;/code&gt; via the Dev.to public API. Account must be at least &lt;strong&gt;30 days old&lt;/strong&gt; and have &lt;strong&gt;at least 1 published post&lt;/strong&gt; before sending or receiving messages.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;First-contact approval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When someone messages you for the first time,&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AnnaVi11arrea1/dev_messages" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;h3&gt;
  
  
  Meme Search Implementation
&lt;/h3&gt;

&lt;p&gt;Arguably, the most important feature. XD&lt;/p&gt;

&lt;p&gt;I wanted not to just pull in the memes, but to allow a user to search them. The best way I figured was to use the alt tags as search parameters. Many of us are nice enough to put alt tags on our stuff, and so I was able to leverage that to get a sort of lazy search going. Hey, it works. I thought that was a little cool and different so that is the snippet I'll be sharing below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/* gifPicker.js – Fetches meme images from Ben Halpern's Meme Monday posts,
   including every image posted in the comments (community memes). */

const GifPicker = {
  _cache: null,

  async fetchImages() {
    if (this._cache) return this._cache;

    /* ── Step 1: collect all Meme Monday articles ─────────────────────────── */
    const articles = [];
    for (let page = 1; page &amp;lt;= 6; page++) {
      try {
        const res = await fetch(
          `https://dev.to/api/articles?username=ben&amp;amp;per_page=100&amp;amp;page=${page}`
        );
        if (!res.ok) break;
        const data = await res.json();
        if (!data.length) break;
        for (const a of data) {
          if (/meme\s+monday/i.test(a.title)) articles.push(a);
        }
        if (data.length &amp;lt; 100) break;
      } catch { break; }
    }

    /* ── Step 2: collect images with dedup ────────────────────────────────── */
    const seen   = new Set();
    const images = [];
    const add    = (url, title) =&amp;gt; {
      if (!url || seen.has(url)) return;
      seen.add(url);
      images.push({ url, title });
    };

    /* Cover images first so they appear at the top of the grid */
    for (const a of articles) {
      if (a.cover_image) add(a.cover_image, a.title);
    }

    /* ── Step 3: fetch all comment threads in parallel ────────────────────── */
    const commentThreads = await Promise.all(
      articles.map(a =&amp;gt;
        fetch(`https://dev.to/api/comments?a_id=${a.id}`)
          .then(r =&amp;gt; r.ok ? r.json() : [])
          .catch(() =&amp;gt; [])
      )
    );

    for (let i = 0; i &amp;lt; articles.length; i++) {
      this._extractImages(commentThreads[i], articles[i].title, add);
    }

    this._cache = images;
    return images;
  },

  /* Recursively walk comment tree and pull every &amp;lt;img src="…"&amp;gt; with its own alt */
  _extractImages(comments, articleTitle, add) {
    for (const comment of comments) {
      const imgTags = (comment.body_html || '').matchAll(/&amp;lt;img([^&amp;gt;]+)&amp;gt;/gi);
      for (const m of imgTags) {
        const attrs  = m[1];
        const srcM   = attrs.match(/src="([^"]+)"/i);
        const altM   = attrs.match(/alt="([^"]*)"/i);
        if (srcM) {
          const alt = altM?.[1]?.trim() || articleTitle;
          add(srcM[1], alt);
        }
      }
      if (comment.children?.length) {
        this._extractImages(comment.children, articleTitle, add);
      }
    }
  },
};

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

&lt;/div&gt;





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

&lt;p&gt;I very quickly realized that I was going to need a secure database so users could keep their chat history. I'm using Neon's free tier for this project. Give it a whirl! XD. Requests from the extension go to Vercel over HTTPS. Vercel connects to Neon with an encrypted connection. The database is never exposed to the internet, and it is only queried by Vercel's serverless functions. &lt;/p&gt;

&lt;p&gt;I used copilot CLI to quickly build up a working template - I would not be able to build something so quickly without it. This is not my first chrome extension, but it is the 'fanciest' one I have made to date. &lt;/p&gt;

&lt;p&gt;I tested with my unpacked files in the google chrome extensions. I was lucky enough to test functionality with another dev user. That was amazingly helpful. A big thank you to &lt;a class="mentioned-user" href="https://dev.to/trickell"&gt;@trickell&lt;/a&gt; for being awesome.&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%2Flqc60t60kjf7xwrl2dxb.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%2Flqc60t60kjf7xwrl2dxb.png" alt="coolest chat ever"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had fun making a settings and options area for users which includes colors and text sizes for increased accessibility.&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%2Fl5cpnl1xpa6cb127u3q1.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%2Fl5cpnl1xpa6cb127u3q1.png" alt="customize settings"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  Features:
&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;Created with the mindset of reducing spam and annoyances&lt;/em&gt;&lt;/small&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Account eligibility - Checks &lt;code&gt;joined_at&lt;/code&gt; &amp;amp; &lt;code&gt;articles_count&lt;/code&gt; via the Dev.to public API. Account must be at least &lt;strong&gt;30 days old&lt;/strong&gt; and have &lt;strong&gt;at least 1 published post&lt;/strong&gt; before sending or receiving messages. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;First-contact approval -  When someone messages you for the first time, you see a banner with their opening message and must hit &lt;strong&gt;Approve&lt;/strong&gt; or &lt;strong&gt;Deny&lt;/strong&gt; before the conversation unlocks. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flag / report spam - Every incoming message has a 🚩 button. Clicking it opens a reason picker (spam, phishing, harassment, inappropriate, other) and marks the message as reported. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Link spoofing detection - Before any link opens, &lt;code&gt;LinkSafety.isSpoofed()&lt;/code&gt; compares the visible URL text against the actual &lt;code&gt;href&lt;/code&gt; hostname. A red alert is shown if they differ.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Link safety warning - Every link in every message routes through a warning modal that displays the full destination URL before opening it in a new tab. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Local storage persistence - All conversations, approvals, flags, and user data are stored in &lt;code&gt;chrome.storage.local&lt;/code&gt;. The extension must be installed and active to read messages. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unread badge - The extension icon shows a live unread count, updated by the background service worker whenever storage changes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My extension is getting reviewed by google currently... whish me luck! haha&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%2F38xqrnzmaumz8zdrvvz7.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%2F38xqrnzmaumz8zdrvvz7.png" alt="pending review"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A user must have the extension to test it. Guess I've made myself a guinea pig haven't I. (hides, 😅)&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>ASCII Whisper: Local P2P Chat with Sound FX and Battleship</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Wed, 11 Feb 2026 00:29:42 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/ascii-whisper-local-p2p-chat-with-sound-fx-and-battleship-18c7</link>
      <guid>https://dev.to/annavi11arrea1/ascii-whisper-local-p2p-chat-with-sound-fx-and-battleship-18c7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a group 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 We Built 🧙🏼‍♂️💁🏼‍♀️
&lt;/h2&gt;

&lt;p&gt;We created a P2P chat that runs on your local network. We enabled a “video feed” capability in the terminal by translating the image from your device camera into low resolution ascii with a certain number of “frames per second”. Python reads camera data and translates it into approximate values. This is then displayed in the “video” stream. This is how we have video in the terminal without fancy packages. &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%2Fejt5dhzw4klhjr4k8fhq.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%2Fejt5dhzw4klhjr4k8fhq.png" alt="Testing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ASCII Whisper is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple&lt;/li&gt;
&lt;li&gt;Effective&lt;/li&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Secure&lt;/li&gt;
&lt;li&gt;Fun for all ages!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contributors:
&lt;/h3&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/trickell"&gt;@trickell&lt;/a&gt; 🦑 John&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/annavi11arrea1"&gt;@annavi11arrea1&lt;/a&gt; 🦄 Anna&lt;/p&gt;
&lt;h3&gt;
  
  
  Tools used:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Github Copilot CLI&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Pillow&lt;/li&gt;
&lt;li&gt;Rich&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are welcome to take a tour of the code on &lt;a href="https://github.com/AnnaVi11arrea1/live_ascii_video" rel="noopener noreferrer"&gt;Github&lt;/a&gt;. We had SO much fun making this project. There were many gut-busting laughs during development, especially when making sounds. 🤣 John managed the implementation of chat sounds and in-game sound effects. This was done using Python.&lt;/p&gt;

&lt;p&gt;🦄 I specifically remember going under my desk in the basement for better sound recording on my cell phone, and trying to artistically whisper “ascii” into the phone. I haven’t done too much work with custom sounds, so my recording studio consists of my cell phone and desk. John proceeded to gaze with amusement. The energy was returned when I saw him positioned under a blanket next to a wall whispering repeatedly “whisper” into his phone. I could not stop laughing, it was extremely entertaining to say the least. 😂&lt;/p&gt;

&lt;p&gt;When you open the app, you will hear our hand crafted intro: “a-s-c-i-i w-h-i-s-p-e-rrrr” 🍃&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%2Fjrcqf9qal619j8m41xdz.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%2Fjrcqf9qal619j8m41xdz.png" alt="ascii whisper intro"&gt;&lt;/a&gt;&lt;/p&gt;
What you see when you launch Ascii Whisper





&lt;p&gt;You enter a user name, select some color options, and then wait for the other person to connect. You will see a preview of your video feed momentarily while you wait for the other person to connect. &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%2F1z7hqmf6flgtzu9g7lpw.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%2F1z7hqmf6flgtzu9g7lpw.png" alt="John is waiting"&gt;&lt;/a&gt;&lt;/p&gt;
Waiting for the other person to connect





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

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/Zw_jS2C2NIU"&gt;
  &lt;/iframe&gt;


&lt;br&gt;
While creating the demo video, the excitement and ridiculousness nearly brought us to tears from laughing.&lt;/p&gt;



&lt;h3&gt;
  
  
  Contributions
&lt;/h3&gt;

&lt;p&gt;🦑 John added useful in-chat commands. &lt;/p&gt;

&lt;p&gt;Commands include:&lt;br&gt;
/help&lt;br&gt;
/ping  (John cannot stop laughing, that is my voice)&lt;br&gt;
/battleship&lt;br&gt;
/manual&lt;br&gt;
/togglecamera&lt;br&gt;
/theme &lt;br&gt;
/togglesound&lt;/p&gt;

&lt;p&gt;(Yes that’s right, you saw battleship!)&lt;/p&gt;

&lt;p&gt;🦑 John also worked on sounds and display layout, polishing up the camera display and adding color themes to choose from. Copilot was used to create basic methods for using sounds, from which John was able to add additional sounds by analyzing the structure in place.&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/trickell"&gt;@trickell&lt;/a&gt; (John Here!) I just wanted to chime in about the sounds and how much fun I had making these work in the code. So sound_manager.py is using &lt;strong&gt;subprocess&lt;/strong&gt; for mac sounds and *&lt;em&gt;winsound *&lt;/em&gt; for windows to play the sounds and threads to keep them actively going as the application is running. In a previous time in my life, I was a sound engineer so getting to create and play with the sound design for the game with Anna, I found that we had a lot of laughs in the creation of quirky and fun sounds using words and throwing some effects on it.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
    def play_battleship_start(self):
        """Play sound for battleship game start."""
        if not self.muted:
            thread = threading.Thread(target=self._play_sound, args=(self.battleship_start_sound,), daemon=True)
            thread.start()

    def _play_sound(self, sound_path):
        """Play a sound file using OS-specific methods."""
        if not os.path.exists(sound_path):
            # Sound file not found, silently skip
            return

        try:
            system = platform.system()

            if system == 'Windows':
                self._play_sound_windows(sound_path)
            elif system == 'Darwin':  # macOS
                self._play_sound_macos(sound_path)
            else:  # Linux
                self._play_sound_linux(sound_path)

        except Exception as e:
            # Silently fail - don't interrupt application if sound fails
            pass

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;I also wanted to touch on the commands. I'm someone who when using applications like vim, nano, github copilot, love the ability to run commands while in the application. When that was missing, I knew something was off about the app because the first thing I wanted the ability to do was alert someone, mute sounds, and exit without having to ctrl-c out of the app. Thus commands happened, and several were born. It makes being inside the app more user friendly.&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.amazonaws.com%2Fuploads%2Farticles%2Fd9btqn2v2q1e2ggbvxxh.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%2Fd9btqn2v2q1e2ggbvxxh.png" alt="Sound features overview"&gt;&lt;/a&gt;&lt;/p&gt;
Copilot helps set up the sound manager.






&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%2Fnabgd7fi81gd5dlp27lm.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%2Fnabgd7fi81gd5dlp27lm.png" alt="Debugging ascii image converter"&gt;&lt;/a&gt;&lt;/p&gt;
Debugging video stream with new color themes





&lt;br&gt;
🦄 I spent a lot of time getting the “video feed” to work locally, the battleship game complete with trash-talking ai, and user manual. We both contributed to the “voice acting” 100% original noises for your amusement.

&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%2Ftvd31slqdwyhrtkowofe.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%2Ftvd31slqdwyhrtkowofe.png" alt="localhost test"&gt;&lt;/a&gt;&lt;/p&gt;
Testing on one device






&lt;p&gt;You can test Ascii Whisper on a single machine. Once you have it downloaded or a copy of the project, open two terminals. Then navigate to the project folder.&lt;/p&gt;

&lt;p&gt;Start the host with: &lt;code&gt;python main.py –host –device &lt;/code&gt;&lt;br&gt;
You may or may not need to include the device id depending on your setup. &lt;/p&gt;

&lt;p&gt;Start the client with: &lt;code&gt;python main.py –connect localhost –device &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you are starting the client on a different device on the same network:&lt;br&gt;
&lt;code&gt;python main.py –connect  –device &lt;/code&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  Battleship Game
&lt;/h3&gt;

&lt;p&gt;🦄 When you type the /battleship command, it starts a game of battleship in the chat. Each player places their ships and the game begins. The player that goes first is determined by a dice roll. &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%2Fij2ccyfvg4rnvddqerzj.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%2Fij2ccyfvg4rnvddqerzj.png" alt="battleship in game screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
Example of battleship game play.






&lt;p&gt;After every turn, the game board is updated and displayed in the chat to help you plan your next move. If there are many lines of chat and the map has disappeared, you can use the /map command to display it once again. If you are feeling very lost, the /manual command will pop open a simple .txt file with instructions in a separate terminal. This way you can keep it open while you play.&lt;/p&gt;

&lt;p&gt;Here is a preview of the manual:&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%2Frx3kp3ccgnbbyxx5zxuu.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%2Frx3kp3ccgnbbyxx5zxuu.png" alt="ascii whisper user manual"&gt;&lt;/a&gt;&lt;/p&gt;
Detailed user manual for Ascii Whisper included!





&lt;h2&gt;
  
  
  Our Experience with GitHub Copilot CLI 👾
&lt;/h2&gt;

&lt;p&gt;Github Copilot CLI was an amazing tool for helping us develop our plan. When you have an idea, it can be a large task getting something minimal up and running. We were able to get a minimally working version in a short period of time. We knew what we wanted, and Github Copilot CLI got us started on the right foot. This is a very large project to completely write out by hand. But we were able to accomplish a lot in a short period of time. When we ran into issues, Copilot was often helpful at writing out tests for debugging. &lt;/p&gt;

&lt;p&gt;🦄 For example, when I was suddenly running into issues with my camera being detected, I asked Copilot why my camera was not displaying anything. I learned from copilot that I may need to provide a device id, and that this is a simple configuration step depending on a user's setup. Cool! I simply started using –device  after finding out what device I should be using. &lt;/p&gt;

&lt;p&gt;🦑 Copilot was also very helpful when John was adding custom sounds into the battleship game. The sounds were “nested” in the game in the wrong place and Copilot helped him relocate the code to the correct places. This was a bug that occurred after I had added the ai trash-talker. &lt;/p&gt;



&lt;h3&gt;
  
  
  Links:
&lt;/h3&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/AnnaVi11arrea1/live_ascii_video" rel="noopener noreferrer"&gt;Ascii Whisper&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%2Fhvxe28yemdvfxcgf0s9y.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%2Fhvxe28yemdvfxcgf0s9y.png" alt="John and Anna"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We would love to hear your feedback! Thank you so much for reading!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>An Al-go-llama Adventure</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Wed, 04 Feb 2026 03:35:52 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/an-al-go-llama-adventure-4051</link>
      <guid>https://dev.to/annavi11arrea1/an-al-go-llama-adventure-4051</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/algolia"&gt;Algolia Agent Studio Challenge&lt;/a&gt;: Consumer-Facing Conversational Experiences&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Hello Everyone!&lt;/p&gt;

&lt;p&gt;As an event vendor for 5 years, I know that it can be hard to find events you are looking for. You need to sell at places with your target audience. &lt;/p&gt;

&lt;p&gt;It would be &lt;em&gt;really&lt;/em&gt; nice to have a natural conversation about what you are looking for, rather than querying hard parameters all the time. It is possible to discover even more opportunities with natural language models. It makes it much easier for the exhausted business owner to say "Find me events to vend at this April near Chicago". Instead of typing, checking, toggling, whatevering-- a bunch of fields. &lt;/p&gt;

&lt;p&gt;So let's output some related findings for the very tired Miss Bosswoman CEO! &lt;/p&gt;

&lt;p&gt;By the way guys, I've been working on this project here and there through time. This Algolia search intelligent chat bot is a wonderful feature.&lt;/p&gt;



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



&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/nNkz04Je3Ts"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;



&lt;h2&gt;
  
  
  How I Used Algolia Agent Studio
&lt;/h2&gt;



&lt;p&gt;I took this opportunity to learn about Algolia and implement it into one of my projects: GoVend, Connecting vendors to events. &lt;/p&gt;

&lt;p&gt;Implementing my first intelligent chat assistant was a challenge for sure. Initially, I set up an Algolia agent with Gemini. &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%2F88ukxrn1qjvzui22qrgl.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%2F88ukxrn1qjvzui22qrgl.png" alt="user interaction"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;“Carl”, the agent I created in Algolia, would take user queries and find related events in the available data. &lt;/p&gt;

&lt;p&gt;You can choose what attributes should be searchable on each index. An index is a group of data on Algolia. For me, I had an “Events” index, which included things like name, date, city, etc. I left most of them on to improve searchability. &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%2F77wnqqgwa3gmye2nem9d.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%2F77wnqqgwa3gmye2nem9d.png" alt="configure algolia search"&gt;&lt;/a&gt;&lt;/p&gt;
Example chosen index in algolia





&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%2F9cjz48aeifbfwzbtdvjg.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%2F9cjz48aeifbfwzbtdvjg.png" alt="search parameters in algolia"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I explored Algolia’s MCP Server integration. It was fairly straightforward, and I was getting excited about it. By assigning tools to agents, we can build them to be more accurate and useful.&lt;/p&gt;

&lt;p&gt;And then of course...&lt;/p&gt;

&lt;p&gt;I ran out of API requests as usual. I pushed the envelope a bit here with an Ollama wildcard. &lt;/p&gt;

&lt;p&gt;I first connected local Ollama (model: llama3.2:latest)to my app and got that working with my local data.&lt;/p&gt;



&lt;h2&gt;
  
  
  Why Fast Retrieval Matters
&lt;/h2&gt;

&lt;p&gt;I integrated Algolia's Search API with llama3.2 for natural language event discovery. Users can ask questions like 'Find events in Chicago' and get intelligently formatted results. Algolia's powerful search combined with Ollama's natural language understanding is a winning scenario.&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%2Ft1drrczmihw2bm45l1a9.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%2Ft1drrczmihw2bm45l1a9.png" alt="output log"&gt;&lt;/a&gt;&lt;/p&gt;
Natural language event search powered by Algolia's search API



&lt;p&gt;I realized that maybe having a fallback method for searches was a good idea to handle errors in production. Llama3.2 will be able to find some event data no matter what.&lt;/p&gt;

&lt;p&gt;I used enhanced Algolia search capabilities by using:&lt;/p&gt;

&lt;ol&gt;
   &lt;li&gt;Zipcode Detection
   &lt;/li&gt;
&lt;li&gt;Geo-Location Search
      &lt;ul&gt;
         &lt;li&gt;Geocodes the zipcode to latitude/longitude&lt;/li&gt;
         &lt;li&gt;Uses Algolia's aroundLatLng geo search&lt;/li&gt;
      &lt;/ul&gt;
      &lt;ul&gt;Smart radius selection:
          &lt;li&gt;50km if query includes "near", "nearby", "close", "around"&lt;/li&gt;
          &lt;li&gt;100km default radius&lt;/li&gt;
      &lt;/ul&gt;
   &lt;/li&gt;
   &lt;li&gt;Distance Display
      &lt;ul&gt;
         &lt;li&gt;Shows distance in miles for each event&lt;/li&gt;
         &lt;li&gt;Sorted by proximity automatically&lt;/li&gt;
      &lt;/ul&gt;
   &lt;/li&gt;
   &lt;li&gt;Combined with Time Filters
     &lt;ul&gt;
        &lt;li&gt;Can search "events near 35801 this spring"&lt;/li&gt;
        &lt;li&gt;Combines zipcode + seasonal date filtering&lt;/li&gt;
     &lt;/ul&gt;
   &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example Queries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Find events near 35801"&lt;/li&gt;
&lt;li&gt;"What's happening close to 90210 in June?"&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Highlights that Align with Algolia’s Standards:
&lt;/h2&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unique Ollama Integration&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;&lt;br&gt;
Graceful fallback system&lt;br&gt;
Clear logging and debugging&lt;br&gt;
No breaking when services unavailable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Natural Language Processing&lt;/strong&gt;&lt;br&gt;
Extracts locations from queries&lt;br&gt;
Understands user intent&lt;br&gt;
Aesthetically pleasing results formatting &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-World Problem Solving&lt;/strong&gt;&lt;br&gt;
Faced API limits (common in production)&lt;br&gt;
Built resilient solution&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;



&lt;h2&gt;
  
  
  The Future:
&lt;/h2&gt;

&lt;p&gt;This was an interesting journey for me, lots of exciting tiny wins, and a couple long drawn out learning experiences. I like that Algolia allows you to configure multiple agents in the background. One day when I stop running out of API requests, I’d like to do a little experiment and have multiple agents talking to each other and see where that ends up.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/AnnaVi11arrea1/go-vend-event/tree/ai_beta" rel="noopener noreferrer"&gt;GoVend ai_beta&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>algoliachallenge</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>Mystery Resolved: Switching Repeatedly from WSL to PS - Issues</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Mon, 02 Feb 2026 12:29:53 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/mystery-resolved-switching-repeatedly-from-wsl-to-ps-issues-nnm</link>
      <guid>https://dev.to/annavi11arrea1/mystery-resolved-switching-repeatedly-from-wsl-to-ps-issues-nnm</guid>
      <description>&lt;p&gt;After having previously built an Ubuntu server, I am a little bit more fond of using WSL instead of PS in Windows. Feeling like I am "getting by with something" using linux commands on a windows pc. It's a nice little feature. &lt;/p&gt;

&lt;p&gt;But, I ask, what is all of that power good for if you are repeatedly running into super annoying unresolvable permission issues? I have gotten around this somehow until I started using antigravity. Being excited, I installed the new IDE and decided I was gonna do my linux nonsense on there too. &lt;/p&gt;

&lt;p&gt;The annoying mount issue rears its head, of course. (Yes I know wizard, should have been a read flag) I proceeded to try to use it anyway. No one is exactly over hear showing me how to stay out of messes. I misuse things, fall on my face, and share it so you don't have the same issue. Grit is one of my superpowers. &lt;/p&gt;




&lt;p&gt;Fast forward through over two years of coding like this, and having gotten around it by using things like codespaces or running everything sudo. (Yes I know, I'm banned) XD&lt;/p&gt;

&lt;p&gt;The fix: literally 5 minutes of reading. &lt;/p&gt;

&lt;p&gt;I should have delt with this before.&lt;/p&gt;

&lt;p&gt;I simply had to properly mount WSL before entering my code editor. All I had to do was open a terminal, switch to WSL in said terminal, and type 'code .' This opens your code editor with your projects mounted properly, resolving all permission issues and "things not installed" issues.&lt;/p&gt;

&lt;p&gt;What it should NOT look like when you start:&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%2Fu792pkxle7qlm70rjctm.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%2Fu792pkxle7qlm70rjctm.png" alt="bad example" width="604" height="47"&gt;&lt;/a&gt;&lt;/p&gt;
Improperly mounted WSL





&lt;p&gt;What it SHOULD look like:&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%2Fifzvulklzm3aawa7kk6w.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%2Fifzvulklzm3aawa7kk6w.png" alt="good example" width="350" height="40"&gt;&lt;/a&gt;&lt;/p&gt;
Properly mounted WSL



&lt;p&gt;HAPPY MONDAY!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>linux</category>
      <category>learning</category>
    </item>
    <item>
      <title>Deployed Profile to Google Cloud via AI Interface in Antigravity</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Tue, 20 Jan 2026 03:00:10 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/deployed-profile-to-google-cloud-via-ai-interface-in-antigravity-2c83</link>
      <guid>https://dev.to/annavi11arrea1/deployed-profile-to-google-cloud-via-ai-interface-in-antigravity-2c83</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;Hey there. &lt;/p&gt;

&lt;p&gt;I have been learning web development for the last few years. To date, I have created a few variations of my portfolio, none of which ever made it to deployment. I am excited for this opportunity to share the latest rendition of my portfolio website in all of its glory.&lt;/p&gt;

&lt;p&gt;I have a background in art and I personally like styling. I wanted to translate a little bit of artistic edgy flare without going too terribly wild. That's a bit of a tough one for me. User-friendly this, attention-grabbing that. I wanted to represent myself, and I am not a well defined black and white object. No, I'm more of an ethereal purple and windy blue.&lt;/p&gt;

&lt;p&gt;Now presenting for the first time ever, a semi respectable portfolio website: Anna Villarreal&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolio
&lt;/h2&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://refined-portfolio-681911491287.us-central1.run.app"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;






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

&lt;p&gt;So, I initially had this portfolio laid out in Ruby on Rails. But I hadn't deployed it anywhere. I always felt like something was missing.&lt;/p&gt;

&lt;p&gt;Here is screenshot of the previous UI:&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%2F3uwyxkgh73c6fdzo6wd7.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%2F3uwyxkgh73c6fdzo6wd7.png" alt="Old UI"&gt;&lt;/a&gt;&lt;/p&gt;
Old UI. Good, but not excellent.






&lt;p&gt;When this challenge popped up, I thought it was a great excuse to get my app deployed finally. I also wanted to convert it to a react app, implementing a mobile-first approach. I just really wanted an "app" that would translate well no matter where you were looking at it from.   &lt;/p&gt;

&lt;p&gt;New tools and approaches I used for this project included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Antigravity&lt;/li&gt;
&lt;li&gt;Google Cloud CLI&lt;/li&gt;
&lt;li&gt;Google Cloud Run&lt;/li&gt;
&lt;li&gt;Deploying my project within Antigravity by telling the built-in AI what to do!&lt;/li&gt;
&lt;li&gt;Tailwind (I usually don't use tailwind because I enjoy styling.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had the built-in AI in Antigravity read the repo of my original project. Then I had it translate Ruby on Rails into a react app. (I think that's pretty slick!) I told it which color palette I wanted to stick to and the general mood I wanted for my page. I continued on with a massive amount of tweaking. I really wanted originality, so I crafted an SVG for my background in illustrator. I used an image I generated from midjourney to make the nav bar come alive as well. &lt;/p&gt;



&lt;h2&gt;
  
  
  What I'm Most Proud Of
&lt;/h2&gt;

&lt;p&gt;This is the most effective profile to date I have created. (Again, actually deployed it. LOL) This profile website balances my whimsical internal artist while keeping the UI and functionallity at the center for users. I am happy with this being my first deployed profile website.&lt;/p&gt;

&lt;p&gt;I was really excited to discover that I could deploy my project to Google Cloud Run right from within Antigravity! It was SO FAST. No hours of debugging, at least for me. After a few minutes of prompting, success! Fastest. Deployment. Ever. &lt;/p&gt;

&lt;p&gt;And the app itself is fast!&lt;/p&gt;

&lt;p&gt;After I was happy with how my app was looking, I simply ran:&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%2F47yuw49mjmw9a2ndk71x.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%2F47yuw49mjmw9a2ndk71x.png" alt="Using built in AI in Antigravity"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I installed Google Cloud CLI:&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%2Fb64jc6alv0wuj2hglu2d.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%2Fb64jc6alv0wuj2hglu2d.png" alt="Google cloud CLI ready"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;As someone who has fought with deployments for literally days in the past, this is basically a jaw-dropping experience. Overall, I am happy I tried out the new Antigravity IDE as well as the deployment to Google Cloud Run from within it. And my app is alive! Yay! XD&lt;/p&gt;

&lt;p&gt;I couldn't tell you how exciting it was to see this message back from AI:&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%2Fqqny9nmwfrx7p8u9evi9.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%2Fqqny9nmwfrx7p8u9evi9.png" alt="Google Cloud app deployed"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>AI Flashcard Generator With Ollama</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Fri, 09 Jan 2026 03:02:10 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/ai-flashcard-generator-with-ollama-10gd</link>
      <guid>https://dev.to/annavi11arrea1/ai-flashcard-generator-with-ollama-10gd</guid>
      <description>&lt;p&gt;TLDR - successfuly got ollama running locally and through Google Colab using ngrok and my VPS.&lt;/p&gt;



&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;As usual, I have gotten massively sidetracked on an interesting web development problem. It all started when I decided to update my yet-to-be-deployed developer profile site. I remembered I had created a small memory card game in vanilla JS and I wanted to share it on my site as well. However I knew it needed more work. Once I figured out which one of my devices it was saved locally on, I quickly pushed it to github. &lt;/p&gt;
&lt;h2&gt;
  
  
  A Decision was Made
&lt;/h2&gt;

&lt;p&gt;Upon reviewing my tiny game that was over a year old, I decided it needed a massive facelift. I had created it just for learning javascript in a more fun gamified way, so it was simple and basic. It lacked any real function at all besides playing the same game over and over with the tiles in different places each time. My significant other kept talking about Ollama and how I should use it, and finally I came up with this plan of using AI to make my tiles.&lt;/p&gt;

&lt;p&gt;View of original game:&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%2Fm6dqtkqd0a8uskvo166j.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%2Fm6dqtkqd0a8uskvo166j.png" alt="Simple app" width="800" height="941"&gt;&lt;/a&gt;&lt;/p&gt;
 This was after I added some styling to the original game. 






&lt;p&gt;I took my original code with me downtown to Google AI Studio, where I fed Gemini my original code and explained what I wanted to have happen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use my existing code and rebuild it to be mobile-first, using react/vite.&lt;/li&gt;
&lt;li&gt;Add functionallity by creating a pdf/text loader area so that a user can generate their own custom flashcards using AI.&lt;/li&gt;
&lt;li&gt;Allow a user to select the number of flashcards.&lt;/li&gt;
&lt;li&gt;Generate a practice test with a reviewing and print option.&lt;/li&gt;
&lt;li&gt;Play their own memory game based on their flashcards.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tend to run out of my free tiers in about 30 minutes. For this annoying reason, I decided it was time to listen to my significant other and try Ollama locally. I downloaded Ollama and started asking Mr. Ollama questions right away about how I might use it to create questions from text/pdf. I needed to choose a model, and Ollama informed me that Mistral was perfomant and effecient, so I chose to go with that. &lt;/p&gt;

&lt;p&gt;After many revisions and error handling I was able to get something minimally functional. &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%2Fa3i24frpjjtj8b67hpi0.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%2Fa3i24frpjjtj8b67hpi0.png" alt="added pdf uploader" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;
Pdf uploader acting weird






&lt;p&gt;I got the pdfs uploading and sending a prompt to AI for questions and flashcards. I then started to modify the styling since it was massivley bothering me. &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%2Fcoteo0i6h34chrpn4bc7.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%2Fcoteo0i6h34chrpn4bc7.png" alt="pdf uploader" width="800" height="1149"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I then moved onto test generation by having AI interpret the provided text and create questions for the users, as well as putting questions and answers into a matching game, modeling after my first idea. It was ugly at first, but I was so excited when I got it working and producing the test and games as I wanted. From a functionallity standpoint, this was a win.&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%2Fxm7gohi7ml4z13s9bzpf.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%2Fxm7gohi7ml4z13s9bzpf.png" alt="Basic test is working" width="800" height="551"&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%2Ffki0r5ljely0brygedsq.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%2Ffki0r5ljely0brygedsq.png" alt="generated flippy tiles" width="800" height="1089"&gt;&lt;/a&gt;&lt;/p&gt;
YAY! I WIN! Even though I can't even read it! XD






&lt;p&gt;Let me just cut to the ending styling, which I am much more happy about. &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%2Fvs8ktvqiu72o9c6l82bt.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%2Fvs8ktvqiu72o9c6l82bt.png" alt="Landing area" width="789" height="1201"&gt;&lt;/a&gt;&lt;/p&gt;
In my opinion, much more fun to look at.



&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%2Fp4im3hl2oj0kt2fhzj3g.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%2Fp4im3hl2oj0kt2fhzj3g.png" alt="Test review" width="800" height="900"&gt;&lt;/a&gt;&lt;/p&gt;
Test review with option to print.



&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%2Fciae4ew8q6sdnha9jsmj.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%2Fciae4ew8q6sdnha9jsmj.png" alt="mobile friendly" width="559" height="1077"&gt;&lt;/a&gt;&lt;/p&gt;
Landing page looks good on mobile






&lt;p&gt;If you are also a student, you will see the value here of creating your own flashcards quickly with ease. I am currently fighting with google colab, ngrok, and my VPS to see how I can configure this up for public use at almost no cost. (Broke college student. cough cough, XD) When I figure it out, there will be an announcement lol. &lt;/p&gt;

&lt;p&gt;If you are curious about my flashcard app you can find it here: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://flippy-card.annavillarreal.com/" rel="noopener noreferrer"&gt;Flippy Card&lt;/a&gt;(Doesn't work hosted, only locally atm) &lt;/li&gt;
&lt;li&gt;Or also the repo: &lt;a href="https://github.com/AnnaVi11arrea1/flippy-card" rel="noopener noreferrer"&gt;Repo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am open for hearing about suggestions. I am new to react and Ollama so it might be a hot mess. Just playing with stuff and making useful things. XD&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%2Fd7g746j48a3hq6gyxmd8.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%2Fd7g746j48a3hq6gyxmd8.png" alt="mobile friendly game" width="545" height="829"&gt;&lt;/a&gt;&lt;/p&gt;
The game experience on mobile is pretty solid.



&lt;p&gt;Basically at the end of the day, I got my first open source local model running on my PC. &lt;/p&gt;



&lt;h2&gt;
  
  
  24 HOURS LATER...
&lt;/h2&gt;

&lt;p&gt;I decided I would try a fresh start on google colab. Blank slate. Now that im sort of familiar with it, I found it was easier to manage the code by executing everything in separate blocks/chunks, instead of trying to run one big fat file. I think part of my original problem was trying to run everything in one "cell" as they call them. &lt;/p&gt;
&lt;h2&gt;
  
  
  The Process Explained With Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a new Google Colab Project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to ngrok and get your auth token. They have a free one. The endpoint for the free tier cycles so you will have to coninuosly update it in your code as needed, but there is a free tier for students if you are so lucky. Check out ngrok stuff here: &lt;a href="https://ngrok.com/docs/pricing-limits/free-plan-limits" rel="noopener noreferrer"&gt;ngrok docs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After you have successfully gotten your auth token, head back to your Google Colab project and pop that bad boy right here:&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%2Frpt91osrxwbxm3d7g4l2.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%2Frpt91osrxwbxm3d7g4l2.png" alt="ngrok auth" width="553" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your gonna need that in a bit.&lt;/p&gt;



&lt;h2&gt;
  
  
  Break up the code into parts on Google Colab.
&lt;/h2&gt;

&lt;p&gt;Do not attempt to run it all at once. It make debugging miserable. Put different things into different "cells". First you are going to want to install Ollama in Google Colab. The warnings are fine depending on your use case. &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%2Fegj2t0njpeu5pxpzgf6h.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%2Fegj2t0njpeu5pxpzgf6h.png" alt="install ollama" width="602" height="299"&gt;&lt;/a&gt;&lt;/p&gt;
It will still run with warnings.



&lt;p&gt;On the bottom right of the notebook, you can change your runtime type if needed.&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%2Fv1ubbku8dbqz272j1xvf.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%2Fv1ubbku8dbqz272j1xvf.png" alt="change runtime type" width="408" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next two code blocks should look like this:&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%2Fb94kwj5pkq50b03wgq6s.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%2Fb94kwj5pkq50b03wgq6s.png" alt="Ollama server" width="619" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then install dependencies...&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%2Fzs55yotz1ixlapoffwtl.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%2Fzs55yotz1ixlapoffwtl.png" alt="loading dependancies" width="708" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a nice snipet of code that the lovely &lt;a class="mentioned-user" href="https://dev.to/trickell"&gt;@trickell&lt;/a&gt; shared with me to get everything behaving. (I was very thankful after days of defeat.) This will be your next cell your gonna wanna create.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
def start_ollama_server() -&amp;gt; None:
    """Starts the Ollama server."""
    subprocess.Popen(['ollama', 'serve'])
    print("Ollama server started.")


def check_ollama_port(port: str) -&amp;gt; None:
    """Check if Ollama server is running at the specified port."""
    try:
        subprocess.run(['sudo', 'lsof', '-i', '-P', '-n'], check=True, capture_output=True, text=True)
        if any(f":{port} (LISTEN)" in line for line in subprocess.run(['sudo', 'lsof', '-i', '-P', '-n'], capture_output=True, text=True).stdout.splitlines()):
            print(f"Ollama is listening on port {port}")
        else:
            print(f"Ollama does not appear to be listening on port {port}.")
    except subprocess.CalledProcessError as e:
         print(f"Error checking Ollama port: {e}")


def setup_ngrok_tunnel(port: str) -&amp;gt; ngrok.NgrokTunnel:
    """Sets up an ngrok tunnel.

    Args:
        port: The port to tunnel.

    Returns:
        The ngrok tunnel object.

    Raises:
        RuntimeError: If the ngrok authtoken is not set.
    """
    ngrok_auth_token = userdata.get('NGROK_AUTHTOKEN')
    if not ngrok_auth_token:
        raise RuntimeError("NGROK_AUTHTOKEN is not set.")

    ngrok.set_auth_token(ngrok_auth_token)
    tunnel = ngrok.connect(port, host_header=f'localhost:{port}')
    print(f"ngrok tunnel created: {tunnel.public_url}")
    return tunnel



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

&lt;/div&gt;



&lt;p&gt;Run that, make sure it works, then assign the ngrok port and start ollama server.&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%2F9r0wzzu2jo1egwuhg22g.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%2F9r0wzzu2jo1egwuhg22g.png" alt="Ollama is listening" width="742" height="321"&gt;&lt;/a&gt;&lt;/p&gt;
Ollama is listening!



&lt;p&gt;Then the last few cells should look like:&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%2F8wbetqcmxbr4qtchiuf6.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%2F8wbetqcmxbr4qtchiuf6.png" alt="click to check link" width="711" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the link to make sure that the tunnel is active and working. Pull whatever model you intend to be using in yout project. &lt;/p&gt;

&lt;p&gt;At this point you have everthing working in Google Colab.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ollama is running&lt;/li&gt;
&lt;li&gt;ngrok makes you a tunnel with your endpoint&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Connecting up your virtual private server
&lt;/h2&gt;

&lt;p&gt;Go to your app on your server and make sure that your model name is set correctly as well as all endpoints. I have my endpoint in a .env file. When I say endpoint I mean that ngrock link to clarify.&lt;/p&gt;

&lt;p&gt;After many days and hours I can say I built my first app locally with AI, deployed it to my VPS and ran the connected AI part in the cloud through Google Colab and ngrok. &lt;/p&gt;

&lt;h1&gt;
  
  
  YAY! IT WORKS!
&lt;/h1&gt;

&lt;p&gt;AHHHH NO BUGS....&lt;small&gt;(after many hours)&lt;small&gt;&lt;/small&gt;&lt;/small&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%2Fga8jqqyp11c7x61f8o05.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%2Fga8jqqyp11c7x61f8o05.png" alt="success af" width="800" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Figure out how to keep it running 24/7 for user friendliness&lt;/li&gt;
&lt;li&gt;Add user accounts and connect a DB so users can store their tests and cards.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Happy debugging!
&lt;/h2&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>learning</category>
      <category>resources</category>
    </item>
    <item>
      <title>2025 ~ Year of Enlightenment</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Wed, 24 Dec 2025 17:36:35 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/2025-year-of-enlightenment-ifb</link>
      <guid>https://dev.to/annavi11arrea1/2025-year-of-enlightenment-ifb</guid>
      <description>&lt;p&gt;&lt;em&gt;For anyone that is thinking of going boldly in an uncharted direction.&lt;/em&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  --------------------------------------------
&lt;/h3&gt;
&lt;h2&gt;
  
  
  Contemplations of 2025 &amp;amp; Recap
&lt;/h2&gt;
&lt;h3&gt;
  
  
  --------------------------------------------
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Web Development
&lt;/h3&gt;

&lt;p&gt;My 2025 started off being fresh out of a fast-paced web developer apprenticeship. Armed with a preliminary understanding of full stack web app development, I felt that anything was possible. I continued to work on my app, goVend. An app that connects vendors to events.&lt;/p&gt;

&lt;p&gt;I continued exploring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruby on Rails&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;Javascript&lt;/li&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Google Cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I began exploring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IT Support&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Scraping&lt;/li&gt;
&lt;li&gt;n8n&lt;/li&gt;
&lt;li&gt;GraphQL&lt;/li&gt;
&lt;li&gt;SQL&lt;/li&gt;
&lt;li&gt;AI&lt;/li&gt;
&lt;li&gt;Cloud servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combining prior knowledge with new knowledge, learning quickly becomes exponential.&lt;/p&gt;



&lt;h3&gt;
  
  
  IT Support
&lt;/h3&gt;

&lt;p&gt;I continued learning and collecting certificates throughout the year. Shortly before spring, I completed the Google IT Support Certificate where I found learning about packet composition and transportation at the network layer particularly fascinating. Here is my Dev post about the TCP Header: &lt;a href="https://dev.to/annavi11arrea1/networking-tcp-header-explained-57k"&gt;Networking: TCP Header Explained&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;I found networking so interesting that I reconfigured my home network, splitting from a modem/router to a more interesting modem and router situation (separate devices) updating to the latest security standards.&lt;/p&gt;

&lt;p&gt;With a basic understanding of network communication, suddenly everything became much more interesting. My thinking swung back and forth from “I really want to play with CSS all day and be a remote developer” to “I can fix things! I want to play with devices! OOO SPARKLEY!!!” – a massive problem for focusing energy. Is this a common problem among my peers here? &lt;/p&gt;



&lt;h3&gt;
  
  
  Employment
&lt;/h3&gt;

&lt;p&gt;I had a tiny proud moment when I completed my Google IT Support Certificate. It was about two months after I completed my web developer apprenticeship that a teaching assistant position became available at the University of Chicago. Excited at the opportunity, (and perhaps slightly terrified) I ran to it. I have absolutely no regrets. Helping students navigate their learning of web development with Ruby on Rails helped me also solidify my own comfort level with Rails as well. A bittersweet end came after two terms of teaching, as the program dynamics evolved.&lt;/p&gt;

&lt;p&gt;I had been applying for places before the teaching assistant position ended, since it was predictable. Everywhere I turned, it felt like my skills fell short every time. So then how does one move forward? It didn’t stop me from applying places. After feeling defeated and sad in my job search efforts, I considered the 2025 landscape and the new dynamics of online applications. &lt;/p&gt;

&lt;p&gt;This included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Having an awareness of AI and results filtering.&lt;/li&gt;
&lt;li&gt;Fighting against robots to get my resume through the filters.&lt;/li&gt;
&lt;li&gt;Catering each and every application resume and cover letter to be as close as possible to the job description.&lt;/li&gt;
&lt;li&gt;Having the actual references to back up your claims.&lt;/li&gt;
&lt;li&gt;Built a structured approach with rudimentary record keeping. (notepad ftw)&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.amazonaws.com%2Fuploads%2Farticles%2Flgpyax50x9ywnoorsjcm.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%2Flgpyax50x9ywnoorsjcm.png" alt="Cat getting attacked by robots" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;
Feel like I am getting filtered out by AI robots from every direction



&lt;p&gt;&lt;br&gt;&lt;br&gt;
Kinda feel like the real test here is if you are knowledgeable enough to get your resume past AI, showing your abilities to handle current technologies. XD&lt;/p&gt;



&lt;h4&gt;
  
  
  Fighting fire with fire!
&lt;/h4&gt;



&lt;p&gt;I started refining my resume and cover letter to the exact job I was applying for. I ran my resume, cover letter, along with the job description through AI to easily craft customizations that were best fit and still aligned with my skills. After each run through AI, I then tweaked it to sound more like me and for accuracy. AI uses overly refined lingo in my opinion -- and lots of other -- choice things.&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%2F65fqh5zjn0evu0agutr1.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%2F65fqh5zjn0evu0agutr1.png" alt="woman sitting and thinking" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
A really elegant photo of me thinking using firefly. It did a great job! XD Firefly is most excellent for a quick picture.






&lt;p&gt;Using AI saved me a lot of mental exhaustion. AI helped me highlight keywords so that I may not be filtered out by bots. Every time I applied somewhere, I recorded the date, name, and job description. This way, If I received contact, I could easily pick out which one this was in reference to so I didn’t sound like a buffoon. The last thing you want is to have submitted so many applications, that you don’t even remember where you applied and who is calling you.&lt;/p&gt;

&lt;p&gt;Within a week of using my newly refined application approach, I received contact from IBM. I was invited to complete a coding challenge. Even though I may have failed the hieroglyphic sorting algorithm (I refuse to cheat!) it proved one thing: My brass knuckle approach to fighting resume filtering was working! I also learned another important lesson: without the use of documentation my basic coding skills were massively lacking. &lt;/p&gt;



&lt;h2&gt;
  
  
  Experience
&lt;/h2&gt;

&lt;p&gt;My inadequate hard skills made me feel so small I felt invisible again. I was really needing any kind of employment. So, accepting defeat, I started to lean into my IT support. I talked myself into it, “I liked learning about networking and packets…” and “knowing IT support will make me a stronger web developer in the future.” I ferociously went on a hunt for a tech support position. I turned down a Geek Squad position to work for lesser pay at a small local IT company, knowing that the experience gained would be worth more than the pay at a large corporation.&lt;/p&gt;

&lt;p&gt;I would make the argument that there are not many web developer females that have stood on ladders at construction sites installing network cabling, security cameras, and access points. Want some comedy? My first experience at a construction site was wearing a pink shirt and wedges atop a ladder with a drill in the ceiling. &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%2Fpeu817meop9zv6mxfwjn.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%2Fpeu817meop9zv6mxfwjn.png" alt="woman on a ladder" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
An interesting experience... XD




 

&lt;p&gt;I can’t tell you how amusing it probably was to some onlookers. This experience was followed quickly by purchasing a pair of solid workboots. After scouring the internet for a pair of workboots I didn’t hate, I landed on some black and yellow carbon fiber wolverines. I can say that I like them very much after wearing them a few months. They can be found &lt;a href="https://www.wolverine.com/US/en/overpass-carbonmax-6-inch-boot/29830M.html?dwvar_29830M_color=W241171&amp;amp;ref=yellow%20and%20black#q=yellow%20and%20black&amp;amp;start=1" rel="noopener noreferrer"&gt;Here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the months that followed, I learned IT helpdesk support, hands on device troubleshooting, and network installation basics. It was very satisfying to put into practice the things that I had been reading about in my 1800-page CompTIA A+ book. And yes, I also got through that book this year and have been studying for the exam on the side, doing practice tests and such.&lt;/p&gt;

&lt;p&gt;Several months in, I realized there was no full time work for me available. Paired with no benefits and other external factors, I was on the brink of burnout. I started searching for a new role. &lt;/p&gt;



&lt;h3&gt;
  
  
  The Present
&lt;/h3&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%2Fym36mrcgoatkbmncwrs5.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%2Fym36mrcgoatkbmncwrs5.png" alt="woman carrying a box down a hallway" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;
Look at my exciting box of trinkets! Thanks again nano-banana! XD






&lt;p&gt;I am so excited to have been offered a position at a local school, where I will be a tech support associate. A big upgrade to full time with benefits included. I am very excited to be given a chance to work in a learning environment with other like minded individuals. There is potential for working on coding projects at this new position, which I would happily run towards at the speed of sound. The satisfaction of making sh*t work has no bounds.&lt;/p&gt;



&lt;h3&gt;
  
  
  Moving Forward
&lt;/h3&gt;

&lt;p&gt;Let's roll back to spring 2025. After poking around at some certificates, I began to feel like I needed something that would bear a massive amount of weight from an experience standpoint. I entered an online master’s in IT program with University of the People. I completed two master's classes with flying colors, database management systems and organizational theory. But I was unsatisfied even after getting an A in both classes. I wanted the nitty-gritty rough and tumbly 0’s and 1’s. I made the conscious decision to step back from a masters in IT to a bachelors in computer science. (For those of you wondering, I already have a bachelors in science, nutrition.) I believe it was the right decision. &lt;/p&gt;

&lt;p&gt;As I continue to work in IT support, I will be quietly pursuing my goal of being a creative software engineer/web developer. I feel it will only be a matter of time before the opportunity I am looking for rears its elusive head. Meanwhile I arm myself with a plethora of certificates, education, personal projects, and work experiences.&lt;/p&gt;

&lt;p&gt;The lesson of 2025 is to be fiercer than the forces that surround you. To accept defeat not as some sort of incapable loser, but as an enlightening experience. Where do champions come from? The champion is champion because of the 1,000 battles worth of experience. Not because of some fanciful wave of the AI wand, or because of a single win. It is imperative to roll in the mud and do the uncomfortable things if you are to grow. Hold your tiny dream inside your heart and don’t let anyone take it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>learning</category>
    </item>
    <item>
      <title>Calculate Your Personal Voltage from Binary</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Thu, 20 Nov 2025 23:22:05 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/calculate-your-personal-voltage-from-binary-gke</link>
      <guid>https://dev.to/annavi11arrea1/calculate-your-personal-voltage-from-binary-gke</guid>
      <description>&lt;p&gt;I came home today and made a fun thing. Here is said fun thing....&lt;/p&gt;

&lt;p&gt;&lt;a href="https://annavi11arrea1.github.io/BitORama/" rel="noopener noreferrer"&gt;B1T-0-RAMA&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%2Fnzdjwmun8w1f04w8xvmw.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%2Fnzdjwmun8w1f04w8xvmw.png" alt="page preview" width="800" height="854"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It offers a fun place to understand number system conversions better.&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%2Fsnystpk7452qq0lwm2zo.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%2Fsnystpk7452qq0lwm2zo.png" alt="b1t-o-rama in use" width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It also calculates your personal voltage. What is that?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The letters in your name are converted to binary.&lt;/li&gt;
&lt;li&gt;Each byte's voltage is calculated bit by bit. &lt;/li&gt;
&lt;li&gt;We get the sum of all the voltages.&lt;/li&gt;
&lt;li&gt;We divide the total voltage by the number of bits.&lt;/li&gt;
&lt;li&gt;We return that number as your "average voltage".&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.amazonaws.com%2Fuploads%2Farticles%2Fl8wwjvguagls8grc9629.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%2Fl8wwjvguagls8grc9629.png" alt="custom data just for you" width="800" height="741"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's both fun and can be educational.&lt;/p&gt;

&lt;p&gt;I am 1.55V. How about you?&lt;/p&gt;

</description>
      <category>learning</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>computerscience</category>
    </item>
  </channel>
</rss>
