<?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>🐝 Real-Life Debugging Story + Home Network Analysis: Peekyport 🫣</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Sat, 16 May 2026 16:44:11 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/real-life-debugging-story-home-network-analysis-peekyport-a10</link>
      <guid>https://dev.to/annavi11arrea1/real-life-debugging-story-home-network-analysis-peekyport-a10</guid>
      <description>&lt;p&gt;There is, for the second time in a month, a yellow jacket in the basement. You know what else is in my basement? My favorite machine. &lt;/p&gt;

&lt;p&gt;The first time this happened, it was early and I was getting ready for work. I saw something moving on my bottle of heat-protectant spray. It looked like a really fat caterpillar, but it had wings. I sat there for a second pretending like nothing was happening. It was distracted by the smell of the heat protectant. &lt;/p&gt;

&lt;p&gt;I slowly turned off my hair straightener and set it down, backing away semi normally. (Ladies, who &lt;em&gt;hasn't&lt;/em&gt; done their hair in front of their device. 😂) I realized that this was not an average bee. This was not a regular puffy bumble bee, or a sweat bee, or a honey bee. This bee looked like it was a soulless attacker.&lt;/p&gt;

&lt;p&gt;I alerted my boyfriend immediately. I did not want anything bad to happen to him while he was sleeping. These yellow jackets attack for no reason. While I was at work, he picked a fight with the yellow jacket and thankfully won. I was so scared for him. The following morning, I saw a dead yellow jacket inside my computer case. 😭 &lt;/p&gt;

&lt;p&gt;That sounds like 2 yellow jackets so far. After a month passes, I am sitting there minding my own business and BAM, another one! I saw it just barely land on the top of the bookshelf out of the corner of my eye! I think to myself: "**** this, I am moving out!"&lt;/p&gt;

&lt;p&gt;My boyfriend got traps and crack sealer for the basement, seeing my state of petrification. They have been setting out for a few days. But he went to work and could not save me until he came back. (Yes, it is &lt;em&gt;save the princess&lt;/em&gt; when there is a direct threat buzzing around.) Therefore, I must stay up on the second floor. I am not moving until I see a dead bee. I have not been in the basement and I absolutely refuse to go down there until there is undeniable evidence. &lt;/p&gt;



&lt;h3&gt;
  
  
  But my computer is in the basement...
&lt;/h3&gt;

&lt;p&gt;My 7-year-old mac is no match for my 2-year-old custom desktop. I must use it. But how? I had one of those moments where a tiny lightbulb went on. I wanted to get to a specific project of mine so I could share the tiny excitement with everyone.&lt;/p&gt;

&lt;h4&gt;
  
  
  Remote Access for the win
&lt;/h4&gt;

&lt;p&gt;I remembered that I installed a remote app on my phone so I could see my pc screen whenever and wherever. (LOVE that btw). Since it's all synced through google anyways, I was like well hey, let me pull that bad boi up! Like butter, I see my pc desktop. I messed around with it but my pc desktop is much wider than my laptop, so it wasn't a perfect situation. I discovered I couldn't record my pc screen while remoting in from mac. I tried it a few times with no luck. (What's up with that?) &lt;/p&gt;

&lt;p&gt;Then I remembered I had made a shared folder for my local network. (Just to prove to myself I knew how at the time.) I saw that it was still there. Ah! So this is what networking is really for! To save us from ourselves and evil bugs! &lt;/p&gt;

&lt;p&gt;So then, I copy over the project folder of interest to shared location, and then put a copy on my macbook. So, as you likely know, we can not just open up a project and run it on mac, if it was built on a windows pc. There is some &lt;em&gt;convertabobbing&lt;/em&gt; involved. I had copilot CLI do the fantabulous converting.&lt;/p&gt;




&lt;p&gt;All of this so I could share:&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Peekyport
&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%2Fa404g7aqzjv3p125f6or.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%2Fa404g7aqzjv3p125f6or.png" alt="Peekyport Logo" width="800" height="689"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a home network analysis and organization tool that I am building from scratch. Well, yes from scratch but ai-assisted because I am just learning Java. Which btw Java appears to be more verbose than Python and Ruby I am also finding. Why do I have to tell you it's a string? Python and Ruby are not like that. I digress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App Name: Peekyport&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tech used: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaFX&lt;/li&gt;
&lt;li&gt;Nmap&lt;/li&gt;
&lt;li&gt;tshark&lt;/li&gt;
&lt;li&gt;Custom CSS&lt;/li&gt;
&lt;li&gt;Draggable topology&lt;/li&gt;
&lt;li&gt;Local storage&lt;/li&gt;
&lt;li&gt;and an interface to connect your router of choice.&lt;/li&gt; 
&lt;/ul&gt;

&lt;p&gt;This is &lt;em&gt;not&lt;/em&gt; a web app. It is a thick-client JavaFX network tool with direct OS integration and minimal dependency footprint. I made it over-the-top with "levels" to represent the floors in a building. One can place nodes around and get a better idea of what your topology actually looks like! &lt;/p&gt;

&lt;p&gt;I built this because all the cool-looking tools are not free, and I wanted an engaging one. This is by no means perfect or a finished product, but I wanted to share my excitement. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Layout Overview&lt;/strong&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%2F4rmo9jmqz86ehrqvviut.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%2F4rmo9jmqz86ehrqvviut.png" alt="Peekyport Overview" width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before Peekyport becomes interesting, we need to scan the network in question. You can run a lightweight scan that covers only the most common ports, or a deep scan which would take much longer. A light scan is adequate for tinkering purposes. When the scan is run, I created a visual console display so the actual scanning can be seen in real time with a progress bar. The visual feedback is nice to clarify that things are actually happening. Bonus: it looks cool.&lt;/p&gt;

&lt;p&gt;Here you can see a scan in progress in Peekyport:&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%2Fk5ao21wpwo856jj796vp.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%2Fk5ao21wpwo856jj796vp.png" alt="Scan in progress" width="799" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After scanning your network, nodes will display in the central area in the Topology Tab. With each node you can edit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name&lt;/li&gt;
&lt;li&gt;Category&lt;/li&gt;
&lt;li&gt;Group&lt;/li&gt;
&lt;li&gt;Floor Number&lt;/li&gt;
&lt;li&gt;Shape and color to differentiate items&lt;/li&gt;
&lt;li&gt;Upload images to help you additionally identify&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%2F14rat2hxn958z3ot71yx.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%2F14rat2hxn958z3ot71yx.png" alt="Node interface" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect to your router by navigating to the router page and entering the details.&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%2Fdld9cjm5uzem7wx0xffw.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%2Fdld9cjm5uzem7wx0xffw.png" alt="Connecting home router" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connecting your router, scanning your network, and comparing it to your wireshark packets gives you a good peek into possible security holes. This allows a user to draw actionable insights for tightening things up on a home network. Being careful with what you are exposing ensures you are less prone to security issues.&lt;/p&gt;

&lt;p&gt;Cool! Now having our basic network topology from the grass-roots network scan and our router connected to allow more specific details, we can run a small wireshark scan and import the saved pcap file. About 2,000 packets or so should give you enough to poke around with.  🤔&lt;/p&gt;

&lt;p&gt;Heading to the Web Traffic Tab, we select a packet capture for analysis.&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%2F2te8a8vm95cbuv3felmg.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%2F2te8a8vm95cbuv3felmg.png" alt="pcap file uplaoder" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a screenshot of the per device traffic activity after upload:&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%2F24nwkxqncve6acd6bz31.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%2F24nwkxqncve6acd6bz31.png" alt="Traffic by device" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depending on your scan and what network you are connected to, you will see the corresponding devices. On a wifi network scan, you will only see wifi links. If you run a  scan connected to ethernet directly, you will choose "hardwire" in the link view. If you do not have the right one selected, you won't see the links because they do not exist. Makes sense.&lt;/p&gt;

&lt;p&gt;I really, really like the network topology link visualization. I feel like I can gain a much better understanding by see what devices speak to each other, through what ports, and how much. Now I can confront household memembers when they overtake the network bandwidth, with my new network facts. Empowering, isn't it? 😂 JK, my bandwidth has actually not been a problem thanks to dynamic quality of service.&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%2F6ihns0epvg55a3ukf9lw.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%2F6ihns0epvg55a3ukf9lw.png" alt="logical wifi links" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Network safety by severity is found in the safety tab:&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%2Fibddyn5qlyh83ni2f88x.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%2Fibddyn5qlyh83ni2f88x.png" alt="Overview findings" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This provides a snapshot of home network security. Many internet users do not have the need or resources to have a fancy enterprise grade network solution for their home. This app empowers a single individual to investigate their home network with a home router, keeping data secure by running it locally.&lt;/p&gt;



&lt;h3&gt;
  
  
  For everyone
&lt;/h3&gt;

&lt;p&gt;This app pulls web traffic together with IP addresses, mac addresses, and conversations between these addresses to gain insights about what can be addressed to improve security. It's super nice to be able to monitor traffic in such a specific modular way, with each device and all of is ports listed. &lt;/p&gt;

&lt;p&gt;It makes learning about your home network fun and de-mystifies the seemingly intangible network activity for all. I think every home network should have something like this. &lt;/p&gt;



&lt;h3&gt;
  
  
  For the future
&lt;/h3&gt;

&lt;p&gt;I am struggling a bit with the drag and drop interface, it behaves in an unexpected manner and there is a lot of weird layering and processes happening if other processes happen. It was so bad at one point I was about to trash the whole thing. But I have been powering through it, and I am slightly less frustrated although it's still not great. The data part is working gracefully. I will continue to fight with the UI until I am satisfied. (So, no end in sight for the foreseeable future. LOL)&lt;/p&gt;

&lt;p&gt;What network analysis tools have you built? Comments, tips, questions? &lt;/p&gt;

&lt;p&gt;Thank you for reading my tiny story. 💜&lt;/p&gt;

</description>
      <category>java</category>
      <category>network</category>
      <category>javafx</category>
      <category>security</category>
    </item>
    <item>
      <title>Circuits: Bit-Banging, SPI, and CPLD</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Thu, 14 May 2026 22:53:39 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/circuits-bit-banging-spi-and-cpld-3b5o</link>
      <guid>https://dev.to/annavi11arrea1/circuits-bit-banging-spi-and-cpld-3b5o</guid>
      <description>&lt;p&gt;TLDR: A small exploration of the use case of hardware over software. &lt;/p&gt;




&lt;p&gt;"Bit-banging" ...what?&lt;/p&gt;

&lt;p&gt;Apparently, bit-banging is when you are &lt;em&gt;trying to do with software what should be done with hardware&lt;/em&gt;. What an entertaining thought. Has anyone done this? I would love to hear your story.&lt;/p&gt;

&lt;p&gt;This is that area in computer science where software developers probably start to stick up their nose. Circuit? &lt;em&gt;Excuse me&lt;/em&gt;? 😆 Leave that to the hardware engineers. &lt;/p&gt;

&lt;p&gt;Guys, we have to play nice and communicate here. Did you know that when it comes to development, some argue there is up to 7,000 communication protocols globally? In all fairness, most of us only use a handful. But still, if you can handle the vast majority of communication protocols for web development, surly you can handle the small amount that exist in hardware. The focus is on one today: SPI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SPI - Serial Peripheral Interface&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;A four-wire, high-speed, full-duplex protocol for synchronous communication between microcontrollers and peripherals&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In one of my classes, we had to come up with a project where we implemented a PLD into a circuit. I looked into use cases for such a thing, and discovered a CPLD is very useful in cases where timing is absolutely critical, or else the system would dysfunction. &lt;/p&gt;

&lt;p&gt;I happen to be a big fan of programmable LEDs.&lt;br&gt;
It is entirely possible to wire an ESP32 directly to an LED strip, but there are a lot of problems with connecting directly, and I have witnessed them in person. Challenges with the ESP32 include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It runs a multitasking operating system, and interruptions from wifi can disrupt timing precision.&lt;/li&gt;
&lt;li&gt;If the timing is off, the LEDs will display the wrong colors or glitch.&lt;/li&gt;
&lt;li&gt;Inconsistent timing resulting from this could lead to the wrong colors displayed.&lt;/li&gt;
&lt;li&gt;Disabling interrupts would also drop wifi packets, leading to intermittent connectivity and exacerbating the problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And returning to the concept of bit-banging...&lt;/p&gt;

&lt;p&gt;This is probably one of those topics that software engineers should pay closer attention to. Some things are best left to hardware. The bit-banging software approach to handling the circuit introduces more inconsistent timing due to wifi, timer, and serial port interrupts. The timing must be nearly perfect for it to work as expected. Bit-banging can lead to high CPU usage for moderate reliability.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;THE SOLUTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So what can be done to run our multitasking OS alongside a fluid light show? We can fool the audience by offloading the timing-critical LED driving to hardware. The ESP32 talks to a CPLD (complex programmable logic device) through a serial peripheral interface. In this arrangement we have a wire for data, clock, select, and ground. I was very excited to learn about how these connections all work, so I made a diagram that represents the physical connections between each set of circuits.&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%2F8hbse6lmsyz7f8pbdfr6.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%2F8hbse6lmsyz7f8pbdfr6.png" alt="Circuit Overview" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This gives a high level understanding of our circuit structure. The CPLD takes the serial data from the ESP32 controller and uses memory to store the information. A pulse generator will also be built as part of the CPLD to make sure that we do not have timing issues. A unique feature of the SPI protocol is that it allows data to be transferred without interruption. This is the really important part. Instead of doing an internal eye roll over performance issues, I would encourage you to try it out. With these boards you don't even need to solder. You just connect the pins, like adult legos. Easy-peasey.&lt;/p&gt;

&lt;p&gt;Now, the speed of data transfer is determined by the frequency of the clock signal. This means that we can make the lights change faster or slower by controlling the frequency of the clock. &lt;em&gt;Cool&lt;/em&gt;. A faster clock speed means LEDs will update more frequently, and a slower clock speed will make them update in a slower manner.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Let's Talk Real Life&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In real hardware, code is written to describe both parts of the CPLD. The synthesis tool converts it to actual logic gates and flip flops. The CPLD contains both the SPI receiver and the pulse generator (which controls the timing). &lt;/p&gt;

&lt;p&gt;A nice board that could be used in a project like this could be the Altera MAX II EPM240 CPLD Development Learning Board that I found online. In the picture below, we see the top row of input pins with the GND and +5V on the very right. The programmable logic of the CPLD happens inside of the central black square. On the bottom, a row of output pins is aligned.&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%2F3bzj3763udamet74iptc.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%2F3bzj3763udamet74iptc.png" alt="ALtera Max II EPM240 CPLD" width="738" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Might have to try this out and see what happens. Am I stepping into the unseen madness that is hardware? It is uncertain, but very curious indeed Mr. Watson.&lt;/p&gt;

</description>
      <category>esp32</category>
      <category>learning</category>
      <category>circuits</category>
      <category>hardware</category>
    </item>
    <item>
      <title>You know you are a coder couple when...</title>
      <dc:creator>Anna Villarreal</dc:creator>
      <pubDate>Sun, 19 Apr 2026 11:29:18 +0000</pubDate>
      <link>https://dev.to/annavi11arrea1/you-know-you-are-a-coder-couple-when-8an</link>
      <guid>https://dev.to/annavi11arrea1/you-know-you-are-a-coder-couple-when-8an</guid>
      <description>&lt;p&gt;Are there many coder couples out there? It presents unique opportunities to poke around with things. Take this morning for example...&lt;/p&gt;

&lt;p&gt;I ask my significant others bot for advice about weather or not to wake him. His bot replies with unwavering logic, as usual.&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%2Fltp88uwo7jp4ek9h5kr9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fltp88uwo7jp4ek9h5kr9.jpg" alt="sleep defenses" width="800" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyone else with a tech savvy partner? I would love to hear your stories. (Or give me ideas.... shhhhhh! Haha.)&lt;/p&gt;

&lt;p&gt;He has since rolled over, in an attempt to access my track pad in his sleep. I can see revenge is eminent. 😂&lt;/p&gt;

</description>
      <category>mentalhealth</category>
      <category>ai</category>
      <category>openclaw</category>
      <category>webdev</category>
    </item>
    <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>
  </channel>
</rss>
